tx:annotation-driven기반 Mulitiple Transaction 설정

Spring에서 DB 트랜잭션을 설정하는 방법은 2가지가 있습니다.
첫번째는 tx:advice를 통해서 “선언적 트랜잭션” 방법 과 나머지 하나는
tx:annotation-driven를 통한 “명시적 어노테이션 지정 방법” 입니다.

둘다 장단점이 있긴 하지만, 최근에는 “tx:annotation-driven“를 사용한
명시적 어노테이션 방법을 사용하고 있습니다.

이번 포스팅은 “tx:annotation-driven”를 이용한 Multiple Transaction
설정에 대해서 말씀 드리려고 합니다.


아래와 같이 2개의 transactionManager를 설정했다고
가정하겠습니다.

(1) 기본 설정

<?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:p=”http://www.springframework.org/schema/p”
    xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd“>

<tx:annotation-driven />

<bean id=”txManager1”
        class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”
        p:dataSource-ref=”dataSource1”/>

<bean id=”txManager2”
        class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”
        p:dataSource-ref=”dataSource2”/>

(2) Service Class Method

@Transactional
public void createDatasource1() {
   //logic….
}

@Transactional
public void createDatasource2() {
   //logic….
}

그리고 JUnit을 실행하면, “transactionManager”를 찾을수 없다는 에러가
발생 합니다.

(3) 해결 방법 #1

첫번째 해결 방법입니다. 그전에 먼저 에러가 발생하는 이유는 별다른
설정이 없으면 첫번째 트랜잭션 매니져의 빈 아이디를 “transactionManager”
로 인식을 합니다.
그렇기 때문에 두개의 트랜잭션 매니져 중에서 적어도 한개에 빈 아이디를
“transactionManager”로 설정 합니다.

<tx:annotation-driven />

<bean id=”transactionManager”
        class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”
        p:dataSource-ref=”dataSource1”/>

<bean id=”txManager2”
        class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”
        p:dataSource-ref=”dataSource2”/>

그리고 Service 클래스의 메서드에 선언된 @Transactional 부분도
명시적으로 트랜잭션 매니져를 설정 해야 합니다.

※ “transactionManager” 빈 아이디를 사용할 경우 지정할 필요가 없습니다.

@Transactional
public void createDatasource1() {
   //logic….
}

@Transactional(value=”txManager2”)
public void createDatasource2() {
   //logic….
}

(4) 해결 방법 #2

두번째 방법은 매커니즘상 첫번째 해결방법과 동일합니다. 대신 스프링이 첫번째
트랜잭션 매니져 빈아이디를 찾도록 명시 하는 것입니다.

<tx:annotation-driven transaction-manager=”txManager1” />

<bean id=”txManager1”
        class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”
        p:dataSource-ref=”dataSource1”/>

<bean id=”txManager2”
        class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”
        p:dataSource-ref=”dataSource2”/>

서비스의 트랜잭션 적용 메서드는 아래와 같이 변경 됩니다.

@Transactional(value=”txManager1”)
public void createDatasource1() {
   //logic….
}

@Transactional(value=”txManager2”)
public void createDatasource2() {
   //logic….
}

(5) 결론

Mulitiple Transaction을 사용하는 환경일 경우는 경험상
“tx:advice” 통한 선언적 방법 보다는 “tx:annotation-driven” 기반의
명시적 트랜잭션 관리가 좀더 트랜잭션을 컨트롤하기가 수월 하지 않을까 생각
을 합니다.
그리고 해결법 중에서는 두번째 방법이 좀더 세련되고, 명시적이지 않나
생각이 듭니다.
물론 아키텍쳐적인 선택은 환경에 맞게 본인들이 선택을 해야 겠죠 ^^

Published by: beyondj2ee

Past SI AA, now I am pikicast developer in yellow mobile and daddy, Java, Spring, OpenSource, Application Architect :) Java Application Architect. mail : beyondj2ee@gmail.com twitter : twitter.com/beyondj2ee facebook : https:www.facebook.com/beyondj2ee blog: http:beyondj2ee.wordpress.com

Categories Uncategorized댓글 남기기

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중