본문 바로가기
프로그램/JPA

context-transaction.xml

by cbwstar 2021. 7. 2.
728x90
반응형

마이바티스와 jpa를 같이 쓰기 위해서는 트랜잭션 설정이 중요합니다. 에러가 발생하였을 경우 rollback이 제대로 일어 나야 합니다. 주석으로 설명 달아 놓았습니다.

마이바티스는 트랜잭션 설정할때 귀찮으니까..

 <tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>

이렇게 한줄로  select,insert,update,delete 몽땅 다 트랜잭션 설정 되게 * 로 하고 사용하는데 jpa 사용할때는 세부적으로 옵션을 설정 하여야 시스템을 좀더 효율적으로 사용할수 있습니다. jpa는 dirty check를 하여서 읽어온 Entity에 변경이 발생하였을경우 자동으로 db에 저장을 합니다. 똑같은 데이터를 snap 해서 메모리에 올려 놓고 원본과 비교해서 변경 사항이 있으면 그냥 트랜잭션이 종료 될때 의도치 않는 업데이트가 발생합니다.

그래서 select는 읽기 전용으로 옵션을 적용해야 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

<!-- 
	TransactionManager 를 이용하여 JPA와 Mybatis 트랜잭션을 하나로 묶으려면, JpaTransactionManager 를 사용하면 가능하다.
	
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>
-->
	<!--   
	<tx:advice id="txAdvice" transaction-manager="txManager">
	--> 
	<!-- 1번째 postgresql DB설정 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
	   <tx:attributes>	 
	 	    <tx:method name="get*" read-only="true" />
			<tx:method name="select*" read-only="true" />
			<tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/>
			<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
			<tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/>
			<tx:method name="regist*" propagation="REQUIRED" rollback-for="Exception"/>
			
            <!-- 
	       <tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
	       -->
	   </tx:attributes>
	</tx:advice>
    
	<aop:config>
		<aop:pointcut id="requiredTx" expression="execution(* egovframework.com..*Service.*(..)) or
		                                          execution(* egovframework.invako..*Service.*(..)) or
												  execution(* egovframework.rte.fdl.excel.impl.*Impl.*(..))"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
	</aop:config>
	
	<!-- jpa 관련 설정 추가 시작 -->
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
	
	<!-- @Transactional 어노테이션 사용한 콤포넌트의 경우 트랜잭션을 적용시킨다. 해당 콤포넌트 스캔 -->
	<tx:annotation-driven transaction-manager="transactionManager" />
	
	
	<!-- 2번째 tibero DB설정 jboss에서 오류가 나서 제외 -->
    <!-- 
	<tx:advice id="txAdvice2" transaction-manager="transactionManager2">
	   <tx:attributes>	 
	       <tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
	   </tx:attributes>
	</tx:advice>
    
	<aop:config>
		<aop:pointcut id="requiredTx2" expression="execution(* egovframework.com..*Impl.*(..)) or
		                                          execution(* egovframework.invako..*Service.*(..)) or
												  execution(* egovframework.rte.fdl.excel.impl.*Impl.*(..))"/>
		<aop:advisor advice-ref="txAdvice2" pointcut-ref="requiredTx2" />
	</aop:config>
	-->
	
	 <!--jpa 관련 설정 추가 시작 -->
	 <!-- 
	<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory2" />
	</bean>
	-->
	 <!-- @Transactional 어노테이션 사용한 콤포넌트의 경우 트랜잭션을 적용시킨다. 해당 콤포넌트 스캔 -->
	 <!-- 
	<tx:annotation-driven transaction-manager="transactionManager2" />
     -->
	
	<!-- JPA 예외를 스프링 예외로 변환 -->
	<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
	<!-- jpa 관련 설정 추가 끝 -->
	
</beans>
 
728x90
반응형

'프로그램 > JPA' 카테고리의 다른 글

마이바티스 쿼리 샘플  (0) 2021.07.02
mapper-config.xml  (0) 2021.07.02
context-security.xml  (0) 2021.07.02
context-nexacro.xml  (0) 2021.07.02
context-mapper.xml  (0) 2021.07.02

댓글



"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

loading