본문 바로가기
IT

Spring @Transactional Propagation 완전 정리

by urosie 2025. 12. 15.
반응형

1️⃣ 기본 개념

  • 트랜잭션: DB 작업 단위를 묶어 commit/rollback을 보장
  • Propagation: 메서드 호출 시 이미 존재하는 트랜잭션을 어떻게 처리할지 지정
 
@Transactional public void doSomething() { // 기본값 REQUIRED 적용 }
  • 아무 설정 안 하면 REQUIRED가 기본값
  • 의미: 기존 트랜잭션 참여, 없으면 새 생성

2️⃣ 주요 Propagation 옵션

옵션동작예시/사용 이유
REQUIRED 기본값. 기존 트랜잭션 참여, 없으면 새 생성 일반 CRUD 메서드
REQUIRES_NEW 항상 새 트랜잭션 생성, 기존 트랜잭션 일시 중단 로그, 결제, 독립 commit 필요 시
SUPPORTS 기존 트랜잭션 있으면 참여, 없으면 트랜잭션 없이 실행 선택적 트랜잭션 처리
NOT_SUPPORTED 기존 트랜잭션 있으면 일시 중단, 트랜잭션 없이 실행 트랜잭션과 무관한 작업
MANDATORY 기존 트랜잭션 반드시 필요, 없으면 예외 트랜잭션 없는 호출 막기
NEVER 트랜잭션 있으면 예외, 없으면 실행 트랜잭션과 절대 분리
NESTED 기존 트랜잭션 안에서 중첩 트랜잭션 생성 (JDBC Savepoint 사용) 일부만 rollback 가능

3️⃣ REQUIRES_NEW vs finally

  • finally: 코드 실행은 보장되지만, 메인 트랜잭션 rollback 시 DB 변경도 취소됨
  • REQUIRES_NEW: 별도 트랜잭션 → 메인 rollback과 관계없이 commit 가능
 
@Transactional public void placeOrder() { try { // 주문 처리 } finally { logAction(); // rollback되면 로그도 사라짐 } } @Transactional(propagation = REQUIRES_NEW) public void logAction() { // 독립 트랜잭션, 메인 rollback 영향 없음 }

4️⃣ 실무에서 사용하는 이유

  1. REQUIRED: 기본 CRUD, 트랜잭션 공유
  2. REQUIRES_NEW:
    • 로그, 감사, 외부 결제 → 반드시 commit 필요
    • 메인 트랜잭션 실패해도 기록 유지
  3. NESTED: 일부 작업만 rollback 가능
  4. 기타 옵션: 특수 상황에서 트랜잭션 격리/참여 조절

5️⃣ 면접 대비 포인트

  • 질문: “트랜잭션 전파 옵션 차이?”
  • 답변:
    • REQUIRED = 기본, 기존 참여
    • REQUIRES_NEW = 독립 트랜잭션, commit/rollback 분리
    • finally는 트랜잭션과 무관 → DB rollback 시 영향 받음
    • 경험 예시: “주문 처리 중 로그 기록은 REQUIRES_NEW 적용”

한 줄 요약

Propagation은 메서드 호출 시 트랜잭션 참여/생성/중단 여부를 결정하며, REQUIRES_NEW는 독립 commit이 필요한 경우, REQUIRED는 기본 공유 트랜잭션, finally는 단순 실행 보장일 뿐 트랜잭션과는 무관하다.

반응형

댓글