[Spring] advice 순서 변경하기

by 스뎅(thDeng) on

동일한 곳에 여러 advice가 들어온다면.. 그 중 내가 만든 advice가 가장 먼저/나중에 실행되어야 한다면..??

간단히.. @Order annotation을 사용하자.

일부 코드만 샘플로.. 전체 코드는 맨 아래 링크로.. 아래에 있는 3개 클래스는 MyClass.myMethod()에 걸려 있다. 호출하면 누가 가장 먼저 호출되고 누가 가장 나중에 호출될까??

@Aspect
@Order(1)
public class MyFirstAspect {
   @Around("..............")
   public Object log(ProceedingJoinPoint pjp) throws Throwable {
       log.info("my - Order(1) start");
       Object result = pjp.proceed();
       log.info("my - Order(1) end");
       return result;
   }
}
@Aspect
@Order(2)
public class MyAspect {
   @Around("..............")
   public Object log(ProceedingJoinPoint pjp) throws Throwable {
       log.info("my - Order(2) start");
       Object result = pjp.proceed();
       log.info("my - Order(2) end");
       return result;
   }
}
@Aspect
public class YourAspect {
   @Around("..............")
   public Object log(ProceedingJoinPoint pjp) throws Throwable {
       log.info("your - not ordered start");
       Object result = pjp.proceed();
       log.info("your - not ordered end");
       return result;
   }
}
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = SpringTestContextConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class MyClassTest {
   @Autowired
   private MyClass dut;

   @Test
   public void test() {
       dut.myMethod();
   }
}

@Aspect@Order로 값을 지정해 주면 호출순서가 정렬이 된다. 프록시로 감쌀 때 가장 작은 값을 주면 @Around를 기준으로 가장 바깥을 감싸게 된다. 가장 먼저 호출되고, 가장 마지막에 호출되는 것이다. 테스트를 돌리면 아래와 같은 결과를 볼 수 있다. @Order(1)을 준 MyFirstAspect가 가장 바깥 자리를 차지하고, @Order를 주지 않은 YourAspect는 가장 안쪽을 차지한다.

$ cd testSpring
$ ./gradlew --info test

... (생략)...

kr.leocat.test.spring.aop.order.MyClassTest > test STANDARD_ERROR
   [Test worker] INFO kr.leocat.test.spring.aop.order.myfirst.MyFirstAspect - my - Order(1) start
   [Test worker] INFO kr.leocat.test.spring.aop.order.my.MyAspect - my - Order(2) start
   [Test worker] INFO kr.leocat.test.spring.aop.order.your.YourAspect - your - not ordered start
   [Test worker] INFO kr.leocat.test.spring.aop.order.MyClass - 잇힝~
   [Test worker] INFO kr.leocat.test.spring.aop.order.your.YourAspect - your - not ordered end
   [Test worker] INFO kr.leocat.test.spring.aop.order.my.MyAspect - my - Order(2) end
   [Test worker] INFO kr.leocat.test.spring.aop.order.myfirst.MyFirstAspect - my - Order(1) end

전체 샘플 코드는 아래에..

https://github.com/entireboy/blog-sample/tree/master/testSpring

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License