쌍용 강북 교육센터 국비학원 Day 89일차
AOP (Aspect Oriented Programming) - 관점(관심) 지향 프로그래밍
AOP(Aspect-Oriented Programming)는 핵심 로직과 부가 기능을 분리하여 애플리케이션 전체에 걸쳐 사용되는 부가 기능을 모듈화하여 재사용할 수 있도록 지원하는 것이다.
※ AOP는 부가기능을 애스펙트(Aspect)로 정의하여, 핵심기능에서 부가기능을 분리함으로써 핵심기능을 설계하고 구현할 때 객체지향적인 가치를 지킬수 있도록 도와주는 개념이다.
Aspect
Aspect는 부가기능을 정의한 코드인 어드바이스(Advice)와 어드바이스를 어디에 적용하지를 결정하는 포인트컷 (PointCut)을 합친 개념이다. Advice + PointCut = Aspect
- AOP 개념을 적용하면 핵심기능 코드 사이에 침투된 부가기능을 독립적인 Aspect로 구분해 낼수 있다.
- 구분된 부가기능 Aspect를 런타임 시에 필요한 위치에 동적으로 참여하게 할 수 있다.
Aspect Class (공통 관심사 클래스) 생성하기
Advice 만들기 (Before, After)
Advice는 실질적으로 프록시에서 수행하게 되는 로직을 정의하게 되는 곳으로 스프링에서는 Advice에 관련된 5가지 애노테이션을 제공한다. 어노테이션은 메소드에 붙이게 되는데 해당 메소드는 advice의 로직을 정의하게 되고, 어노테이션의 종류에 따라 포인트컷에 지정된 대상 메소드에서 Advice가 실행되는 시점을 정할 수 있다. 또한 속성값으로 Pointcut을 지정 할 수 있다.
게시판을 예를들어 주업무 (게시글 작성, 글수정, 댓글작성 등등)를 실행하기 앞서서 이러한 주업무들은 공통적으로 먼저 로그인을 해야만 사용가능한 작업이므로 주업무에 대한 보조업무 (예 - 로그인 유무검사) 객체로 로그인 여부를 체크하는 관심 클래스 (Aspect 클래스)를 생성하여 포인트컷(주업무) 과 어드바이스 (보조업무)를 생성하여 동작하도록 만들겠다.
먼저 Pointcut (주업무)을 설정해야 한다.
Pointcut이란 공통관심사 (예 - 로그인유무검사)를 필요로 하는 메소드를 말한다.
- 어드바이스를 적용할 타겟의 메소드를 선별하는 정규표현식이다.
- 포인트컷 표현식은 execution으로 시작하고 메서드의 Signature를 비교하는 방법을 주로 이용한다.
Advice의 종류
@Before : 메소드 실행 전 Advice 실행
@After : 메소드 실행 후 Advice 실행 메서드가 성공적으로 수행된 경우와 에러가 발생하여 Exception이 생긴 경우 모두 해당
@After-returning : AOP가 적용될 메소드가 에러(예외)없이 성공적으로 실행이 되면 advice 실행
@After-throwing : AOP가 적용될 메소드가 에러(예외)가 발생하였을때 Exception을 던질때 advice 실행
@Around : AOP가 적용될 메소드의 시작부터 끝까지 전반적인 시점을 모두 관리한다. (위의 4가지를 모두 포함하는 어노테이션)
Before Advice 구현
After Advice 구현
게시글을 작성할 때 마다 회원의 포인트를 증가시키는 after advice를 구현하려 한다. 마찬가지로 먼저 Pointcut 를 설정
JoinPoint
- Spring AOP 혹은 AspectJ에서 AOP가 적용되는 지점을 뜻한다. 해당 지점을 AspectJ에서 JoinPoint라는 인터페이스로 나타낸다.
- 어드바이스가 적용될 수 있는 위치를 말한다.
- 타겟 객체가 구현한 인터페이스의 모든 메서드는 조인 포인트가 된다.
JoinPoint 메소드
getArgs() | 메소드 인수 반환 |
getThis() | 프록시 객체 반환 |
getTarget() | 대상 객체 반환 |
getSignature() | Advice 또는 메소드의 설명을 반환한다. |
toString() | Advice 되는 메소드의 설명을 출력한다. |
어노테이션 동작 순서
Around -> Before -> AfterThrowing -> AfterReturning -> After -> Around
참고 출처 - https://velog.io/@backtony/Spring-AOP-%EC%B4%9D%EC%A0%95%EB%A6%AC
'Spring' 카테고리의 다른 글
쌍용강북교육센터 국비 학원 Day 88일차 Spring (Controller, tiles 적용) (0) | 2023.05.10 |
---|---|
쌍용강북교육센터 국비 학원 Day 87일차 Spring Framework (0) | 2023.05.09 |