제조 고객사 A사의 MES/POP 시스템 유지보수 중 받은 버그 리포트입니다. “자재투입 화면에서 재고는 분명히 있는데, 로트(LOT) 번호가 ‘없음’으로 나와요.” 재고 수량은 맞는데 로트만 없다 — 이 묘한 증상을 추적해 보니, 문제는 그 화면이 아니라 한참 상류인 구매입고에 있었습니다. LOT이 어디서 끊겼는지 추적하고, 사내 LOT과 외부업체 LOT을 분리하기까지의 기록입니다.
증상: 재고는 있는데 로트가 없다
생산 현장의 자재투입 화면은 “어느 로트의 자재를 투입할지”를 선택하는 화면입니다. 그런데 특정 자재들은 재고 수량은 정확히 잡혀 있는데 로트 목록이 비어 있었습니다. 로트 추적이 안 되면 품질 이슈가 생겼을 때 “어느 입고분이 어느 제품에 들어갔는지”를 역추적할 수 없으니, 단순 표시 버그가 아니라 추적성의 구멍입니다.
추적: 로트는 어디서 태어나는가
조회 화면을 의심하기 전에, 이 데이터가 어디서 만들어져서 어떤 경로로 흘러오는지부터 거슬러 올라갔습니다. 재고에 로트가 기록되는 경로는 두 갈래였습니다.
- 재고조정 경로 — 로트를 재고 테이블에 정상적으로 기록하고 있었음
- 구매입고 경로 — 로트를 재고 테이블에 넣지 않고 있었음. 로트 미입력 시 자동 채번도 없어서, 입고된 재고는 수량만 쌓이고 로트는 비는 구조
즉 “재고는 있는데 로트가 없다”는 증상 그대로였습니다 — 수량은 입고가 쌓아줬지만, 로트는 아무도 안 쌓아준 것. 조회 화면 버그처럼 보이는 문제의 뿌리가 쓰기 경로에 있는 전형적인 패턴입니다.
수정 1: 새 채번 대신, 있는 식별자를 재사용
수정 방향을 정할 때 선택지가 있었습니다. 로트 채번 체계를 새로 만들 것인가? 그러지 않았습니다. 입고 건마다 이미 유일한 식별자 — 입고번호(RCV-xxxx) — 가 있으니, 로트 미입력 시 입고번호를 로트로 쓰기로 했습니다.
- 구매입고 시 로트가 비어 있으면 입고번호를 로트로 재고·이력에 전파
- 로트 조회 로직도 입고번호를 로트로 연결하도록 보강 (창고 불일치 케이스 대응, 유령 중복 제거)
- 이미 로트 없이 쌓여 있던 기존 재고는 백필 스크립트로 입고번호 기준 로트를 소급 부여
“입고번호=로트” 방식의 장점은 채번 시스템이 하나 줄어든다는 것만이 아닙니다. 로트를 보는 순간 어느 입고 건인지가 그 자체로 읽힙니다. 추적성 문제를 풀면서 식별자 간 매핑 테이블도 필요 없어진 거죠.
수정 2: 사내 로트와 업체 로트는 다른 값이다
그런데 여기서 새 요구가 나옵니다. “외부업체가 자재에 붙여 보낸 로트 번호도 관리하고 싶다.” 순간 유혹이 생깁니다 — 로트 컬럼에 업체 로트를 넣으면 되지 않나?
안 됩니다. 두 값은 용도가 다릅니다. 사내 로트(=입고번호)는 우리 시스템의 추적 키이고, 업체 로트는 공급사가 붙인 외부 표기입니다. 한 컬럼에 섞으면 “어떤 행은 우리 채번, 어떤 행은 업체 표기”인 컬럼이 되어 추적 키로서의 신뢰가 무너집니다. 그래서:
lot_number는 사내 추적 로트(=입고번호)로 의미를 고정- 업체 로트는 신규 컬럼(supplier_lot_no)으로 분리 — 마이그레이션으로 개발·운영 모두 적용
- 입고 화면에 “업체 LOT” 입력칸을 따로 추가
이제 품질 역추적 시 “우리 입고 몇 번째 건인지”(사내 로트)와 “공급사 쪽 어느 로트인지”(업체 로트)를 각각 물을 수 있습니다.
교훈
- 조회 버그의 뿌리는 대개 쓰기 경로에 있다. “화면에 안 나온다”는 리포트를 받으면 화면 코드보다 데이터의 출생 경로부터 거슬러 올라가는 게 빠르다. 쓰기 경로가 여러 갈래면(입고/조정) 각 갈래가 같은 규약을 지키는지 확인할 것.
- 새 채번 전에, 이미 있는 유일 식별자를 찾아라. 입고번호처럼 이미 유일성이 보장된 값을 재사용하면 채번 시스템과 매핑 관리가 통째로 사라진다.
- 의미가 다른 값은 컬럼을 분리하라. 사내 추적 키와 외부 표기를 한 컬럼에 섞는 순간, 그 컬럼은 둘 다로서 못 쓰게 된다.
- 코드 수정과 기존 데이터 백필은 세트다. 쓰기 경로를 고쳐도 이미 쌓인 데이터는 그대로다. 소급 보정까지 끝나야 수정 완료.
덧붙여
이 작업도 AI 코딩 에이전트(Claude Code)와 페어로 진행했습니다. 두 갈래 쓰기 경로의 코드 추적과 백필 스크립트 작성은 에이전트가, “입고번호를 로트로 쓴다”와 “업체 로트는 컬럼을 분리한다”는 설계 결정은 사람이 했습니다. 제조 시스템 유지보수의 실전 사례들을 계속 기록합니다.