[BE-06] application DTO — Command·Result 계약

작업 내용 (설계 의도)

변경 사항

UseCase 입출력 DTO를 신설한다(근거 TDD: ../TDD.md “API 계약”, DTO 흐름 Request→Command→Entity→Response). BE-07~09 UseCase가 공유하는 application 계약. domain 타입(BE-01)만 참조하고 BE-03/04/05 파일과 겹치지 않아 같은 wave 병렬 안전.

  • PurchaseLimitedDropCommand(userId·dropId·quantity·idempotencyKey).
  • CreateLimitedDropCommand(productId·openAt·closeAt·limitedQuantity·perUserLimit·ownerUserId).
  • LimitedDropPurchaseResult(orderId·dropId·status) + of(order, drop) 팩토리.
  • LimitedDropView(조회용: dropId·productId·status·openAt·closeAt·remaining·perUserLimit). perUserLimit은 FE QuantityStepper 상한·“1인당 N개” 안내에 필요(FE-02·design-db per_user_limit 정합).
  • LimitedDropStatsResult(successCount·soldOutRejectCount·tooEarlyRejectCount) — FR-9.
  • 시간 타입 ZonedDateTime. Command는 UseCase 파라미터 형태.

의존

  • BE-01 (LimitedDrop·LimitedDropStatus)

다이어그램

클래스 의존

flowchart LR
    PurchaseLimitedDropCommand --> LimitedDropPurchaseResult
    CreateLimitedDropCommand -.->|생성| LimitedDrop
    LimitedDropView -.->|from| LimitedDrop
    LimitedDropStatsResult

테스트 케이스

  • LimitedDropPurchaseResult.of(order, drop)가 orderId·dropId·status를 정확히 매핑한다
  • LimitedDropView가 LimitedDrop과 remaining을 결합해 생성되고 perUserLimit을 포함한다
  • CreateLimitedDropCommand의 시간 필드가 ZonedDateTime으로 유지된다