← 프로젝트 회고 · Database
RETROSPECTIVE · 회고

부분 취소·환불을 위한 주문 그룹–주문–주문 옵션 설계

Database

쇼핑몰 프로젝트에서 "장바구니로 여러 상품을 한 번에 결제한 뒤, 그중 하나만 환불"하는 요구사항이 있었다. 주문 테이블 하나에 결제 정보와 상품 정보를 같이 두면 이 요구를 표현할 수가 없다.

상품 구조부터

상품은 옵션 대분류(색상)와 소분류(사이즈)를 가지고, 재고는 소분류 단위로 관리된다.

상품(폰 케이스)
└ 옵션 대분류: 빨강, 파랑
└ 옵션 소분류: XL, M, S ← 재고 단위

주문을 상품 구조에 맞춰 3단으로

주문 그룹 (결제 1회) ← PG 결제 키, 결제 상태
└ 주문 (상품 1개) ← 판매자, 배송 상태, 정산
└ 주문 옵션 (소분류 1개) ← 수량, 가격
  1. 주문 그룹: 결제 1회 = 1행. 결제 전 / 결제 취소 / 결제 환불 / 부분 취소 / 부분 환불
  2. 주문: 상품 1개 = 1행. 결제 완료 / 배송 전 / 배송 중 / 배송 완료 / 판매자 취소 / 구매자 취소 / 환불 / 정산 완료
  3. 주문 옵션: 옵션 소분류 1개 = 1행.

이렇게 나눴을 때 얻는 것

  1. 상품마다 판매자가 달라도 배송·정산을 주문 단위로 따로 처리할 수 있다.
  2. 한 상품만 환불하면 해당 주문 상태만 바뀌고, 주문 그룹은 "부분 환불"이 된다. PG에는 해당 금액만 부분 취소 요청한다.
  3. 구매자의 주문 내역, 판매자의 판매 내역을 같은 구조로 조회할 수 있다.

주의할 점

  1. 그룹 상태는 하위 주문 상태로부터 계산되는 값이라, 갱신 로직이 흩어지면 불일치가 생긴다. 상태 전이는 한 서비스 메서드에서만 일어나게 모았다.
  2. 쿠폰·배송비처럼 그룹 전체에 걸린 금액은 부분 환불 시 어떻게 나눌지 정책을 먼저 정해야 한다.
Gunmo Lee
부분 취소·환불을 위한 주문 그룹–주문–주문 옵션 설계 | Gunmo's Dev Life