반응형
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️⃣ 실무에서 사용하는 이유
- REQUIRED: 기본 CRUD, 트랜잭션 공유
- REQUIRES_NEW:
- 로그, 감사, 외부 결제 → 반드시 commit 필요
- 메인 트랜잭션 실패해도 기록 유지
- NESTED: 일부 작업만 rollback 가능
- 기타 옵션: 특수 상황에서 트랜잭션 격리/참여 조절
5️⃣ 면접 대비 포인트
- 질문: “트랜잭션 전파 옵션 차이?”
- 답변:
- REQUIRED = 기본, 기존 참여
- REQUIRES_NEW = 독립 트랜잭션, commit/rollback 분리
- finally는 트랜잭션과 무관 → DB rollback 시 영향 받음
- 경험 예시: “주문 처리 중 로그 기록은 REQUIRES_NEW 적용”
한 줄 요약
Propagation은 메서드 호출 시 트랜잭션 참여/생성/중단 여부를 결정하며, REQUIRES_NEW는 독립 commit이 필요한 경우, REQUIRED는 기본 공유 트랜잭션, finally는 단순 실행 보장일 뿐 트랜잭션과는 무관하다.
반응형
'IT' 카테고리의 다른 글
| Business Exception vs System Exception (0) | 2025.12.15 |
|---|---|
| Spring @ControllerAdvice 완전 정리 (0) | 2025.12.15 |
| 외부 API 장애에도 우리 서비스가 죽지 않게 하는 방법 (0) | 2025.12.15 |
| 낙관적 락 vs 비관적 락 (0) | 2025.12.15 |
| 같은 서버에서 톰캣 별도 인스턴스 띄우기 (0) | 2025.12.11 |
댓글