반응형
propagation은 트랜잭션 전파(Propagation) 옵션이다.
스프링의 @Transactional은 이미 진행 중인 트랜잭션이 있을 때, 새로 호출된 메서드가 그 트랜잭션에 어떻게 참여할지를 결정
1. REQUIRED(기본값)
- 이미 트랜잭션이 있으면 → 거기에 합류
- 없으면 → 새 트랜잭션 시작
대부분의 경우 기본값으로 충분
예: 서비스에서 레포지토리를 여러 번 호출해도 하나의 트랜잭션으로 묶임
@Transactional(propagation = Propagation.REQUIRED)
사용 상황
일반적인 서비스/DAO 호출 대부분
예: 계좌 이체 서비스 → 출금 메서드, 입금 메서드 모두 같은 트랜잭션으로 묶여야 함
@Transactional // REQUIRED 기본값
public void transfer(...) {
withdraw(...); // 합류
deposit(...); // 합류
}
2. REQUIRES_NEW
- 항상 새로운 트랜잭션을 만듦
- 기존 트랜잭션은 잠시 보류(suspend)
부분적으로 독립 커밋/롤백이 필요할 때 사용
예: 주문 저장은 롤백됐지만, 로그 기록은 반드시 DB에 남겨야 하는 경우.
@Transactional(propagation = Propagation.REQUIRES_NEW)
사용 상황
- “메인 로직이 실패해도 이건 반드시 저장돼야 한다”는 경우
- 예: 주문 생성 중간에 실패하더라도, 에러 로그는 DB에 꼭 남겨야 할 때
3. SUPPORTS
- 트랜잭션이 있으면 → 합류
- 없으면 → 그냥 트랜잭션 없이 실행
트랜잭션이 있어도 되고 없어도 되는 단순 조회 로직에 가끔 씀
@Transactional(propagation = Propagation.SUPPORTS)
사용 상황
- 트랜잭션이 있어도 되고 없어도 되는 단순 조회성 메서드
- 예: 조회 API인데, 다른 트랜잭션 로직 안에서도 호출될 수 있는 경우
4. NOT_SUPPORTED
- 트랜잭션이 있으면 → 일시 정지하고 트랜잭션 없이 실행
- 없으면 그냥 실행
트랜잭션 오버헤드가 필요 없는 경우(대량 읽기 작업 등)
@Transactional(propagation = Propagation.NOT_SUPPORTED)
사용 상황
- 트랜잭션 걸리면 오히려 성능이나 락 문제가 생기는 경우
- 예: 대량 데이터 보고용 조회 → 굳이 트랜잭션 걸 필요 없음
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public List<Report> generateReport() { ... }
5. MANDATORY
- 트랜잭션이 이미 있어야 함
- 없으면 예외(IllegalTransactionStateException) 발생
“이 로직은 반드시 상위 트랜잭션 안에서만 실행돼야 한다”는 제약을 줄 때.
@Transactional(propagation = Propagation.MANDATORY)
사용 상황
- 항상 상위 로직에서 트랜잭션이 열려 있어야만 의미 있는 작업
- 예: “주문 저장” 같은 로직은 반드시 트랜잭션 안에서 실행돼야 한다고 강제할 때
6. NEVER
- 트랜잭션이 있으면 예외 발생
- 없으면 그냥 실행
“트랜잭션 걸리면 안 되는 코드”라는 의도를 명확히 할 때.
@Transactional(propagation = Propagation.NEVER)
사용 상황
- 트랜잭션 걸리면 안 되는 로직 (예: DB 관리성 쿼리, DB 락 걸릴 수 있는 작업)
- 예: 모니터링용 메서드 → 반드시 트랜잭션 없이 실행되도록 강제하고 싶을 때
7. NESTED
- 현재 트랜잭션이 있으면 중첩 트랜잭션을 시작 (DB savepoint 사용)
- 상위가 롤백돼도 하위는 따로 커밋 가능 (DB 지원 필요)
- 없으면 REQUIRED처럼 새 트랜잭션 시작
특정 구간만 부분 롤백하고 싶을 때 사용
@Transactional(propagation = Propagation.NESTED)
사용 상황
- 부분적으로 롤백 포인트를 두고 싶은 경우
- 예: 대량 주문 처리 중 한 건 실패 → 그 건만 롤백, 나머지는 커밋
- @Transactional(propagation = Propagation.NESTED) public void processSingleOrder(Order order) { ... }
반응형
'Spring Boot > 트랜잭션' 카테고리의 다른 글
Isolation Level (1) | 2025.08.28 |
---|---|
트랜잭션 범위 (Class, Method) (3) | 2025.08.28 |
정의(ACID) (3) | 2025.08.28 |