Spring Boot/AOP
Spring Boot AOP 실습2 - @Order
최-코드
2024. 7. 30. 20:50
문제 : 동일한 조건에 매칭되는 여러 어드바이스가 있을 때 어드바이스의 순서를 어떻게 할 것인가. 스프링에서는 임의로 순서를 정하지 않고, 무작위로 하나를 선택하여 실행한다. 따라서 매번 다른 순서로 이뤄지게 된다.
해결법 : 겹치는 어드바이스에 대해 서로 다른 에스펙트로 나눈 이후, @Order 어노테이션을 붙이면 된다. 이 어노테이션을 통해 순서를 지정할 수 있다.
이유 : 스프링 컨테이너는 에스펙트를 생성하고 초기화할 떄 @Order를 참조하여 에스펙트들을 정렬한다. 이후 AOP 프록시가 생성될 때 이 순서대로 에스펙트가 적용된다. 따라서 타겟 메소드를 감쌀 때 우선 순위가 높은 것이 제일 처음으로 나오려면 우선 순위가 낮은 것이 타겟 메소드를 제일 먼저 감싸게 된다.
@Order(1)
@Aspect
@Component
public class MyCloudLogAspect {
@Before("execution(* com.luv2code.aopdemo.dao.*.*(..))")
public void logToCloudAdvice() {
System.out.println("Logging to Cloud");
}
}
@Order(2)
@Aspect
@Component
public class MyLoggingDemoAspect {
@Before("execution(* com.luv2code.aopdemo.dao.*.*(..))")
public void beforeAddAccountAdvice() {
System.out.println("Executing @Before advice on method");
}
}
@Order(3)
@Aspect
@Component
public class MyApiAnalyticsAspect {
@Before("execution(* com.luv2code.aopdemo.dao.*.*(..))")
public void performApiAnalytics() {
System.out.println("Performing API analytics");
}
}
@Order()에서 괄호안의 숫자가 적은 것이 우선순위가 더 높다.