케이터링 식자재 ERP를 만들 때 가장 먼저 정확히 옮겨야 했던 규칙이 자재명세서(BOM) 였어요. "메뉴 몇 개를 만들려면 재료가 얼마나 필요한가"는 사람이 레시피를 보며 손으로 계산하던 일인데, 이걸 시스템이 대신하게 하는 게 필요재료 자동산출이에요. 이 글은 자재명세서 개념을 케이터링 사례로 풀어봅니다. 전체 그림은 케이터링 식자재 ERP 구축 사례에 있어요.
자재명세서(BOM)란 무엇인가요
자재명세서(BOM, Bill of Materials)는 완성품 하나를 만드는 데 필요한 하위 재료와 수량의 목록이에요. 제조업에서 나온 개념인데, "이 제품을 만들려면 부품 A 2개, 부품 B 3개가 든다"를 표로 정리한 것이죠. 케이터링에서는 완성품이 메뉴, 하위 재료가 식자재예요. "이 도시락 1개에는 밥 300g, 닭고기 150g, 양념 30g이 든다" 같은 레시피가 곧 그 메뉴의 자재명세서예요.
BOM이 중요한 이유는, 주문은 "메뉴 단위"로 들어오는데 발주와 재고는 "재료 단위"로 움직이기 때문이에요. 이 둘 사이를 이어주는 변환표가 바로 자재명세서죠. 자재명세서가 시스템에 정확히 들어 있으면, 주문을 재료 소요량으로 자동 번역할 수 있어요.
레시피를 재료로 펼치는 'BOM 폭발'
핵심 동작은 BOM 폭발(BOM explosion) 이에요. 주문에 담긴 각 메뉴를, 그 메뉴의 레시피(재료별 기준 소요량)로 펼쳐서 주문 수량만큼 곱하는 거예요. 우리 시스템에서 레시피 한 줄은 "기준 수량당 이 재료가 얼마"라는 값을 가져요.
quantity_per_base * box_count # 기준 소요량 × 주문 수량주문에 메뉴가 여러 개면, 각 메뉴를 이렇게 펼친 뒤 같은 재료끼리 합산해야 해요. 도시락 A에도 양파가 들어가고 도시락 B에도 양파가 들어가면, 두 소요량을 더해 "양파 총 필요량"을 내야 발주가 맞으니까요. 그래서 필요재료 산출은 품목 단위로 누적하는 구조예요. 주문에 담긴 메뉴를 하나씩 레시피로 펼치면서, 이미 나온 품목이면 소요량을 더하고 처음 나온 품목이면 새로 등록하는 식으로 품목별 합산표를 채워 나가요.
이렇게 계산된 결과를 주문에 필요 재료 목록으로 저장해요. 주문이 저장될 때 콜백으로 이 계산이 돌기 때문에, 메뉴나 수량을 바꾸면 필요 재료도 기존 것을 지우고 다시 만들어져요. 담당자가 재료를 손으로 다시 세지 않아도 항상 최신 상태가 유지되는 거죠.
예제로 보는 재료 합산
숫자로 보면 이해가 빨라요. 도시락 A와 도시락 B를 주문에 담았다고 해볼게요. 도시락 A의 레시피는 밥 300g·양파 20g, 도시락 B의 레시피는 밥 250g·양파 15g·닭고기 150g이라고 하죠. 주문에 도시락 A를 40개, 도시락 B를 30개 담으면 계산은 이렇게 펼쳐져요.
| 재료 | 도시락 A(40개) | 도시락 B(30개) | 합산 필요량 |
|---|---|---|---|
| 밥 | 12,000g | 7,500g | 19,500g |
| 양파 | 800g | 450g | 1,250g |
| 닭고기 | - | 4,500g | 4,500g |
밥과 양파는 두 메뉴에 모두 들어가니 합쳐지고, 닭고기는 도시락 B에만 있으니 그대로 나와요. 사람이 이걸 손으로 하면 메뉴가 늘수록 실수가 쌓이지만, 시스템은 품목 단위로 누적하니 몇 개든 정확히 합산해요.
자잘하지만 중요한 예외 처리
BOM 폭발에는 자잘한 예외가 있어요. 레시피의 기준 소요량이 비어 있거나 0이면 계산에서 건너뛰어야 해요. 안 그러면 "필요량 0"인 재료가 목록을 지저분하게 채우니까요. 또 소모품(포장용기·수저 등)은 재료와 성격이 달라 별도로 다뤄요. 재료는 레시피에서 나오지만 소모품은 주문 자체에 붙는 식이죠. 이런 경계를 코드에 명확히 두어야 필요 재료 목록이 실제 발주에 바로 쓸 수 있을 만큼 깔끔해져요. 또 산출된 필요 재료는 그대로 주방·현장용 작업지시서로 뽑을 수 있어, 계산 결과가 문서 작업으로 한 번 더 이어지지 않도록 했어요.
기능
메뉴와 수량만 고르면 필요 재료가 자동 산출
주문에 메뉴와 수량을 넣으면 각 메뉴의 레시피가 재료 단위로 펼쳐지고, 여러 메뉴가 같은 재료를 쓰면 자동으로 합산됩니다. 저장 전에도 미리보기로 필요 재료를 확인할 수 있어요.
메뉴별 필요재료 자동산출 화면

필요재료 자동산출 표 화면
저장 전에 보이는 '미리보기'가 중요한 이유
필요재료 산출은 저장 후에만 보이면 늦어요. 주문을 확정하기 전에 "이 구성이면 재료가 이만큼 든다"를 눈으로 봐야 메뉴 구성을 조정할 수 있으니까요. 그래서 주문 작성 화면에서는 메뉴·수량을 바꿀 때마다 필요 재료 표가 실시간으로 다시 그려지는 미리보기를 넣었어요. 저장하면 그 계산 결과가 주문의 확정된 필요 재료로 남습니다.
이 자동산출이 정확해야 그다음 단계인 재고 차감과 발주가 맞아떨어져요. 재료가 어떤 단위로 저장되고 재고에 어떻게 반영되는지는 재고 단위와 사용 단위를 분리한 이유에서 이어집니다. 기존 엑셀 레시피표를 시스템으로 옮기는 준비 과정은 엑셀을 버리지 않고 시스템으로 옮기는 법에서 다뤘어요.
자주 묻는 질문
자재명세서(BOM)와 레시피는 같은 건가요?
개념적으로는 같은 역할이에요. 제조업의 자재명세서가 "제품 = 부품 목록"이라면, 케이터링의 레시피는 "메뉴 = 재료 목록"이에요. 시스템 관점에서는 둘 다 완성품을 하위 재료 수량으로 펼치는 변환표라서, 레시피가 곧 그 메뉴의 자재명세서예요.
메뉴 여러 개가 같은 재료를 쓰면 어떻게 계산되나요?
각 메뉴를 재료로 펼친 뒤 같은 품목끼리 소요량을 더해 하나로 합산합니다. 예를 들어 두 메뉴가 모두 양파를 쓰면 양파 필요량은 두 메뉴의 소요량을 합친 값으로 나와, 발주와 재고 차감이 어긋나지 않아요.
레시피를 바꾸면 이미 넣은 주문의 재료도 바뀌나요?
필요 재료는 주문이 저장될 때 다시 계산됩니다. 메뉴나 수량을 수정해 주문을 저장하면 기존 필요 재료를 지우고 현재 레시피 기준으로 새로 만들기 때문에, 항상 최신 레시피가 반영된 상태가 유지돼요.