Transaction Boundary

서비스 메서드는 한 유스케이스의 커밋 경계를 잡는다

컨트롤러는 요청을 해석하고, 서비스는 함께 성공해야 하는 DB 변경만 하나의 트랜잭션으로 묶는다. 외부 부작용은 커밋 뒤로 밀어낸다.

Controller

인증, DTO 검증, command 생성

DB 커넥션을 오래 붙잡지 않고 빠르게 서비스로 넘긴다.

Service.createOrder()

@Transactional 내부: 재고 차감, 주문 저장, 주문 항목 저장

begin재고 확인과 차감

읽기와 쓰기가 같은 커넥션 문맥에서 이어진다.

write주문 저장

이후 상세 항목이 같은 주문을 참조한다.

write주문 항목 저장

금액 스냅샷과 상품 연결을 보존한다.

commit성공 또는 rollback

런타임 예외가 전파되면 전체 변경을 취소한다.

After commit

메일, 알림, 결제 승인, 이벤트 발행

Outbox나 after-commit hook으로 DB 락과 분리한다.

원자성

재고 차감과 주문 저장이 분리 커밋되면 안 된다.

예외 전파

실패를 삼키면 롤백 규칙이 실행되지 않는다.

잠금 시간

외부 API를 안쪽에 두면 DB 잠금이 불필요하게 길어진다.