비교 요약으로 돌아가기

Full output

GPT-5.6 Sol · medium 원문 결과물

재고 예약 상태 전이·멱등성 보수 / OpenAI / GPT-5.6 Sol / 실행일 2026-07-30

gpt-5.6-sol-medium 작업 결과

변경한 파일

  • src/main/java/com/samebrief/reservation/service/ReservationService.java
  • src/test/java/com/samebrief/reservation/ReservationServiceContractTest.java

작업 사본은 verification/work/14-inventory-reservation-state/gpt-5.6-sol-medium에 보존했다.

구현 내용

  • null, 빈 문자열과 공백 문자열을 포함한 예약 입력 검증
  • 최초 등장 순서를 유지하는 중복 상품 합산과 long 오버플로 검출
  • 정규화한 상품별 총수량을 이용한 요청 멱등성 비교
  • 모든 상품의 재고를 먼저 확인한 뒤에만 차감하는 다중 상품 예약 원자성
  • 주입된 Clock을 이용한 생성 시각과 정확한 15분 만료 시각 계산
  • 만료 경계 now >= expiresAt 처리와 재고 1회 복구
  • 동일 결제 ID 재시도, 다른 결제 ID 충돌과 전역 결제 ID 고유성 처리
  • 취소·만료 상태의 반복 호출을 no-op으로 처리해 재고 중복 복구 방지
  • 취소·만료 뒤 예약 생성 재시도에서 기존 종결 예약 반환

서비스에서 입력 정규화, 멱등성 판정과 전체 재고 선검증을 순서대로 수행하고, 검증이 끝난 뒤 기존 저장소의 상품별 증감 연산을 적용하는 방식을 선택했다. 별도 저장소 API, 잠금이나 외부 인프라는 추가하지 않았다.

발견한 기존 오류

  • 공백 요청 ID와 상품 ID를 허용했다.
  • 중복 상품 수량을 합산하지 않았고 합산 오버플로도 검출하지 않았다.
  • 다중 상품 예약에서 재고가 부분 차감될 수 있었다.
  • 기존 요청 ID의 payload 차이를 확인하지 않았다.
  • 만료 시각과 정확히 같은 순간을 만료로 판단하지 않았다.
  • 확정 시 만료된 예약의 상태와 재고를 갱신하지 않았다.
  • 확정된 예약의 다른 결제 ID와 예약 간 결제 ID 중복을 허용했다.
  • 종결 상태의 취소 재시도에서 재고가 중복 복구될 수 있었다.

테스트 결과

실행 명령:

./gradlew clean test --no-daemon

결과:

  • 기본 테스트: 4개 통과
  • 추가 계약 테스트: 19개 통과
  • 전체: 23개 통과, 실패 0개
  • BUILD SUCCESSFUL