인핸스
경력근거: 데이터·AI 기반 문제 해결을 통해 기업의 의사결정 수준을 혁신하는 기술 기업
인핸스 공고는 'Commerce OS (Ontology, Workflow, Agent) 제품을 이용한 현장 맞춤형 솔루션 커스터마이징 및 제공'과 '고객사에 깊이 임베딩되어 모호한 비즈니스 문제를 정의부터 솔루션 구현까지 주도'를 나란히 적어 뒀습니다. 이 도구는 고객사가 이미 쓰는 엑셀 한 개를 받아 그 회사가 실제로 올려야 하는 채널 규격 파일로 바꾸는, 현장에서 가장 먼저 걸리는 구간을 그대로 재현합니다. 다만 이 포트폴리오는 지저분한 엑셀을 규칙으로 파싱해 다른 규격의 파일로 바꾸는 데이터 처리 기술을 보여주며, 커머스 상품 운영이나 채널 입점 정책에 대한 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
'Commerce OS (Ontology, Workflow, Agent) 제품을 이용한 현장 맞춤형 솔루션 커스터마이징 및 제공'이라, 고객사 파일을 그 회사가 실제로 쓰는 채널 규격으로 바꾸는 일이 업무와 같은 모양입니다.
'고객사에 깊이 임베딩되어 모호한 비즈니스 문제를 정의부터 솔루션 구현까지 주도'라, 입력 자료를 고객사에서 받은 엑셀로 두고 쓰는 사람도 고객사 담당자로 잡았습니다.
'솔루션 아키텍처 설계, 대규모 데이터 처리, 웹 앱 코딩 등 엔드투엔드 수행'이라, 수만 행 엑셀을 한 행씩 흘려 읽어 메모리를 고정하는 축을 넣었습니다.
고객사 온라인영업 담당자가 ERP 에서 내려받아 쓰는 상품 마스터 엑셀 한 개를 인자로 받아, 병합 셀로 비어 있는 카테고리를 위 행에서 상속시키고 소계 행과 중간에 다시 끼어든 머리글 행을 걸러낸 뒤, 한 칸에 뭉쳐 있는 '블랙/그레이 · S,M,L' 같은 옵션 문자열을 색상 축과 사이즈 축으로 나눠 SKU 한 개당 한 행으로 펼치고, '189,000원' 같은 문자열 가격을 정수로 바꿔 스마트스토어 대량등록 엑셀 한 개를 씁니다. 색상·사이즈 값이 채널이 공개한 허용값 사전에 있으면 등록 행으로, 없으면 같은 파일 안에서 보류 상태와 사유가 적힌 행으로 갈립니다. 결과는 담당자가 채널 관리자 화면에 그대로 올리는 파일 한 개이고 터미널은 등록 몇 행·보류 몇 행인지만 찍기 때문에 별도 화면이 없습니다.
인핸스와 계약한 패션 브랜드 A사의 온라인영업 담당자입니다. 매주 신상품 60여 개를 ERP 에서 내려받은 상품 마스터 엑셀에서 채널 대량등록 양식으로 손으로 옮기는데, 옵션 한 칸에 색상과 사이즈가 뭉쳐 있어 색상 두 개에 사이즈 세 개면 여섯 줄로 직접 늘려 적어야 하고, 그러다 가격 자리를 한 칸 밀려 잘못 올린 적이 있어 매번 반나절을 씁니다.
옵션 문자열 분해 규칙과 채널이 공개한 허용 옵션값 사전만 있으면, 사람이 손으로 늘려 적던 SKU 행 전개와 가격·재고 서식 정리가 규칙으로 재현되고, 사전에 없는 값만 보류 행으로 남아 담당자가 그 행만 손보면 됩니다.
상품 마스터 엑셀 경로를 인자로 주면 옵션이 SKU 행으로 펼쳐지고 채널 필수 컬럼 규격 검사를 통과하는 대량등록 엑셀 한 개가 나오는 명령줄 도구입니다.
같은 입력을 손으로 옮겨 만든 기준 파일과 셀 단위로 비교해 일치율과 어긋난 셀의 원인을 정리한 결과입니다.
쿠팡 대량등록 양식 매핑을 표로 추가해 채널 인자 하나로 두 채널 파일을 각각 내는 상태입니다.
상품 마스터 엑셀 한 개를 인자로 넣으면 대량등록 엑셀 한 개가 나오고 그 파일이 채널 필수 컬럼 규격 검사를 통과하는 것을 시연합니다
소계 행·반복 머리글·병합 셀·표기 흔들림·음수 재고를 섞은 40행을 넣어도 변환이 멈추지 않고 사전 밖 값만 보류 행으로 갈리는 것을 시연합니다
같은 입력을 손으로 옮겨 만든 기준 파일과 비교한 셀 단위 일치율
측정: 셀 문자열 비교, 표본: 상품 300건, 2주차
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 제가 만든 더미 엑셀과 제가 만든 기준 파일로 잰 자가채점이고, 실제 정확도는 고객사 상품 마스터와 실제 채널 계정에 올려 봐야 나옵니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다
고객사도 실데이터도 없이 혼자 만든 포트폴리오라 모든 수치는 합성 엑셀 자가채점입니다. 면접에서는 동작하는 데모와 실검증 준비 상태로 솔직히 설명합니다
정답을 제가 만들었으니 잘 맞는 게 당연합니다. 병합 셀·소계 행·중복 바코드·음수 재고·'FREE'와 '프리'처럼 흔들리는 표기를 더미에 일부러 섞어 쉬운 문제만 푸는 게 아님을 보입니다
이 포트폴리오는 지저분한 엑셀을 규칙으로 파싱해 다른 규격의 파일로 바꾸는 데이터 처리 기술을 보여주며, 커머스 상품 운영이나 채널 입점 정책에 대한 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다
변환이 맞았는지를 모델이나 사람의 판단으로 채점하지 않습니다. 채점은 손으로 만든 기준 파일과의 셀 문자열 비교뿐이고, LLM 이 뽑은 색상·사이즈 후보도 허용값 사전에 있을 때만 채택해 지어낸 값이 파일에 실리지 않습니다
실제 도입 시 달라지는 것은 채널 양식과 허용값 목록이 수시로 바뀐다는 점입니다. 매핑을 코드가 아니라 표 파일로 빼 뒀고, 표를 갈아 끼우는 운영이 도입 단계 과제로 남습니다
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사 온라인영업 담당자가 ERP 에서 내려받아 쓰는 상품 마스터 엑셀을 행 단위로 옮겨 변환 입력으로 씁니다
| row_no | row_kind | category_raw | product_name | option_raw | price_raw | stock_raw | barcode |
|---|---|---|---|---|---|---|---|
| 7 | item | 여성 아우터 | 울 블렌드 코트 | 블랙/그레이 · S,M,L | 189,000원 | 12 | 8801234500017 |
| 8 | item | — | 울 블렌드 코트 (기모) | 네이비 · FREE | 189,000원 | 3 | 8801234500024 |
| 9 | subtotal | — | 여성 아우터 소계 | — | 1,134,000원 | 37 | — |
| 10 | header_repeat | 카테고리 | 상품명 | 옵션 | 판매가 | 재고 | 바코드 |
| 11 | item | 여성 상의 | 코튼 티셔츠 | 화이트,블랙 · F | 29000 | 재고없음 | 8801234500031 |
{"type":"object","properties":{"row_no":{"type":"number"},"row_kind":{"type":"string","enum":["item","subtotal","header_repeat"]},"category_raw":{"type":["string","null"]},"product_name":{"type":"string"},"option_raw":{"type":["string","null"]},"price_raw":{"type":"string"},"stock_raw":{"type":["string","null"]},"barcode":{"type":["string","null"]}},"required":["row_no","row_kind","category_raw","product_name","option_raw","price_raw","stock_raw","barcode"]} 형태로 만듭니다. 쉬운 데이터만 만들지 마십시오. 다음 하드 케이스를 일부러 섞습니다. 병합 셀 때문에 category_raw 가 null 인 연속 행, 카테고리마다 끼어드는 subtotal 행과 시트 중간에 다시 나오는 header_repeat 행, 색상과 사이즈가 한 칸에 뭉친 option_raw('블랙/그레이 · S,M,L'), 사이즈 범위 표기('S~L')와 숫자 사이즈('25,26,27'), 'FREE'·'F'·'프리'·'단일'처럼 흔들리는 자유 사이즈 표기, 허용값 사전에 없는 색상('차콜'·'모카'·'인디고'), '189,000원'·'29000'·'29,000 원'처럼 제각각인 price_raw, '재고없음'·'0'·'-2' 같은 stock_raw, 공백이 낀 바코드와 중복 바코드. 형식을 깨뜨리는 시도 3건도 별도로 만듭니다.{"type":"object","properties":{"row_no":{"type":"number"},"row_kind":{"type":"string","enum":["item","subtotal","header_repeat"]},"category_raw":{"type":["string","null"]},"product_name":{"type":"string"},"option_raw":{"type":["string","null"]},"price_raw":{"type":"string"},"stock_raw":{"type":["string","null"]},"barcode":{"type":["string","null"]}},"required":["row_no","row_kind","category_raw","product_name","option_raw","price_raw","stock_raw","barcode"]}스마트스토어가 공개한 색상·사이즈 허용값과 별칭을 사전으로 두고, 변환된 값이 이 사전에 있을 때만 등록 행으로 채택합니다
| axis | channel_value | aliases |
|---|---|---|
| color | 블랙 | ["블랙","BLACK","검정","블랙컬러"] |
| color | 그레이 | ["그레이","GRAY","GREY","회색"] |
| color | 네이비 | ["네이비","NAVY","곤색"] |
| color | 화이트 | ["화이트","WHITE","흰색"] |
| color | 아이보리 | ["아이보리","IVORY","크림"] |
{"type":"object","properties":{"axis":{"type":"string","enum":["color","size"]},"channel_value":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}}},"required":["axis","channel_value","aliases"]} 형태로 만듭니다. 채널이 실제로 쓰는 값만 channel_value 에 두고, aliases 에는 고객사 엑셀에서 관측되는 표기(영문 대문자, 한글 음차, 숫자 사이즈)를 넣습니다. 사전에 일부러 넣지 않는 값도 목록으로 따로 적어 보류 행이 나오도록 합니다. 별칭이 두 channel_value 에 겹치는 충돌 사례 2건도 만듭니다.{"type":"object","properties":{"axis":{"type":"string","enum":["color","size"]},"channel_value":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}}},"required":["axis","channel_value","aliases"]}| 대규모 데이터 처리 | 수만 행짜리 상품 마스터 엑셀을 한 행씩 흘려 읽어 상품 수가 늘어도 메모리 사용이 고정입니다 |
| 데이터 구조·스토리지 | 채널 규격을 코드가 아니라 컬럼 매핑 표 파일로 분리해 채널이 늘어도 변환 코드를 고치지 않습니다 |
| Workflow | 읽기·행 분류·옵션 분해·규격 검사·파일 쓰기 다섯 단계를 순서가 그대로 보이는 파이프라인으로 짰습니다 |
| Ontology | 속성 체계를 새로 제정하지 않고 채널이 이미 공개한 허용 옵션값 목록을 사전으로 읽어 대조만 합니다 |
| 프로토타이핑·반복 개선 | 명령 한 줄로 전체를 다시 돌려 담당자가 고친 원본 엑셀을 즉시 재변환합니다 |
| Claude | 상품명과 옵션 칸에 자유롭게 적힌 색상·사이즈 후보를 뽑는 보조로만 쓰고 채택 여부는 사전 대조가 정합니다 |
✓ pass → 여기서 멈춰도 제출 가능한 완성품입니다. 더 키우려면 2주차(기준 파일 대비 셀 일치율)로 갑니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 3주차(두 번째 채널 양식)로 갑니다.
담당자가 스마트스토어 관리자 화면에 그대로 올리는 대량등록 엑셀의 한 행입니다
{"type":"object","properties":{"sku_id":{"type":"string"},"product_name":{"type":"string"},"color":{"type":["string","null"]},"size":{"type":["string","null"]},"sale_price":{"type":"number"},"stock":{"type":"number"},"status":{"type":"string","enum":["ready","held"]},"held_reason":{"type":["string","null"]},"source_row_no":{"type":"number"}},"required":["sku_id","product_name","color","size","sale_price","stock","status","held_reason","source_row_no"]}[
{
"sku_id": "A-0007-블랙-S",
"product_name": "울 블렌드 코트",
"color": "블랙",
"size": "S",
"sale_price": 189000,
"stock": 12,
"status": "ready",
"held_reason": null,
"source_row_no": 7
},
{
"sku_id": "A-0012-아이보리-FREE",
"product_name": "코튼 티셔츠 롱슬리브",
"color": "아이보리",
"size": "FREE",
"sale_price": 29000,
"stock": 0,
"status": "ready",
"held_reason": null,
"source_row_no": 12
},
{
"sku_id": "A-0013-차콜-M",
"product_name": "라이트 다운 베스트(이월)",
"color": null,
"size": "M",
"sale_price": 99000,
"stock": 7,
"status": "held",
"held_reason": "색상 표기 '차콜' 이 채널 허용값 사전에 없어 담당자 확인이 필요합니다",
"source_row_no": 13
},
{
"sku_id": "A-0018-모카-S",
"product_name": "플리스 집업",
"color": null,
"size": "S",
"sale_price": 119000,
"stock": -2,
"status": "held",
"held_reason": "색상 표기 '모카' 가 사전에 없고 재고 -2 가 음수라 채널 규격을 벗어납니다",
"source_row_no": 18
}
]sale_price 와 stock 이 숫자만 남았는지, color·size 가 채널 허용값 사전의 channel_value 와 정확히 같은지, sku_id 가 원본 행 한 개와 옵션 조합 한 개에 일대일로 대응하는지, status 가 held 면 held_reason 이 비어 있지 않은지를 규칙으로 검사합니다. 정답은 같은 입력 엑셀을 손으로 옮겨 만든 기준 파일이고 채점은 셀 단위 문자열 비교라, 모델이나 사람의 판단이 정답을 대신하지 않습니다.