본문 바로가기

Database/Data

Spring에서 트랜잭션 설정 방법

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>

 

참고

freehoon.tistory.com/110

 

Spring 블로그 만들기 - 8.트랜잭션 처리

이 포스팅의 샘플 게시판 개발 환경은 MAC OS, STS, OpenJDK11 입니다. 트랜잭션 처리에 대한 포스팅은 아래와 같은 순서로 진행합니다. 트랜잭션 이란 트랜잭션 설정 방법1 - 선언적 트랜잭션 설정 트

freehoon.tistory.com

developyo.tistory.com/51

 

[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

 

반응형