Spring Boot/트랜잭션

Propagation

재윤 2025. 8. 28. 14:58
반응형

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