여러 공급사의 재고를 한 시스템으로 모으는 순간, "재고가 있다"는 단순한 사실이 회사마다 다르게 적혀 있다는 것을 알게 됩니다. 카페24 셀러의 재고 반영을 자동화하며 도매상 7곳의 재고표를 받아 보니, 같은 정보가 최소 네 가지 방식으로 표현되고 있었습니다. 이 글은 그 제각각인 표기를 하나의 판정으로 통일한 재고 표기 정규화 설계를 정리했습니다.
재고 표기의 네 가지 유형
실제로 만난 표기 방식은 이렇습니다.
| 유형 | 예시 | 판정 방식 |
|---|---|---|
| 텍스트형 | 유 / 무 | 문자열 매칭 |
| 기호형 | O / X, 재고있음(O) | 패턴 포함 여부 |
| 수량형 | 3, 0, 빈 칸 | 0 초과 여부 |
| 행 존재형 | 재고 있는 품목만 파일에 존재 | 행이 있으면 재고 있음 |
규모도 만만치 않았습니다. 도매상 한 곳의 재고표가 수백 행에서 많게는 7,000행을 넘었고 파일 형식도 CSV와 엑셀이 섞여 있었습니다. 이 규모에서 표기 차이를 눈으로 맞추는 것은 이미 사람의 일이 아닙니다.
특히 행 존재형이 함정입니다. 파일에 없는 품목을 "정보 없음"으로 두면 이전 상태가 그대로 남아 품절된 상품이 계속 진열됩니다. 이 공급사의 파일에서는 "없음" 자체가 데이터이므로, 파일에 없는 품목은 재고 없음으로 판정해야 맞습니다. 같은 빈칸이 공급사에 따라 정반대 의미가 되는 셈입니다.
표기 규칙은 코드가 아니라 타입으로
이 차이를 어디서 흡수할지가 설계의 핵심입니다. 우리가 택한 구조는 공급사 타입마다 규칙을 내장하는 것입니다. 공급사마다 재고 컬럼 위치, 표기 방식, 판정 규칙을 하나의 타입으로 정의하고 변환기는 타입을 받아 해당 규칙으로 파일을 읽습니다. 사용자에게는 드롭다운에서 공급사를 고르는 일만 남습니다.
반대 방향의 설계, 즉 공급사에게 "우리 양식대로 보내 달라"고 요구하는 접근은 오래가지 못합니다. 도매상은 우리 사정에 맞춰 시스템을 바꿔 주지 않고 양식 강제는 곧 수작업 재변환으로 돌아옵니다. 원본을 바꾸지 않고 흔들림을 우리 쪽에서 흡수한다는 원칙은 엑셀 자동 파싱과 헤더 자동 감지에서 다룬 것과 같은 철학입니다.
표기 이전의 정규화: 인코딩과 품목코드
표기 판정 전에 두 가지 낮은 층위의 정규화가 필요했습니다.
첫째, 파일 인코딩입니다. 공급사 CSV는 UTF-8, CP949, EUC-KR이 섞여 있습니다. 인코딩을 잘못 짚으면 한글이 깨져 매칭이 전멸하므로, 여러 인코딩을 순차 시도하는 폴백 디코딩으로 읽습니다.
둘째, 품목코드 정규화입니다. 매칭 키인 품목코드가 숫자형 바코드일 때, 엑셀이 이를 숫자로 해석해 8809123456789.0처럼 소수점 꼬리를 붙이는 경우가 있습니다. 공백과 이 .0 꼬리를 제거하는 정규화가 없으면, 눈으로는 같은 코드가 프로그램에게는 다른 코드가 됩니다. 매칭 실패의 상당수는 로직이 아니라 이런 표기 차원의 불일치에서 옵니다.
판정 이후: 미매칭을 어떻게 다룰 것인가
정규화가 끝나면 각 품목은 "재고 있음/없음"의 이진 판정을 받습니다. 남는 문제는 어느 쪽에도 매칭되지 않은 품목입니다. 재고표에 코드가 없거나, 쇼핑몰 양식에 코드가 비어 있는 품목들입니다.
초기 버전은 미매칭 품목을 건드리지 않았는데, 운영해 보니 이것이 사고의 원인이었습니다. 이전에 진열이던 품목이 매칭 실패로 갱신에서 빠지면 품절 후에도 진열로 남습니다. 그래서 규칙을 바꿔 미매칭과 빈 코드도 예외 없이 미진열로 내리게 했습니다. "모르면 안전한 쪽으로"가 재고 판정의 기본값이어야 한다는 것이 운영에서 얻은 교훈입니다. 이 판정이 상품 단위 진열로 이어지는 다음 단계는 재고 연동 진열 자동화에서 다룹니다.
이 규칙 변경은 실제 운영 요청에서 나왔습니다. 초기 버전을 쓰던 고객이 품절 품목이 진열로 남는 사례를 발견해 알렸습니다. 규칙을 바꾼 뒤 같은 유형의 문의가 사라졌습니다. 정규화 규칙은 책상이 아니라 운영에서 완성됩니다.
이 정규화 설계가 들어간 전체 시스템은 카페24 재고 업로드 자동화에서 볼 수 있습니다.
자주 묻는 질문
공급사마다 다른 재고 표기는 어떻게 통일하나요?
공급사별 표기 규칙(컬럼 위치, 유/무·O/X·수량·행 존재 같은 판정 방식)을 타입으로 정의해 프로그램에 내장합니다. 원본 양식을 바꿔 달라고 요구하는 대신 읽는 쪽에서 차이를 흡수해야 지속 가능합니다.
재고표에 없는 품목은 어떻게 처리해야 하나요?
안전한 쪽, 즉 재고 없음으로 처리하는 것을 권합니다. 매칭 안 된 품목을 건드리지 않으면 이전 진열 상태가 남아 품절 상품이 계속 노출됩니다. 특히 재고 있는 품목만 내려 주는 공급사라면 "파일에 없음"이 곧 "재고 없음"이라는 데이터입니다.
공급사에 양식을 통일해 달라고 요구하면 안 되나요?
현실적으로 오래가지 않습니다. 공급사는 여러 거래처를 상대하므로 한 거래처 사정에 맞춰 시스템을 바꿔 주지 않고 바꿔 준다 해도 담당자가 바뀌면 원래 양식으로 돌아오기 일쑤입니다. 읽는 쪽에서 차이를 흡수하는 구조가 유일하게 지속 가능한 답입니다.
품목코드가 분명히 같은데 매칭이 안 되는 이유는 뭔가요?
대부분 표기 차원의 불일치입니다. 엑셀이 숫자 바코드에 붙이는 .0 꼬리, 앞뒤 공백, 인코딩 깨짐이 대표적입니다. 매칭 전에 코드 정규화(공백 제거, 숫자 꼬리 정리)와 인코딩 폴백을 거치면 이런 유령 불일치가 사라집니다.