발주량 자동 산정하는 로직 만들기

by 여름비


물류 운영자분들이 겪는 가장 어려운 문제들 중 하나는 발주량을 얼마나 산정해야 하는 것이다.

그냥 말로 하니 쉬워보이지만 사실 발주량을 산정한다는 것을 쪼개보면 [수요 예측, 발주 한계, 재고 정책, 비용 및 이득 산정] 이라는 다양한 요소들이 엮여 있다. 그리고 각 요소들은 치열한 고민과 최적화가 필요하다.

이와 연관하여 이전에 운영 효율화를 위해 MVP형식으로 (일단 간단하게 만들어보고 추후 고도화 하자는 의미) 모델을 만들어 보았다.

결과부터 말해보면 SCM,

운영자분들의 리소스를 적어도 5시간 이상 줄일 수 있고, 발주 프로세스의 효율성 및 예측성을 측정하여 물류 정책의 고도화를 할 수 있는 가능성은 발견했으나, 동시에 실무에서 반영해야 하는 추가적인 로직들이 있어 실무에 적용하기 위해서는 물류 운영 프로세스에서 아직 정의되지 않고 메뉴얼로 처리되는 것들을 먼저 자동화 및 고도화를 해야 된다는 것을 발견했다.

발주 자동화 이전에 무엇을 고도화하고 정책을 설정해야 하는지에 대해서는 나중에 기회가 될 때 설명하고, 일단 그래도 가능성을 발견했던 로직에 대해서 이야기를 나누어 보고자 한다.


발주 자동화를 한다는 것은 일단 적어도 아래 세 가지 사항이 정해져야 한다:


1. 수요를 어떻게 예측할 것인가
2. 발주량 산정을 위한 최적화 로직은 무엇을 목표로 해야 하는가
3. 발주를 하는데 적용되는 한계는 무엇인가

첫 번째로, 발주를 한다는 것은 미래에 있을 수요에 대비해 상품이 품절 나지 않도록 미리 구매 주문서를 넣는 것과 마찬가지이다. 따라서 발주량 산정 자체가 수요예측에 근거한다고 볼 수 있다. 수요 예측 자체가 얼마나 큰 정확도와 상세를 요구하는지에 따라 복잡도가 끝도없이 올라가는 경향이 있다. 요번 프로젝트에서 이 미래의 수요를 그냥 일평균 판매량으로 대체하여 사용했다. 운영에서 자주 사용하는 기준이기 때문이기도 하다.

두 번째로, 발주량을 산정하기 위해서는 목표를 설정해야 한다. 재고 비용을 최소화 하는게 목표인가? 아니면 수익을 최대화 하는게 목표인가? 아니면 지금의 회사 상황에 따른 특수한 목표를 달성하는 것이 목표인가? 그에 따라 무엇을 얼마나 발주해야 하는지가 달라진다. 요번 프로젝트에서는 이런저런 상황들을 고려하여 재고 비용의 최소화를 목표로 두었다.

세 번째로, 발주 프로세스 내에 내재된 한계를 정의해야 한다. 각 SKU의 MOQ는 얼마인가? 트럭운송 혹은 컨테이너 운송 시 어떤 MOQ와 최소 발주 CBM이 존재하는가? 현재 창고의 최대 적재량은 어느 정도인가? 등을 미리 산정해두어야 얼마나 발주를 할지 계산할 수 있다.

위 3가지가 결정되면 이제 발주량 계산을 위한 최적화 로직을 짤 수 있다. 이때 다양한 ML로직, 인공지능 등을 사용할 수 있지만, 모든 프로젝트는 추후 정책의 변화 및 고도화를 위해 "이해 가능한 최대한 심플한 로직"을 1차로 만들어야 한다는 것이 내 지론이기에 최대한 심플한 로직을 만들어 보았다.

로직은 아래와 같다.


[핵심 아이디어: 2단계 최적화 전략]


발주량 계산의 핵심은 "제약조건을 만족하면서, 재고 비용을 최소화하는 것"이다. 이를 위해 2단계 접근법을 사용했다.



-1단계: 기본 발주량 산정 (필수 조건 충족) -

먼저 품절을 방지하기 위한 최소 발주량을 계산한다.

각 SKU별로:
1. 품절 예상 시점 계산 (현재 재고 + 입고예정 - 예상 수요)
2. 필요 수량 산정 (리드타임 + 목표 재고일수 고려)
3. MOQ 제약 적용 (공급업체 최소 주문량)
4. 팔레트 단위로 반올림 (물류 효율성)

이 단계에서는 "발주가 필요한가?"와 "최소한 얼마나 필요한가?"를 결정한다.

- 2단계: 반복적 최적화 (비용 최소화) -

1단계에서 계산된 발주량은 각 SKU의 필요량만 충족했을 뿐, 운송 제약(컨테이너/트럭 MOQ)을 만족하지 못할 수 있다. 이때 단순히 아무 SKU나 늘리면 재고 비용이 급증한다.

왜냐하면: 재고 보관비용은 수량의 제곱에 비례하기 때문이다.
- 1개 SKU에 100개 추가 → 비용 100²
- 2개 SKU에 50개씩 추가 → 비용 50² + 50² (절반 수준)

따라서 "어떤 SKU를 얼마나 늘려야 가장 경제적인가?"를 반복적으로 결정하는 최적화를 수행한다.

매 반복마다 두 가지 전략을 비교:

전략 A: 이미 발주하기로 한 SKU 중 하나를 팔레트 단위만큼 증량
전략 B: 아직 발주하지 않은 SKU를 MOQ만큼 신규 추가

→ 각 전략의 "추가 재고 보관비용"을 계산
→ 더 저렴한 전략 선택
→ 운송 제약 충족시까지 반복

이 과정에서 시스템은 자동으로:
- CBM이 큰 SKU보다 작은 SKU를 우선 증량
- 한 SKU에 집중하기보다 여러 SKU에 분산
- 컨테이너/트럭 용량을 최대한 효율적으로 활용


실무 적용 효과


이 로직의 강점은 "설명 가능성"에 있다.
- ML 블랙박스가 아닌, 각 의사결정의 근거가 명확함
- 운영자가 결과를 검증하고 필요시 수동 조정 가능
- 비즈니스 정책 변경시 로직 수정이 용이함

실제로 이 로직을 적용했을 때:
- 시간 절감: 발주량 산정에 소요되는 5시간 이상의 수작업 자동화
- 비용 효율: 재고 보관비용 최소화를 통한 운영비 절감
- 일관성: 사람마다 다른 판단 기준을 표준화
- 확장성: 추후 수요 예측 고도화, 다목적 최적화 등으로 진화 가능


문제점


나중에 발주 담당자분과 이야기를 나누어보니 몇가지 보완점이 있었는데 아래와 같다.

1. CMB이 작은 SKU 과도발주:
CBM이 작은 sku가 존재하면 끝없이 해당 sku를 추가하게 된다. 하지만 해당 sku가 팔리기 위해서는 다른 sku들과 짝이 맞아야 한다는 것을 고려하면 안좋은 최적화였다

2. 매출 미고려:
이는 첫 단계에서 매출을 고려하지 않기로 하고 진행한 것이었으나, 막상 진행해보니 매출을 너무 고려하지 않으면 기존에 진행하던 암묵적인 발주로직과 미스매치가 일어나 문제가 생겼다.

3. 수요의 메뉴얼 업데이트
수요는 가변적이어서 수동 업데이트가 필요한데 이를 가능하게 하는 인터렉티브 도구가 없었다.

매거진의 이전글어느 분석가의 실종 : 만약 분석 비용이 0이 된다면