Whiteship's Note

왜 Spring MVC 컨트롤러에 AOP가 적용되지 않을까?



왜그럴까요? 저도 궁금해서 관련 아티클도 읽고 소스코드도 좀 해봤는데요; 아직도 조금 긴가민가 합니다.

AOP / AJAX Enabled Controllers in Spring MVC

위 글을 참조하였습니다.

Controller 인터페이스를 직접 구현하여 컨트롤러를 만들면 handleRequest() 메소드에 AOP를 적용할 수 있습니다. 하지만 자주 사용하는 MultiActionController, SimpleFormController에는 AOP가 적용되지 않습니다.

왜냐면, AbstractController에서 Controller 인터페이스를 구현하고, handleRequest 메소드를 final 메소드로 구현했습니다. 그래서 AOP가 적용되지 않는다고 합니다.

왜 냐면, MultiActionController, SimpleFormController 들의 프록시 객체를 만들 때, 인터페이스 기반으로 Proxy를 만들지 않고 CGlib 라이브러리를 사용해서 하위클래스를 생성하여 Proxy를 만들려고 하는데 final 메소드를 가지고 있기 때문에 그것마저도 못하기 때문인듯 합니다.

사용자 삽입 이미지
위와 같은 상속구조에서 SampleController의 handleRequest() 메소드에 BeforeAdvice를 적용하는 Aspect를 다음과 같이 정의했습니다.

@Aspect
public class SampleAspect {

    @Pointcut("execution(* finalClassProxying.SampleController.handleRequest())")
    public void samplePointcut(){}

    @Before("samplePointcut()")
    public void sampleAdvice(){
        System.out.println("과연 될까?");
    }

}

테스트를 해보면 적용이 되지 않는 것을 확인할 수 있습니다.

public class FinalClassProxingTest {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("finalClassProxying/applicationContext.xml");
        SampleController controller = (SampleController) context.getBean("sampleController");
        controller.handleRequest();
    }
}

흠냐... 로그 메시지에서 final 메소드라서 Proxy객체를 만들 수 없다는 메시지가 보고 싶었는데 보지를 못했습니다... 그래서 위에 제가 생각한 것이 맞는 건인지 아리까리 합니다.



top




: 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : ··· : 11 :