데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위를 의미. "전부 성공하거나, 아니면 아예 실패하거나(All or Nothing)"라는 원칙을 통해 데이터의 정합성을 보장.
ACID 원칙
스프링은 AOP(Aspect Oriented Programming)를 이용하여 선언적 트랜잭션을 지원한다. 개발자는 비즈니스 로직에만 집중하고, 트랜잭션의 시작과 종료(Commit/Rollback)는 스프링 프록시가 대신 처리한다.
동작 원리
1. 대상 메서드가 호출되면 스프링이 프록시(Proxy) 객체를 통해 트랜잭션을 가로챈다.
2. 메서드 실행 전 Transaction Manager를 통해 트랜잭션을 시작한다.
3. 성공 시 Commit, 예외 발생 시 Rollback 처리를 수행한다.
과제에서 사용하는 PortOne 결제 프로세스를 예시로 트랜잭션의 중요성을 정리했다.
주요 로직 흐름
코드 예시 (Java/Spring)
@Transactional(rollbackFor = Exception.class)
public void confirmPayment(String orderId, String paymentId) {
// 1. 주문 상태 변경
Order order = orderRepository.findById(orderId);
order.setStatus(OrderStatus.PAID);
// 2. 멤버십 등급별 적립 로직 (Normal 1%, VIP 5%, VVIP 10%)
long rewardPoint = calculationPointByMembership(order);
pointService.addPoint(order.getUserId(), rewardPoint);
// 3. 재고 확정 처리
stockService.confirmStock(order.getProductId());
// 이 메서드 안에서 하나라도 에러가 나면 1, 2, 3번 모두가 실행 전으로 롤백됨
}
결제 시스템처럼 돈과 재고가 얽힌 로직에서는 트랜잭션 설정 하나가 서비스의 신뢰도를 결정한다. 단순히 어노테이션을 붙이는 것에 그치지 않고, 전파(Propagation) 속성이나 격리 수준에 대해서도 깊게 공부해야 할 필요성을 느꼈다.