도메인 규칙·오류·트랜잭션·테스트 가능성을 함께 설계합니다.
실무 서비스는 Controller에 모든 로직을 쓰지 않고 입력 변환, 도메인 규칙, 저장소, 외부 결제를 경계로 나눕니다. 핵심 use case는 프레임워크 없이 테스트 가능해야 합니다.
Order가 자신의 상태 전이를 지키게 하고 Service는 여러 객체와 저장소의 작업 순서를 조정합니다.
중복 요청 id, 재고 부족, 결제 실패, 저장 실패에서 최종 상태와 보상 정책을 명시합니다.
로그에는 orderId·requestId를 구조화해 남기고 금액·상태 전이 metric과 실패율 alert를 둡니다.
예외를 모두 RuntimeException 하나로 바꾸면 재시도 가능 오류와 사용자 입력 오류를 구분할 수 없습니다.
직접 바꿔보세요취소된 주문을 다시 결제하지 못하게 하고 테스트를 추가하세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.