주문 취소
주문 취소는 주문을 없애는 작업이 아니라, 주문과 연결된 결제, 재고 예약, 출고 요청, 배송, 정산 데이터를 원래 상태에 맞게 되돌리거나 보정하는 업무다. 그래서 취소 가능 여부는 주문 상태 하나만 보고 판단하면 안 된다.
주의사항
출고 확정 이후에는 단순 주문 취소로 처리하지 않는 것이 안전하다. 이미 재고, 배송, 매출, 정산 데이터가 움직였으므로 반품 흐름으로 전환하는 편이 운영 추적에 유리하다.
주문 취소란?
주문 취소는 고객 요청, 품절, 결제 실패, 운영 판단 등으로 주문 이행을 중단하는 처리다. 취소 시점에 따라 난이도가 크게 달라진다.
| 시점 | 취소 난이도 | 주요 처리 |
|---|---|---|
| 결제 전 | 낮음 | 주문 상태만 취소 |
| 결제 완료 후 | 보통 | 결제 취소, 재고 예약 해제 |
| 출고 요청 후 | 높음 | WMS 출고 요청 취소 필요 |
| 피킹 중 | 높음 | 작업 중단, 피킹 상품 회수 |
| 출고 확정 후 | 매우 높음 | 취소보다 반품 처리 권장 |
| 배송 중 | 매우 높음 | 회수/반품 프로세스로 전환 |
실제 업무 흐름
상태별 취소 판단
화면/기능 관점
주문 상세 화면의 취소 버튼은 다음 조건을 함께 봐야 한다.
| 조건 | 화면 처리 |
|---|---|
| 결제 전 | 즉시 취소 가능 |
| 결제 완료 | 결제 취소 가능 여부 표시 |
| 출고 요청 전 | 재고 예약 해제 포함 취소 |
| 출고 요청 후 | WMS 취소 가능 여부 조회 |
| 피킹 중 | 운영자 승인 또는 보류 처리 |
| 출고 확정 후 | 취소 버튼 대신 반품 접수 안내 |
API 관점
취소 API는 취소 가능 여부 판단과 실행을 분리하면 운영 화면을 만들기 쉽다.
GET /api/orders/ORD-1001/cancelability
POST /api/orders/ORD-1001/cancel
취소 실행 API는 내부적으로 다음 작업을 순서대로 수행한다.
- 주문, 결제, 출고, 배송 상태 잠금 조회
- 중복 취소 요청 여부 확인
- WMS 출고 취소 또는 작업 보류 요청
- 재고 예약 해제
- 결제 취소 또는 환불 요청
- 주문 상태 변경
- 취소 이력 저장
- ERP/정산 연동 메시지 생성
DB 테이블 예시
| 테이블 | 역할 |
|---|---|
orders | 주문 현재 상태 |
order_lines | 상품별 취소 수량 |
order_cancel_requests | 취소 요청과 사유 |
payment_transactions | 결제 취소/환불 처리 결과 |
stock_reservations | 예약 재고 해제 대상 |
status_history | 취소 상태 변경 이력 |
interface_messages | WMS/ERP 취소 연동 메시지 |
취소 이력 예시
| order_no | from_status | to_status | cancel_reason | requested_by |
|---|---|---|---|---|
ORD-1001 | PAID | CANCELED | 고객 변심 | customer |
ORD-1002 | OUTBOUND_REQUESTED | CANCEL_REQUESTED | 품절 | operator |
실무에서 자주 생기는 문제
- 사용자는 취소됐다고 보지만 WMS에는 이미 출고 지시가 내려가 있다.
- 재고 예약은 해제됐는데 결제 취소가 실패한다.
- 출고 확정 후 주문 상태만 취소되어 재고와 정산이 맞지 않는다.
- 외부몰에서 같은 취소 요청이 중복 수신된다.
- 피킹 완료 상품이 제자리로 돌아가지 않아 실재고가 틀어진다.
설계 시 주의사항
주문 상태, 결제 상태, 출고 상태, 배송 상태는 분리해야 한다. 취소 가능 여부는 이 상태들을 조합해 판단하고, 취소 결과는 상태 이력과 연동 로그로 남겨야 한다. 외부몰이나 결제사 연동은 실패할 수 있으므로 취소 요청 상태와 취소 완료 상태를 구분하는 것이 안전하다.