미래멤버스
경력근거: 자체 인쇄 공장의 생산 ERP/MES 기능 개발 및 고도화
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고가 담당업무 첫 줄에 '자체 인쇄 공장의 생산 ERP/MES 기능 개발 및 고도화 (주문-생산-출고 흐름, 원가·재고 관리)' 를 적었고, FDE 항목에서는 '공장·CS·영업 현장에 직접 들어가 문제를 파악하고, 그 자리에서 쓸 수 있는 도구를 만들어 정착시키기' 를 요구했습니다. 주문이 생산으로 넘어가는 첫 관문이 접수 확인이고, 이 포트폴리오는 그 확인을 사양표와 규칙으로 옮깁니다. 공고가 '현업의 반복 업무를 찾아내 자동화' 를 함께 적은 것도 같은 자리를 가리킵니다. 이 포트폴리오가 보여주는 것은 사양을 데이터로 두고 주문서와 맞춰 생산 가능 여부를 가르는 기술이며, 인쇄 공정 설계나 원가 산출 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
'자체 인쇄 공장의 생산 ERP/MES 기능 개발 및 고도화'. 주문이 생산으로 넘어가는 첫 관문이 이 편의 자리입니다.
'공장·CS·영업 현장에 직접 들어가 문제를 파악하고, 그 자리에서 쓸 수 있는 도구를 만들어 정착시키기'. CLI 한 벌로 접수 담당이 바로 쓰는 형태입니다.
'마케팅·CS·주문·생산 등 현업의 반복 업무를 찾아내 자동화'. 접수 확인이 그 반복 중 하나입니다.
들어온 인쇄 주문이 공장 사양표에 그대로 걸리는지 가릅니다. 품목·규격·용지·최소 수량·리드타임을 사양표에 두고 주문서와 맞춰, 다 맞으면 생산 가능으로 넘기고 그렇지 않으면 규격 미지원·용지 없음·수량 미달·납기 부족 중 어느 쪽인지 사유로 남깁니다. 규격이 빈 주문은 어느 사양에 붙일지 정하지 못한다고 표시하고, 사양표에 없는 품목은 미매핑으로 남겨 생산 가능 여부를 먼저 정하게 합니다. 주문서는 실 고객 주문 대신 지원자가 인쇄물 공개 규격으로 만든 것을 가정합니다.
인쇄 공장 사내 개발자로 현업에 들어가 주문 접수 자리에 앉은 사람입니다. 고객마다 다르게 적어 보내는 주문서를 받아 사양표를 넘겨 가며 걸 수 있는지 하나씩 확인하고, 안 되면 다시 전화를 걸던 담당자의 옆자리에 있습니다.
품목마다 생산 가능한 규격과 용지, 최소 수량, 리드타임을 표로 두고 주문서와 맞추면, 그대로 걸 주문과 되물을 주문이 접수 단계에서 갈리고 되묻는 이유가 근거로 남는다는 가정입니다. 사양표에 없는 품목은 미매핑으로 빠지므로 아직 생산 가능 여부를 정하지 않은 품목이 그대로 드러납니다.
주문서와 사양표를 받아 주문마다 생산 가능·보류를 판정하고, 보류면 규격 미지원·용지 없음·수량 미달·납기 부족·미매핑 중 어느 쪽인지 붙여 고객별로 묶은 접수 리포트를 터미널과 Markdown 파일로 내는 CLI 가 도는 완결품입니다.
공개 규격으로 만든 주문 300건에 손으로 붙인 정답 판정과 대조해 일치율을 내고, 미매핑이 몰리는 품목과 표기를 모아 사양표에 없는 자리를 목록으로 냅니다.
보류 사유별로 고객에게 되물을 문안 초안을 조립하고, 수량만 채우면 걸 수 있는 주문은 최소 수량을 함께 적어 내는 단계입니다.
접수 담당이 주문서와 사양표를 넣으면 주문마다 생산 가능 여부와 보류 사유가 고객별로 묶여 나오는 과정을 시연합니다.
공개 규격으로 만든 주문 300건과 손으로 붙인 정답 판정을 대조해 일치율을 냅니다. 단, 정답과 주문서를 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
규격이 비었거나 표기가 흔들리거나 사양표에 없는 품목이 섞인 입력 30종을 넣어도 출력 형식이 안 깨지고 사유별로 빠지는 비율을 보여줍니다.
사양표의 최소 수량과 리드타임을 바꿨을 때 옛 판정이 어떻게 뒤집히는지 회귀로 확인합니다.
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 작성자가 만든 주문서의 자가채점이며, 실제 접수 정확도는 미래멤버스의 실 주문과 실 사양표가 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아니므로, 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 붙였으니 잘 맞는 게 당연하므로, 규격 결측과 수량 미달, 사양표에 없는 품목을 일부러 섞어 쉬운 주문만 푸는 함정을 피합니다.
이 포트폴리오가 보여주는 것은 사양을 데이터로 두고 주문서와 맞춰 생산 가능 여부를 가르는 기술이며, 인쇄 공정 설계나 원가 산출 전문성은 주장하지 않습니다. 판정은 규격 대조와 날짜 계산이 하고 LLM 은 담당자가 읽을 사유 문장만 맡습니다.
품목 표기 대응 사전은 사람이 채우는 것이라, 새 표기가 오면 미매핑으로 남기고 짐작해 붙이지 않습니다.
실제 도입 때는 고객마다 주문서 양식이 다르므로, 양식별 읽기 규칙을 새로 채우는 일을 도입 단계 과제로 둡니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객이 보낸 인쇄 주문서를 행으로 편 것입니다. 주문번호와 고객 표기, 품목 표기, 규격 표기, 용지 표기, 수량, 납기, 접수일, 요청 메모를 한 행에 둡니다. 표기는 고객이 직접 적어 '90x50'과 '90*50mm', '명함'과 '名刺'처럼 흔들립니다. 규격이나 수량이 빈 행, 최소 수량에 못 미치는 행, 사양표에 없는 품목을 일부러 섞어 두어 사유가 갈리게 둡니다.
| order_no | customer_raw | item_raw | size_raw | paper_raw | qty | due_date | received_at | note_raw |
|---|---|---|---|---|---|---|---|---|
| OD-2601 | 코스모출판 | 명함 | 90x50 | 스노우 250g | 2,000 | 2026-09-02 | 2026-08-22 | 모서리 둥글게 |
| OD-2602 | 코스모출판 | 명함 | 90*50mm | 스노우 250g | 1,000 | 2026-09-05 | 2026-08-22 | — |
| OD-2603 | サンライズ商事 | 名刺 | 91x55 | 上質紙 220g | 3,000 | 2026-09-10 | 2026-08-22 | 日本向け |
| OD-2604 | 한빛식자재 | 스티커 | 50x50 | 아트지 150g | 300 | 2026-09-01 | 2026-08-23 | 소량 테스트 |
| OD-2605 | 한빛식자재 | 스티커 | 50x50 | 유포지 120g | 5,000 | 2026-09-12 | 2026-08-23 | — |
아래 JSON Schema 를 그대로 만족하는 인쇄 주문 행을 300개 더 만들어 주세요. 품목을 명함·스티커·봉투·카다록·전단지로 섞고, 규격 표기는 몇 행에서 '90*50mm'처럼 기호를 바꾸며 일본 수출 건은 품목을 '名刺'처럼 일본어로 적습니다. 2할은 규격이나 수량, 용지를 비우고, 몇 행은 최소 수량에 못 미치는 수량과 접수일에서 사흘 뒤 납기를 넣으세요. 사양표에 없는 품목도 몇 행 넣습니다. 판정 결과나 사유는 넣지 마세요.
{"type": "object", "properties": {"order_no": {"type": "string"}, "customer_raw": {"type": "string"}, "item_raw": {"type": "string"}, "size_raw": {"type": ["string", "null"]}, "paper_raw": {"type": ["string", "null"]}, "qty": {"type": ["integer", "null"]}, "due_date": {"type": ["string", "null"]}, "received_at": {"type": "string"}, "note_raw": {"type": ["string", "null"]}}, "required": ["order_no", "customer_raw", "item_raw", "size_raw", "paper_raw", "qty", "due_date", "received_at"]}{"type": "object", "properties": {"order_no": {"type": "string"}, "customer_raw": {"type": "string"}, "item_raw": {"type": "string"}, "size_raw": {"type": ["string", "null"]}, "paper_raw": {"type": ["string", "null"]}, "qty": {"type": ["integer", "null"]}, "due_date": {"type": ["string", "null"]}, "received_at": {"type": "string"}, "note_raw": {"type": ["string", "null"]}}, "required": ["order_no", "customer_raw", "item_raw", "size_raw", "paper_raw", "qty", "due_date", "received_at"]}공장이 정한 품목별 생산 사양표입니다. 사양 번호와 품목, 생산 가능한 규격과 용지, 최소 수량, 리드타임, 라인을 한 행에 둡니다. 같은 품목이라도 규격과 용지 조합마다 최소 수량과 리드타임이 달라 어느 사양에 붙느냐로 결과가 갈립니다. 주문서에 나오는 품목 중 일부는 일부러 넣지 않아 미매핑이 도출되게 둡니다.
| spec_no | item_raw | size_mm | paper_raw | min_qty | lead_days | line_name |
|---|---|---|---|---|---|---|
| SP-101 | 명함 | 90x50 | 스노우 250g | 500 | 5 | 소형인쇄1 |
| SP-102 | 명함 | 91x55 | 上質紙 220g | 1,000 | 9 | 수출전용 |
| SP-103 | 스티커 | 50x50 | 유포지 120g | 1,000 | 7 | 스티커1 |
| SP-104 | 스티커 | 70x70 | 유포지 120g | 1,000 | 7 | 스티커1 |
| SP-105 | 봉투 | 120x235 | 모조 100g | 1,000 | 8 | 봉투1 |
아래 JSON Schema 를 그대로 만족하는 생산 사양 행을 40개 더 만들어 주세요. 같은 품목에 규격·용지 조합을 여럿 두고 조합마다 최소 수량과 리드타임을 다르게 정합니다. 주문서에 나오는 품목 중 일부는 일부러 넣지 마세요 — 미매핑이 있어야 사양표의 구멍이 드러납니다. 판정 결과는 넣지 마세요.
{"type": "object", "properties": {"spec_no": {"type": "string"}, "item_raw": {"type": "string"}, "size_mm": {"type": "string"}, "paper_raw": {"type": "string"}, "min_qty": {"type": "integer"}, "lead_days": {"type": "integer"}, "line_name": {"type": "string"}}, "required": ["spec_no", "item_raw", "size_mm", "paper_raw", "min_qty", "lead_days", "line_name"]}{"type": "object", "properties": {"spec_no": {"type": "string"}, "item_raw": {"type": "string"}, "size_mm": {"type": "string"}, "paper_raw": {"type": "string"}, "min_qty": {"type": "integer"}, "lead_days": {"type": "integer"}, "line_name": {"type": "string"}}, "required": ["spec_no", "item_raw", "size_mm", "paper_raw", "min_qty", "lead_days", "line_name"]}| TypeScript | 주문서와 사양표를 맞춰 규격을 접고 납기 여유를 세는 판정기를 맡습니다. 사내 시스템이 Node 로 서 있어 같은 언어로 둡니다. |
| Node.js | CLI 실행기와 파일 입출력을 맡습니다. |
| Markdown | 고객별로 묶은 접수 리포트와 되물을 문안 초안을 파일로 냅니다. |
✗ fail → 미매핑이 절반을 넘으면 사양표를 먼저 채웁니다.
✓ pass → 2주차 정답 대조로 넘어갑니다.
✗ fail → 어긋난 품목을 모아 표기 대응 사전을 다시 봅니다.
✓ pass → 3주차 회신 문안으로 넘어갑니다.
주문 하나와 생산 사양이 만나는 자리마다 그대로 걸 수 있는지 정합니다. 못 걸면 규격 미지원·용지 없음·수량 미달·납기 부족·미매핑 중 어느 쪽인지 싣습니다. 화면과 리포트는 이 사유 코드로 묶습니다.
{"type": "object", "properties": {"verdict_no": {"type": "string"}, "order_no": {"type": "string"}, "item_raw": {"type": "string"}, "spec_no": {"type": ["string", "null"]}, "intake_code": {"type": "string", "enum": ["producible", "size_unsupported", "paper_unavailable", "qty_below_min", "leadtime_short", "item_unmapped"]}, "lead_margin_days": {"type": ["integer", "null"], "description": "due_date 에서 received_at 을 뺀 날수에서 그 사양의 lead_days 를 뺀 값입니다. 음수면 납기가 모자랍니다."}, "size_mm": {"type": ["string", "null"]}, "line_name": {"type": ["string", "null"]}, "evidence": {"type": "array", "items": {"type": "object", "properties": {"field": {"type": "string"}, "agg": {"type": ["string", "null"]}, "value": {}}, "required": ["field", "value"]}}, "summary": {"type": "string"}, "hedge": {"type": ["string", "null"]}}, "required": ["verdict_no", "order_no", "item_raw", "intake_code", "evidence", "summary"]}[
{
"verdict_no": "IV-001",
"order_no": "OD-2601",
"item_raw": "명함",
"spec_no": "SP-101",
"intake_code": "producible",
"lead_margin_days": 6,
"size_mm": "90x50",
"line_name": "소형인쇄1",
"evidence": [
{
"field": "qty",
"agg": null,
"value": 2000
},
{
"field": "min_qty",
"agg": null,
"value": 500
}
],
"summary": "규격과 용지가 사양표와 맞고 납기도 여유가 있어 그대로 생산에 넘깁니다.",
"hedge": null
},
{
"verdict_no": "IV-002",
"order_no": "OD-2602",
"item_raw": "명함",
"spec_no": "SP-101",
"intake_code": "producible",
"lead_margin_days": 9,
"size_mm": "90x50",
"line_name": "소형인쇄1",
"evidence": [
{
"field": "size_raw",
"agg": null,
"value": "90*50mm"
},
{
"field": "size_mm",
"agg": null,
"value": "90x50"
}
],
"summary": "규격을 '90*50mm'로 적었으나 접으면 사양표의 90x50 과 같아 그대로 넘깁니다.",
"hedge": null
},
{
"verdict_no": "IV-003",
"order_no": "OD-2603",
"item_raw": "名刺",
"spec_no": "SP-102",
"intake_code": "producible",
"lead_margin_days": 10,
"size_mm": "91x55",
"line_name": "수출전용",
"evidence": [
{
"field": "qty",
"agg": null,
"value": 3000
},
{
"field": "lead_days",
"agg": null,
"value": 9
}
],
"summary": "일본 표기 '名刺'를 명함으로 읽어 수출전용 사양에 붙였고 납기도 맞습니다.",
"hedge": "품목 표기 대응은 사전에 등록된 쌍만 쓰므로 새 표기는 사람이 추가합니다."
},
{
"verdict_no": "IV-004",
"order_no": "OD-2604",
"item_raw": "스티커",
"spec_no": "SP-111",
"intake_code": "qty_below_min",
"lead_margin_days": 2,
"size_mm": "50x50",
"line_name": "스티커2",
"evidence": [
{
"field": "qty",
"agg": null,
"value": 300
},
{
"field": "min_qty",
"agg": null,
"value": 2000
}
],
"summary": "300장은 그 사양의 최소 수량 2000장에 못 미쳐 그대로 걸 수 없습니다.",
"hedge": null
},
{
"verdict_no": "IV-005",
"order_no": "OD-2606",
"item_raw": "봉투",
"spec_no": "SP-105",
"intake_code": "leadtime_short",
"lead_margin_days": -4,
"size_mm": "120x235",
"line_name": "봉투1",
"evidence": [
{
"field": "due_date",
"agg": null,
"value": "2026-08-27"
},
{
"field": "lead_days",
"agg": null,
"value": 8
}
],
"summary": "접수일부터 납기까지 나흘인데 그 사양은 여드레가 필요해 날짜가 모자랍니다.",
"hedge": null
},
{
"verdict_no": "IV-006",
"order_no": "OD-2607",
"item_raw": "봉투",
"spec_no": null,
"intake_code": "size_unsupported",
"lead_margin_days": null,
"size_mm": null,
"line_name": null,
"evidence": [
{
"field": "size_raw",
"agg": null,
"value": null
},
{
"field": "spec_no",
"agg": "count",
"value": 12
}
],
"summary": "규격이 비어 있어 사양표 열두 행 중 어느 쪽에 붙일지 정하지 못합니다.",
"hedge": null
},
{
"verdict_no": "IV-007",
"order_no": "OD-2605",
"item_raw": "스티커",
"spec_no": "SP-103",
"intake_code": "producible",
"lead_margin_days": 13,
"size_mm": "50x50",
"line_name": "스티커1",
"evidence": [
{
"field": "paper_raw",
"agg": null,
"value": "유포지 120g"
},
{
"field": "min_qty",
"agg": null,
"value": 1000
}
],
"summary": "같은 규격이라도 용지가 유포지라 스티커1 라인 사양에 붙습니다.",
"hedge": null
},
{
"verdict_no": "IV-008",
"order_no": "OD-2610",
"item_raw": "자석스티커",
"spec_no": null,
"intake_code": "item_unmapped",
"lead_margin_days": null,
"size_mm": null,
"line_name": null,
"evidence": [
{
"field": "item_raw",
"agg": null,
"value": "자석스티커"
},
{
"field": "spec_no",
"agg": "count",
"value": 12
}
],
"summary": "자석스티커는 사양표 어디에도 없어 생산 가능한 품목인지 먼저 정해야 합니다.",
"hedge": null
}
][자동 검증 · 코드가 판정합니다] 1. intake_code 가 enum 여섯 값 중 하나인지 확인합니다. 2. verdict_no·order_no·item_raw·intake_code·evidence·summary 가 모두 채워졌는지 확인합니다. 3. order_no 가 주문서에 실재하는 번호인지 대조합니다. 4. spec_no 가 있으면 사양표에 실재하는 행 번호인지 대조합니다. 5. spec_no 가 있으면 size_mm·line_name 이 그 사양 행의 값과 같은지 대조합니다. 6. item_raw·size_raw 를 기호와 단위를 지워 접은 뒤 사양표와 맞고, 맞는 행이 없으면 intake_code 가 item_unmapped 인지 확인합니다. 7. lead_margin_days 를 due_date 에서 received_at 을 뺀 날수에서 lead_days 를 빼 다시 계산합니다. 8. intake_code 가 producible 이면 qty 가 min_qty 이상이고 lead_margin_days 가 0 이상인지 다시 확인합니다. 9. intake_code 가 qty_below_min 이면 qty 가 min_qty 에 못 미치는지 다시 확인합니다. 10. intake_code 가 leadtime_short 이면 lead_margin_days 가 음수인지 다시 계산합니다. 11. intake_code 가 paper_unavailable 이면 그 품목·규격 사양 중 주문 용지와 같은 행이 없는지 확인합니다. 12. size_raw 가 비어 있으면 intake_code 가 size_unsupported 인지 확인합니다. 13. evidence 의 field 이름이 주문서와 사양표에 실재하는 컬럼인지 대조합니다. 14. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 행 값과 같은지 확인합니다. 15. summary 가 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 공개 규격으로 만든 주문 300건에 손으로 붙인 정답 판정과 대조해 일치율과 사유 코드별 분포를 내고, 미매핑이 몰리는 품목과 표기를 모아 사양표에 없는 자리를 목록으로 냅니다. [수동 검증 · 사람이 봅니다] 1. 새 품목을 생산 가능 품목으로 올릴지 공장이 정합니다. 2. 최소 수량에 못 미치는 주문을 받을지 영업이 정합니다.