Transaction Service

Transaction 관리에 대하여 일관성 있는 추상화된 방법을 제공하는 서비스로 다음과 같은 장점을 제공한다.
  • JTA, JDBC와 같은 서로 다른 Transaction API에 대해 일관성 있는 프로그래밍 모델을 제공한다.
  • 프로그램적인 Transaction 관리에 대한 사용하기 쉬운 API를 제공한다.
  • 선언적인 Transaction 관리를 지원한다.
  • Query Service와 통합이 용이하다.
  • Hibernate와 통합이 용이하다.
다음 목록에 제시된 Transaction 서비스 중, 적합한 서비스를 선택하여 Transaction을 관리할 수 있다.

DataSource Transaction Service

DataSource Transaction 서비스는 DataSource를 사용하여 Local Transaction을 관리한다.

Samples

다음은 DataSource Transaction 서비스의 속성 설정 및 테스트 코드에 대한 예제이다.
  • Configuration
  • 다음은 DataSourceTransactionManager의 속성 정의 파일인 applicationContext-transaction-datasource.xml 의 일부이다. 여기에서는 dataSource property를 정의해 주어야 한다.
    <bean id="transactionManagerDataSource" 
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	<property name="dataSource"><ref bean="common_datasource"/></property>
    </bean>
    위에서 제시한 common_datasource Bean은 DataSource 서비스의 속성을 정의한 applicationContext-datasource-common.xml 파일에 다음과 같이 정의되어 있다.
    <bean id="common_datasource
       " class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:file:/./db/sampledb"/>
        <property name="username" value="sa"/>
    </bean>
  • TestCase
  • 다음은 앞서 정의한 속성 설정을 기반으로 하여 DatSource Transaction 서비스를 이용하여 Transaction 처리 기능을 테스트 하는 TransactionServiceTestDataSource.java 코드의 일부이다. 실제 테스트 메소드는 AbstractTransactionServiceTest.java 에 공통으로 작성되어 있다. DatSource Transaction 서비스를 테스트하기 위해서는 setUp() 메소드를 다음과 같이 작성해준다.
    public class TransactionServiceTestDataSource extends AbstractTransactionServiceTest {
       중략...
       protected void setup() {
          super.setup();
          this.service = (TransactionTestSampleService)context.getBean("transactionSampleDataSource");
          this.transactionManager = (PlatformTransactionManager)context
                                                            .getBean("transactionManagerDataSource");
       }
    }

Hibernate Transaction Service

Hibernate Transaction 서비스는 DataSource를 사용하여 Local Transaction과 Hibernate Session을 관리한다. HibernateTransactionManager는 SessionFactoryBean에 의존성을 가지고 있으므로 반드시 SessionFactoryBean 설정과 함께 정의되어야 한다.

Samples

다음은 Hibernate Transaction 서비스의 속성 설정 및 테스트 코드에 대한 예제이다.
  • Configuration
  • 다음은 HibernateTransactionManager의 속성 정의 파일인 applicationContext-transaction-hibernate.xml 의 일부이다. 여기에서 sessionFactory property를 정의해 주는데, sessionFactory 설정은 sessionFactory Bean을 참조하고 있음을 알 수 있다. Hibernate의 sessionFactory Bean 설정 방법은 Hibernate 서비스 매뉴얼 내용을 참고한다.
    <bean id="transactionManagerHibernate"
    	class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    	<property name="sessionFactory" ref="sessionFactory" />
    </bean>
    
    위에서 sessionFactory Bean은 Hibernate 서비스 속성을 정의한 applicationContext-hibernate.xml 파일에 다음과 같이 정의되어 있다.
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
      <property name="dataSource" ref="common_datasource" />
      <property name="mappingDirectoryLocations">
        <value>classpath:/integration/anyframe/services/hibernate/sample</value>
      </property>
      <property name="hibernateProperties">
        <props>
          <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
          <prop key="hibernate.show_sql">true</prop>
          <prop key="hibernate.cache.provider_class">org.hibernate.cache.OSCacheProvider</prop> 
          <prop key="hibernate.cache.use_second_level_cache">true</prop>         
        </props>
      </property>
    </bean>
  • TestCase
  • 다음은 앞서 정의한 속성 설정을 기반으로 하여 Hibernate Transaction 서비스를 이용하여 Transaction 처리 기능을 테스트 하는 TransactionServiceTestHibernate.java 코드의 일부이다. 실제 테스트 메소드는 AbstractTransactionServiceTest.java 에 공통으로 작성되어 있다. DatSource Transaction 서비스를 테스트하기 위해서는 setUp() 메소드를 다음과 같이 작성해준다.
    public class TransactionServiceTestHibernate extends AbstractTransactionServiceTest {
       중략...
       protected void setup() {
          super.setup();
          this.service = (TransactionTestSampleService)context.getBean("transactionSampleHibernate");
          this.transactionManager = (PlatformTransactionManager)context
                                                            .getBean("transactionManagerHibernate");
       }
    }

JTA Transaction Service

JTA Transaction 서비스는 JTA를 사용하여 Global Transaction 관리 부분을 추상화하고, 해당 서비스로 인해 JTA,JNDI 등에 종속되지 않게 구현할 수 있도록 도와준다. JndiTemplate Bean과 함께 정의되어야 한다. 또한 이때 DataSource 서비스는 JNDI DataSource 서비스 로 설정해줘야 한다.

Samples

다음은 JTA Transaction 서비스의 속성 설정 및 테스트 코드에 대한 예제이다.
  • Configuration
  • 다음은 JTATransactionManager의 속성 정의 파일인 applicationContext-transaction-jta.xml 의 일부이다. 여기에서 transactionManagerName property와 jnditemplate property를 정의해 주도록 한다. transactionManagerName property는 해당 WAS에 등록된 TransactionManager의 JNDI명을 정의해주며, 이것은 WAS 벤더 별로 다를 수 있다. 또한 jnditemplate property에는 해당하는 WAS의 provider url과 initial context factory 클래스명을 정의해준다.
    다음은 WebLogic Server를 통해 Transaction을 관리하고자 하는 경우 TransactionManager 설정에 대한 예제이다.
    <bean id="transactionManagerJTA"
       class="org.springframework.transaction.jta.WebLogicJtaTransactionManager">
       <property name="transactionManagerName"	value="javax.transaction.TransactionManager" />
       <property name="jndiTemplate" ref="jnditemplate"></property>
    </bean>
    
    <bean id="jnditemplate" class="org.springframework.jndi.JndiTemplate" >
       <property name="environment">
          <props>
             <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
             <prop key="java.naming.provider.url">t3://server.ip:7001</prop>
          </props>
       </property>
    </bean>
    또한, JEUS Server를 통해 Transaction을 관리하고자 하는 경우에는 다음과 같이 TransactionManager를 설정할 수 있다.
    <bean id="transactionManagerJTA"
       class="org.springframework.transaction.jta.JtaTransactionManager">
       <property name="transactionManagerName"	value="java:/TransactionManager" />
       <property name="jndiTemplate" ref="jnditemplate"></property>
    </bean>
    
    <bean id="jnditemplate" class="org.springframework.jndi.JndiTemplate" >
       <property name="environment">
          <props>
             <prop key="java.naming.factory.initial">jeus.jndi.JNSContextFactory</prop>
             <prop key="java.naming.provider.url">server.ip:9736</prop>
          </props>
       </property>
    </bean>
    JEUS Server는 추가 설정없이도 기본적으로 TransactionManager를 가지고 있으며 해당 TransactionManager의 JNDI명은 java:/TransactionManager 이다. JNDI 명이 java:/TransactionManager인 TransactionManager를 찾지 못해 javax.naming.NameNotFoundException이 발생하였다면 해당 프로젝트의 클래스패스 내에 j2ee-x.x.jar 파일이 추가되어 있지 않은지 확인하여 삭제하도록 한다. 이는 JEUS Server를 위한 기본 라이브러리 내에 존재하는 Transaction 처리 관련 클래스와의 충돌로 인해 발생하는 문제이기 때문이다.
    JNDI DataSource 서비스는 아래와 같이 설정하도록 한다.
    <bean class="org.springframework.jndi.JndiObjectFactoryBean" id="common_datasource">
       <property name="jndiName" value="AnyframeDS"/>
       <property name="jndiTemplate" ref="jnditemplate"/>
    </bean>
  • TestCase
  • 다음은 앞서 정의한 속성 설정을 기반으로 하여 JTA Transaction 서비스를 이용하여 Transaction 처리 기능을 테스트 하는 TransactionServiceTestJTA.java 코드의 일부이다. 실제 테스트 메소드는 AbstractTransactionServiceTest.java 에 공통으로 작성되어 있다. DatSource Transaction 서비스를 테스트하기 위해서는 setUp() 메소드를 다음과 같이 작성해준다.
    public class TransactionServiceTestHibernate extends AbstractTransactionServiceTest {
       중략...
       protected void setup() {
          super.setup();
          this.service = (TransactionTestSampleService)context.getBean("transactionSampleJTA");
          this.transactionManager = (PlatformTransactionManager)context
                                                 .getBean("transactionManagerJTA");
       }
    }
예제 테스트 코드는 런타임시 WebLogic 라이브러리를 참조하므로 [WebLogic Home]/server/lib/ 폴더의 weblogic-9.2.jar, xbean-9.2.jar 파일을 [Anyframe Core 설치 폴더] 내에 복사해 두어야 한다. 위 작업이 완료된 후, WebLogic Server가 성공적으로 시작된 상태에서 예제 테스트 코드를 실행하도록 한다. * [Anyframe Core 설치 폴더]라함은 [anyframe-X.X.X-bin.zip 압축 해제 위치]로 간주한다.

Resources