결론부터 말하자면, 모든 로케이션 코드의 마지막 자리는 체크 디짓이어야 한다. 나는 이런 실패를 정확히 세 번 봤고, 세 번 모두 결말은 같았다. 도난은 없었지만 시스템이 재고를 찾지 못했다. 숫자 한 자리를 추가하는 비용은 거의 들지 않는데, 이런 "사라진 재고" 사례의 대부분을 잡아낸다.

가장 최근 건은 몇 달 전에 마무리됐다. 중국 동부의 자동차 부품 고객, 약 20,000제곱미터 규모의 신규 DC, 가동 3개월 후. 첫 전체 실사에서 맞지 않는 재고가 2,000,000원을 넘었다. 도난도 없고 오출고도 없었다. 40개가 넘는 파렛트가 잘못된 로케이션에 적치되어 있었다. 로케이션 B-12-03-4가 B-12-08-4로 잘못 읽힌 것이다. 지게차 기사의 스캔이 더러워진 라벨 때문에 실패했고, 수기로 입력하면서 3이 8이 됐다. WMS에서는 그 40개 파렛트가 B-12-03-4에 "있는" 것으로 되어 있었지만, 실제로는 B-12-08-4에 있었다. 꼬박 2주 동안 영업은 화면에서 재고를 보고, 피커는 현장에서 찾지 못했고, CS는 고객에게, 창고는 영업에게 항의를 받았다. 결국 두 사람이 5일 동안 모든 로케이션을 하나하나 열어젖히고 나서야 찾았다. 숫자 한 자리 오독 때문에 2,000,000원이 2주 동안 "사라졌다".

두 번째 프로젝트는 더 아팠다. 2024년 초, 중국 남부의 3PL 창고가 더 싼 라벨 업체로 바꿨다. 새 템플릿의 여백이 맞지 않아 오른쪽이 2밀리미터 잘려 나갔다. 바로 체크 디짓이 있는 자리였다. 라벨의 절반이 잘린 코드로 스캔됐고, 현장은 오류를 잡아줄 체크 디짓 없이 수기 입력으로 돌아갔으며, 오적치율이 치솟았다. 라벨에서 아낀 돈으로는 사라진 파렛트 하나를 찾는 인건비도 못 댔다. 두 프로젝트, 하나는 사람의 오독, 하나는 업체의 인쇄 불량. 근본 원인은 같았다. 코드 설계가 오류에게 잡힐 기회를 주지 않았던 것이다.

체크 디짓이 이를 막는 방법

한 문장으로 말하면, 답을 스스로 품고 있는 숫자를 한 자리 덧붙여 시스템이 모든 입력을 검증할 수 있게 하는 것이다.

로케이션 B12034(숫자만, 구분자 제거)를 예로 들자. WMS에서 Luhn 알고리즘(신용카드 번호 뒤에 있는 그 알고리즘)으로 체크 디짓 한 자리를 계산하면 로케이션은 B12034-7이 된다. 이후 모든 스캔과 수기 입력은 먼저 검증된다. 앞의 숫자들로부터 마지막 7을 다시 계산할 수 있는가. 안 되면 하드 스톱, 빨간 에러, 파렛트는 잘못된 슬롯으로 절대 가지 않는다.

마법이 아니다. 계산 과정을 하나하나 짚어보자. 전부 재현 가능하다. 로케이션 숫자가 417203이라고 하자.

  1. 끝에 플레이스홀더로 0을 덧붙인다: 4172030.
  2. 오른쪽부터 2번째, 4번째, 6번째 숫자를 2배로 만든다: 3은 6이, 2는 4가, 1은 2가 된다. (2배 해서 10 이상이 되면 두 자리 숫자를 더한다. 8의 2배는 16이므로 1 더하기 6으로 7을 만든다.)
  3. 전부 더한다: 0 더하기 6 더하기 0 더하기 4 더하기 7 더하기 2 더하기 4는 23과 같다.
  4. 체크 디짓은 23을 10으로 나눈 나머지를 10에서 뺀 값이다. 10 빼기 3, 즉 7이다.

전체 로케이션 코드: 4172037. 이제 기사가 417203 대신 417208을 입력했다고 하자. 시스템은 4172087을 검증하고, 계산이 7이 되지 않으므로 파렛트가 도크를 떠나기 전에 화면에 에러가 뜬다. 트릭은 이게 전부다. "틀림"을 검출 가능하게 만드는 숫자 한 자리.

파렛트 랙 앞에서 PDA 스캐너를 들고 있는 창고 작업자

어떤 알고리즘을 쓸까? 직접 만들지 마라. 비교표는 다음과 같다.

| 알고리즘 | 원리 | 잡아내는 것 | 약점 | | Luhn | 한 자리씩 건너뛰며 2배, 합산, mod 10 | 한 자리 오류, 대부분의 인접 자리바꿈 | 검증 로직을 위한 WMS 지원 필요 | | 가중합 | 각 자리에 고정 가중치를 곱해 합산, mod 10 | 한 자리 오류 | 가중치가 틀리면 보호는 제로 | | GS1 체크 디짓 | 홀수/짝수 자리에 3과 1을 곱함 | 한 자리 오류 | 상품 바코드용으로 만들어진 것. 로케이션에 빌려 쓰려면 현장 전체의 일관성 필요 |

내 결론: 로케이션 코드에는 Luhn을 써라. 끝. "자작 체크 규칙"은 내가 세 번 본 실패다. 매번 다음 컨설턴트가 예전 규칙을 역으로 풀어내지 못했고, 현장은 결국 창고 전체 라벨을 다시 붙였다.

WMS에 설정하기: 4단계, 하나도 빼놓을 수 없다

  1. 라벨 한 장을 찍기 전에 코드 규칙을 확정하라. 세 문장이다. 로케이션 코드는 존-통로-단-베이에 체크 디짓 한 자리를 더한 것과 같다. 구분자는 표시용일 뿐 계산에서 제외한다. 체크 디짓은 항상 마지막이다. 규칙은 나중에 정하고 라벨부터 찍으면 다시 찍게 된다. 세 번 봤다.
  2. WMS의 로케이션 마스터 데이터에 필드 두 개를 추가하라: 체크 디짓과 알고리즘 이름. 체크 디짓을 인쇄된 라벨에만 남겨두지 마라. 시스템이 저장하고 설정할 곳이 없으면, 라벨 업체를 바꾸는 날이 재앙의 날이 된다.
  3. 세 곳의 터치포인트에서 검증을 강제하라: 적치, 이동, 순환실사 조정. 모든 스캔과 수기 입력 로케이션을 검증하고, 실패는 차단하고 기록한다. 적치에서만 강제하는 건 강제하지 않는 것과 같다. 내 프로젝트에서는 오적치의 대부분이 이동과 실사 조정 중에 일어났다.
  4. 스크립트로 이력을 일괄 채워라: 기존 모든 로케이션의 체크 디짓을 한 번에 계산하고 한 배치로 다시 찍어라. 현장에 손으로 계산하게 하지 마라. 30,000개 로케이션 규모의 신설 현장이라면 가동 전날 밤에 배치 작업을 돌린다.

고민해볼 트레이드오프: 하드 차단 대 경고만. 하드 차단은 작업을 늦춘다. 에러마다 기사가 확인 때문에 멈춘다. 경고만은 무시된다. 없는 것과 같다. 내 기준: 적치와 이동은 하드 차단(이곳의 에러 하나는 파렛트 통째로 사라짐을 의미한다), 실사 조정은 경고 플러스 당일 리뷰(실사는 시간에 민감하고 에러는 당일 드러난다). 어느 한쪽 극단도 틀렸다.

가동 전야 체크리스트: 다섯 가지 중 하나라도 탈락하면 가동하지 마라

  1. 라벨이 잘리고 있지 않은가. 체크 디짓은 맨 끝에 있다. 좁은 용지나 템플릿 여백 설정 오류로 절반이 잘리면 스캔이 안 된다. 라벨 10장을 한 장씩 스캔하라. 샘플링하지 마라.
  2. PDA 입력이 고정되어 있는가. 일부 Android PDA는 기본값이 중국어 입력 방식이라 전각과 반각 숫자는 시스템에게 다른 문자다. 검증이 전부 실패한다. 가동 전에 모든 기기를 반각 영문 입력으로 고정하고 한 대씩 확인하라.
  3. 오독 대책을 설계했는가. 0 대 O, 1 대 I, 5 대 S. 높은 곳, 어두운 조명 아래에서 사람의 눈은 이들을 끊임없이 혼동한다. 내 규칙: 로케이션 코드는 숫자만, 슬래시 제로가 있는 고정폭 폰트, 0과 O는 같은 라벨에 절대 함께 쓰지 않는다.
  4. 차단 로그를 누군가 읽고 있는가. 아무도 보지 않는 에러 차단은 쇼다. 첫 주에는 매일 차단 로그를 뽑아라. 진짜 에러인지 규칙 설정 오류인지 가려내고, 둘째 주에 완화하라.
  5. 기존 로케이션은 채워졌는가. 신구 코드가 섞이면 재앙이다. 전부 채우거나 전부 교체하라. "기득권 코드" 뒷문은 없다.

직관에 반하는 결론: 작업자의 잘못이 절대 아니다

30회가 넘는 가동을 거치며, 이런 일이 생길 때마다 경영진의 첫 반응은 "교육 강화"와 "실수 처벌"이었다. 하지만 긴 숫자열을 잘못 읽는 건 그저 인간다움이다. "조심해라"로는 고쳐지지 않고, 벌금으로는 더더욱 고쳐지지 않는다. 선택지는 두 가지다. 인간은 실수한다고 받아들이고 시스템이 잡게 하거나, 인간은 절대 실수하지 않는다고 걸고 매달 며칠씩 "사라진" 화물을 찾는 것이다. 전자는 숫자 한 자리의 비용, 후자는 한 고객에게 장부상 2,000,000원을 잃게 했다. 이 계산은 스스로 할 수 있을 것이다.

내일 할 수 있는 일 하나: 오늘 밤 WMS 로케이션 마스터 데이터를 열어 체크 디짓 필드가 있는지 확인하라. 없으면 위의 다섯 가지 체크리스트를 인쇄해 벽에 붙이고, 다음 가동 전에 실행하라.

Lin Xiao, WMS 구현 컨설턴트 지음

영어판 번역본입니다. 내용이 다를 경우 영어판을 우선합니다.