-
여러 어드바이저 동시 적용스프링/스프링 AOP 2023. 9. 17. 17:00
하나의 타겟에 어드바이저 1개가 아니라 여러개를 동시에 적용하는 방법을 알아볼 것이다.
프록시를 어드바이저 개수만큼 선언해서 계속해서 프록시 팩토리를 생성해서 넣어주는 방법이 있다. 하지만 이러한 방식은 프록시의 개수만큼 프록시를 생성해야 한다는 문제점이 있기 때문에 스프링에서 제공하는 방식을 사용하면 된다.
위의 사진보다 아래있는 방식을 선호한다.
프록시를 여러개 생성하는 것이 아니라 여러 어드바이저를 하나의 프록시로 설정하는 것이다.
어드바이스 static 메서드로 선언
static class Advice1 implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { log.info("advice1 호출"); return invocation.proceed(); } } static class Advice2 implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { log.info("advice2 호출"); return invocation.proceed(); } }
여러 어드바이스를 사용해야하는데 굳이 따로 생성하지 않고 static 메서드로 테스트 코드 아래에 선언해줬다.
@Test void multiAdvisorTest2() { // client -> proxy -> advisor2 -> advisor1 -> target DefaultPointcutAdvisor advisor1 = new DefaultPointcutAdvisor(Pointcut.TRUE, new Advice1()); DefaultPointcutAdvisor advisor2 = new DefaultPointcutAdvisor(Pointcut.TRUE, new Advice2()); // static 메서드로 만들어놓은 어드바이저 선언 // 프록시 생성 ServiceInterface target = new ServiceImpl(); ProxyFactory proxyFactory = new ProxyFactory(target); proxyFactory.addAdvisor(advisor2); proxyFactory.addAdvisor(advisor1); ServiceInterface proxy = (ServiceInterface) proxyFactory1.getProxy(); // 실행 proxy.save(); }
방법은 크게 다를것이 없는데, proxyFactory.addAdvisor()를 2번 해주면 된다. 클라이언트가 호출하는 순서가 어드바이저2를 호출하고 어드바이저1을 호출하기에 advisor2를 위에서 호출한다.
실행창을 확인해보면 2개의 어드바이저가 둘 다 호출된 것을 확인할 수 있다.
맨 위의 사진처럼 프록시마다 어드바이저를 호출하는 것이 아니라, 프록시 하나가 어드바이저 여러개를 호출하는 것이다. 이 방식을 모른다면 훨씬 복잡하고 성능도 별로겠지만 이 방식을 사용하면 훨씬 간단한 것을 알 수 있다.
AOP 적용 수 만큼 프록시가 생성된다고 착각하는 경우가 많은데 실제로는 그렇지 않으며 스프링 AOP를 적용할 때 최적화를 진행해서 지금처럼 프록시는 하나만 만들고, 하나의 프록시에 여러 어드바이저를 적용할 수 있다.
하나의 target에 여러 AOP가 동시에 적용되어도, 스프링의 AOP는 target마다 하나의 프록시를 생성하게 된다.
'스프링 > 스프링 AOP' 카테고리의 다른 글
빈 후처리기 (0) 2023.09.17 어드바이저의 실제 적용 (0) 2023.09.17 포인트컷, 어드바이스, 어드바이저 (0) 2023.09.17 프록시 팩토리(ProxyFactory) (0) 2023.09.17 프록시를 이용한 로그추적기 - 구체클래스 기반 (0) 2023.09.10