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
'개발 > Java & Kotlin' 카테고리의 다른 글
[Java] Null Object Pattern 공부 (29) | 2025.05.04 |
---|---|
[JPA] JPA에서 양방향 @OneToOne 관계와 Lazy Loading의 한계 (95) | 2025.04.06 |
[Spring] 의존성 주입 간단히 알아보자 (94) | 2025.03.31 |
[Spring] 스프링 트랜잭션 전파 속성 (39) | 2025.03.29 |
[Spring] CQRS 패턴이란? (98) | 2025.03.23 |