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()에서 괄호안의 숫자가 적은 것이 우선순위가 더 높다.