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