고위드는 3,500여 고객사의 법인카드 지출 데이터를 가진 B2B 핀테크라, 지출을 자동 분류하고 이상 지출을 짚는 이 도구는 고위드의 실제 법인 지출 내역이 있어야 분류를 검증한다.
'실시간 데이터를 기반으로 최적의 금융과 프로세스를 공급'이 미션. 지출 데이터를 즉시 분류·점검하는 도구가 그 방향과 정렬.
스타트업 전용 법인카드가 핵심 제품. 카드 지출의 분류·이상 탐지는 고객사가 매일 마주하는 운영 문제.
Java·Spring·MySQL·Redis 백엔드 + React. 지출 ingest→분류→점검 파이프라인을 제품으로 만드는 직무와 정렬.
법인카드 거래 내역에 가맹점·계정 메타를 붙여, 지출을 계정 항목으로 자동 분류하고 정책 위반·이상 지출을 근거와 함께 표시하는 1주 포트폴리오.
고위드 PE. 고객사의 법인카드 지출을 매번 손으로 분류·점검하던 상황을 끝내고, 그 분류·이상 탐지를 자동 도구로 옮기고 싶은 사람.
거래 내역에 가맹점·계정 규칙을 붙이면, LLM/규칙이 (a) 지출을 계정 항목으로 분류하고 (b) 한도 초과·이중 결제·정책 위반 지출을 근거와 함께 표시한다.
법인카드 거래를 받아 계정 항목으로 자동 분류하고 정책 위반·이상 지출을 근거와 함께 표시하는 동작하는 도구.
실제 회계 확정 대비 자동분류 정확도와 이상 탐지 정밀도/오탐 비율을 보여주는 대시보드.
월 마감 리포트를 자동 생성하고 정책 위반을 봇으로 알려, 경리 마감 시간을 줄이는 단계.
결측·중복·미등록·이상 거래 30종(이중 결제·한도 초과·미등록 가맹점 포함)을 넣어도 분류·탐지가 멈추지 않는 걸 시연한다
거래 묶음을 넣으면 계정 분류와 이상 지출 플래그가 근거와 함께 몇 초 안에 나오는 걸 시연한다
모든 분류·플래그 출력이 형식 검증(Zod)을 통과
측정: 자동 parse, 표본: 거래 200건
계정 분류 라벨 30개 중 26개가 내가 만든 정답과 일치. 단, 정답·데이터를 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건 동작'
위 수치는 더미데이터 자가채점이며, 실제 분류·이상 탐지 정확도는 고위드 실제 거래 데이터 + 회계 검수가 있어야 측정 가능. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만든다.
이건 고객·실데이터 없이 혼자 만든 포트폴리오라 모든 수치는 합성 데이터 자가채점이다. 면접에서 '데모 동작 + 실검증 준비 상태'로 솔직히 설명하는 게 오히려 신뢰를 준다
정답을 내가 만들었으니 잘 맞는 게 당연. 그래서 이중 결제·미등록 가맹점·표기 흔들림·결측 같은 헷갈리는 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 게 아님을 보여준다
'이상 지출'의 기준은 고객사 정책마다 다름. 규칙을 정책 설정으로 외부화하고, 애매한 건 단정하지 말고 '검토 필요'로 표시
실제 도입 시 달라지는 것: 실 거래 분포·가맹점 다양성이 더미와 다르므로 계정 사전과 이상 규칙을 실데이터로 다시 맞춰야 한다(도입 단계 과제)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
법인카드 거래 한 건 로그. 분류·이상탐지 엔진이 가장 먼저 보는 표. 결측·중복·미등록·이상금액을 일부러 섞었다.
| tx_id | company_id | merchant_raw | merchant_id | amount_krw | category | ts |
|---|---|---|---|---|---|---|
| tx_001 | co_a | 스타벅스 강남점 | m_sbux | 18,000 | meal | 2026-05-02T09:12:00 |
| tx_002 | co_a | AWS | m_aws | 1,320,000 | software | 2026-05-02T03:00:00 |
| tx_003 | co_a | 스타벅스강남 | m_sbux | 18,000 | meal | 2026-05-02T09:12:05 |
| tx_004 | co_b | 카카오모빌리티 | m_kakaot | 9,800 | transport | 2026-05-03T22:40:00 |
| tx_005 | co_b | 알 수 없는 가맹점 #44 | — | 540,000 | — | 2026-05-03T02:13:00 |
아래 Zod 스키마에 맞는 법인카드 거래 로그 120행 JSON 배열로 생성.
z.object({ tx_id: z.string(), company_id: z.string(), merchant_raw: z.string(), merchant_id: z.string().nullable(), amount_krw: z.number().int(), category: z.enum(["meal","transport","software","office","ad","unknown"]).nullable(), ts: z.string().nullable() })
쉬운 데이터만 만들지 말 것. 하드 케이스 의도적 혼입: (1) 동일 거래 중복(금액·가맹점 같고 ts 5초 차) 1쌍, (2) merchant_id/category/ts=null 결측 각 1~2건, (3) merchant_raw 표기 흔들림('스타벅스 강남점' vs '스타벅스강남') 1쌍과 빈 문자열 1건, (4) 미등록 가맹점(merchant_id=null) 2건, (5) 경계 금액 0원·심야 고액(>50만, 03시) 각 1건, (6) 미등록 company_id(orphan) 1건. JSON 배열만.z.object({ tx_id: z.string(), company_id: z.string(), merchant_raw: z.string(), merchant_id: z.string().nullable(), amount_krw: z.number().int(), category: z.enum(["meal","transport","software","office","ad","unknown"]).nullable(), ts: z.string().nullable() })| Java | 거래 ingest + 분류 규칙 + 이상 탐지(한도·중복·시간대) 배치 |
| Spring | 분류·점검 API (`POST /classify`. 거래 배열 → 계정 라벨 + 이상 플래그) |
| React | 지출 점검 대시보드 + Zod 런타임 검증 |
| Redis | 가맹점→계정 매핑 캐시 |
✓ pass → 그대로 멈춰도 완성품. 더 키우려면 2주차(자동분류·이상탐지가 실제와 맞는지 검증)로.
✓ pass → 여기서 멈춰도 완결. 더 키우려면 3주차(월 마감 자동화 + 위반 알림)로.
거래 단위 계정 분류 + 이상 지출 플래그 출력. 근거 인용 포함.
z.object({ tx_id: z.string(), category: z.enum(["meal","transport","software","office","ad","unknown"]), anomaly: z.array(z.enum(["duplicate","over_limit","late_night","unmapped_merchant","zero_amount","none"])).min(1), evidence: z.array(z.object({ field: z.string(), quote: z.string() })).min(1), hedge: z.string().min(8).nullable() })[
{
"tx_id": "tx_003",
"category": "meal",
"anomaly": [
"duplicate"
],
"evidence": [
{
"field": "merchant_raw",
"quote": "스타벅스강남"
},
{
"field": "ts",
"quote": "2026-05-02T09:12:05"
}
],
"hedge": "tx_001 과 5초 차 동일 금액. 이중 결제 의심"
},
{
"tx_id": "tx_005",
"category": "unknown",
"anomaly": [
"unmapped_merchant",
"late_night"
],
"evidence": [
{
"field": "merchant_id",
"quote": "null"
}
],
"hedge": "미등록 가맹점 + 심야 고액, 계정 단정 보류"
},
{
"tx_id": "tx_009",
"category": "office",
"anomaly": [
"zero_amount"
],
"evidence": [
{
"field": "amount_krw",
"quote": "0"
}
],
"hedge": "0원 거래. 취소/오류 가능"
}
]자동: (1) Zod parse, (2) evidence.field 가 입력 스키마 실제 필드명인지, (3) unmapped_merchant 플래그 시 category=unknown 권장 규칙 체크. 수동/judge: 이상 판정 적정성은 회계 정책 기준 사람 5% 확인.