주문 완료

PROD-ORDER-DETAIL · /products/order/[orderNo]

기능
1
API 호출
0
가드레일
2
id 가 테스트 이름
구현 단계
5 / 5
완료수강신청 · 결제wvctesol-api :8080서버 컴포넌트동적 라우트118

개발 스펙

이 화면에서 할 수 있어야 하는 것 (3)

  • 주문번호 · 상품 · 금액 · 결제수단을 확인한다.
  • 무통장이면 입금 계좌와 안내를 본다.
  • 카드 결제가 실패했으면 사유를 본다.

비즈니스 규칙 (2)

  • 무통장 계좌는 기업은행 514-046901-04-011 (주)하이유.
    근거: _Env.php:400~402
  • 무통장 주문은 입금 확인 전까지 ready 다.
    근거: 원본은 즉시 success 였지만 확인 UI 가 없었기 때문.

API (1)

메서드경로권한모듈 · 설명
GET/api/commerce/orders/{orderNo}공개
주문 상세.
domains:commerce:commerce-web
404 ORDER_NOT_FOUND

가드레일 (2) — id 가 곧 테스트 이름이다

id반드시 만족해야 하는 것등급
order-bank-stays-ready
무통장 주문은 생성 직후 state=ready 여야 한다. 입금 전에 success 가 되면 안 된다.
critical
order-no-entitlement-before-payment
주문만 만들었을 때 수강권(member.pay_* )이 열리면 안 된다.
critical

구현 계획 (5/5)

  1. Order · OrderState · Entitlement · 포트 2개commerce-domain
  2. PlaceOrderUseCase · AdminOrderUseCasecommerce-app
  3. OrderRepositoryAdapter · NicepayGatewaycommerce-infrastructure
  4. /api/commerce/orders/{orderNo} 구현commerce-web
  5. Next.js 를 BFF 로 전환 — Prisma 직접 접근 제거wvctesol

서버 사이드 구현 계획 — 자바 객체별 요구사항 (6/6)

객체모듈책임 · 지켜야 할 것
PlaceOrderUseCase
service
commerce-app
주문 생성.
  • 금액을 요청에서 받지 않는다. 상품 코드로 서버가 다시 읽는 것이 유일한 출처다.
  • 연락처는 숫자만 남긴다. 원본도 하이픈 없이 저장한다.
  • 비로그인 주문을 허용한다 — memberId 가 null 일 수 있다.
AdminOrderUseCase
service
commerce-app
입금확인 · 환불.
  • 모든 진입점에서 RequireAdmin.check 를 부른다. 화면 가드만으로는 부족하다.
  • 카드 환불은 PG 취소가 성공해야만 상태를 바꾼다. 실패하면 예외를 던져 트랜잭션을 되돌린다.
  • TID 가 없는 레거시 카드 주문은 막고 안내한다. 상태를 건드리지 않는다.
  • 이미 cancel 인 주문은 409 로 거부한다.
Entitlement
class
commerce-domain
상품 코드 → 수강권 플래그 매핑.
  • 원본에는 이 매핑이 없다 — 결제가 회원 플래그를 건드리지 않았고 관리자가 직접 켰다.
  • tesoltec 은 pay_yn 과 pay_tec_yn 을 모두 연다.
  • 컬럼 이름이 여기서만 나온다. 사용자 입력이 SQL 식별자가 되지 않는다.
OrderState
enum
commerce-domain
주문 상태.
  • 무통장도 입금 확인 전까지 READY 다. 원본은 즉시 success 였지만 확인 UI 가 없었기 때문이다.
  • 알 수 없는 값은 READY 로 읽는다 — 레거시 행에 빈 state 가 있다.
NicepayGateway
class
commerce-infrastructure
NICEPAY 취소 연동.
  • SignData = sha256(MID + CancelAmt + EdiDate + MerchantKey), 성공코드 2001.
  • 상점키는 환경변수로만 받는다. 없으면 available()=false 이고 카드 환불을 시도조차 하지 않는다.
  • 도메인은 이 클래스를 모른다 — PaymentGateway 포트로만 만난다.
OrderRepositoryAdapter
class
commerce-infrastructure
payment 테이블 조작.
  • 원본 insertPayment 처럼 cost 와 amount 에 같은 값을 넣는다.
  • setEntitlement 의 컬럼 이름은 Entitlement 매핑에서만 온다.

테스트 방법 (2)

가드레일종류확인 방법
order-bank-stays-readye2e무통장 주문 직후 state 가 ready
order-no-entitlement-before-paymente2e주문 직후 해당 회원 수강권 플래그가 변하지 않음

정하지 못한 것 · 확인이 필요한 것

  • 주문 상세를 주문번호만으로 조회할 수 있다. 주문번호를 알면 남의 주문이 보인다 — 접근 제어 방식을 정해야 한다.

스냅샷

PROD-ORDER-DETAIL 스냅샷

기능 목록 (1)

데이터
  • ·조회 조건error

화면 이동

← 이 화면으로 오는 곳
이 화면에서 가는 곳 →

연결

API

직접 호출하는 API 가 없습니다

소스
src/app/products/order/[orderNo]/page.tsx