Transaction Boundary

트랜잭션은 함께 끝나야 하는 작업 묶음만 감싸는 것이 기본입니다.

주문 저장 예시에서는 주문 생성과 주문 상세 저장이 하나의 성공·실패 단위입니다. 그래서 경계는 `Service` 메서드에 두고, 검증·응답 변환·외부 호출까지 끌어들이지 않도록 잡습니다.

판단 기준은 레이어 이름이 아니라
같이 COMMIT / ROLLBACK 되어야 하는 범위입니다.

너무 넓으면 락과 지연이 늘고, 너무 좁으면 중간 저장이 남아 일관성이 깨질 수 있습니다.

요청 검증
DTO 변환
주문 생성
주문 상세 저장
응답 반환
Controller 전체 경계가 너무 넓음

HTTP 처리와 변환까지 묶여 불필요하게 오래 열린다.

Service 메서드 적절한 기본 경계

주문 생성과 주문 상세 저장이 한 작업으로 묶여, 예외 시 함께 롤백된다.

Repository 한 줄 경계가 너무 좁음

각 `save()`를 따로 커밋하면 중간 상태가 남을 수 있다.

핵심: 트랜잭션 경계는 요청 전체가 아니라 한 비즈니스 작업의 원자성을 보장하는 구간에 두는 것이 가장 안전합니다.