'Integration'에 해당되는 글 1건

  1. 2013.08.27 Atomikos 3.7 - Spring3.1 - Tomcat7 Integration

이번 포스트에서는 오픈소스 JTA 구현체인 Atomikos를 스프링 웹 어플리케이션 및 Tomcat과 연동하여 사용하는 방법에 대해 다뤄 보겠습니다. 기본적인 내용들은 Atomikos 홈페이지에서 다루고 있기는 하지만, 그대로 따라해보니 몇 가지 부족한 부분이 있더군요. 이 포스트에서는 원문을 보지 않고도 최대한 간단히, 그리고 빠르게 적용할 수 있도록 설명해 보도록 하겠습니다.

Atomikos 홈페이지에서 소개하고 있는 Tomcat Integration 정보는 [여기]에서 확인하실 수 있습니다. 이 페이지에서 자신이 사용하는 버전에 맞는 항목을 참고하시면 됩니다. 이 포스트에서는 Tomcat 7.x와 연동하는 방법에 대해 살펴보도록 하겠습니다.


이 포스트의 내용을 진행하기 위한 사전 준비사항은 다음과 같습니다.

  1. 설치 및 설정 완료된 Apache Tomcat 7.x
  2. 사용하는 DB에 대한 JDBC Driver JAR 파일
  3. Tomcat에서 실행할 스프링 웹 어플리케이션
  4. Atomikos에서 제공하는 JAR 파일 
    1. atomikos-integration-extension-3.7.1-20120529.jar


아래 내용에서 사용되는 환경변수들은 다음과 같습니다.

  • $CATALINA_HOME : 톰캣 설치 디렉토리.
  • $CATALINA_LIB : $CATALINA_HOME/lib - 톰캣이 사용할 라이브러리가 위치하는 디렉토리
  • $CATALINA_CONF : $CATALINA_HOME/conf - 톰캣에 대한 환경설정 파일 이 위치한 디렉토리
  • $WEB_CONTEXT_ROOT : 웹 어플리케이션이 설치된 디렉토리


  1. 먼저 Tomcat에 대한 설정을 진행합니다. (2~7)

  2. 사용하는 DB에 대한 JDBC 드라이버 JAR 파일을 $CATALINA_LIB 디렉토리에 복사해 넣습니다.
    (저의 경우에는 Oracle10g를 위한 ojdbc6.jar 파일을 넣었습니다.)

  3. atomikos-integration-extension-3.7.1-20120529.jar 파일을 $CATALINA_LIB 디렉토리에 복사해 넣습니다.

  4. 그 외 JTA와 Spring 연동을 위한 갖가지 라이브러리들을 $CATALINA_LIB 디렉토리에 복사해 넣습니다.
    (atomikos-integration-extension-3.7.1-20120529.jar 파일은 2번에서 이미 넣은 것이니 여기서는 생략해도 됩니다.)


    이 파일들은 [JAR Finder]에서 검색하여 다운로드 받으실 수 있습니다. (이 파일들이 없으면 Tomcat 기동 시 수많은 오류를 보게 될 것입니다.)

  5. $CATALINA_CONF/server.xml 파일에 다음 내용을 입력합니다.
    <Listener className="com.atomikos.tomcat.AtomikosLifecycleListener" />
    


  6. $CATALINA_CONF/context.xml 파일에 다음 내용을 입력합니다. 이 정보는 context.xml 파일에 등록되어 있는 <WatchedResource> 태그 이후에 입력합니다.
        <Transaction factory="com.atomikos.icatch.jta.UserTransactionFactory" />
    	<!-- Also register Atomikos TransactionManager as java:comp/env/TransactionManager -->
        <Resource name="TransactionManager"
                auth="Container"
                type="com.atomikos.icatch.jta.UserTransactionManager"
                factory="org.apache.naming.factory.BeanFactory" />
    
        <!-- Spring LoadTimeWeaver Support for the Tomcat server. -->
        <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"
              useSystemClassLoaderAsParent="false"/>
        <Resource
    			name="defaultDatasource"
    			auth="Container"
    			type="com.atomikos.jdbc.AtomikosDataSourceBean"
    			factory="com.atomikos.tomcat.EnhancedTomcatAtomikosBeanFactory"
    			uniqueResourceName="defaultDatasource"
    			xaDataSourceClassName="oracle.jdbc.xa.client.OracleXADataSource"
    			
    			xaProperties.serverName="xxx.xxx.xxx.xxx" 
    			xaProperties.portNumber="xxxx"  
    			xaProperties.user="xxxx"
    			xaProperties.password="xxxx"
    			xaProperties.databaseName="xxxx"
    			xaProperties.URL="jdbc:oracle:thin:@xxx.xxx.xxx.xxx:xxxx:xxxx"
    			
    			maxPoolSize="10"
    			minPoolSize="1"
    	/>      
    


  7. 여기까지 하면 일단 Tomcat에 대한 설정은 마무리된 것입니다. 이제 웹 어플리케이션에 대한 설정을 진행합니다.

  8. $WEB_CONTEXT_ROOT/WEB-INF/web.xml 파일에 다음과 같이 resource-ref 정보를 입력합니다. 8에서 입력했던 Datasource 정보를 이용합니다.
    	<resource-ref>
    		<res-ref-name>defaultDatasource</res-ref-name>
    		<res-type>com.atomikos.jdbc.AtomikosDataSourceBean</res-type>
    		<res-auth>Container</res-auth>
    		<res-sharing-scope>Unshareable</res-sharing-scope>
    	</resource-ref>
    


  9. 스프링 웹 어플리케이션에서 사용할 데이터소스 정보와 트랜잭션 매니저 정보를 다음과 같이 스프링 컨텍스트 파일에 입력합니다. 이 예제에서는 MyBatis를 같이 이용하고 있습니다.
    <?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
    
    	<tx:annotation-driven transaction-manager="transactionManager" />
    
    	<jee:jndi-lookup id="defaultDataSource" jndi-name="defaultDatasource" />
    
    	<!-- Construct Atomikos UserTransactionManager, needed to configure Spring -->
    	<bean id="AtomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init"
    		destroy-method="close">
    
    		<!-- when close is called, should we force transactions to terminate or not? -->
    		<property name="forceShutdown" value="false" />
    	</bean>
    
    	<!-- Also use Atomikos UserTransactionImp, needed to configure Spring -->
    	<bean id="AtomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
    
    		<property name="transactionTimeout" value="300" />
    	</bean>
    
    	<!-- Configure the Spring framework to use JTA transactions from Atomikos -->
    	<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    		<property name="transactionManager" ref="AtomikosTransactionManager" />
    		<property name="userTransaction" ref="AtomikosUserTransaction" />
    	</bean>
    
    
    	<bean id="oracleSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    		<property name="dataSource" ref="defaultDataSource" />
    		<property name="configLocation" value="classpath:mybatis/oracle-configuration.xml" />
    	</bean>
    
    	<bean id="oracleSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    		<constructor-arg ref="oracleSessionFactory" />
    	</bean>
    
    	<bean id="myBatisMapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    		<property name="basePackage" value="com.bory.app.dao" />
    		<property name="annotationClass" value="org.springframework.stereotype.Repository" />
    	</bean>
    
    </beans>
    
    


  10. $WEB_CONTEXT_ROOT/WEB-INF/classes 디렉토리에 jta.properties 파일을 생성하고 그 내용을 적절히 수정합니다. jta.properties 파일에 대한 내용은 [여기]에서 확인하실 수 있습니다.


이제 모든 작업이 완료되었습니다. Tomcat을 재기동하면 Atomikos에 의해 트랜잭션 처리가 수행되는 웹 어플리케이션을 이용할 수 있게 됩니다.

신고
Posted by Layered 트랙백 0 : 댓글 0

댓글을 달아 주세요


티스토리 툴바