개발자 미니민의 개발스터디

[spring] 트랜잭션 처리 주의사항

by mini_min
[spring] 트랜잭션 처리 주의사항

✔️ 트랜잭션 처리

1) 트랜잭션 처리를 위한 AOP 등록하기 (마이바티스 -CONTEXT 쪽 짜세요)

<aop:config proxy-target-class="true">
    <aop:pointcut expression="execution(public * com.sp.app..*Controller.*(..))"
         id="controllerOperation"/>
</aop:config>

 

2) DataSourceTransactionManager

: JDBC 기반 트랜잭션 관리자다.

: JDBC, 마이바티스 등 JDBC 기반 라이브러리로 데이터베이스에 접근하는 경우 이용한다.

: 커밋, 롤백 등의 메소들 사용해 트랜잭션을 관리한다. DataSourceTransactionManager 을 직접 사용하는 경우 코드에서 커밋, 롤백 처리를 해야한다.

 

2-1) TransactionTemplate

: 트랜잭션과 관련된 작업(커밋, 트랜잭션 시작, 롤백 등)을 처리해주는 템플릿 클래스이다.

: 프로그램에서 직접 트랜잭션을 관리하고자 할 때 사용한다.

: 코드에서 TransactionTemplate.execute() 등의 메소드를 이용해 트랜잭션을 처리한다.

 

2-2) 선언적 방법을 통한 트랜잭션 처리

: 트랜잭션 템플릿과 달리 트랜잭션 처리를 코드에서 직접 하지 않고 설정 파일이나 애노테이션을 이용해 범위, 롤백 등을 정의한다. 

방법 : <tx:advice> 태그 이용해 처리 / @Transactional 애노테이션을 이용한 트랜잭션 설정

<!-- 트랜잭션관리자 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<!-- 트랜잭션과 관련된 작업(트랜잭션시작, 커및, 롤백등) -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager" />
</bean>

<!--  선언적 방법으로 트랜잭션 처리 : XML 또는 @Transactional 애노테이션으로 트랜잭션 처리  -->
<!-- 트랜잭션을 위한 advice 작업 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="insert*" rollback-for="Exception"/>
        <tx:method name="update*" rollback-for="Exception"/>
        <tx:method name="delete*" rollback-for="Exception"/>
    </tx:attributes>
</tx:advice>

<!-- AOP 적용 -->
<aop:config proxy-target-class="true">
    <aop:pointcut expression="execution(public * com.sp.app..*Service.*(..))" 
        id="serviceOperation"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"
        id="transactionAdvisor"/>
</aop:config>

 

3) 트랜잭션을 처리해야 하는 작업은 하나의 try{~} catch(){} 블럭에서 코딩해야한다.

@Override
public void insertDemo(Demo dto) throws Exception {
    try {

        //트랜잭션을 처리해야 하는 작업은 하나의 try{~} catch(){} 블럭에서 코딩해야함
        dao.insertData("ts1.insertDemo1", dto);
        dao.insertData("ts1.insertDemo2", dto);
        dao.insertData("ts1.insertDemo3", dto);

    } catch (Exception e) {
        e.printStackTrace();
        throw e;
    }

}

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기