TESOL 수강신청

PROD-TESOL · /products/tesol

실제 화면 열기 ↗
기능
5
API 호출
0
가드레일
3
id 가 테스트 이름
구현 단계
6 / 6
완료수강신청 · 결제wvctesol-api :8080서버 컴포넌트31

개발 스펙

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

  • 상품 정보와 가격을 확인한다.
  • 성명 · 전화번호 · 이메일을 넣고 결제수단(무통장/카드)을 고른다.
  • 신청하면 주문이 생기고 결제수단에 따라 갈라진다.

비즈니스 규칙 (4)

  • 가격은 product 테이블이 정본이다. 화면에 다시 적지 않는다.
    근거: products_init.php $_PRODUCTS_LIST
  • 비로그인으로도 신청할 수 있다. member_id 는 비워 둔다.
    근거: 원본도 비회원 결제를 허용했다.
  • 주문번호는 YmdHis + 4자리.
    근거: products_record01.php:47
  • 무통장은 주문 생성 후 계좌 안내로, 카드는 PG 결제창으로 간다.
    근거: products_record01.php:177~180

API (2)

메서드경로권한모듈 · 설명
GET/api/catalog/products/{code}공개
상품 가격 · 표시 정보.
domains:catalog:catalog-web
응답: { code, name, price, salePrice, displayTitle, highlight, options[] }
POST/api/commerce/orders공개
주문 생성. 금액은 서버가 상품에서 다시 읽는다.
domains:commerce:commerce-web
요청: { lecture, name, tel, email, type: "card"|"bank" }
응답: { orderNo, amount, type, nextStep: "bank"|"card" }
400 INVALID_INPUT
404 PRODUCT_NOT_FOUND — 판매하지 않는 상품

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

id반드시 만족해야 하는 것등급
order-amount-from-server
요청에 금액을 실어 보내도 무시하고 product 의 sale_price 로 주문이 만들어져야 한다.
critical
order-price-single-source
신청 화면 가격과 상품 목록 가격이 항상 같아야 한다.
예전에는 컴포넌트 기본값(TESOL 가격)이 있어 다른 과정에도 TESOL 가격이 찍힐 수 있었다.
high
order-required-fields
성명 · 연락처 · 이메일이 비면 주문이 만들어지면 안 된다.
high

구현 계획 (6/6)

  1. Order · OrderState · Entitlement · 포트 2개commerce-domain
  2. PlaceOrderUseCase · AdminOrderUseCasecommerce-app
  3. OrderRepositoryAdapter · NicepayGatewaycommerce-infrastructure
  4. /api/catalog/products/{code} 구현commerce-web
  5. /api/commerce/orders 구현commerce-web
  6. 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 매핑에서만 온다.

테스트 방법 (3)

가드레일종류확인 방법
order-amount-from-servere2eamount=1000 을 body 에 넣어 주문 생성 → 저장된 amount 가 상품 판매가
order-price-single-sourcee2e/products 목록 가격과 /products/{code} 신청 화면 가격 문자열이 동일
order-required-fieldse2e이름 없이 주문 요청 → 400, payment 행 미생성

스냅샷

PROD-TESOL 스냅샷

기능 목록 (5)

입력
  • ·1개
  • ·제출 버튼1개
  • ·입력 필드8개
액션
  • ·서버 액션submitEnrollment
상태
  • ·화면 상태emailDomain, emailDomainCustom, paymentMethod, emailLocal

화면 이동

← 이 화면으로 오는 곳

없음

이 화면에서 가는 곳 →

연결

API

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

소스
src/app/products/tesol/page.tsx