웹 개발/Spring Framework

@Transactional(선언적 트랜잭션) bean Id 지정해서 사용하기

희랍인 조르바 2018. 6. 28. 14:53

스프링에서 일반적으로 선언적 트랜잭션을 사용하기 위해서는 


dataSource가 있는 xml 위치에서


1
2
3
<!-- datasource가 있는 xml-->
 
<tx:annotation-driven/>
cs

 

을 선언해서 사용한다.


하지만, 복수개의 트랜잭션을 사용하기 싶어하는 분들도 있을 것이고, 


나처럼 기존 소스를 안 건드리기 위해 특정 부분에서만 트랜잭션을 걸어주고 싶을 수 있다.


에러가 발생해야 내가 무엇을 몰랐는지 알게 되는 것 같다.

(에러의 긍정적인 부분이라 생각함)


1
2
3
<!-- datasource가 있는 xml-->
 
<tx:annotation-driven/>
cs


dataSource가 있는 xml에서 위와 같이 선언하고 JUnit을 돌려보았더니 



위와 같은 에러가 발생했다.


이게 무엇인지 구글링을 해보니 tx:anntation-drivendefault 값으로 transactinManager로 선언된


DataSourceTransactionManager를 찾는 것을 알았다.


아무 것도 없이 선언을 해두면 transactionManager라는 bean을 찾는다는 것이다.


특정 bean Id를 찾게 하기 위해서는 다음과 같이 xml을 작성한다.


1
2
3
4
5
6
7
<!-- datasource가 있는 xml-->
 
<tx:annotation-driven transaction-manager="chocolateTransactionManager"/>
 
<bean id="chocolateTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="egov.dataSource" />
</bean>
cs



<tx:annotation-driven 뒤에 transaction-manager="빈 아이디"/>로 만들어주는 것이다.


자바 코드에서도 @Transactional을 사용할 때도 bean Id를 지정해주어야한다.


1
2
3
4
5
6
7
/* 트랜잭션을 사용할 자바 클래스 */
@Transactional("chocolateTransactionManager")
public int testMethod(){
    
    int chocolateCount = testService.insertChoco;
    return chocolateCount;
}
cs



1. tx-annotaion-driven을 DataSourceTransaction 클래스의 bean 아이디를 기입한다.


2. 사용할 트랜잭셔널 애노테이션에서 bean Id를 작성한다.