Programing/Spring

Spring Transaction 설정 방법. 에러발생? 롤백해.

리커니 2019. 9. 10. 14:23
반응형

Spring Transaction 설정 방법. 에러발생? 롤백해.

 

Transaction 처리는 쉽게 말해 DB의 상태를 바꾸는 작업단위입니다.

예를 들어 Delete 후에 Insert 를 해야 하는 로직이 있다면,

이 Delete, Insert는 하나의 transaction으로 관리해야 합니다.

Delete는 잘 되었는데 Insert할때 에러가 난다면? 데이터는 증발하게 되겠죠.

그래서 Delete가 잘 되고, Insert도 잘 되어야만 Commit을 해야 합니다. 아니면 Rollback을 해야하죠.

더보기

Commit : 모든 작업을 정상적으로 처리하겠다고 확정하는 명령어

Rollback : 작업 중 문제가 발생하였을때, 트랜젝션의 처리 과정에서 발생한 변경사항을 취소하고, 트랜젝션 과정을 종료.

 

그럼 Spring 에서 이 Transaction을 설정하는 방법을 알아보도록 하겠습니다.

Spring 설정파일 경로에 context-transaction.xml 파일을 추가합니다.

 

<?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:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="*" rollback-for="Exception"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="requiredTx" expression="execution(* 프로젝트경로..service.impl.*Impl.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
    </aop:config>
</beans>

 

프로젝트의 모든 인터페이스를 상속받은 클래스의 모든 메소드를 기준으로 트랜젝션 설정을 합니다.

AOP에 대해서는 아래의 Link를 참고하세요.

Link : AOP 관련내용

 

'aop'의 검색결과

Work hard. Dream big.

aljjabaegi.tistory.com

 

그리고 트랜젝션 처리 할 메소드에 @Transactional 어노테이션을 추가해줍니다.

 

[예시 코드]

@Override
@Transactional
public void delResult(List<CompareVO> list) throws Exception{
    try{
        msdAnalMapper.delResult(list);    
    }catch(Exception e1){
        LOGGER.error("MSD 삭제 에러", e1);
        throw e1;
    }
    try {
        msdAnalMapper.delDpResult(list);
    } catch (Exception e2) {
        LOGGER.error("MSD_DUP 삭제 에러", e2);
        throw e2;
    }
    try{
        msdAnalMapper.delCompareResult(list);
    }catch(Exception e3){
        LOGGER.error("COMPARE_RESULT 삭제 에러", e3);
        throw e3;
    }
    try {
        msdAnalMapper.delDpCompareResult(list);
    } catch (Exception e4) {
        LOGGER.error("DUP_COMPARE_RESULT 삭제 에러", e4);
        throw e4;
    }
}

 

위의 코드 처럼 작성을 하게되면 4개의 로직 중 하나의 로직에서 Exception이 발생하면

Exception 발생 전 트랜젝션을 모두 Rollback 하게 됩니다.

 

반응형