지난 몇 년간 자동화 창고 프로젝트에서 반복되는 기묘한 의식을 지켜봐 왔다. WMS 업체와 WES 업체가 같은 회의 테이블에 둘러앉는다. 인터페이스 얘기, 하드웨어 얘기, 분위기는 화기애애하다——누군가 "작업 할당"이라는 말을 꺼내기 전까지는. 그 순간 양쪽은 서로를 바라보기 시작하고, 눈빛에서 생각이 읽힌다. 그건 네 일이다.

회의가 끝나면 클라이언트는 항상 나를 따로 불러낸다. "Lao Mi, 이거 도대체 누구 책임입니까?" 나는 보통 되묻는다. "계약서에 있습니까?" 열에 아홉은 답이 아니다. 그 침묵이 바로 문제다. 웨이브 릴리스, 핫픽, 예외 처리——아무도 맡으려 하지 않는 세 가지 일이자, 자동화 프로젝트가 논쟁판이 되는 세 곳이다.

웨이브 릴리스: WMS가 곡을 쓰고, WES가 템포를 잡는다

교과서적인 이야기는 깔끔하다. WMS가 우선순위와 캐리어 컷오프 시간에 따라 주문을 웨이브로 묶고, 한 웨이브씩 릴리스하면 WES가 실행한다. 한쪽은 전략을 정하고, 다른 한쪽은 일을 한다.

그러다 AMR과 셔틀이 등장하면서 이야기가 복잡해졌다. WES 업체는 이렇게 말한다. 각 로봇의 실시간 상태와 각 통로의 혼잡을 다 볼 수 있으니 웨이브를 동적으로 만들고 릴리스할 수 있고, WMS의 경직된 정시 릴리스보다 훨씬 효율적이라고. WMS 업체의 반박: 웨이브는 주문 전략이고, 풀필먼트 약속이며, 장비 업체가 결정할 일이 아니다.

나는 2023년에 이 싸움을 직접 목격했다. 남부 캘리포니아 인랜드 엠파이어의 한 이커머스 풀필먼트 센터——200,000 제곱피트가 넘는 건물에 현장에는 40~50대의 AMR. WMS는 캐리어 컷오프에 맞춰 20분마다 웨이브를 릴리스했다. WES는 따라가지 못했다. 로봇이 지난 웨이브를 아직 씹고 있는데 다음 웨이브가 떨어졌다. 작업자는 통로에 서서 작업을 기다렸고, 로봇은 빈 채로 돌아다녔다. WMS 팀은 자기들의 웨이브 로직은 멀쩡하다고 했고, WES 팀은 릴리스 주기가 불가능하다고 했다. 클라이언트는 그 사이에 앉아——양쪽 말이 다 그럴듯하게 들렸다.

내 결론은 이렇다. 웨이브 전략은 WMS의 것이다——묶는 규칙, 우선순위 로직, 그건 주문 관리와 풀필먼트다. 하지만 릴리스 속도는 WES와 공유해야 한다. 장비가 실제로 얼마나 삼킬 수 있는지 아는 건 실행 계층뿐이기 때문이다. 실무에서는 여기 단일 소유자가 없다. 공동 소유만 있고, 양쪽 계약서에 써야 한다. WMS는 웨이브 전략 설정을 소유하고, WES는 릴리스 속도를 소유하며, 인터페이스 계약에는 WMS는 웨이브를 발행하고 WES는 작업을 흡수할 실시간 수용 능력을 발행한다고 쓴다. 누구의 필드인지, 누구의 로직인지——종이 위에.

창고 통로에서 나란히 일하는 작업자와 AMR

핫픽: 현장에서 가장 뜨거운 감자

핫픽만큼 치열하게 다투는 것도 없다. 고객 서비스에서 전화가 온다. 핵심 고객의 긴급 주문, 두 시간 안에 출고해야 한다. WMS는 최우선 플래그를 달아 WES로 밀어 넣는다. WES 영업사원은 데모에서 동적 우선순위 조정을 약속했다. 가동에 들어가면, 순서가 정해진 작업 계획에 주문 하나를 끼워 넣으려면 경로를 다시 계산해야 하고, 현장 전체 효율이 떨어진다. WMS는 말한다. "우선순위는 달았으니, 나머지는 네 몫이다." WES는 말한다. "달기는 네가 달았지만, 실행을 못 하겠다."

2024년, 오하이오의 한 3PL 현장에서는 피크 시즌에 하루 수십 건의 핫픽이 쏟아졌고, 최악의 시간대에는 거의 한 시간에 한 건꼴이었다. 파고들어 보니 WES에는 긴급 작업 전용 레인이 전혀 없었다. 모든 핫픽이 일반 재순서 대기열을 거쳤고, 솔버는 점점 느려졌으며, 일반 주문까지 함께 끌려 내려갔다. 클라이언트는 분노했다. "우리가 산 게 그게 아니잖아."

해결책을 협상 불가 세 가지로 압축했다. 핫픽 권한은 WMS에 있다——누가 앞당길 수 있는지, 하루에 몇 번까지인지. 쿼터가 있어야 하고, 쿼터 초과분은 수동 승인을 거친다. 쿼터 없는 앞당김은 보장된 재앙이다. WES는 무제한 끼어들기에 질식할 것이고, 그건 물리이지 소프트웨어 버그가 아니다. 핫픽 실행은 WES에 있다——용량을 예약하거나 전용 레인을 만들어 긴급 작업이 전체 순서를 망치지 않게 한다. 그리고 SLA는 계약서에 넣는다——핫픽 발행 순간부터 실행 시작까지, 합의한 분 이내. 숫자는 협상할 수 있다. 숫자를 갖는 건 협상 대상이 아니다.

예외 처리: 똑똑한 시스템이 멍청한 척하는 곳

셋째, 예외다. 로봇이 끼이고, 라벨이 스캔되지 않고, 중량 검사가 떨어진다——작업은 도중에 죽는다. 누가 가로채는가. 누가 결정하는가. 재시도할 것인가, 사람에게 넘길 것인가. WMS 업체의 논리: "우리는 상위 시스템이다. WES가 예외를 먼저 처리하고, 못 하는 건 에스컬레이션해야 한다." WES 업체의 논리: "장비를 돌리는 건 우리다. 주문 자체에 이상이 있는 것 같은 비즈니스 예외——그건 WMS의 판단이다."

양쪽 다 그럴듯하게 들린다. 현실에서는 어느 쪽도 맡지 않는 예외가 시스템 안에서 그냥 사라진다. 한 프로젝트에서는 가동 후 첫 세 달 동안 WES는 예외를 보고했다고 믿었고, WMS는 받아본 적이 없다고 믿었다. 근본 원인을 찾는 데 일주일이 넘게 걸렸고, 원인은 민망할 정도로 단순했다. WES가 보내던 예외 코드가 WMS 사전에 존재하지 않아 인터페이스가 조용히 버리고 있었던 것이다. 박스 하나가 컨베이어 위에서 이틀 동안 방치됐다. 아무도 몰랐다.

그래서 예외는 두 개 층으로 나눠야 한다. 장비층 예외——낀 로봇, 끊긴 연결, 실패한 스캔——은 WES의 것이다. 먼저 자가 치유를 시도해야 한다. 재시도하고, 경로를 바꾸고, 그래도 안 되면 에스컬레이션한다. 비즈니스층 예외——취소된 주문, 재고 불일치——는 WMS의 것이다. 그리고 두 층 사이에는 단 하나의 예외 코드 매핑표가 있어야 한다. 양쪽 업체가 서명하고, 통합 테스트에서 한 줄씩 테스트한다. 대부분의 프로젝트에는 이 표가 없다. 인터페이스가 연결되는지만 테스트하고 승리를 선언한다. 기억하라. 인터페이스가 연결되는 것과 예외 흐름이 동작하는 것은 같지 않다.

진짜 근본 원인——그리고 그것을 없애는 법

여기까지 오면 근본 원인은 아마 분명해졌을 것이다. 하지만 이름을 붙여보자. 이름을 붙이는 것이 계약 가능하게 만드는 것이니까.

우선, WES가 도대체 뭔지 아무도 정의한 적이 없다는 사실부터 시작하자. 10년 전에는 WMS가 모든 것을 돌렸고 장비는 멍청했다. 그 뒤 AMR과 셔틀이 두뇌를 갖게 되면서, 그것들을 관리하려고 WES가 태어났다. 하지만 업계는 WES의 경계를 표준화하지 않았다——어떤 업체의 WES는 사실상 작은 WMS이고, 어떤 업체의 그것은 간신히 장치 스케줄러다. 선정할 때는 모든 입찰자로부터 같은 걸 산다고 생각한다. 아니다. 데모는 다 비슷해 보이지만, 계약서는 두 마리 다른 동물을 묘사하고 있다.

그리고 더 깊은 문제가 있다. 양쪽 다 "최적화"하고 있지만, 최적화하는 게 다르다. WMS는 풀필먼트를 최적화한다——정시율, 컷오프 준수. WES는 장비 효율을 최적화한다——로봇 가동률, 통로 처리량. 풀필먼트는 속도를 원하고, 장비는 매끄러움을 원한다. 본질적으로 긴장 관계에 있고, 웨이브와 핫픽과 예외는 정확히 그 두 목표가 충돌하는 지점이다. 그러니 책임 공방은 태도의 문제가 아니다. 목적함수가 진짜로 어긋나 있다.

그리고 가장 해로운 것: 계약서에 없다는 것이다. WMS의 작업명세서(SOW)에는 "업체는 작업 할당 모듈의 책임을 진다"고 쓰여 있다. WES의 작업명세서에도 같은 문장이 쓰여 있다. 겹치는 경계에 모호한 문구——논쟁으로의 상시 초대장이다.

그럼 어떻게 계약서에 쓰는가. 내가 클라이언트에게 주는 템플릿은 세 칸짜리 단순한 표다. 항목, 소유자, 공동 소유자. 최소 여덟 개 항목을 다룬다. 웨이브 전략 정의, 웨이브 릴리스 속도, 핫픽 권한과 쿼터, 핫픽 실행 레인, 장비 예외 자가 치유, 비즈니스 예외 판정, 예외 코드 사전 유지보수, 인터페이스 필드 소유권. 각 항목마다 소유자는 정확히 한 명. "지원"이나 "보조"는 배정으로 치지 않는다.

또 몇 가지 엄격한 조항을 고집한다. 합격 기준 명문화——예외 코드표를 한 줄씩 테스트해서 합격률 100%, 핫픽 발행에서 실행 시작까지 5분 이내. 숫자는 협상할 수 있지만, 숫자를 갖는 건 협상할 수 없다. 예외 사전 유지보수 책임을 실명의 담당자에게 배정하고, 새 코드는 48시간 이내에 상대방과 동기화한다. 그리고 몇 번 데인 뒤에 추가했고, 이후 한 번도 빼지 않은 타이브레이커 조항: 경계 분쟁은 클라이언트가 48시간 이내에 결정하고, 논쟁 중에도 어느 쪽도 작업을 멈추지 않는다.

그 회의실로 돌아가자. 다음에 WMS 업체와 WES 업체가 나란히 앉아 작업 할당을 두고 서로를 바라보기 시작하면, 나는 보통 끼어든다. 바라보는 건 그만하고, 계약서를 펴고, 페이지와 줄을 찾아라. 경계는 회의에서 논쟁해서 정해지는 게 아니다. 써서 정해지는 것이다. 글로 쓰면 양쪽이 자기 일을 안다. 모호하게 두면 예외 하나하나, 핫픽 하나하나가 새로운 논쟁이 된다. 그리고 그 모든 논쟁의 비용은, 매번, 클라이언트에게 돌아간다.

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