Database/Data
Spring에서 트랜잭션 설정 방법
yujin.me
2021. 3. 16. 17:43
DB를 다루기 위해서 필수적인 개념인 트랜잭션을 공부하고 있다.
1. 선언전 트랜잭션
- XML + aop pointcut을 사용해서 설정하기
- aop pointcut으로 선언할 경우 아래와 같이 적용할 pointcut 범위 지정
- * com.sample..*Service.*(..) : 모든 접근제한자의 com 패키지 밑의 sample 패키지 밑의 ~Service로 끝나는 몯느 클래스 밑의 모든(*) 메서드
- advice설정에 메소드 별로 제약 및 옵션을 걸 수 있음
- get* : get으로 시작하는 모든 메소드
- select* : select로 시작하는 모든 메소드
- insert*, update*, delete* : ..로 시작하는 모든 메소드
- read-only = true : insert/update/delete 쿼리를 내부적으로 실행시 exception을 뱉는다
- propagation : 메소드 내에서 다른 메소드를 사용할 때 하나의 트랜잭션으로 묶을지 별도의 트랜잭션으로 분류할지 등과 같은 설정 지정 옵션. default값이 required
- roll-backfor = Exception : Exception (Exception 밑의 모든 Exception 포함) 이 발생할 경우 rollback 처리
- src/main/resources > spring > context.xml에 transactionMagager빈 추가
- org.springframework.jdbc.datasource.DataSourceTransactionManager 클래스를 transactionManager로 등록
<!-- transactionManager 적용 범위 지정(advice) -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true" rollback-for="Exception" />
<tx:method name="select*" read-only="true" rollback-for="Exception" />
<tx:method name="insert*" read-only="false" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="update*" read-only="false" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="delete*" read-only="false" propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<!-- transactionManager pointcut -->
<aop:config>
<aop:pointcut id="txMethod" expression="execution(* com.sample..*Service.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txMethod" />
</aop:config>
<!-- transactionManager bean -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- datasource bean (jndi 사용) -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:/jdbc/AdmJNDI" />
</bean>
2. @Transactional 어노테이션 사용
- servlet-context에 아래 내용 추가
- 적은 코드로 1번과 같은 효과를 볼 수 있다
- 트랜잭션을 적용할 클래스, 인터페이스, 메서드에 @Transactional 어노테이션을 선언해준다
- public 메서드에서만 작용
- 트랜잭션의 적용 우선 순위는 클래스의 메서드 > 클래스 > 인터페이스의 메서드 > 인터페이스 순이다.
<!-- Transaction 설정 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
참고
Spring 블로그 만들기 - 8.트랜잭션 처리
이 포스팅의 샘플 게시판 개발 환경은 MAC OS, STS, OpenJDK11 입니다. 트랜잭션 처리에 대한 포스팅은 아래와 같은 순서로 진행합니다. 트랜잭션 이란 트랜잭션 설정 방법1 - 선언적 트랜잭션 설정 트
freehoon.tistory.com
[Spring fw] Transaction 설정 및 주의사항 : 예상치 못한 롤백이 이루어 지는 경우, 롤백이 되지 않는
* Spring 5.1.2 * jdk 1.8 * jboss/wildfly 9 * jndi 1. xml + aop pointcut 을 사용한 설정 (context xml 설정) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ..
developyo.tistory.com
반응형