Spring 핵심원리 고급편 - 여러 Advisor 와 함께 적용

목차

참고

본 포스트는 김영한의 스프링 핵심 원리 - 고급편 내용을 참고해 만들었습니다.

여러 Advisor 와 함께 적용

하나의 Target 에 여러 Advisor 를 적용한다.

// 여러개의 프록시 객체

// client -> proxy2(advisor2) -> proxy1(advisor1) -> target

// Proxy 1 생성
ServiceInterface target = new ServiceImpl();
ProxyFactory proxyFactory = new ProxyFactory(target);

// Advisor 인터페이스의 가장 일반적인 구현체
DefaultPointcutAdvisor advisor1 = new DefaultPointcutAdvisor(Pointcut.TRUE, new Advice1());

// ProxyFactory 에 적용할 Advisor 를 지정한다.
proxyFactory.addAdvisor(advisor1);
ServiceInterface proxy = (ServiceInterface) proxyFactory.getProxy();

/////////////////////////////////////////////////////////////////////////////////////////////

// Proxy 2 생성 (taget -> proxy 1 입력)
ProxyFactory proxyFactory2 = new ProxyFactory(proxy);

// Advisor 인터페이스의 가장 일반적인 구현체
DefaultPointcutAdvisor advisor2 = new DefaultPointcutAdvisor(Pointcut.TRUE, new Advice2());

// ProxyFactory 에 적용할 Advisor 를 지정한다.
proxyFactory2.addAdvisor(advisor2);
ServiceInterface proxy2 = (ServiceInterface) proxyFactory2.getProxy();

proxy2.save();
00:36:05.734 [Test worker] INFO hello.proxy.advisor.MultiAdvisorTest$Advice2 - advice2 호출
00:36:05.737 [Test worker] INFO hello.proxy.advisor.MultiAdvisorTest$Advice1 - advice1 호출
00:36:05.737 [Test worker] INFO hello.proxy.common.service.ServiceImpl - save 호출

하나의 프록시로 여러개의 Advisor 적용

위에서는 여러 Advisor 를 적용하기 위해서는 여러개의 프록시를 생성 해야 한다는 문제점이 있다.
스프링 AOP 에서는 하나의 프록시만 생성 하고 여러개의 Advisor 를 적용 할 수 있도록 지원한다.

여러개의 Advisor 를 등록 후 호춯될때 순서는 등록한 순서대로 호출됩니다.

// 하나의 프록시 여러개의 Advisor

// client -> proxy -> advisor2 -> advisor1 -> target
// Advisor 객체 생성
DefaultPointcutAdvisor advisor1 = new DefaultPointcutAdvisor(Pointcut.TRUE, new Advice1());
DefaultPointcutAdvisor advisor2 = new DefaultPointcutAdvisor(Pointcut.TRUE, new Advice2());

// Proxy 객체 생성
ServiceInterface target = new ServiceImpl();
ProxyFactory proxyFactory = new ProxyFactory(target);

// 등록하는 순서대로 Advisor 가 호출된다.
proxyFactory.addAdvisor(advisor2);
proxyFactory.addAdvisor(advisor1);
ServiceInterface proxy = (ServiceInterface) proxyFactory.getProxy();

proxy.save();
23:30:55.675 [Test worker] INFO hello.proxy.advisor.MultiAdvisorTest$Advice2 - advice2 호출
23:30:55.676 [Test worker] INFO hello.proxy.advisor.MultiAdvisorTest$Advice1 - advice1 호출
23:30:55.677 [Test worker] INFO hello.proxy.common.service.ServiceImpl - save 호출
Share