고객 주문 취소와 창고 피킹이 동시에 진행될 때 이중 환불·오출하를 막는 상태 전이 설계입니다.
어디서 문제가 시작될까
고객이 주문 취소 버튼을 누른 순간 창고 직원이 이미 상자를 스캔했을 수 있습니다. 주문 시스템은 취소 완료라고 표시하지만 WMS는 포장 완료로 넘어가면 환불과 출하가 동시에 일어날 수 있습니다. 두 시스템이 각각 정상이어도 전체 업무는 모순될 수 있다는 점이 핵심입니다.
설계의 핵심
주문 상태와 물류 상태를 분리하고 취소 요청, 취소 승인, 피킹 중단, 출하 보류, 취소 불가를 명시적으로 정의합니다. 취소 요청에는 고유 ID를 붙여 재시도해도 중복 환불이 생기지 않게 합니다. WMS가 피킹 시작·포장·출하 확정 이벤트를 보내면 주문 시스템은 현재 물류 상태를 확인해 취소 가능 여부를 결정합니다. 확정 전의 짧은 경계에서는 출하 보류를 먼저 요청하고 결과가 돌아올 때까지 고객에게 '처리 중'으로 표시합니다.

현장에 적용해 보면
고객이 오전 10시에 취소를 눌렀고 10시 1분에 피커가 상품을 집었습니다. 취소 요청이 먼저 기록됐더라도 창고 단말이 오프라인이었다면 실물은 이동할 수 있습니다. 이 경우 단순히 DB 상태를 되돌리기보다 해당 피킹 작업을 중단 지시하고 재고 복귀 확인이 끝나야 취소를 완료합니다. 이미 출하됐다면 반품 흐름으로 전환하며 같은 취소 요청 ID를 추적합니다.

놓치기 쉬운 점
분산된 두 DB 사이에 '동시에 한 번에 성공'을 가정하면 장애 때 중간 상태가 남습니다. 보상 작업과 조정 큐를 설계하고, 미확정 상태가 오래 지속되면 운영자가 볼 수 있게 해야 합니다. 고객에게 취소 가능 시간을 과장하지 않는 문구도 중요합니다.
도입 전 점검
- 취소 요청과 취소 확정을 구분하는가
- 실물 피킹·출하 이벤트와 주문 상태를 대사하는가
- 환불·재고 복귀에 중복 방지 ID가 있는가
참고 자료: Microsoft의 보상 트랜잭션 패턴
#주문취소 #WMS #피킹 #물류시스템 #상태머신 #분산트랜잭션 #사가패턴 #재고관리 #업무자동화 #시스템통합