https://megamaker.tistory.com/352
[Spring] Advisor 이용해서 Proxy Factory 사용하기
https://megamaker.tistory.com/351 [Spring] 프록시 팩토리(Proxy Factory) 사용하기https://megamaker.tistory.com/349 [Java] 동적 프록시 (Dynamic Proxy)이전에 살펴보았던 프록시 패턴에서는 원하는 클래스나 인터페이스
megamaker.tistory.com
ㄴ 이전 게시글
스프링에서 제공하는 프록시 팩토리를 사용하는 것까지는 좋았지만 매번 설정 코드를 작성해야 하는 번거로움이 있었다. 그래서 이번에는 이 문제를 해결할 수 있는 빈 후처리기를 알아보겠다. 빈 후처리기는 스프링 빈으로 등록한 클래스들을 스프링 컨테이너에 등록하기 전에 원하는 처리를 해서 등록할 수 있도록 해준다. 그렇기 때문에 설정 코드에서 컴포넌트로 등록한 빈들은 처리하지 못하는 문제까지 해결할 수 있다.
빈 후처리기 사용하기
이번에도 이전과 동일하게 =========로 원하는 문자열을 감싸는 기능을 구현했다.
@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이다. 프록시 팩토리에서 target이 될 비즈니스 로직이 담긴 객체를 지정할 테니 따로 주입받는 것은 없다.
public class MyPostProcessor implements BeanPostProcessor {
private final Advisor advisor;
public MyPostProcessor(Advisor advisor) {
this.advisor = advisor;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
ProxyFactory proxyFactory = new ProxyFactory(bean);
proxyFactory.addAdvisor(advisor);
return proxyFactory.getProxy();
}
}
커스텀 빈 후처리기를 정의한 부분이다. 나중에 이 객체가 스프링 빈을 조작하여 프록시 객체로 변환해 스프링 컨테이너에 등록할 것이다.
@SpringJUnitConfig
public class PostProcessorTest {
@Autowired
private MyText myText;
@Test
void postProcessorTest() {
Assertions.assertThat(AopUtils.isAopProxy(myText)).isTrue();
myText.print("하이");
}
@TestConfiguration
static class MyTestConfig {
@Bean
public MyText myText() {
return new MyText();
}
@Bean
public MyPostProcessor myPostProcessor() {
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(Pointcut.TRUE, new MyTextAdvice());
return new MyPostProcessor(advisor);
}
}
}


Advisor의 Pointcut으로 생성과 적용을 필터링한다. 생성할 때는 해당 스프링 빈의 프록시를 생성해야 하는 지를 고려하고, 실행시점에서 어떤 메서드가 호출되는지에 따라서 프록시를 사용할지 구분된다. 그렇기 때문에 사실 위와 같이 빈으로 등록되는 모든 객체를 처리해 버리면 모든 빈이 프록시로 생성되기 때문에 비효율적이다. 그렇기 때문에 포인트컷을 새로 조건을 주어서 만드는 것이 좋다. 나는 단순 테스트만 하려고 위와 같이 구성한 것이기에 실제로 사용하려면 무조건 포인트컷을 직접 설정하여 사용하여야 한다.
실행 결과를 보면 분명 MyText만 주입 받았는데 Advice에서 만들어 놓았던 로직까지 적용되어 출력된 것을 알 수 있다. MyTestConfig에서 myText와 myPostProcessor를 빈으로 등록했는데 myPostProcessor에서 myText를 가져와 프록시로 만든 후 myText라는 빈 이름으로 프록시 인스턴스를 등록한 것이다. 그렇기 때문에 주입받은 빈을 AopUtils로 AOP 프록시인지 확인해 봤을 때 맞다고 결과가 나온 것이다.
결과
이렇게 해서 빈 후처리기를 사용하는 방법에 대해서 알아보았다. 이전에는 인터페이스와 클래스를 직접 설정 클래스에서 등록하는 방법만 프록시로 만들 수 있었지만 이제는 빈 후처리기를 통해서 컴포넌트 스캔으로 등록되는 빈도 프록시로 만들 수 있게 되어 프록시 처리를 효율적으로 할 수 있게 되었다.
'공부 > Spring' 카테고리의 다른 글
| [Spring] 포인트컷 지시자(Pointcut Designator) (0) | 2024.07.31 |
|---|---|
| [Spring] 자동 프록시 생성기 (0) | 2024.07.29 |
| [Spring] Advisor 이용해서 Proxy Factory 사용하기 (0) | 2024.07.26 |
| [Spring] 프록시 팩토리(Proxy Factory) 사용하기 (0) | 2024.07.25 |
| [Spring] CGLIB로 프록시 직접 만들기 (0) | 2024.07.24 |