본문 바로가기

spring

spring aop without java interface

spring에서 인터페이스없이 aop를 적용시킬려면..

<aop:config proxy-target-class="true">와 같은 셋팅이 필요하다.


자세한것은 openseed에 등록된 이일민(toby)님의 글에서 확인할 수 있다.


http://www.openseed.net/forum/viewtopic.php?p=304


다음이 이일민님의 대답임~


주중에 너무 바빠서 이제야 답변을 달게되는군요 -_-;;

Max님이 원하시는 Dao만 Spring빈을 사용하고 거기다 Tx AOP를 적용하는 것은 아무 문제가 없습니다.

위에서 ClassCasting에러가 난 이유는 aop설정이 잘못됐기 때문입니다.

[aop:config] 이라고 된 부분을 [aop:config proxy-target-class="true"]로 변경해주면 됩니다.

이유를 좀 자세히 설명드리면

스프링AOP는 Proxy기반의 AOP방식을 사용합니다. 이때 프록시를 만드는 방법이 두가지가 있는데 하나는 JDK의 DynamicProxy를 이용하는 것이도 또 다른 하나는 CGLib Proxy를 쓰는 것이죠. 전자는 인터페이스가 있는 경우만 프록시를 만들 수 있는데 반해 후자는 concrete class에 대해서도 proxying이 가능합니다.

[aop:config] schema tag을 이용해서 Tx AOP를 적용하는 경우 스프링은 다음의 방법으로 두가지 proxy중 어떤 것을 사용할지 결정합니다.

먼저 타겟클래스가 하나이상의 인터페이스를 구현하고 있으면 그 모든 인터페이스를 구현한 JDK Dynamic Proxy를 사용합니다. Proxying된 메소드는 그 인터페이스의 메소드에 한정되겠죠.
반대로 타겟클래스가 구현한 인터페이스가 하나도 없는 경우라면 자동으로 CGLib을 적용합니다. 이때는 final method를 제외한 나머지 메소드를 구현한 proxy를 만들어주죠.

그런데 Max님의 경우처럼 Spring의 xxxDaoSupport를 상속받은 Dao를 인터페이스 없이 concrete class만으로 Tx AOP를 적용하면 어떻게 되냐면 첫번째 경우에 해당이 되서 JDK Dynamic Proxy가 적용이 됩니다. 왜냐면 xxxDaoSupport들의 상위 클래스인 DaoSupport클래스는 InitializingBean 인터페이스를 구현하고 있기 때문에 스프링은 그 인터페이스의 메소드만 proxy를 적용해서 리턴하기 때문입니다. 따라서 그것을 xxxDaoSupport로 캐스팅하려면 당연히 에러가 나겠죠. InitializeBean으로 캐스팅한다면 될 겁니다.

그럼 이런 경우에 어쩔 수 없이 사용한 인터페이스가 있는데 JDK Proxy가 아닌 CGLib을 적용해서 xxxDaoSupport의 모든 메소드에 AOP를 적용하려면 어떻게 해야하냐면 스프링에게 강제로 CGLib를 사용한 proxy를 쓰도록 지정을 해줘야 합니다. 그래서 들어간 옵션이 proxy-target-class="true" 인 것이죠.

이렇게하면 xxxDaoSupport클래스 자체를 proxying하기 때문에 문제없이 캐스팅해서 매니저쪽에서 사용할 수 있습니다.

다시 적용해보시고 그래도 문제가 있다면 알려주세요.

그 외에 한가지만 더 언급하자면,

OnJava에 나온 ContextSingletonBeanFactoryLocator를 이용한 singleton기반의 factory사용은 그다지 바람직해보이지 않는군요. 물론 그렇게 사용하는 것에 기능적인 문제는 없겠지만 ContextSingletonBeanFactoryLocator이 만들어진 특수한 상황에 들어맞는 적용케이스가 아니라고 생각됩니다. 차라리 ContextLoaderListener를 확장해서 싱글톤기반으로 factory에 접근할 수 있도록 만드는 것이 더 심플하고 나아보이는군요. 나중에 PresentationLayer까지 적용할 때도 더 자연스럽고요. 그렇게 구현한 방법은 다음 기회에 올리도록 하죠.

'spring' 카테고리의 다른 글

spring+ibatis+jsp+jstl  (3) 2007.10.11
spring aop+oracle procedure 에서의 transaction 처리..  (0) 2007.10.05
Spring 라이브러리  (0) 2007.08.21
flex data management services with spring  (0) 2007.08.20
SimpleFormController  (0) 2007.05.30