본문 바로가기

전지적라온시점

@Transactional 기반 Spring 트랜잭션 처리 완벽 가이드 본문

Development/Spring

@Transactional 기반 Spring 트랜잭션 처리 완벽 가이드

최라온 2025. 5. 15. 15:57
728x90
반응형
SMALL

@Transactional 기반 Spring 트랜잭션 처리 완벽 가이드

Spring 트랜잭션 처리는 데이터 정합성과 일관성을 보장하기 위한 핵심 기술입니다. @Transactional 어노테이션은 선언형 방식으로 트랜잭션을 간단하게 제어할 수 있도록 도와주며, 실무에서는 서비스 계층에서 자주 사용됩니다.

1. 트랜잭션(Transaction)이란?

트랜잭션은 데이터베이스 작업의 논리적 단위로, 다음 4가지 속성(ACID)을 만족해야 합니다:

  • Atomicity: 전부 성공 or 전부 실패
  • Consistency: 일관된 상태 유지
  • Isolation: 동시에 실행되는 트랜잭션 간 간섭 없음
  • Durability: 커밋된 데이터는 영구 반영

2. Spring의 트랜잭션 관리 방식

Spring은 다음 두 가지 방식으로 트랜잭션을 지원합니다:

  • 선언적 트랜잭션 관리: @Transactional 어노테이션 기반 (권장)
  • 프로그래밍 방식 트랜잭션 관리: TransactionTemplate, PlatformTransactionManager 사용

3. @Transactional 기본 사용법

@Service
public class OrderService {

    @Transactional
    public void placeOrder() {
        // DB Insert
        // 재고 감소
        // 결제 처리
    }
}

해당 메서드 실행 중 예외가 발생하면 자동으로 Rollback 됩니다. 런타임 예외만 자동 롤백되며, 체크 예외는 롤백되지 않습니다.

4. 롤백 제어 옵션

@Transactional은 다양한 속성으로 롤백 조건을 제어할 수 있습니다.

@Transactional(rollbackFor = Exception.class)
public void saveAll() throws Exception {
    ...
}
  • rollbackFor: 롤백할 예외 타입 지정
  • noRollbackFor: 롤백하지 않을 예외 타입 지정
  • readOnly = true: 읽기 전용 트랜잭션 (성능 최적화)
  • propagation: 트랜잭션 전파 방식 지정

5. 트랜잭션 전파(PROPAGATION)

메서드 간 트랜잭션 처리 방식을 정의합니다.

  • REQUIRED: 기본값, 기존 트랜잭션 존재 시 참여, 없으면 새로 생성
  • REQUIRES_NEW: 항상 새 트랜잭션 시작
  • NESTED: 중첩 트랜잭션 (savepoint 기반)

6. 실무 예외 처리 주의사항

  • 예외가 try-catch로 잡히면 롤백 안 됨 → 직접 setRollbackOnly() 호출 필요
  • 클래스 외부에서 호출한 메서드에만 AOP 적용됨 (프록시 기반)
  • private 메서드에는 @Transactional 효과 없음

7. 트랜잭션 테스트 예시

@SpringBootTest
@Transactional
class OrderServiceTest {
    @Test
    void 주문_정상_처리() {
        // 테스트 종료 시 DB 롤백됨
    }
}

8. 결론

@Transactional은 Spring에서 안정적인 트랜잭션 처리를 가능하게 해주는 강력한 기능입니다. 전파 방식, 예외 처리, 롤백 조건 등을 정확히 이해하면 복잡한 트랜잭션 흐름 속에서도 데이터 일관성을 유지할 수 있습니다. 실무에서는 서비스 계층에 트랜잭션을 선언하고, 예외 설계에 따라 롤백 제어하는 패턴을 따르는 것이 가장 안전합니다.

728x90
반응형
LIST