
위 이미지의 S는 메서드 실행 전의 포인트이고, E는 메서드 실행 후의 포인트이다. S와 같은 포인트를 어드바이스가 적용될 조인 포인트라고 한다.
포인트컷으로 결정한 타겟의 조인 포인트에 어드바이스를 적용하는 것으로 Advice를 핵심 코드에 적용하는 것이다.
핵심 기능 코드에 영향을 주지 않고 부가 기능을 추가할 수 있다.
AOP 적용을 위해 Aspect 객체에 연결한 상태를 뜻한다.
컴파일 타임(AspectJ compooiler)
로드 타임
런타임
스프링 AOP는 런타임, 프록시 방식
기본적으로 어드바이스는 순서를 보장하지 않는다.
순서를 지정하기 위해서는 @Aspect 적용 단위로 org.springframework.core.annotation.@Order 어노테이션을 적용해야 한다.
애스펙트를 별도의 클래스로 분리해야 한다.
Before
-- 리턴 값을 가지고 있더라도 실제 Advice 적용 과정에 영향을 끼치지 않는다.
@Before("hello.aop.order.aop.Pointcuts.orderAndService()")
public void doBefore(JoinPoint joinPoint) {
log.info("[before] {}", joinPoint.getSignature());
}
조인 포인트가 정상 완료된 후 실행한다.
메서드가 예외 없이 실행된 이후에 공통 기능을 실행한다.
@AfterReturning(value = "hello.aop.order.aop.Pointcuts.orderAndService()", returning = "result")
public void doReturn(JoinPoint joinPoint, Object result) {
log.info("[return] {} return={}", joinPoint.getSignature(), result);
}
메서드가 예외를 던지는 경우에 실행한다.
메서드를 실행하는 도중에 예외가 발생하는 경우 공통 기능을 실행한다.
@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());
}
After (finally)
조인 포인트의 동작(정상 종료 또는 예외 발생)과는 상관없이 실행한다.
메서드 실행 후 공통 기능을 실행한다.
일반적으로 리소스를 해제하는 데 사용한다.
Around
메서드 호출 전후에 수행하며 가장 강력한 어드바이스이다.
조인 포인트 실행 여부 선택, 반환 값 변환, 예외 변한 등이 가능하다.
joinPoint.proceed() : 조인 포인트 실행 여부 선택
joinPoint.proceed(args[]) : 전달 값 변환
반환 값 변환
예외 변환
메서드 실행 전과 후, 예외 발생 시점에 공통 기능을 실행한다.
어드바이스의 첫 번째 파라미터는 ProceedingJoinPoint를 사용해야 한다.
proceed()를 통해 대상을 실행한다.
proceed()는 여러 번 실행할 수 있다.
Around
Around는 가장 강력한 어드바이스로 대부분의 기능을 제공한다. 하지만, 타겟 등 고려해야 할 사항이 있을 때 정상적으로 작동이 되지 않는 경우가 있다.
@Before, @After와 같은 어드바이스는 기능은 적지만 원하는 대로 작동되고 코드도 단순하다.
좋은 설계는 @Around만 사용해서 모두 해결하는 것보다는 제약을 가지더라도 실수를 방지하는 것이 좋다.
제약을 두면 문제 자체가 발생하지 않게 하며, 역할이 명확해진다.
참고한 사이트
https://ittrue.tistory.com/232