트랜잭션처리 설정문의
- 작성자 :
- 환*통
- 작성일 :
- 2014-10-21 15:18:43
- 조회수 :
- 1,353
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
전자정부프레임워크를 가지고 간소화시켜서 개발해보려고 합니다.
트랜잭션 처리 context-transaction.xml을 아래와같이 수정했습니다. 그런데 트랜잭션 처리가 되지 않습니다.
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="requiredTx" expression="execution(* com.shopping..*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
</aop:config>
com.shopping하위에 *Impl이란 이름을 가진 모든메소드(인자값을 하나이상가진)에서 Exception이 발생 했을 때 롤백처리가 되는 것 아닌가요? 에러는 나지 않습니다만 트랜잭션처리가 이뤄지지 않습니다.
혹시 context-aspect.xml파일과도 트랜잭션처리가 관련이 있는건가요? service와 dao가 특정 인터페이스의 상속을 받긴 하지만 전자정부프레임워크의 service와 dao처럼 EgovAbstractServiceImpl, EgovBBSUseInfoManageService, EgovComAbstractDAO을 상속받지는 않습니다. 이것이 문제인 것일까요?
트랜잭션 처리 context-transaction.xml을 아래와같이 수정했습니다. 그런데 트랜잭션 처리가 되지 않습니다.
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="requiredTx" expression="execution(* com.shopping..*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
</aop:config>
com.shopping하위에 *Impl이란 이름을 가진 모든메소드(인자값을 하나이상가진)에서 Exception이 발생 했을 때 롤백처리가 되는 것 아닌가요? 에러는 나지 않습니다만 트랜잭션처리가 이뤄지지 않습니다.
혹시 context-aspect.xml파일과도 트랜잭션처리가 관련이 있는건가요? service와 dao가 특정 인터페이스의 상속을 받긴 하지만 전자정부프레임워크의 service와 dao처럼 EgovAbstractServiceImpl, EgovBBSUseInfoManageService, EgovComAbstractDAO을 상속받지는 않습니다. 이것이 문제인 것일까요?
A
안녕하세요. 환상통님.
우선 AOP를 통해 transaction을 적용하는 것으로 context-aspect.xml과는 상관없이 context-transaction.xml만 있으시면 됩니다.
이 경우는 다음과 같은 경우일 가능성이 높습니다.
context-transaction.xml이 지정된 ApplicationContext와 실제 @Service가 정의된 component-scan 부분과 다른 경우입니다.
우선 context-transaction.xml이 지정된 configConfigLocation 부분이 web.xml 상에서 ContextLoaderListener 부분에 지정되어 있어야 합니다.
그리고 DispatcherServlet 지정의 configConfigLocation 설정 xml 중에 component-scan 설정이 있고, 다음과 같이 @Service에 대하여 exclude-filter 처리가 되어 있으신지 확인해 보십시오.
<context:component-scan base-package="egovframework">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
정리하자면, web.xml 상에 2개의 ApplicationContext(ContextLoaderListener, DispatcherServlet)이 생성이 되고, DispatcherServlet의 ContextLoaderListener를 상위(parent)로 지정됩니다.
그리고 각각 ContextLoaderListener는 @Service, @Repository를 가지고 있고, DispatcherServlet는 @Controller를 가지고 있습니다.
그리고 @Service를 가지고 있는 ApplicationContext 상에 AOP 설정이 지정되어 있어야 됩니다.
그럼, 즐거운 하루되십시오.
감사합니다.
우선 AOP를 통해 transaction을 적용하는 것으로 context-aspect.xml과는 상관없이 context-transaction.xml만 있으시면 됩니다.
이 경우는 다음과 같은 경우일 가능성이 높습니다.
context-transaction.xml이 지정된 ApplicationContext와 실제 @Service가 정의된 component-scan 부분과 다른 경우입니다.
우선 context-transaction.xml이 지정된 configConfigLocation 부분이 web.xml 상에서 ContextLoaderListener 부분에 지정되어 있어야 합니다.
그리고 DispatcherServlet 지정의 configConfigLocation 설정 xml 중에 component-scan 설정이 있고, 다음과 같이 @Service에 대하여 exclude-filter 처리가 되어 있으신지 확인해 보십시오.
<context:component-scan base-package="egovframework">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
정리하자면, web.xml 상에 2개의 ApplicationContext(ContextLoaderListener, DispatcherServlet)이 생성이 되고, DispatcherServlet의 ContextLoaderListener를 상위(parent)로 지정됩니다.
그리고 각각 ContextLoaderListener는 @Service, @Repository를 가지고 있고, DispatcherServlet는 @Controller를 가지고 있습니다.
그리고 @Service를 가지고 있는 ApplicationContext 상에 AOP 설정이 지정되어 있어야 됩니다.
그럼, 즐거운 하루되십시오.
감사합니다.