조인포인트에서 수행되는 코드. Aspect를 언제 핵심 코드에 적용할지를 정의한다.
어드바이스는 기본적으로 순서를 보장하지 않기 때문에 @Aspect 적용 단위로 org.springframework.core.annotation.@Order 애너테이션을 적용해야 한다. 이는 어드바이스 단위가 아니라 클래스 단위로 적용할 수 있기에 애스팩트를 별도의 클래스로 분리해야 한다.
Before
@Before("hello.aop.order.aop.Pointcuts.orderAndService()")
public void doBefore(JoinPoint joinPoint) {
log.info("[before] {}", joinPoint.getSignature());
}
After returning
@AfterReturning(value = "hello.aop.order.aop.Pointcuts.orderAndService()", returning = "result")
public void doReturn(JoinPoint joinPoint, Object result) {
log.info("[return] {} return={}", joinPoint.getSignature(), result);
}
After thowing
@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
조인포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능이다.
Pointcut 표현
@Pointcut("execution(* transfer(..))") // 포인트컷 표현식
private void anyOldTransfer() {} // 포인트컷 서명
포인트컷 지시자에는 여러 종류가 있지만 주로 execution을 사용한다.
표현식 결합
포인트컷 표현식은 &&, ||, !와 같은 연산자들을 사용하여 결합할 수 있다.
@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {}
@Pointcut("within(com.xyz.myapp.trading..*)")
private void inTrading() {}
@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {}