결론부터 말하겠다. FIFO로 운영하는 식품 창고는 FEFO(first-expired, first-out: 유통기한이 임박한 것부터 먼저 출고)로 운영하는 창고에 비해 유통기한 만료로 폐기하는 제품이 보통 2~3배 많다. 나는 이 현상을 십여 곳이 넘는 식품 유통 현장에서 지켜봤다. 그리고 이건 대개 소프트웨어 문제가 아니다. 대부분의 WMS는 유통기한 순으로 재고를 할당할 수 있다. 문제는 입력되는 유통기한 데이터가 엉터리이고, 출력되는 알림을 아무도 보지 않는다는 것이다.

사람들은 FIFO와 FEFO가 거의 같다고 생각한다. 아니다. 먼저 들어온 것이 먼저 만료되는 것은 아니다. 3월에 입고된 같은 SKU가 내년 6월까지 멀쩡한데, 5월에 입고된 로트는 올해 11월에 만료된다. 식품 창고에서는 매일 일어나는 일이다. FIFO로 출고하면 11월 만료 로트는 뒤쪽에 남고 6월 만료 로트는 문 밖으로 나간다. 누군가 눈치챘을 때는 이미 파렛트 단위 폐기가 확정된 상태다. 로스앤젤레스 외곽의 냉동식품 3PL(약 60,000제곱피트)이 몇 년 전 이 수업료를 톡톡히 치렀다. 냉동 새우 파렛트 하나가 유통기한을 두 달이나 넘긴 뒤에야 발견됐다. 수만 달러가 그대로 폐기장으로 갔다. 왜 그랬을까. 그 회사 시스템에는 유통기한 필드 자체가 없었다. 피킹은 입고 날짜로만 돌아갔다.

유통기한 데이터가 엉터리면 FEFO는 연극이다

FEFO는 두 가지 데이터 위에 선다. 로트 번호와 유통기한이다. WMS에서는 입고 시 이 두 가지를 필수로 해야 한다. 날짜 없으면 입고 없다. 이것이 철칙이다. 내가 본 가장 어처구니없는 꼼수는 이렇다. 입고가 밀리면 시스템이 유통기한 입력을 건너뛰게 해주고 2099-12-31을 자동으로 채워준다. 6개월 뒤 수천 건의 재고 레코드가 "2099년에 만료"되고, FEFO 알고리즘은 허구를 정렬하고 있다. 그런 건 없는 것과 같다.

날짜 형식도 표준화해야 한다. 공급사 라벨은 엉망이다. 한 박스는 06/08/26, 다음 박스는 08-JUN-2026, 어떤 건 제조일자만 찍혀 있고 유통기한은 없다. 입고 SOP는 하나의 규칙을 정해 고정해야 한다. 연-월-일, 유통기한만, 제조일자는 사용 금지. 입고 담당자가 고르게 하려고 "제조일자" 필드와 "유통기한" 필드를 둘 다 열어두지 마라. 나는 이걸로 크게 데인 적이 있다. 작업자의 절반은 한쪽 필드, 나머지는 다른 쪽에 입력해서 재고의 절반에서 시스템의 유통기한 정렬이 틀어진다.

입고 시 잔여 유통기한 검증 규칙도 필요하다. 잔여 기한이 너무 짧게 남은 제품은 입고 거절이나 품질 보류(QA hold)로 돌린다. "너무 짧다"의 기준은 카테고리마다 다르다. 12개월 상온 제품은 남은 기한이 3분의 1 미만이면 무조건 탈락. 45일 냉장 제품은 절반 밑이면 걱정하기 시작한다. 만능 숫자는 없다. 카테고리와 회전 속도에 맞춰 정하고 입고 SOP에 쓰고, 실제 자사의 시스템과 운영에 맞게 조정한다. 핵심은 벽에 붙인 라미네이트 안내문이 아니라 시스템의 강제 검증으로 만드는 것이다. 안내문은 입고 담당자를 막지 못한다. 팝업은 막는다.

한 가지 함정이 더 있다. 공급사의 혼합 로트다. 같은 파렛트에 유통기한이 두 개면 두 개의 로트로 따로 입고해야 한다. 빠르다고 하나로 합치면 시스템이 보는 유통기한은 하나뿐이다. 파렛트의 나머지 절반은 FEFO에서 보이지 않게 된다. 시간을 아끼려고 정확히 이렇게 한 창고를 본 적이 있다. 파렛트마다 임박한 절반이 계속 후순위로 밀리다가 아무도 모르게 유통기한이 지났다.

날짜 라벨이 희미하게 보이는 식품 창고 선반에 가지런히 쌓인 박스

아무도 움직이지 않는 알림은 스팸일 뿐이다

데이터가 깨끗해지면 경고가 필요하다. 나는 3단계로 운영한다. 유통기한까지 90일, 60일, 30일. WMS가 매일 유통기한 리포트를 생성해 담당자에게 보낸다. 단계와 일수는 카테고리별로 달라야 한다. 냉장과 상온은 같은 매뉴얼을 쓸 수 없다. 그런데 여기서 모두가 빼먹는 부분이 있다. 모든 알림에는 담당자와 액션이 붙어야 한다. 90일이면 "영업에 연락해서 물량을 빼라". 60일이면 "할인 또는 이전 계획". 30일이면 "폐기 승인 시작". 액션이 붙지 않은 알림은 스팸이고, 석 달이면 아무도 읽지 않는다.

가장 설정하기 어려운 것은 출고 할당 로직이다. 유통기한 오름차순의 순수 할당은 이론상 최적이지만 현실에서는 처참하다. 피크 경로가 산산조각 나고 피커는 한 주문 때문에 건물 절반을 걷게 된다. 이게 진짜 트레이드오프다. 유통기한 우선이냐 피킹 효율이냐. 나의 절충안은 이렇다. 먼저 유통기한 순으로 할당하되, 같은 웨이브 안에서는 유통기한이 며칠 범위 안에 드는 로트들의 피킹을 합칠 수 있게 한다. 며칠은 상관없다. 몇 달은 상관있다. 이 윈도우는 카테고리별로 조정한다. 냉장은 좁게, 상온은 넓게. 이론상의 최적을 쫓지 마라. 피커가 실제로 따르는 90점짜리 계획이 아무도 실행하지 않는 100점짜리 계획을 이긴다.

동작하는 FEFO와 장식용 FEFO를 가르는 설정이 하나 더 있다. 임박 재고를 깊은 보관 구역에서 죽게 두지 마라. 60일 알림이 울리면 그 재고를 포워드 피크 존(포장에 가장 가깝고 집기 가장 쉬운 곳)으로 옮기라고 시스템이 권장해야 한다. 물리적 배치와 FEFO 할당의 이중 잠금이다. 할당 로직만 설정하고 슬롯 전략은 설정하지 않는 창고가 많다. 그러면 임박 파렛트는 리저브 구역 뒤쪽에서 잠자고 피커는 손에 닿는 대로 집는다. 시스템은 맞았다. 인간의 본성이 이겼다.

임박 재고는 어떻게 처리하나. 출구는 세 가지다. 할인, 기부, 폐기. 아울렛이나 직원 판매로 할인해서 회수할 수 있는 건 회수한다. 미국에서 기부는 Bill Emerson Good Samaritan Food Donation Act of 1996(1996년 빌 에머슨 착한 사마리아인 식품 기부법)으로 보호된다. 유통기한이 지나지 않은 식품을 기부한 사람을 원칙적으로 책임에서 보호하고 세제 혜택이 있을 수도 있다. 자세한 건 세무사와 상의하라. 정말 구제 불능이면 이중 승인, 사진 기록, 적법한 절차의 폐기다. 폐기 워크플로도 시스템에 넣어야 한다. 누가 신청하고 누가 승인하며 어떻게 폐기하고 사진은 어디에 두는가. 프로세스가 시스템에 없으면 그 프로세스는 존재하지 않는 것과 같다.

덧붙이자면 FEFO는 식품만의 것이 아니다. 의약품과 화장품도 같은 로직이다. 다른 점은 알림 윈도우가 더 타이트하고 폐기 컴플라이언스가 더 엄격하다는 것뿐이다.

그리고 대부분의 창고가 닫지 않고 잊는 루프가 있다. 사이클 카운트다. 수량만 세지 말고 유통기한을 실물 라벨과 대조하라. 라벨과 시스템의 불일치는 입고나 이동 때 누군가 프로세스를 우회했다는 증거다. 유통기한 불일치를 별도의 카운트 차이 카테고리로 기록하고 매월 리뷰하라. 카운트는 데이터가 얻을 수 있는 가장 정직한 거울이다.

내일 아침 WMS에서 쿼리 하나를 돌려보라. 유통기한이 공란인 재고 레코드, 혹은 2099-12-31 같은 플레이스홀더가 몇 건인지. 먼저 이 구멍을 막아라. 이것 없이는 FEFO가 하나도 돌아가지 않는다.

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