Programing/Spring

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

리커니 2019. 9. 10.
반응형

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 하게 됩니다.

 

반응형

댓글

💲 추천 글