트랜잭션
title: 2026-02-28 author: 강병호 (이름) date: 2026-02-28 (날짜) category: TIL/강병호/2026/02 (파일 경로 : TIL/{이름}/{연}/{월}) layout: post (자유) —
1. Spring 프레임워크의 트랜잭션 롤백 매커니즘
Spring은 @Transactional 어노테이션을 통한 선언적 트랜잭션 관리 시, 예외의 종류에 따라 서로 다른 기본 정책을 적용합니다.
Checked Exception (체크 예외) 기본 동작: 트랜잭션을 롤백하지 않고 커밋(Commit)합니다.
사유: 컴파일 시점에 처리를 강제하는 예외로, 프레임워크는 이를 개발자가 충분히 복구 가능하거나 비즈니스 흐름상 예측 가능한 상황으로 간주합니다.
예시: IOException, SQLException 등.
Unchecked Exception (언체크 예외) 기본 동작: 예외 발생 시 트랜잭션을 즉시 롤백(Rollback)합니다.
대상: RuntimeException 및 그 하위 클래스, 그리고 Error.
사유: 프로그래머의 실수나 시스템의 치명적인 오류(회복 불가능)로 판단하기 때문입니다. Spring은 데이터 액세스 계층의 예외를 언체크 예외인 DataAccessException으로 추상화하여 일관된 전략을 제공합니다.
예시: NullPointerException, IllegalArgumentException 등.
2. 사용자 정의 롤백 설정
기본 정책과 무관하게 특정 상황에서 롤백 여부를 명시적으로 제어할 수 있습니다.
rollbackFor: 특정 Checked Exception이 발생했을 때도 롤백이 수행되도록 설정합니다.
예: @Transactional(rollbackFor = CustomException.class)
noRollbackFor: 특정 Unchecked Exception이 발생하더라도 롤백되지 않고 커밋되도록 설정합니다.
3. Java EE (Jakarta EE) 환경의 동작
EJB나 CDI 환경에서의 트랜잭션 관리는 Spring과 유사하나 관리 주체에 따라 차이가 있습니다.
컨테이너 관리 트랜잭션 (CMT) Unchecked Exception: 컨테이너가 자동으로 롤백을 수행합니다.
Checked Exception: 기본적으로 롤백하지 않으나, @ApplicationException(rollback=true)와 같은 어노테이션을 통해 롤백을 강제할 수 있습니다.
프로그래밍 방식의 트랜잭션 제어 (Programmatic) 개발자가 직접 UserTransaction API를 사용하여 시작과 종료를 관리합니다.
주의사항: 예외 종류에 따른 자동 롤백이 지원되지 않으므로, try-catch 블록 내에서 예외 발생 시 개발자가 직접 setRollbackOnly() 또는 rollback() 메서드를 호출해야 합니다.