🌐 웹개발/웹 개발

Spring @Transactional 어노테이션 적용 안될 때 | try-catch문, 체크드 예외

두_두 2025. 1. 3. 10:49

까먹기전에 짧게 정리. 분명 어노테이션을 적용했는데도 롤백이 되지 않아서 찾아봤다.

 

앙딱정

1. @Transactionl 어노테이션을 썼다 해도  try-catch문으로 예외 처리를 한다면 롤백이 적용되지않는다. 따라서 catch문에서 예외를 다시 발생시키거나, 강제로 롤백을 실행해야한다.

2. 체크드 예외를 적용했을 경우 따로 어노테이션에 rollbackFor 속성을 추가해야한다.

 

🌈Try-cath 문 사용 시

한 줄 정 리 : catch문 안에 throw new Exception(); 을 넣어서 예외를 발생시켜야 한다

방법1 | 예외 재발생

@Transactional
public void yourMethod() {
    try {
        // 비즈니스 로직
    } catch (Exception e) {
        // 예외를 로깅하거나 추가 작업 수행
        System.out.println("Exception occurred: " + e.getMessage());

        // 예외를 다시 발생시켜 롤백 트리거
        throw new RuntimeException("Forced rollback due to exception", e);
    }
}

 

 

방법 2 | 롤백 강제

import org.springframework.transaction.interceptor.TransactionAspectSupport;

@Transactional
public void yourMethod() {
    try {
        // 비즈니스 로직
    } catch (Exception e) {
        // 롤백 강제
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        System.out.println("Rollback forced due to exception: " + e.getMessage());
    }
}

 

 

🚀체크드 예외

체크드 예외(Checked Exception)는 기본적으로 롤백되지 않음

  • rollbackFor 속성을 통해 롤백 대상을 명시적으로 설정해야 함.

한 줄 정 리 : throws로 던지는 예외가 존재하는 경우에는 rollbackFor 속성을 추가해라

예시

@Transactional(rollbackFor = Exception.class)
public void yourMethod() throws IOException {
    throw new IOException("Checked exception occurred");
}

 

그럼 다들 홧팅

728x90