AspectJ를 이용한 AOP는 프록시 기반에서 작동합니다.
Pointcut을 컨트롤러에 걸었는데 해당 컨트롤러가 기타 컨트롤러(MultiActionController 등..)를 상속한 경우에는 CGLIB 프록시가 아닌 JDK 프록시가 적용됩니다.
URL 맵핑을 진행하는 AbstractHandlerMethodMapping 인스턴스에서 JDK 프록시가 적용된 컨트롤러는 URL 맵핑을 하지 못합니다. 결국 해당 컨트롤러에 포함된 메서드로의 HTTP Request에 대해 톰캣이 404를 노출하게 됩니다.
이런 경우에는 CGLIB 프록시를 강제로 적용해야 합니다.
1. context 파일에 어노테이션 추가
이 방식은 AOP가 적용되는 모든 클래스에 CGLIB 프록시를 적용하는 설정입니다.
심플한 방법이나 <tx:annotation-driven/>, <aop:aspectj-autoproxy/>, <aop:config/>의 모든 설정에 CGLIB 프록시가 강제되는 문제가 있습니다.
2. 컨트롤러 클래스에 프록시 Scope 부여
원하는 클래스에만 CGLIB 프록시를 강제하고 싶을 때 사용합니다.
* 기타 정보
CGLIB은 인터페이스가 아닌 클래스에 대해서도 동적 프록시를 생성할 수 있고 성능 또한 우수한 장점이 있습니다.
* 출처 :
CGLIB Proxy 설명 - http://javacan.tistory.com/entry/114
Proxying mechanisms - https://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-proxying
프록시 Scope 설정 - http://stackoverflow.com/questions/15568112/using-proxy-target-class-true-with-spring-beans
'Spring' 카테고리의 다른 글
[Spring, JPA] junit test 돌릴 때 hibernate query가 노출되지 않는 경우 (0) | 2019.11.06 |
---|---|
[Spring] ModelAndView에서 Json 리턴 (0) | 2017.08.08 |
[Spring Security] 기본 응답 헤더 (0) | 2017.04.04 |
Spring DispatcherServlet (0) | 2017.03.21 |
스프링에서 한글 처리하기 (0) | 2016.09.26 |