개발/Java & Kotlin

[Spring] 트랜잭션 롤백하는 예외

devhooney 2025. 5. 12. 07:58
728x90

예외 종류에 따라서 트랜잭션 롤백이 다르게 동작한다.

 

 

Spring Framework 기준으로 트랜잭션이 롤백되는 예외는 다음과 같은 규칙을 따른다.

 

728x90

 

 

✅ 기본 롤백 규칙

예외타입 트랜잭션 롤백 여부
RuntimeException (또는 그 하위 클래스) O (롤백됨)
Error O (롤백됨)
Checked Exception X (롤백 안 됨)

 

 

 

 

❗ 예시

@Transactional
public void someMethod() throws IOException {
    // IOException은 Checked Exception이므로 기본적으로 롤백되지 않음
    throw new IOException("checked exception");
}

 

위의 경우 트랜잭션은 롤백되지 않는다.

 

@Transactional
public void someMethod() {
    throw new IllegalArgumentException("runtime exception");
}

 

이 경우는 RuntimeException이므로 트랜잭션이 롤백된다.

 

 

 

🔧 롤백 조건 커스터마이징
원하는 예외에 대해 명시적으로 롤백하려면 @Transactional의 속성을 활용한다:

@Transactional(rollbackFor = IOException.class)
public void someMethod() throws IOException {
    throw new IOException("이제는 롤백됨");
}

 

또는 복수의 예외를 지정할 수도 있다:

@Transactional(rollbackFor = {IOException.class, SQLException.class})


반대로 특정 예외에 대해 롤백을 하지 않도록 하려면:

@Transactional(noRollbackFor = CustomBusinessException.class)

 

 

 


 

📌 결론 정리

조건 트랜잭션 롤백 여부
RuntimeException, Error O (기본적으로 롤백됨)
Checked Exception X (기본적으로 롤백 안 됨)
rollbackFor 명시 O (롤백됨)
noRollbackFor 명시 X (롤백 안 됨)

 

728x90