| 목차 >> Transaction Manager(tx) +- GlueTransactionManager ----+- Service Layer에서의 트랜잭션 ----+- Activity Layer에서의 트랜잭션 +- GlueDataSourceTransactionManager +- GlueLazyDataSourceTransactionManager |
이번 장에서 다루는 Transaction Manager는 이전 장의 Data Access Object(DAO)와 같이 사용됩니다.
GlueTransactionManager는 트랜잰선 관리 interface입니다. GlueTransactionManager에서 제공하는 메소드는 Java Doc을 참고합니다 (GlueAPI).
Transaction Manager는 dao와 한쌍으로 applicationContext.xml에 정의합니다.
<bean id="dao" class=. . . /> <bean id="tx" class=. . . />
Glue Service에서 dao가 사용되는 경우 다음과 같이 <transaction-manager>가 추가되어 있어야 DB에 대한 트랜잭션(commit)이 반영됩니다.
<?xml version="1.0" encoding="UTF-8"?>
<service name="hello-service" initial="HelloActivity" xmlns="http://www.poscoict.com/glueframework/service">
<transaction-manager id="tx" commit="true"/>
<activity . . ./>
</service>
transaction-manager 은 다음 속성을 필요로 합니다.
GlueActivity의 JavaDoc에는 다음과 같은 Method가 있습니다 (GlueAPI 참고).
public class SampleActivity extends GlueActivity<GlueContext> {
@Override
public String runActivity( GlueContext ctx )
{
. . .
/* activity가 속한 service.xml 의 transaction-manager의 id 값 */
String transactionMgrKey = "tx";
try
{
this.commitTransaction(transactionMgrKey);
. . .
} catch ( Exception ex ) {
this.rollbackTransaction(transactionMgrKey)
. . .
}
return GlueBizControlConstants.SUCCESS;
}
}
GlueBizController는 Glue Service를 실행할 때, 등록되어 있는 <transaction-manager>를 기준으로 Transaction들을 Start합니다. Glue Service가 정상 종료 하였을 경우에는 start된 Transaction들을 Commit하고 Exception이 발생한 경우에는 start된 Transaction들을 Rollback합니다.
Transaction의 관리(start,commit,rollback)은 Service Layer에서 처리되는 것이 기본 원칙이므로, Activity Layer에서 Commit혹은 Rollback 이 필요한 경우에는 GlueActivity에서 제공하는 2개의 메소드를 사용합니다. 이 때 메소드의 인자는 Glue Service에 등록되어 있는 <transaction-manager>를 사용하여야 합니다.
GlueService에 등록되어 있는 <transaction-manager>를 얻어와서, Transaction처리가 가능한지 확인하는 방법은 아래와 같습니다. (ver glue-core-4.2.7-RELEASE 부터 지원)
public class SampleActivity extends GlueActivity<GlueContext> {
@Override
public String runActivity( GlueContext ctx )
{
. . .
/* activity가 속한 service.xml 의 transaction-manager의 id 값 */
String transactionMgrKey = "tx";
GlueService service = (GlueService) ctx.get( (String) ctx.get( GlueBizControlConstants.SERVICE_NAME ) );
if ( service.getTransactionManagers().containsKey( transactionMgrKey ) )
{
try
{
this.commitTransaction(transactionMgrKey);
. . .
} catch ( Exception ex ) {
this.rollbackTransaction(transactionMgrKey)
. . .
}
}else{
/* activity가 subservice 에 속할 경우, 경우에 따라 commit, rollback 사용 가능 */
}
return GlueBizControlConstants.SUCCESS;
}
}
GlueDataSourceTransactionManager의 상속관계 및 메소드는 Java Doc을 참고합니다 (GlueAPI).
GlueDataSourceTransactionManager의 속성(property)는 다음과 같습니다.
dataSource : 참조할 DataSource Bean. 필수.
<bean id="tx" class="com.poscoict.glueframework.transaction.GlueDataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
transactionDefinition : 참조할 Transaction Definition. 선택.
<bean id="tx" class="com.poscoict.glueframework.transaction.GlueDataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
<property name="transactionDefinition" ref="tx-def"/>
</bean>
<bean id="tx-def" class="com.poscoict.glueframework.transaction.GlueDefaultTransactionDefinition">
<property name="isolationLevelName" value="ISOLATION_DEFAULT"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED_NEW"/>
<property name="readOnly" value="false"/>
<property name="timeout" value="100"/>
</bean>
| 그림 : GlueDataSourceTransactionManager |

<bean id="dao" class="com.poscoict.glueframework.dao.GlueJdbcDao">
<property name="dataSource" ref="dataSource"/>
<property name="queryManager" ref="queryManager"/>
</bean>
<bean id="tx" class="com.poscoict.glueframework.transaction.GlueDataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" class= . . . />
<bean id="queryManager" class= . . . />
<bean id="dao" class="com.poscoict.glueframework.dao.mybatis.GlueMybatisDao">
<property name="sqlSession" ref="sqlSession" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:mybatis/mapper/*.xml" />
</bean>
<bean id="tx" class="com.poscoict.glueframework.transaction.GlueDataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" class= . . . />
GlueLazyDataSourceTransactionManager의 상속관계 및 메소드는 Java Doc을 참고합니다 (GlueAPI).
GlueLazyDataSourceTransactionManager의 속성(property)는 다음과 같습니다.
dataSource : 참조할 DataSource Bean. 필수.
<bean id="tx" class="com.poscoict.glueframework.transaction.GlueLazyDataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
transactionDefinition : 참조할 Transaction Definition. 선택.
<bean id="tx" class="com.poscoict.glueframework.transaction.GlueLazyDataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
<property name="transactionDefinition" ref="tx-def"/>
</bean>
<bean id="tx-def" class="com.poscoict.glueframework.transaction.GlueDefaultTransactionDefinition">
<property name="isolationLevelName" value="ISOLATION_DEFAULT"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED_NEW"/>
<property name="readOnly" value="false"/>
<property name="timeout" value="100"/>
</bean>
| 그림 : GlueLazyDataSourceTransactionManager |

다음은 GlueService 없이 사용하는 Java Code 예시입니다.
GlueLazyTransactionManager tx = GlueStaticContext.getBeanFactory().getBeanObject("tx", GlueLazyTransactionManager.class);
tx.startTransaction();
boolean isError = . . . ;
. . .
if ( isError ) {
tx.lazyRollback();
}else{
tx.lazyCommit();
}
다음은 Activity Layer에서의 Java Code 예시입니다.
public class CustomActivity extends GlueActivity{
public String runActivity( GlueContext ctx )
GlueLazyTransactionManager tx = GlueStaticContext.getBeanFactory().getBeanObject("tx", GlueLazyTransactionManager.class);
boolean isError = . . . ;
. . .
if ( isError ) {
tx.lazyRollback();
}else{
tx.lazyCommit();
}
tx.startTransaction();
return GlueBizControlConstants.SUCCESS;
}
}
<bean id="dao" class="com.poscoict.glueframework.dao.GlueLazyJdbcDao">
<property name="dataSource" ref="dataSource"/>
<property name="queryManager" ref="queryManager"/>
<property name="fetchSize" ... />
<property name="countQuery" ... />
</bean>
<bean id="tx" class="com.poscoict.glueframework.transaction.GlueLazyDataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" class= . . . />
<bean id="queryManager" class= . . . />
| Prev | Home | Next |