패스트뷰
경력근거: 다국어 콘텐츠 처리, CP(콘텐츠 파트너) 온보딩, 글로벌 리포팅 워크플로우 재설계
패스트뷰 뷰어스는 850개 넘는 콘텐츠 파트너의 권리 확보 콘텐츠를 MSN·Yahoo Japan·SmartNews·LINE·네이버로 7개국 이상에 유통하고, FDE 는 글로벌 세일즈·콘텐츠 운영·파트너 정산의 반복 업무를 발굴해 AI 로 재설계합니다. 플랫폼마다 서식이 다른 월간 리포트를 담당자가 손으로 취합하던 일을 한 번의 명령으로 명세서 파일까지 끌고 가는 이 도구는 그 현업 자동화를 정면으로 보여줍니다. 다만 이 포트폴리오가 보여주는 것은 서식이 다른 표 파일을 규칙으로 파싱해 결정론으로 금액을 계산하고 문서로 렌더하는 기술이며, 콘텐츠 IP 계약 구조나 글로벌 라이선싱 협상 같은 도메인 전문성은 주장하지 않습니다. 그 깊이는 면접에서 모르면 모른다고 말하는 편이 낫고, 데모는 가상 리포트 서식과 가상 CP 마스터로 기술만 보입니다.
권리 확보된 콘텐츠를 850개 넘는 파트너와 글로벌 플랫폼으로 유통합니다. 파트너별 정산 명세와 계약 배분율 계산이 이 축과 직접 맞닿습니다.
현업의 반복 업무와 병목을 발굴해 LLM API 로 자동화 솔루션을 설계·개발·배포합니다. 손으로 취합하던 월간 정산 집계가 이 축과 정렬됩니다.
다국어 콘텐츠 처리와 CP 온보딩, 글로벌 리포팅 워크플로우를 재설계합니다. 일본어·영문 서식 리포트를 읽어 명세서를 내는 이 도구가 그 업무 자체입니다.
플랫폼 5곳(MSN·Yahoo Japan·SmartNews·LINE·네이버)이 매달 내려준 정산 리포트 파일이 담긴 폴더를 인자로 받아, 파트너별 정산 명세서 Markdown 과 미배분 목록을 파일로 내놓는 CLI입니다. 화면은 없고 터미널에서 한 줄로 실행합니다. 소계 행·반복 머리글·주석 행 제외, 병합 셀로 빈 파트너 칸 상속, 괄호 음수와 통화 기호 해석, 별칭 정규화, 환율 환산과 배분율 절사까지 전부 규칙으로 계산하고, LLM 은 처음 보는 서식의 열 매핑 후보를 제안하고 명세서 머리말 문단을 쓰는 보조만 맡습니다. 지급이나 송금은 하지 않고 명세와 대조 결과만 냅니다.
뷰어스 글로벌 리포팅을 맡은 정산 담당자입니다. 매달 플랫폼 5곳에서 열 이름도 통화도 기간 표기도 다른 실적 파일을 받아 엑셀 한 장에 옮겨 붙이고 파트너별 배분액을 손으로 계산하는데, 소계 행을 한 번 더 더하거나 병합 셀 때문에 파트너가 빈 행을 놓치면 어디서 틀렸는지 찾느라 이틀을 씁니다. 파일을 폴더에 모아 한 번 실행하면 파트너별 명세서와 확인이 필요한 행 목록이 파일로 떨어지기를 바라는 사람입니다.
플랫폼별 리포트 서식을 어댑터 규칙으로 적어 두고 CP 마스터의 별칭·배분율을 붙이면, (a) 소계·반복 머리글·주석 행을 이중 계산하지 않고 데이터 행만 골라내며, (b) 통화 환산과 배분율 절사를 원 단위까지 결정론으로 계산해 파트너별 명세서를 만들고, (c) 파트너를 못 붙인 행은 추측하지 않고 미배분 목록으로 남깁니다.
리포트 파일이 담긴 폴더를 인자로 주면 파트너별 정산 명세서 Markdown 과 미배분 목록을 파일로 내놓는 동작하는 CLI입니다. 플랫폼 API 연동 없이 담당자가 내려받아 둔 엑셀·CSV 파일만 입력으로 가정하고 시작합니다.
심은 정답 금액과 명세서 금액을 원 단위로 대조하는 회귀 실행과, 어긋난 행을 사유별로 보여주는 리포트 파일입니다.
처음 보는 플랫폼 리포트 서식 하나를 어댑터 규칙으로 추가하고, 월별 파트너 지급액과 미배분 행 수를 누적한 추이표 파일입니다.
플랫폼 5곳 리포트 파일 6개(합쳐 240행)가 든 폴더를 주고 한 번 실행하면, 파트너별 명세서 12개와 미배분 목록 1개가 20초 안에 파일로 떨어지는 걸 터미널에서 시연합니다
소계 행·반복 머리글·병합 빈칸·괄호 음수·통화 기호·전각 숫자를 섞은 악성 행 30종을 넣어도 명세서 객체 형식이 한 번도 안 깨지고, 소계 행이 합산에 다시 들어가지 않습니다
2주차 회귀 실행에서 더미에 심은 정답 금액 96행 중 원 단위까지 일치한 게 92행(약 96%)입니다. 단, 정답·데이터를 모두 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건에서의 동작'임을 명시합니다
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 정확도와 처리 시간은 패스트뷰의 실제 플랫폼 리포트 파일과 실제 CP 마스터, 실제 정산 담당자가 있어야 측정 가능합니다. 이 도구는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 소계 행·반복 머리글·병합 빈칸·괄호 음수·일본어 열 이름·미등록 파트너·계약 종료 파트너 같은 경계 케이스를 더미 리포트에 일부러 섞어, 깨끗한 파일만 처리하는 게 아님을 보여줍니다
이 포트폴리오가 보여주는 것은 서식이 다른 표 파일을 규칙으로 파싱해 결정론으로 금액을 계산하고 문서로 렌더하는 기술이며, 콘텐츠 IP 계약 구조·글로벌 라이선싱 협상·플랫폼별 실제 정산 정책 같은 도메인 전문성은 주장하지 않습니다. 그 깊이는 면접에서 모르면 모른다고 말하는 편이 낫습니다
이 도구는 지급이나 송금을 하지 않고 명세서와 대조 결과만 냅니다. 실제 지급은 사람이 명세서를 확인한 뒤 기존 절차로 처리하며, 라인별 절사 합과 일괄 계산이 몇 원 어긋나는 건 숨기지 않고 대조 줄에 그대로 적습니다
파트너 표기가 파일마다 제각각입니다. CP 마스터 별칭 목록 안에서만 정규화하고, 목록 밖 표기는 비슷해 보여도 붙이지 않고 미배분으로 남깁니다. 실제 도입 시 어댑터 규칙과 환율 기준일이 더미와 다르므로 도입 단계에서 다시 맞춰야 합니다
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
플랫폼 5곳이 내려준 월간 정산 리포트 파일을 행 단위로 편 원본입니다. 파서가 가장 먼저 읽는 표이며, 소계 행·반복 머리글·주석 행·병합 빈칸·괄호 음수·통화 기호·일본어 열 표기를 일부러 섞고 expected_include 와 expected_amount_krw 로 정답을 심어 자가채점합니다. 환율은 1 USD = 1,380 KRW, 1 JPY = 9.4 KRW 로 고정합니다.
| row_id | src_file | platform | row_kind | cp_raw | period_raw | currency | amount_raw | impressions_raw | expected_include | expected_amount_krw |
|---|---|---|---|---|---|---|---|---|---|---|
| r001 | msn_2026-06.csv | msn | data | ViewUs PartnerA | 2026-06 | USD | 1,240.50 | 820,412 | true | 1,711,890 |
| r002 | msn_2026-06.csv | msn | header_repeat | Partner | - | USD | Revenue (USD) | Impressions | false | — |
| r003 | msn_2026-06.csv | msn | data | PartnerB | 2026-06 | USD | (120.00) | 0 | true | -165,600 |
| r004 | msn_2026-06.csv | msn | subtotal | Total | 2026-06 | USD | 1,120.50 | 820,412 | false | — |
| r005 | yahoo_jp_2026-06.xlsx | yahoo_jp | data | ビューアスパートナーA | 2026年6月 | JPY | ¥ 458,200 | 1,204,880 | true | 4,307,080 |
아래 JSON Schema 에 맞는 플랫폼 월간 정산 리포트 행 200행을 JSON 배열로 생성합니다. 파일은 플랫폼 5곳(msn·yahoo_jp·smartnews·line·naver) 기준 6개로 나누고, 파일마다 데이터 행이 이어진 뒤 마지막에 소계 행이 한 번 오게 합니다. 환율은 1 USD = 1,380 KRW, 1 JPY = 9.4 KRW 로 고정하고 expected_amount_krw 는 원 단위 절사로 계산합니다. expected_include 규칙: row_kind 가 data 면 true, subtotal·header_repeat·note 면 false 이고 이때 expected_amount_krw 는 null 입니다.
{"type":"object","properties":{"row_id":{"type":"string"},"src_file":{"type":"string"},"platform":{"type":"string","enum":["msn","yahoo_jp","smartnews","line","naver"]},"row_kind":{"type":"string","enum":["data","subtotal","header_repeat","note"]},"cp_raw":{"type":["string","null"]},"period_raw":{"type":"string"},"currency":{"type":"string","enum":["KRW","JPY","USD"]},"amount_raw":{"type":"string"},"impressions_raw":{"type":["string","null"]},"expected_include":{"type":"boolean"},"expected_amount_krw":{"type":["number","null"]}},"required":["row_id","src_file","platform","row_kind","period_raw","currency","amount_raw","expected_include"]}
깨끗한 파일만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라(정돈된 파일만 처리하는 함정 회피): (1) 파일 중간에 다시 나오는 머리글 행(row_kind=header_repeat) 4건 이상, (2) 병합 셀 때문에 cp_raw 가 null 이라 바로 위 데이터 행의 파트너를 상속해야 하는 행 5건 이상, (3) 괄호 음수 '(120.00)' 형식의 차감 행 3건, (4) 통화 기호·전각 숫자·천 단위 구분이 섞인 amount_raw('¥ 458,200', '123,456') 5건 이상, (5) 기간 표기 흔들림('2026-06', '2026年6月', '2026/06/01-2026/06/30') 세 종류 모두, (6) 같은 파트너의 표기 별칭('ViewUs PartnerA'/'파트너A(주)'/'ビューアスパートナーA') 6건 이상, (7) CP 마스터에 없는 파트너 2건과 계약 종료 파트너 2건, (8) 숫자가 아닌 안내 문구가 들어간 note 행 2건. expected_include 와 expected_amount_krw 는 위 규칙대로 정직하게. JSON 배열만.{"type":"object","properties":{"row_id":{"type":"string"},"src_file":{"type":"string"},"platform":{"type":"string","enum":["msn","yahoo_jp","smartnews","line","naver"]},"row_kind":{"type":"string","enum":["data","subtotal","header_repeat","note"]},"cp_raw":{"type":["string","null"]},"period_raw":{"type":"string"},"currency":{"type":"string","enum":["KRW","JPY","USD"]},"amount_raw":{"type":"string"},"impressions_raw":{"type":["string","null"]},"expected_include":{"type":"boolean"},"expected_amount_krw":{"type":["number","null"]}},"required":["row_id","src_file","platform","row_kind","period_raw","currency","amount_raw","expected_include"]}콘텐츠 파트너 마스터입니다. 리포트 행의 파트너 표기를 여기 별칭 목록으로만 정규화하고, 목록 밖 표기는 추측하지 않고 미배분으로 돌립니다. 배분율과 계약 기간이 지급액 계산과 계약 종료 판정의 근거입니다.
| cp_id | cp_name | aliases | share_pct | payout_currency | contract_from | contract_to | active |
|---|---|---|---|---|---|---|---|
| cpA | 파트너에이미디어 | ["뷰어스 파트너A","ViewUs PartnerA","파트너A(주)","ビューアスパートナーA"] | 57 | KRW | 2024-03-01 | — | true |
| cpB | 비케이스튜디오 | ["PartnerB","뷰어스 파트너B","파트너B 주식회사"] | 60 | KRW | 2025-01-01 | — | true |
| cpC | 파트너씨콘텐츠 | ["파트너C","Partner C","パートナーC"] | 50 | KRW | 2024-09-01 | — | true |
| cpD | 디데일리 | ["Partner D","파트너D"] | 65 | KRW | 2025-06-01 | — | true |
| cpE | 이엔터랩 | ["Partner E","파트너E"] | 55 | KRW | 2025-02-01 | — | true |
아래 JSON Schema 에 맞는 콘텐츠 파트너 마스터 40행을 JSON 배열로 생성합니다. cp_id 는 cpA 부터 이어지는 고유 문자열이고 share_pct 는 45 에서 70 사이 정수입니다. payout_currency 는 모두 KRW 입니다.
{"type":"object","properties":{"cp_id":{"type":"string"},"cp_name":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"share_pct":{"type":"number"},"payout_currency":{"type":"string","enum":["KRW"]},"contract_from":{"type":"string"},"contract_to":{"type":["string","null"]},"active":{"type":"boolean"}},"required":["cp_id","cp_name","aliases","share_pct","active"]}
쉬운 마스터만 만들지 말 것. 다음을 의도적으로 섞어라: (1) 한국어·영문·일본어 표기가 함께 들어간 aliases 를 가진 파트너 10건 이상, (2) aliases 가 빈 배열이라 정본 이름으로만 매칭되는 파트너 3건, (3) contract_to 가 과거 날짜이고 active=false 인 계약 종료 파트너 4건, (4) 이름이 서로 비슷해 사람이 헷갈리기 쉬운 파트너 쌍 2쌍(별칭은 겹치지 않게). JSON 배열만.{"type":"object","properties":{"cp_id":{"type":"string"},"cp_name":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"share_pct":{"type":"number"},"payout_currency":{"type":"string","enum":["KRW"]},"contract_from":{"type":"string"},"contract_to":{"type":["string","null"]},"active":{"type":"boolean"}},"required":["cp_id","cp_name","aliases","share_pct","active"]}| LLM | 처음 보는 리포트 서식의 열 이름을 내부 필드 후보로 매핑해 어댑터 초안을 쓰고, 명세서 머리말 문단을 작성합니다 |
| 프롬프트 설계 | 열 매핑 제안을 후보 목록과 근거 셀 값으로만 답하게 출력 스키마로 묶어 금액 계산에는 손대지 못하게 합니다 |
| Claude Code | 어댑터 규칙과 파서를 빠르게 만들고 회귀 실행으로 굳혀 가는 개발 워크플로우입니다 |
| RAG | 이미 만든 어댑터 규칙과 열 이름 사전을 검색해 새 서식의 매핑 후보를 좁히는 보조입니다 |
| 에이전트 오케스트레이션 | 파싱·정규화·계산·명세 생성·대조를 단계로 묶고 실패한 단계만 다시 돌리는 실행 흐름입니다 |
| TypeScript | 어댑터 규칙 엔진·금액 계산·명세서 렌더러의 구현 언어입니다 |
| JSON Schema | 어댑터 규칙과 명세서 객체의 형식을 실행 시점에 검증합니다 |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차(금액 회귀 확인)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(새 서식 어댑터·월 누적)로 진행합니다.
파트너 한 곳의 월간 정산 명세서 1건입니다. 플랫폼별 라인·지급액·대조 결과·미배분 행을 한 객체에 담고, 그대로 Markdown 명세서 파일로 렌더합니다. 지급 실행이 아니라 명세와 대조 결과를 내는 문서입니다.
{"type":"object","properties":{"cp_id":{"type":"string"},"cp_name":{"type":"string"},"period":{"type":"string"},"lines":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string"},"src_file":{"type":"string"},"currency":{"type":"string"},"amount_src":{"type":"number"},"fx_rate":{"type":"number"},"amount_krw":{"type":"integer"},"share_pct":{"type":"number"},"payable_krw":{"type":"integer"},"src_rows":{"type":"array","items":{"type":"string"}}},"required":["platform","currency","amount_src","fx_rate","amount_krw","share_pct","payable_krw","src_rows"]}},"total_payable_krw":{"type":"integer"},"reconciliation":{"type":"object","properties":{"gross_krw":{"type":"integer"},"share_pct_applied":{"type":"number"},"expected_payable_krw":{"type":"integer"},"sum_of_lines_krw":{"type":"integer"},"diff_krw":{"type":"integer"},"status":{"type":"string","enum":["match","diff"]}},"required":["gross_krw","share_pct_applied","expected_payable_krw","sum_of_lines_krw","diff_krw","status"]},"unmatched":{"type":"array","items":{"type":"object","properties":{"row_id":{"type":"string"},"src_file":{"type":"string"},"cp_raw":{"type":["string","null"]},"amount_krw":{"type":"integer"},"reason":{"type":"string","enum":["unregistered_cp","inactive_contract","ambiguous_alias","unparsed_amount"]}},"required":["row_id","src_file","amount_krw","reason"]}},"hedge":{"type":["string","null"]}},"required":["cp_id","cp_name","period","lines","total_payable_krw","reconciliation"]}[
{
"input_ref": "r001·r005·r006·r010 (별칭 3종·병합 빈칸 상속·통화 3종이 한 파트너로 모임)",
"output": {
"cp_id": "cpA",
"cp_name": "파트너에이미디어",
"period": "2026-06",
"lines": [
{
"platform": "msn",
"src_file": "msn_2026-06.csv",
"currency": "USD",
"amount_src": 1240.5,
"fx_rate": 1380,
"amount_krw": 1711890,
"share_pct": 57,
"payable_krw": 975777,
"src_rows": [
"r001"
]
},
{
"platform": "yahoo_jp",
"src_file": "yahoo_jp_2026-06.xlsx",
"currency": "JPY",
"amount_src": 554600,
"fx_rate": 9.4,
"amount_krw": 5213240,
"share_pct": 57,
"payable_krw": 2971546,
"src_rows": [
"r005",
"r006"
]
},
{
"platform": "naver",
"src_file": "naver_2026-06.xlsx",
"currency": "KRW",
"amount_krw": 3420000,
"amount_src": 3420000,
"fx_rate": 1,
"share_pct": 57,
"payable_krw": 1949400,
"src_rows": [
"r010"
]
}
],
"total_payable_krw": 5896723,
"reconciliation": {
"gross_krw": 10345130,
"share_pct_applied": 57,
"expected_payable_krw": 5896724,
"sum_of_lines_krw": 5896723,
"diff_krw": -1,
"status": "diff"
},
"unmatched": [],
"hedge": "플랫폼 라인마다 원 단위로 절사해 합계가 일괄 계산보다 1원 적습니다. 숨기지 않고 대조 줄에 적어 두었으니 지급 전에 어느 쪽 기준으로 맞출지 정해 주십시오"
}
},
{
"input_ref": "r003 (괄호 음수 차감만 있는 달)",
"output": {
"cp_id": "cpB",
"cp_name": "비케이스튜디오",
"period": "2026-06",
"lines": [
{
"platform": "msn",
"src_file": "msn_2026-06.csv",
"currency": "USD",
"amount_src": -120,
"fx_rate": 1380,
"amount_krw": -165600,
"share_pct": 60,
"payable_krw": -99360,
"src_rows": [
"r003"
]
}
],
"total_payable_krw": -99360,
"reconciliation": {
"gross_krw": -165600,
"share_pct_applied": 60,
"expected_payable_krw": -99360,
"sum_of_lines_krw": -99360,
"diff_krw": 0,
"status": "match"
},
"unmatched": [],
"hedge": "이번 달은 환불 차감만 있어 지급액이 음수입니다. 다음 달 지급분에서 상계할지는 사람이 정해야 합니다"
}
},
{
"input_ref": "r008 (기간 표기가 범위형인 LINE 리포트 한 줄)",
"output": {
"cp_id": "cpC",
"cp_name": "파트너씨콘텐츠",
"period": "2026-06",
"lines": [
{
"platform": "line",
"src_file": "line_2026-06.csv",
"currency": "JPY",
"amount_src": 212000,
"fx_rate": 9.4,
"amount_krw": 1992800,
"share_pct": 50,
"payable_krw": 996400,
"src_rows": [
"r008"
]
}
],
"total_payable_krw": 996400,
"reconciliation": {
"gross_krw": 1992800,
"share_pct_applied": 50,
"expected_payable_krw": 996400,
"sum_of_lines_krw": 996400,
"diff_krw": 0,
"status": "match"
},
"unmatched": [],
"hedge": null
}
},
{
"input_ref": "r011·r013 (미등록 파트너와 계약 종료 파트너를 모은 미배분 문서)",
"output": {
"cp_id": "__unassigned__",
"cp_name": "미배분(파트너를 붙이지 못한 행)",
"period": "2026-06",
"lines": [],
"total_payable_krw": 0,
"reconciliation": {
"gross_krw": 920000,
"share_pct_applied": 0,
"expected_payable_krw": 0,
"sum_of_lines_krw": 0,
"diff_krw": 0,
"status": "match"
},
"unmatched": [
{
"row_id": "r011",
"src_file": "naver_2026-06.xlsx",
"cp_raw": "파트너Z",
"amount_krw": 740000,
"reason": "unregistered_cp"
},
{
"row_id": "r013",
"src_file": "naver_2026-06.xlsx",
"cp_raw": "파트너I",
"amount_krw": 180000,
"reason": "inactive_contract"
}
],
"hedge": "CP 마스터 별칭 목록에 없거나 계약이 끝난 파트너라 비슷해 보여도 붙이지 않았습니다. 마스터를 고친 뒤 다시 실행하면 명세서에 실립니다"
}
}
][자동 검증] 1. JSON Schema 형식(필드·enum·정수 여부)이 통과하는지 확인해 Markdown 명세서 렌더가 깨지지 않게 합니다. 2. 합산에 들어간 행이 expected_include=true 인 행과 정확히 일치하는지 대조해, 소계·반복 머리글·주석 행이 다시 더해지지 않았는지 봅니다. 3. amount_krw 를 통화별 고정 환율로 다시 계산해 심은 정답 expected_amount_krw 와 원 단위까지 맞는지 확인합니다. 4. payable_krw 가 amount_krw 와 share_pct 의 절사 결과와 같은지 재계산하고, sum_of_lines_krw 와 expected_payable_krw 의 차이가 라인 수(원) 이내인지 확인해 넘으면 status 를 diff 로 표시합니다. 5. 파트너 매칭이 CP 마스터 별칭 목록 안에서만 일어났는지 확인하고, 목록 밖 추정 매칭이나 계약 종료 파트너는 unmatched 로 돌립니다. [수동 검증] 1. 정산 담당자 1명이 표본 20행을 손계산 결과와 대조합니다. 2. 생성된 명세서 전체의 5% 를 사람이 직접 열어 점검합니다.