재고·주문 상태기계 — 커머스 백오스가 무너지는 지점
쇼핑몰 관리 화면이 흔들리는 이유는 UI가 못생겨서가 아닌 경우가 많습니다.
“결제완료”, “배송준비”, “부분출고”, “반품접수” 같은 말이 화면마다 다르게 쓰이면, 재고 숫자와 실제 창고·고객 체감이 어긋납니다.
오픈 초기에는 주문이 적어 수작업으로 버팁니다. 광고를 켜거나 시즌 세일이 시작되면 같은 상품을 여러 사람이 동시에 담고, 결제 직전 재고가 0이 되고, 관리자는 이미 출고 버튼을 누른 뒤입니다.
이 지점에서 백오스는 “숫자만 보여주는 화면”이 아니라 규칙을 강제하는 시스템이어야 합니다.

왜 이런 일이 생기나요?
주문 상태 규칙(상태기계)은 주문이 허용된 상태만 거치고, 허용된 전환만 수행하도록 고정하는 설계입니다. “아무 버튼이나 누르면 값이 바뀌는” 구조와 반대입니다.
단일 브랜드몰에서 자주 쓰는 골격 예시는 이렇습니다. (업종에 따라 이름은 달라집니다.)
- 결제 대기 → 결제 완료 → 배송 준비 → 배송 중 → 배송 완료
- 어느 단계에서든 취소·환불로 빠지는 경로
- 부분 출고·부분 취소가 있다면 잔여 수량 상태
상태가 느슨하면 이런 일이 납니다.
1) 동시 주문 레이스
두 고객이 마지막 1개를 거의 동시에 결제합니다. “화면에서 품절 표시”만으로는 막지 못합니다. 서버에서 재고를 안전하게 줄이는 규칙이 필요합니다.
2) 차감 시점이 제각각
| 차감 시점 | 장점 | 리스크 |
|---|---|---|
| 장바구니 담을 때 | 선점 쉬움 | 장바구니 방치 시 재고 묶임 |
| 결제 직전 예약 | 결제 전환과 맞춤 | 예약 시간 제한·해제 로직 필요 |
| 결제 확정 후 | 허수 주문 적음 | 결제 중 품절 발생 가능 |
| 출고 시 | 창고 실물과 맞춤 | 판매 과다·약속 불이행 |
실무에서는 판매 가능 재고와 실물 재고를 나누는 편이 설명이 쉽습니다. 한 숫자만 두면 고객센터 안내가 어려워집니다.
3) 취소·반품 시 복원 누락
판매에서 줄인 모든 것을 취소·반품에서 되돌려야 합니다. 재고만 복원하고 쿠폰·포인트·사은품 재고를 빼먹으면 “금액은 맞는데 재고가 안 맞는” 상태가 됩니다.
4) 옵션·세트·창고
색상·사이즈, 세트 상품, 복수 창고가 있으면 “상품 1개 재고” 모델이 바로 한계에 부딪힙니다. 초기에 옵션 단위 재고를 두지 않으면 이후 이관 비용이 큽니다.
이렇게 보면 쉬워요
백오스가 무너질 때 보이는 증상입니다.
- 같은 주문이 목록과 상세에서 서로 다른 상태로 보임
- “배송중”인데 송장 번호가 비어 있음
- 부분 출고 후 나머지 수량이 어디 상태인지 모름
- 교환이 신규 주문인지, 원주문 연장인지 팀마다 해석이 다름
- 품절 알림은 갔는데 결제 페이지에서는 구매 가능
이런 증상은 디자인 수정으로 해결되지 않습니다. 상태 전환 표 + 재고 변경 이력이 있어야 원인 추적이 됩니다.
발주 전에 고정할 질문입니다.
- 결제 실패·시간 초과 주문은 얼마나 보관하고 언제 만료시키는가
- 무통장 입금 대기와 카드 승인을 같은 상태 트리로 묶을 것인가
- 부분 출고를 허용하는가. 허용하면 잔여 수량 상태는 무엇인가
- 판매 중지·진열 숨김·재고 0을 어떻게 구분하는가
- 관리자 강제 상태 변경을 허용할 것인가. 허용 시 사유 로그는 있는가
- 외부 채널(오픈마켓) 재고와 자사몰 재고를 동기화하는가
이 답이 견적서·요구사항 문서에 없으면, 개발 중반에 범위가 늘어납니다.
이렇게 준비하면 좋아요
- □ 주문 상태 목록과 허용 전환이 표로 문서화되어 있다
- □ 상태 변경이 한 경로로만 일어난다(화면 여기저기 임의 수정 금지)
- □ 재고 차감·복원이 이력으로 남는다
- □ 동시 주문 재고 시나리오를 테스트했다
- □ 결제 확정 실패 시 예약 재고가 자동 해제된다
- □ 부분 출고·부분 취소 시 잔여 상태 정의가 있다
- □ 관리자 강제 변경 시 사유·담당자 로그가 남는다
- □ 고객에게 보이는 상태와 내부 운영 상태가 혼동되지 않는다
- □ 옵션 단위 재고가 필요한지 초기에 결정했다
- □ 취소·반품 시 재고 외 쿠폰·포인트·사은품 복원 목록이 있다
상태 규칙은 거창한 기술 이름이 아닙니다. 팀이 같은 언어로 주문을 말하는 규약에 가깝습니다.
자주 하는 실수
“상태 칸 하나 + 관리자가 직접 수정”으로 시작하면 초기 공수는 줄어듭니다. 대신 시즌 이후에는 다음 비용이 따라옵니다.
- 중복 출고·미출고 분쟁 대응 인건비
- 재고 실사와 시스템 숫자의 만성적 불일치
- 부분 환불·부분 출고 요구 시 전면 재개발
- 데이터 이관 시 “과거 상태 의미”를 아무도 설명하지 못함
LB Contents는 쇼핑몰·커머스 앱을 구축할 때 상품 나열 화면만이 아니라 주문 상태·재고 규칙·관리자 운영 흐름을 함께 설계합니다. 오픈 전 상태 정의 정리 단계의 상담도 가능합니다.