hanker

Spring - 프로시저 롤백처리 방법에 관해(TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()) 본문

SPRING

Spring - 프로시저 롤백처리 방법에 관해(TransactionAspectSupport.currentTransactionStatus().setRollbackOnly())

hanker 2024. 10. 16. 00:09
반응형

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()

1. TransactionAspectSupport: Spring AOP의 트랜잭션 관리를 지원하는 클래스
2. currentTransactionStatus(): 현재 실행 중인 트랜잭션의 상태 정보를 가져온다.
3. setRollbackOnly(): 트랜잭션 상태를 롤백 전용으로 설정


동작은
1. 트랜잭션 상태 확인: 현재 실행 중인 트랜잭션의 상태를 가져온 후
2. 롤백 표시: 해당 트랜잭션을 롤백해야 함을 Spring에 알림
3. 트랜잭션 종료 시 동작: 메서드가 종료될 때 Spring이 트랜잭션을 자동으로 롤백


@Transactional 어노테이션은 런타임 예외처리(RuntimeException)에서만 롤백을 수행하기 때문에, 체크드 예외(Checked Exception)처리로 세밀한 제어가 가능하다.

논외.
체크드 예외처리란 : 컴파일 시점에 처리 여부를 체크하는 예외처리 (RuntimeException 과 그 하위 클래스를 제외한 Exception)  
대표적으로 IOException, SQLException, ClassNotFoundException 이 있다.



예외를 throw하지 않고도 트랜잭션을 롤백할 수 있다.
단, @Transactional 내에서 사용해야함 

또한 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 실행 후 메서드가 종료되지 않음 이어서 계속 실행되고 메서드가 종료될 때 롤백 된다.

 

 

예제 코드

@Service
@RequiredArgsConstructor
@Slf4j
public class TestServiceImpl {

    private final TestRepository testRepository;


    @Transactional
    public Map<String, Object> testTransactional(){
        Map<String, Object> result = new HashMap<>();

        try {
            Map<String, Object> map = testRepository.testCallA();

            if (!map.containsKey("result")) {
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                result.put("status", "ROLLBACK");
                result.put("message", "롤백처리");
                return result;
            } else {
                testRepository.testCallB();
                result.put("status", "SUCCESS");
                result.put("message", "성공");
            }
        } catch (Exception e) {
            log.error("Error", e);
            result.put("status", "ERROR");
            result.put("message", e.getMessage());
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }

        return result;
    }

}

 

위 코드를 간략하게 설명하자면

1. testCallA 프로시저를 실행해서 결과 값을 map에 담는다.

2. map안에 result라는 key가 없으면 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly() 발생

3. result안에 status와 message를 넣고 return 

4. map안에 result라는 key가 있으면 testCallB 프로시저 호출

 

 

간단하게 설정이 가능하다.

 

 

끝.

반응형