Advice
Join Point에서 실행되는 코드
Aspect를 언제 핵심 코드에 적용할지 정의한다.
- 부가 기능(Cross-Cutting Concern)에 해당한다
- 시스템 전체 aspect에 API 호출 제공
- 각 상세 정보와 모든 메서드를 로그로 남기기 때문에
메서드 시작 전의 포인트를 선택한다.
Orders of Advice
Advice는 기본적으로 순서를 보장하지 않는다.
순서를 지정하고 싶다면 @Aspect 애너테이션을 적용 단위로 사용하여
org.springframework.core.annotation.@Order를 적용해야 한다.
- Advice단위가 아니라 클래스 단위로 적용한다.
- 하나의 Aspect에 여러 Advice가 존재하면, 순서 보장 X
Aspect를 별도의 클래스로 분리해야 한다.
Types of Advice
Before
Join point 실행 이전에 실행한다
- Target method가 실행되기 전, 처리해야할 필요가 있는 부가 기능을 호출하기 전에
공통 기능을 먼저 실행한다. - Before Advice를 구현한 메서드는 일반적으로 void를 리턴 타입을 갖는다.
- 리턴 타입을 갖고 있어도 실제 적용 과정에 영향 없음
- 작업 흐름을 변경할 수 없다.
- 메서드 종료시 다음 타겟을 자동으로 호출 (예외 발생 시 다음 타겟 호출 X)
- [주의] 메서드에서 예외를 처리하면, 대상 객체의 메서드가 호출되지 않는다.
After returning
Join point가 정상적으로 완료된 후 실행한다
- 메서드가 예외 없이 실행된 이후 공통 기능 실행
@AfterReturning(value= "hello.aop.order.aop.Pointcuts.orderAndService()", returning = "result")
public void doReturn(JoinPoint joinPoint, Object result)
{
log.info("[return] {} return={}", joinPoint.getSignature(), result);
}
메서드 실행이 정상적으로 반환될 때 실행된다.
returning 속성에 사용된 이름은 Advice method의 매개변수 이름과 동일해야 한다.
returning 절에 지정된 타입의 값을 반환하는 메서드만 대상으로 실행한다.
After throwing
메서드가 예외를 던지는 경우에 실행한다
메서드 실행 도중 예외가 발생한 경우, 공통 기능을 실행한다.
@AfterThrowing(value = "hello.aop.order.aop.Pointcuts.orderAndService()", throwing = "ex")
public void doThrowing(JoinPoint joinPoint, Exception ex)
{
log.info("[ex] {} message={}", joinPoint.getSignature(), ex.getMessage());
}
throwing속성에 사용된 이름은 Advice method의 매개변수 이름과 동일해야 한다.
throwing 절에 지정된 타입의 값을 반환하는 예외만 대상으로 실행한다.
After (finally)
Join Point의 동작(정상 or 예외)과는 상관없이 실행
예외의 finally를 생각할 것
- 메서드 실행 후 공통 기능을 실행한다.
- 일반적으로 리소스를 해제하는 데 사용된다.
Around
Method 호출 전/후에 수행하며 가장 강력한 Advice이다.
Join Point 실행 여부 선택, return값 변환, 예외 변환 등을 수행 가능
- Method 실행 전 / 후, 예외 발생 시점에 공통 기능 실행
- Advice의 첫 번째 매개변수로 [ ProceedingJoinPoint ]를 사용해야 함
- proceed( ) 메서드를 통해 대상을 실행
- proceed( ) 메서드는 여러 번 실행 가능
- proceed( ) 메서드를 통해 대상을 실행
- 가장 강력한 Advice = 아래의 기능 수행 가능
- Join Point 실행 여부 선택 - joinpoint.proceed()
- 전달 값 변환 - joinpoint.proceed(args[])
- return 값 변환
- 예외 변환
- try - catch - finally의 예외 구문 처리 가능
'programming > SPRING' 카테고리의 다른 글
AOP - Join Point (0) | 2022.06.20 |
---|---|
AOP - Pointcut 표현식 / 지시자 (0) | 2022.06.20 |
[TBC]IoC 와 DI (0) | 2022.06.18 |
PSA (0) | 2022.06.15 |
Spring Framework (0) | 2022.06.14 |