티스토리 뷰


화창한 봄날에

간만에 이렇게 글을 남기네요.


오늘은

스프링 3.2 와 Atomikos 트랜젝션 라이브러리 3.8.0. 버전을 이용하여 Tomcat 7에서 분산 트랜젝션 설정

(Configurations for Distributed Transactions using Atomikos TransactionEssentials v3.8.0 

on Spring Framework and Tomcat 7)

이라는 주제로 글을 써보도록 하겠습니다.


말이 거창하지만 실제로는 별 것 없습니다.

저도 처음에는 어떻게 해야할까 하고 당연히 열심히 구글링을 했습니다.만......

외국애들이 써놓은 자료는 오래되었고, 뭔가 구성이 저랑 안맞고(아마 한국의 SI와 안맞는 현실이랄까요?) 해서

그냥 직접 Atomikos 트랜젝션 라이브러리 만들 사람들 사이트에서 혼자 보면서 해봤습니다.

사이트 주소는 http://www.atomikos.com/Documentation 여기 보시면 되구요.

참고로 아래에 올려놓은 부분들은 소스 전체 올리지는 않았구요.

또 그렇게 하지도 않을것이구요. 혹시나 제 글을 보시고 도움이 필요하거나(없으시겠지요?) 하시는 분들은...

메일주소(hanuli7@네이버)로 메일 주시면 제가 해결하면서 발생했던 문제점과 그에 대한 해결책 같은 부분들을

별도로 알려드리던지 하겟습니다.


이번 삽질은 오전 세시간 좀 걸려서 해결이 되었네요.

아, 다른 큰 난관에 비하면 세시간만에 해결된 건 빨리 끝난겁니다.

어쨌든 그럼 이제 한번 해보도록 하겠습니다. 


□ 설정 환경

 - 전자정부프레임워크 3.0(Spring 3.2.9 RELEASE + iBatis 2.3.4.726) - Maven 프로젝트 구성

 - JDK 1.7 64Bit

 - Tomcat 7.x

 - Oracle, Tibero, MSSql 데이터베이스

 - Atomikos 3.8.0(글쓰는 현재 3.9.3 버전이 최신이지만, 저는 뭐든지 조금 예전버전을 신뢰합니다.)


위와 같은 상황입니다.

저 정도가 대한민국 SI의 기본 개발환경 아닐까요???


1. Maven Pom.xml 수정

Atomikos 라이브러리를 사용하기 위하여 다음과 같이 Atomikos 라이브러리를 추가합니다.

<dependency>

<groupId>com.atomikos</groupId>

<artifactId>transactions-jta</artifactId>

<version>3.8.0</version>

</dependency>

<dependency>

<groupId>com.atomikos</groupId>

<artifactId>transactions-jdbc</artifactId>

<version>3.8.0</version>

</dependency>


기본적인 전자정부 프레임워크 설정이 다 되어있다는 전제하에(Spring Core, Web, Jdbc 등) 위와 같이 라이브러리 의존성을 추가하여 줍니다.


2. Database 연결 설정

저는 오라클, 티베로 그리고 MS-SQL을 연결 합니다. 오라클과 MS-SQL은 분산트랜젝션 설정이 널려있습니다.

티베로는 거의 자료가 없길래... 이건 제가 나중에 찾아보기 위해 정리를 해보겠습니다.

우선 오라클 설정입니다.

<bean id="dataSource-Oracle-XA" class="oracle.jdbc.xa.client.OracleXADataSource"

 destroy-method="close">

<property name="URL" value="jdbc:oracle:thin:@host:port:sid"/>

<property name="user" value="scott" />

<property name="password" value="tiger"/>

</bean>

<bean id="dataSource_Oracle" class="com.atomikos.jdbc.AtomikosDataSourceBean"

   init-method="init" destroy-method="close">

    <property name="uniqueResourceName" value="oracleXAds"/>

    <property name="xaDataSource" ref="dataSource-Oracle-XA"></property>

    <property name="poolSize" value="3"/>

</bean>


그리고 티베로 설정 입니다.

<bean id="dataSource-Tibero-XA" class="com.tmax.tibero.jdbc.ext.TbXADataSource">

<property name="URL" value="jdbc:tibero:thin:@server:port:tibero" />

<property name="user" value="tibero"/>

<property name="password" value="tibero"/>

</bean>


<bean id="dataSource-Tibero" class="com.atomikos.jdbc.AtomikosDataSourceBean"

 init-method="init" destroy-method="close">

<property name="uniqueResourceName" value="tbXADataSource"/>

<property name="xaDataSource" ref="dataSource-Tibero-dd"/>

<property name="poolSize" value="3"/>

</bean>


다시 옮겨적어놓고 보니... 둘의 차이가 없네요..

차이라면 티베로의 XA 데이터소스 클래스에는 'close()' 메소드가 없더라구요.

위에 언급하지 않은 MS-SQL도 동일하게 하시면 됩니다.


3. 트랜젝션 설정

다음은 스프링의 트랜젝션 설정입니다. 전 이런 설정이 막 어노테이션으로 클래스마다 들어있는 걸

별로 좋아하지 않습니다. 뭔가 나이스하지 않은 느낌?!

트랜젝션 설정 파일(context-transaction.xml이나 applicationConfig.xml 등)에 스프링에서 사용할 

TransactionManager를 Atomikos의 트랜젝션매니저로 등록을 해줍니다.

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"

init-method="init" destroy-method="close">

<property name="forceShutdown">

<value>true</value>

</property>

</bean>


<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">

<property name="transactionTimeout">

<value>300</value>

</property>

</bean>


<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">

<property name="transactionManager" ref="atomikosTransactionManager"/>

<property name="userTransaction" ref="atomikosUserTransaction"/>

</bean>



네, 위와 같이 설정하시면 됩니다. 이전에는 아마도 스프링의 DataSourceTransactionManager이나

JpaTransactionManager등을 사용하셨겠지만, 이제는 JtaTransactionManager를 사용하셔야 합니다.

자바 트랜젝션 API의 분산 트랜젝션매니저 기능을 구현한 클래스이다 정도로 넘어가시고...

자세한건 귀찮으니까 구글에 한번 물어보시구요 ^^

이제 끝입니다.

그럼 Atomikos의 트랜젝션 매니저가 AtomikosDataSourceBean 객체의 데이터베이스 연결에 대한

트랜젝션을 모두 관리하게 됩니다.

물론 해당 트랜젝션에서 제외시키고 별도로 사용하시기 위하려면 AtomikosDataSourceBean 객체가 아닌

다른 datasource를 사용하셔도 무방합니다. 물론 이 경우에는 해당 데이터베이스의 연결에 대한 트랜젝션은

별도로 동작하게 되는거 잊지 마시구요.

이후부터는 별 다른 내용이 없습니다.

ibatis를 위한 sqlMapClient 객체를 각 데이터베이스별로 만드시고 쿼리도 만드시고 dao도 만드시면 됩니다.

그리고 이 모든 dao 객체를 service 객체에서 사용해보면 분산트랜젝션이 정상적으로 커밋, 롤백되는

경험을 하실 수 있으실 겁니다.


이렇게 하고 톰캣을 시작하면.. 다음과 같이 트랜젝션매니저가 동작하고 해당 datasource를 통한 연결이

정상적으로 트랜젝션매니저에 의해서 분산 트랜젝션이 관리되는 것을 볼 수 있습니다.


2015-04-24 14:08:24.815  INFO (Slf4jLogger.java:16): AtomikosDataSoureBean 'tbXADataSource': init...

2015-04-24 14:08:24.815  WARN (Slf4jLogger.java:12): AtomikosDataSoureBean 'tbXADataSource': no testQuery set - the connection pool will not be able to validate the connections!

2015-04-24 14:08:24.827  INFO (Slf4jLogger.java:16): AtomikosDataSoureBean 'tbXADataSource': initializing with [ xaDataSourceClassName=null, uniqueResourceName=tbXADataSource, maxPoolSize=3, minPoolSize=3, borrowConnectionTimeout=30, maxIdleTime=60, reapTimeout=0, maintenanceInterval=60, testQuery=null, xaProperties=[] loginTimeout=0]

2015-04-24 14:08:24.838 DEBUG (Slf4jLogger.java:20): Configuration: adding resource tbXADataSource

2015-04-24 14:08:24.839 DEBUG (Slf4jLogger.java:20): Configuration: added resource tbXADataSource

2015-04-24 14:08:24.842 DEBUG (Slf4jLogger.java:20): atomikos connection pool '': initializing...

(...중략...)

2015-04-24 14:08:25.032 DEBUG (Slf4jLogger.java:20): AtomikosDataSoureBean 'tbXADataSource': init done.

(...중략...)

2015-04-24 14:08:33.233 DEBUG (Slf4jLogger.java:20): AtomikosDataSoureBean 'oraclexa1': init done.

2015-04-24 14:08:39.375  INFO (Slf4jLogger.java:16): AtomikosDataSoureBean 'oraclexa2': init...

2015-04-24 14:08:39.376  WARN (Slf4jLogger.java:12): AtomikosDataSoureBean 'oraclexa2': no testQuery set - the connection pool will not be able to validate the connections!

(...중략...)

2015-04-24 14:08:39.737 DEBUG (Slf4jLogger.java:20): ThreadFactory: creating new thread: Atomikos:2

2015-04-24 14:08:39.738 DEBUG (Slf4jLogger.java:20): AtomikosDataSoureBean 'oraclexa2': init done.



위에 설명드린 것 이외에는, 정말 건드린게 없습니다.(근데 왜 세시간씩이나??)

근무중이니까 이정도만 설명드리고 마치고, 필요하신 분은 위에 적어드린 메일 주소로 메일 주시면

제가 설정하면서 겪은 증상과 그에 따른 해결 방법을 알려드리겠습니다.(도움 안될지도 몰라요.)




그럼 다음에 또 삽질글로 돌아오도록 하죠.

adios.



댓글