https://megamaker.tistory.com/351
[Spring] 프록시 팩토리(Proxy Factory) 사용하기
https://megamaker.tistory.com/349 [Java] 동적 프록시 (Dynamic Proxy)이전에 살펴보았던 프록시 패턴에서는 원하는 클래스나 인터페이스마다 프록시 클래스를 만들어주어야 하는 문제가 있었다. 100곳에서
megamaker.tistory.com
지난번에는 프록시 팩토리에 Advice를 추가해서 실행해 봤는데 이번에는 Advisor를 사용해 보았다. Advisor는 Pointcut과 Advice로 구성되어 있는데, Pointcut은 어떤 패키지, 메서드에 부가 기능을 적용한 것인지를 결정하고, Advice에는 부가 기능 로직이 담겨있다.
Advisor 사용하기
@Slf4j
public class MyText {
public void print(String text) {
log.info(text);
}
}
이전에 사용했던 비즈니스 로직이 담겨있는 클래스이다.
@Slf4j
public class MyTextAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
log.info("=================");
Object result = invocation.proceed();
log.info("=================");
return result;
}
}
부가 기능 로직을 담고 있는 Advice 클래스이다.
public class MyAdvisorTest {
@Test
void advisorTest() {
MyText target = new MyText();
ProxyFactory proxyFactory = new ProxyFactory(target);
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(Pointcut.TRUE, new MyTextAdvice());
proxyFactory.addAdvisor(advisor);
MyText proxy = (MyText) proxyFactory.getProxy();
proxy.print("비가 많이 오네요");
}
}

Advisor를 사용해도 프록시 팩토리를 만들어야 한다. 프록시 팩토리를 만든 후에 Advisor를 하나 만들고 추가하는 식으로 동작한다. 원래라면 Advisor와 Pointcut도 만들어야 하지만, 스프링에서 기본으로 만들어서 제공하는 것이 있으므로 상황에 따라 가져와서 사용하면 된다. Pointcut은 프록시를 적용할 조건을 지정할 수 있지만 Pointcut.TRUE로 설정하면 그냥 전부 허용한다.
Advisor를 사용하면 장점이 있는데 바로 여러 Advisor를 적용할 수 있다는 점이다. 새로운 Advisor를 만들어 적용만 시키면 한번에 여러 프록시를 사용하는 것과 같은 효과를 낼 수 있다. 하지만 실제로는 프록시가 하나만 생성되며, 내부에서 여러 Advisor가 호출되는 형식이다. 물론 각 Advisor마다 Pointcut을 조회하여 부가 기능 로직을 적용할지 말지를 결정한다.
Advisor 추가하기
@Slf4j
public class NewAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
log.info("@@@@@@@@@@");
Object result = invocation.proceed();
log.info("@@@@@@@@@@");
return result;
}
}
위와 같이 @로 둘러싸이도록 하는 부가 기능을 추가했다.
public class MyAdvisorTest {
@Test
void advisorTest() {
MyText target = new MyText();
ProxyFactory proxyFactory = new ProxyFactory(target);
DefaultPointcutAdvisor advisor1 = new DefaultPointcutAdvisor(Pointcut.TRUE, new MyTextAdvice());
DefaultPointcutAdvisor advisor2 = new DefaultPointcutAdvisor(Pointcut.TRUE, new NewAdvice());
proxyFactory.addAdvisor(advisor1);
proxyFactory.addAdvisor(advisor2);
MyText proxy = (MyText) proxyFactory.getProxy();
proxy.print("비가 많이 오네요");
}
}

이전의 테스트 코드에서 새로 만든 advisor를 추가하고 이전과 동일하게 addAdvisor()를 통해 프록시 팩토리에 추가한다. 주의할 점은 추가한 순서대로 호출되어 실행한다는 점이다. 즉, advisor1이 적용된 이후에 advisor2가 적용된다.
여기까지 많은 개선이 이루어졌지만 아직 새로 프록시를 만들 때마다 Advisor를 생성하고 적용하는 코드가 포함된 것을 알 수 있다. 다음에 테스트해 볼 빈 후처리기를 사용하면 이 문제를 해결할 수 있다.
'공부 > Spring' 카테고리의 다른 글
| [Spring] 자동 프록시 생성기 (0) | 2024.07.29 |
|---|---|
| [Spring] 빈 후처리기 (BeanPostProcessor) (0) | 2024.07.27 |
| [Spring] 프록시 팩토리(Proxy Factory) 사용하기 (0) | 2024.07.25 |
| [Spring] CGLIB로 프록시 직접 만들기 (0) | 2024.07.24 |
| [Spring] MapStruct로 이미지 경로 수정하기 + Null Pointer Exception 해결하기 (0) | 2024.06.16 |