BOM 자동화로 발주서 한 건 6시간을 1시간으로 줄인 방법
BOM 자동화를 직접 만들어 쓰기 전까지, 저는 발주서 한 건에 6시간을 썼습니다.
발주서가 오면 그날 하루가 사라졌다
레이저 절단·절곡 일을 하다 보면, 발주서가 들어오는 순간부터 도면이 아니라 엑셀을 봅니다.
- 발주서 품목을 하나씩 BOM으로 옮겨 적고
- 그 BOM을 도면과 1:1로 맞춰보고
- 도면을 풀어서 각 부재에 마킹을 넣고
- 출고할 때 나갈 송장을 엑셀로 한 장씩 만들어 출력하고
- 출고일자 도장까지 찍어서 서류를 완성하고
여기까지가 절단을 시작하기 전에 끝나 있어야 합니다. 기계는 멈춰 있고, 저는 엑셀에 앉아 있었습니다.
발주서 한 건에 대략 6시간. 오전에 받으면 작업 지시는 오후 늦게야 나갔습니다. 그리고 이 일에는 창의성이 0입니다. 옮겨 적고, 분류하고, 합치고, 출력하는 것뿐입니다.
저는 이 일 외에도 송장 정리, 사급자재 관리, 현장 업무 파악, 타 업체 일정까지 함께 보고 있었습니다.
발주서 한 건에 하루를 통째로 내줄 수가 없었습니다.
지난 글에서는 집에서 회사 작업 환경에 접속하는 원격 세팅을 만들었습니다. 이번 편은 그 위에서 돌리는 첫 번째 자동화입니다.
그래서 파이썬으로 도망쳤습니다.
뭘 만들었나 — BOM 자동화 프로그램
발주서 파일을 넣으면 아래를 한 번에 뱉는 프로그램입니다.
| 출력물 | 내용 |
|---|---|
| 정리된 BOM | 부재 종류별로 묶고, 마킹 순으로 정렬, 착지별 시트 분리 |
| 현장분류표 | 마킹 × 착지 수량 매트릭스 — A4 세로 한 장 |
| 출고 송장 | 납기 × 착지 조합별로, 3부(납품처용·현장보관용·사무소보관용) 자동 생성 |
| 정리된 도면 | 마킹 규칙에 맞게 파일명 일괄 변경 |
발주서를 끌어다 놓고 마킹 시작값만 정하면 끝입니다. 도면 폴더를 지정하면 파일명까지 같이 정리됩니다.
결과
| 구분 | 자동화 전 | 자동화 후 |
|---|---|---|
| 발주서 1건 처리 | 약 6시간 | 1~2시간 |
| 송장 작성 | 엑셀로 건마다 수작업 | 조합별 자동 생성 |
| 현장 문의 | 마킹·수량 확인 전화 잦음 | 분류표 한 장으로 정리 |
시간이 줄어든 것보다 중요한 건 현장에서 혼란이 사라진 것입니다. 예전에는 이 부재가 어디로 가는 건지 확인하는 전화가 계속 왔습니다. 지금은 현장분류표 한 장이 그 질문을 대신 받습니다.
BOM 자동화 실행 순서
엑셀을 읽고 쓰는 부분은 pandas와 openpyxl 두 라이브러리로 전부 해결됩니다.
개발자용 글이 아니니 코드는 최소한만 붙입니다. 흐름이 핵심입니다.
1. 발주서 양식부터 판별한다
가장 먼저 부딪히는 벽입니다. 발주서에는 표준이 없습니다. 거래처마다 다르고, 같은 거래처 안에서도 담당자마다 다릅니다.
그래서 파일을 읽자마자 “이게 어떤 양식인지”부터 판정하게 했습니다. 컬럼 개수, 특정 헤더 문구의 유무 같은 지문을 봅니다.
python
# 컬럼 수 + 헤더 키워드 조합으로 양식을 먼저 확정한다
if col_count == 16 and "발주수량" in row3:
fmt = "D형"
elif "구간" in header:
fmt = "B형"
양식을 먼저 확정해두면 그 뒤 로직은 전부 하나의 표준 형태만 다루면 됩니다. 이 구조로 안 짜면 거래처가 늘어날 때마다 프로그램 전체를 뜯어고치게 됩니다.
2. BOM을 표준 형태로 정규화한다
양식이 뭐였든 이 단계를 지나면 컬럼 이름과 순서가 같아집니다. 재질·두께·수량 표기의 흔들림도 여기서 통일합니다.
3. 마킹을 자동으로 부여한다

부재마다 마킹 코드를 붙입니다. 이 코드가 도면 파일명·현장분류표·송장을 하나로 묶는 열쇠입니다.
같은 부재명은 반드시 같은 마킹을 받아야 하고, 마킹 시작값(A1, B1, AA…)을 지정할 수 있게 했습니다. 여러 발주 건을 동시에 돌릴 때 마킹이 겹치면 현장이 그대로 섞이기 때문입니다.
정렬에도 한 가지 함정이 있습니다. 문자 그대로 정렬하면 A10이 A2보다 앞에 옵니다. 그래서 문자 부분과 숫자 부분을 분리해서 숫자는 자릿수를 맞춘 뒤 정렬합니다. 사소해 보이지만, 현장에서 파레트를 순서대로 쌓을 때 바로 티가 납니다.
4. 현장분류표를 만든다
마킹을 세로, 착지를 가로에 두고 수량을 채운 매트릭스입니다. A4 세로 한 장에 들어가도록 인쇄 설정을 강제했습니다. 두 장이 되는 순간 현장에서 안 봅니다.

현장에 나가는 종이는 이 한 장입니다. “이 마킹은 어느 파레트에 몇 개” 가 전부라, 물어볼 게 없어집니다. 거래처별로 마킹이 들어간 제품만 적재하도록 만들었습니다.
5. 송장을 납기 × 착지 조합으로 뽑는다
제일 시간을 잡아먹던 구간입니다. 특히 종이 발주서가 오면 그걸 보고 송장을 처음부터 엑셀로 다시 만들어야 했습니다.
지금은 납기와 착지 조합마다 3부가 자동으로 나옵니다. 거래처도 발주번호로 확인하기 때문에, 이 번호가 서류 전체를 관통하는 기준값이 됩니다.


발주서 한 건에서 착지 4곳 × 3부 = 12장이 한 번에 나옵니다. 예전엔 이걸 손으로 만들었습니다.
납품처 정보와 서명란까지 채워진 상태로 나옵니다. 여기에 출고일자 도장만 찍으면 서류가 끝납니다.
지뢰 — 실제로 밟은 것들
지뢰 1. 마킹을 거래처 도면코드 그대로 넣었더니, 레이저가 느려졌다
처음엔 당연히 거래처가 쓰는 도면코드를 그대로 마킹으로 넣었습니다. 현장에서 바로 대조되니까요.
그런데 절단 속도가 안 나왔습니다. 마킹은 결국 레이저가 글자를 그리는 작업이라, 문자 수가 늘어나면 그만큼 시간이 붙습니다. 부재가 수백 장이면 그 차이가 그대로 사이클 타임이 됩니다.
교훈: 마킹 코드는 사람이 구분할 수 있는 최소 길이로 설계합니다. 긴 원본 코드는 프로그램 안에서 짧은 코드와 매핑해두고, 대조가 필요하면 표를 보면 됩니다. 정보는 종이가 들고, 철판에는 최소한만 새깁니다.
지뢰 2. 대문자 하나 차이로, 같은 부재가 두 개로 잡혔다
이건 한참 못 찾았습니다. 발주서에 같은 부재가 어떤 줄에는 대문자로, 어떤 줄에는 일부만 소문자로 들어와 있었습니다. 사람 눈에는 같은 부재인데, 프로그램에는 서로 다른 두 개였습니다.
결과는 마킹이 둘로 쪼개지고, 현장분류표에 같은 부재가 두 줄로 뜨는 것이었습니다. 원인은 ERP에 입력하는 사람이 매번 같은 방식으로 치지 않는다는, 지극히 평범한 사실이었습니다.
교훈: 사람이 입력한 데이터에는 반드시 표기 편차가 있습니다. 대소문자, 공백, 전각/반각. 이걸 정규화하는 단계를 파이프라인 맨 앞에 두지 않으면, 이후 모든 집계가 조용히 틀립니다. 조용히 틀리는 게 제일 무섭습니다.
지뢰 3. 주소를 저장하는 칸과 읽는 칸이 서로 달랐다
송장에 납품지 주소가 계속 - 로 인쇄됐습니다.
원인은 허무했습니다. 발주서에서 뽑은 주소는 담당자 파일의 ‘비고’ 칸에 저장되고 있었는데, 송장을 만들 때는 ‘주소’ 칸을 읽고 있었습니다. 쓰는 곳과 읽는 곳이 다르니 영원히 빈 값이었던 겁니다.
고치면서 세 가지를 같이 넣었습니다.
- 기존에 비고에 들어가 있던 주소를 주소 칸으로 한 번만 자동 이관
- 발주서에서 자동으로 뽑은 값은 빈 칸만 채우고, 사람이 직접 입력한 값은 절대 덮어쓰지 않게
- 송장을 만들기 전에 주소가 빈 착지를 먼저 찾아 입력창을 띄우게


결국 이 표가 송장의 품질을 결정합니다. 프로그램보다 이 표를 먼저 정리해야 했습니다.
교훈: 참조 데이터가 틀리면 자동화는 틀린 값을 더 빠르게 인쇄할 뿐입니다. 그리고 자동 수집과 사람 입력이 섞이는 곳에서는 누가 이기는지를 반드시 정해둬야 합니다. 저는 “사람이 이긴다”로 정했습니다.
지뢰 4. 코드로 다 받아주려 하지 말고, 양식을 통일시켜라
같은 거래처인데 발주하는 사람마다 양식이 달랐습니다. 파서에 예외를 계속 붙일 수도 있었지만 그건 끝이 없습니다.
그래서 거래처에 발주 양식 통일을 요청했습니다.
교훈: 자동화를 하다 보면 “코드로 다 받아주자”는 유혹이 옵니다. 하지만 입력을 정리하는 게 코드를 늘리는 것보다 싼 경우가 많습니다. 자동화의 절반은 프로그래밍이 아니라 업무 규칙 협의입니다.
짧은 지뢰들
- 발주번호 오기입 — 송장도 거래처 확인도 전부 발주번호 기준인데, 한 글자만 틀려도 물건은 갔는데 서류상 없는 건이 됩니다. 문서 전체를 묶는 키값에는 검증을 겁니다.
- 결과 파일을 엑셀로 열어둔 채 실행 — 저장이 실패합니다. 지금은 파일이 잠겨 있으면 시간을 붙인 새 파일명으로 저장하고 그 사실을 로그에 알려줍니다.
- 전화번호 앞자리 0이 사라짐 — 엑셀이 010…을 숫자로 바꿔버립니다. 읽을 때부터 문자로 강제하고, 셀 서식도 텍스트로 고정해야 합니다.
같은 걸 만들려는 분을 위한 체크리스트
- 지금 하는 일을 단계별로 종이에 적었는가 (자동화 대상은 “느낌”이 아니라 “단계”)
- 어느 단계가 제일 오래 걸리는지 숫자로 알고 있는가
- 입력 양식이 몇 종류인지 세어봤는가 — 세기 전에 코드부터 짜면 반드시 다시 짭니다
- 사람이 친 글자를 정규화하는 단계가 파이프라인 맨 앞에 있는가
- 모든 문서를 관통하는 키값(발주번호 등)을 정하고, 그 값에 검증을 걸었는가
- 자동 수집 값과 사람 입력 값이 충돌할 때 누가 이기는지 정했는가
- 마킹처럼 기계 시간에 영향을 주는 항목을 최소화했는가
- 현장에 나가는 종이는 한 장에 들어가는가
- 코드로 받을 것과 사람에게 요청할 것을 구분했는가
다음 글 예고
다음 편에서는 절곡 계산기를 다룹니다. 전개 길이와 K값 문제, 그리고 현장 실측과 계산값이 왜 자꾸 어긋나는지에 대한 이야기입니다.
비슷한 작업 때문에 시간을 뺏기고 계신가요
발주서 정리, BOM 작성, 송장 발행처럼 매번 반복되는 사무 작업이라면 자동화할 수 있습니다.
어떤 작업을 몇 번 반복하시는지만 알려주세요.
판금하는 탄즈 — 레이저 절단·절곡 9년차. 반복 작업이 싫어서 AI와 자동화로 도망치는 중.