쇼핑몰 운영에서 재고와 진열은 항상 같이 움직여야 하는 한 쌍입니다. 재고가 떨어졌는데 진열이 유지되면 품절 상품에 주문이 들어오고, 재고가 들어왔는데 미진열이면 팔 수 있는 상품이 검색에서 사라집니다. 도매상 재고표로 카페24 몰을 운영하는 셀러의 진열 자동화를 구축하며 정리한 판정 규칙과 운영 중 실제로 겪은 버그의 교훈을 공유합니다.
진열 자동화 판정은 두 층이다
카페24를 포함한 대부분의 쇼핑몰 구조에서 진열은 두 층으로 관리됩니다. 품목(사이즈·색상 옵션 조합) 단위의 진열과 그 품목들을 묶는 상품 단위의 진열입니다. 재고 연동은 두 층의 판정 규칙을 함께 정의해야 완성됩니다.
우리가 정한 규칙은 단순합니다.
- 품목: 재고표에 재고 있음으로 매칭되면 진열, 아니면 미진열
- 상품: 소속 품목 중 하나라도 진열이면 진열, 전부 미진열이면 미진열
상품 층의 "하나라도" 규칙이 중요합니다. 헬멧의 L 사이즈가 품절이어도 M과 XL이 있다면 상품은 팔려야 합니다. 상품 진열을 전 품목 재고로 판정하면(AND 규칙) 인기 사이즈 하나 빠질 때마다 상품 전체가 내려가고, 반대로 상품을 항상 진열로 두면 전 품목 품절 상품이 빈 껍데기로 남습니다. OR 규칙이 판매 기회와 고객 경험 사이의 균형점입니다.
실제로 겪은 버그: 첫 품목만 보고 판정하기
이 규칙은 단순해 보이지만 구현에서 미끄러지기 쉽습니다. 우리도 운영 중에 한 번 미끄러졌습니다. 특정 상품이 재고가 있는데도 미진열로 내려가는 문제가 보고됐는데, 원인을 추적해 보니 상품 진열을 판정할 때 같은 상품코드의 첫 품목 상태만 보고 있었습니다. 첫 품목(하필 품절된 사이즈)이 미진열이라 상품 전체가 미진열이 되었습니다.
수정 자체는 같은 상품코드의 전 품목을 순회해 OR로 판정하도록 바꾸는 것이었지만, 진짜 교훈은 그다음입니다. 실제 주문 데이터에서 재현된 이 사례를 그대로 테스트 케이스로 만들어 고정했습니다. "첫 행이 품절인 상품도 다른 품목에 재고가 있으면 진열된다"는 회귀 테스트가 있으니 이후 어떤 수정에서도 같은 실수는 빌드 단계에서 걸립니다. 운영 버그는 수정으로 끝내지 말고 테스트로 남겨야 자산이 됩니다.
이 버그가 실데이터에서만 드러났다는 점도 기록할 만합니다. 깨끗한 테스트 데이터에서는 첫 품목에 재고가 있는 상품이 많아 증상이 가려졌습니다. 특정 상품의 실제 품목 배열이 들어오고서야 재현됐습니다. 그래서 회귀 테스트도 가공 예시가 아니라 실제 주문 배열을 본뜬 데이터로 만들었습니다.
모호한 경우의 기본값: 안전한 쪽으로
판정 규칙에서 또 하나 정해야 하는 것이 모호한 경우의 기본값입니다. 재고표에 코드가 없는 품목, 품목코드가 빈 행은 재고가 있다고도 없다고도 확언할 수 없습니다.
우리는 이 경우를 전부 미진열로 내리기로 했습니다. 두 방향의 실수 비용이 다르기 때문입니다. 재고가 있는데 미진열이면 판매 기회를 잠시 잃지만, 재고가 없는데 진열이면 주문이 들어오고 취소·CS·평판 하락으로 이어집니다. 확신이 없을 때는 비용이 작은 쪽 실수를 선택하도록 기본값을 설계하는 것이 운영 시스템의 원칙입니다. 이 판정의 입력이 되는 재고 유무 자체를 읽어 내는 문제, 즉 공급사마다 다른 표기를 통일하는 설계는 재고 표기 정규화 설계에서 다뤘습니다.
판정 결과는 두 파일로, 정합은 코드로
판정이 끝나면 결과를 쇼핑몰에 반영해야 합니다. 카페24는 품목 진열과 상품 진열을 별도 양식으로 업로드하므로 두 파일이 서로 어긋나지 않는 것이 중요합니다. 우리는 품목 판정 결과에서 상품 판정을 유도해 두 파일을 한 번에 생성합니다. 사람이 두 파일을 따로 만들면서 생기는 불일치(품목은 갱신했는데 상품은 옛날 상태)가 구조적으로 불가능해집니다. 업로드 양식 자체의 규칙들은 카페24 엑셀 업로드 규칙에 정리했습니다.
이 진열 자동화가 포함된 전체 시스템은 카페24 재고 업로드 자동화 사례에서 볼 수 있습니다.
자주 묻는 질문
상품 진열은 어떤 기준으로 자동 판정하나요?
소속 품목 중 하나라도 재고가 있으면 진열, 전부 없으면 미진열로 판정하는 OR 규칙이 표준입니다. 일부 사이즈만 품절인 상품을 계속 팔 수 있고 전 품목 품절인 빈 상품은 자동으로 내려갑니다.
재고 정보가 불확실한 품목은 어떻게 처리하나요?
미진열, 즉 안전한 쪽으로 처리하는 것을 권합니다. 품절 상품이 진열로 남는 실수는 주문 취소와 고객 불만으로 이어져 진열이 잠시 늦는 실수보다 비용이 큽니다. 기본값은 실수 비용이 작은 방향으로 설계해야 합니다.
재고 수량도 자동으로 갱신하나요?
아니요, 진열 상태만 갱신합니다. 공급사 재고표의 수량 표기는 신뢰도가 제각각이라 수량을 그대로 옮기면 오히려 오류가 유입됩니다. 확실하게 판정할 수 있는 신호(재고 유무에 따른 진열 여부)만 자동화하고 수량 컬럼은 원본을 유지하는 것이 안전한 경계였습니다.
진열 자동화 로직의 버그는 어떻게 예방하나요?
운영에서 발견된 사례를 테스트로 고정하는 것이 가장 효과적입니다. 우리는 "첫 품목이 품절이어도 다른 품목에 재고가 있으면 상품은 진열"이라는 실제 버그 사례를 회귀 테스트로 만들어 이후 수정에서 같은 실수가 재발하면 빌드가 실패하게 했습니다.