트랜잭션 범위 최소화를 통한 성능 및 안정성 향상
넓은 범위에 걸친 트랜잭션
public class OrderService {
// ...
@Transactional // 해당 메서드 전체에 걸친 트랜잭션 범위
public OrderConfirmResponse confirmOrder(OrderConfirmRequest orderConfirmRequest) {
// 1. OrderInfo + Product + User Fetch Join 조회(X-LOCK)
OrderInfo orderInfo =
this.getOrderInfoByOrderPessimisticLock(orderConfirmRequest.getOrderId());
// 2. 재고 감소
productService.reduceStock(orderInfo.getProduct().getId(), orderInfo.getQuantity());
// 3. TossPayment 측 결제 정보 조회(외부 API)
TossPaymentResponse paymentInfo = paymentService.getPaymentInfoByOrderId(
orderConfirmRequest.getOrderId()
);
// 4. 결제 정보 검증
orderInfo.validateInProgressOrder(paymentInfo, orderConfirmRequest);
// 5. TossPayment 측 결제 승인(외부 API)
TossPaymentResponse confirmPaymentResponse =
paymentService.confirmPayment(
TossConfirmRequest.createByOrderConfirmRequest(orderConfirmRequest)
);
// 6. 주문 확정 상태 변경
OrderInfo confirmedOrderInfo = orderInfo.confirmOrder(
confirmPaymentResponse,
orderConfirmRequest
);
return new OrderConfirmResponse(confirmedOrderInfo);
}
// ...
}
외부 API 응답이 늦은 경우 발생하는 문제


트랜잭션 범위 내에 있는 외부 API 요청 배제

로직 순서 변경을 통한 위험 범위 최소화

보상 트랜잭션 명시적 추가를 통한 롤백

마무리



에러 처리 및 복구 로직 적용에 따른 트랜잭션 범위 변화

Last updated