본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 17. 04:47

FastAPI, Claude API를 사용하여 AI 이력서 최적화 도구를 만들고 4개월 만에 100명의 사용자를 확보한 방법

요약

FastAPI와 Claude API를 활용하여 ATS(지원자 추적 시스템)를 통과할 수 있는 AI 이력서 최적화 도구 개발 사례를 소개합니다. 분석과 최적화로 나누어진 2단계 AI 파이프라인 설계와 구조화된 JSON 출력을 처리하는 기술적 노하우를 다룹니다.

핵심 포인트

  • FastAPI와 Claude API를 결합한 AI 기반 이력서 분석 및 재작성 아키텍처
  • Claude로부터 일관된 JSON 출력을 얻기 위한 방어적 파싱 전략
  • 사용자 신뢰와 리텐션을 높이기 위한 '분석 후 승인' 방식의 2단계 설계

6개월 전, 제 사촌은 50개 이상의 직무에 지원하고 있었지만 아무런 연락도 받지 못하고 있었습니다. 그의 이력서는 괜찮아 보였습니다. 좋은 경력과 적절한 형식을 갖추고 있었죠. 하지만 사람이 읽기도 전에 필터링되고 있었습니다.

그때 저는 ATS(Applicant Tracking Systems, 지원자 추적 시스템)의 세계에 빠져들게 되었습니다.

ATS는 채용 담당자가 확인하기 전에 이력서의 75%를 필터링합니다. 이는 후보자가 자격이 없어서가 아니라, 이력서가 시스템이 스캔하는 키워드와 일치하지 않기 때문입니다. 대부분의 사람들은 이런 일이 일어나고 있다는 사실조차 모릅니다.

그래서 저는 이를 해결하기 위한 도구를 만들었습니다: Resume Builder AI — 직무 기술서(Job Description)와 이력서를 비교하여 점수를 매기고, ATS 필터를 통과할 수 있도록 이력서를 다시 작성해 주는 AI 기반 이력서 최적화 도구입니다. 제가 이것을 어떻게 만들었는지 정확히 설명해 드리겠습니다.

- 아키텍처 (The Architecture)

Frontend:  Next.js 15 (App Router) + TypeScript + Tailwind
Backend:   FastAPI + SQLAlchemy + PostgreSQL
AI:        Claude API (claude-sonnet-4-6)
...

핵심 흐름은 2단계 AI 파이프라인입니다:

분석 (Analyze) — Claude가 이력서와 직무 기술서를 읽고 ATS 점수, 누락된 키워드, 구체적인 제안 사항이 포함된 구조화된 JSON을 반환합니다.
최적화 (Optimize) — 사용자가 제안된 변경 사항을 검토하고 승인한 후에만, Claude가 해당 변경 사항을 반영하여 이력서를 다시 작성합니다.
2단계는 나중에 추가되었습니다. 제 첫 번째 버전은 모든 AI 변경 사항을 자동으로 적용했습니다. 사용자들은 그것을 싫어했습니다.

2단계는 나중에 추가되었습니다. 제 첫 번째 버전은 모든 AI 변경 사항을 자동으로 적용했습니다. 사용자들은 그것을 싫어했습니다.

- Claude API 연동 (The Claude API Integration)
가장 까다로운 부분은 분석 단계에서 Claude로부터 일관된 구조화된 출력(Structured Output)을 얻어내는 것이었습니다. 제가 정착한 핵심 패턴은 다음과 같습니다:

from anthropic import Anthropic

client = Anthropic()
...
```

"):
        content = content.split("

```")[1]
        if content.startswith("json"):
            content = content[4:]

...

핵심 통찰: 모델에게 마크다운 구분 기호 (markdown fences)를 사용하지 말라고 명시적으로 지시하더라도, 항상 이를 제거해야 합니다. Claude는 매우 뛰어나지만, 가끔 JSON을 구분 기호로 감싸는 경우가 있습니다. 방어적으로 처리하세요.

- 2단계 설계 결정 (The Two-Stage Design Decision)
나의 V1은 단발성 재작성 (single-shot rewrite) 방식이었습니다: 이력서 + 직무 기술서 (job description) 붙여넣기 → 최적화된 이력서 받기.

초기 사용자들은 다시 돌아오지 않았습니다.

이유를 물었을 때, 답변은 일관되었습니다: "무엇이 바뀌었는지 몰랐어요. 믿을 수가 없었습니다."

그래서 나는 미리보기 (preview) 단계를 구축했습니다. AI가 변경하고자 하는 내용 — 구체적인 불렛 포인트 재작성, 추가할 키워드, 구조를 재편할 섹션 등 — 을 보여주고, 사용자가 변경 사항이 적용되기 전에 각 변경 사항을 승인하거나 거절하도록 했습니다.

이 변화 이후 리텐션 (retention, 유지율)이 크게 개선되었습니다.

교훈: 사용자는 AI의 결과물, 특히 이력서처럼 개인적인 것에 대해 스스로 통제하고 있다고 느낄 필요가 있습니다. 투명성 (Transparency) > 편의성 (convenience).

현재 구현된 내용은 resumebuilder.pulsestack.in/builder 에서 확인할 수 있습니다.

- PDF 파싱 (PDF Parsing)은 예상보다 어려웠다
다양한 이력서 형식의 업로드된 PDF에서 깨끗한 텍스트를 추출하는 것이 프로젝트에서 가장 고통스러운 부분이었습니다.

import pdfplumber

def extract_text_from_pdf(file_bytes: bytes) -> str:
...

다중 열 (Multi-column) 이력서 레이아웃이 가장 어려운 케이스였습니다. 표준

extract_text()

함수는 열 단위가 아니라 페이지 전체를 왼쪽에서 오른쪽으로 읽기 때문에 구조를 완전히 망가뜨립니다. 위의 경계 상자 (bounding-box) 접근 방식은 대부분의 레이아웃을 올바르게 처리합니다.

- ATS 점수 산정 로직 (ATS Scoring Logic)
점수는 5가지 차원에 걸쳐 계산됩니다:

def calculate_ats_score(resume: dict, job_desc: str) -> int:
    scores = {
        "keyword_match":    _keyword_overlap(resume, job_desc) * 0.35,
...

키워드 일치 (Keyword match)에 가장 높은 가중치(35%)를 두었는데, 이는 대부분의 ATS (채용 관리 시스템)가 주로 필터링하는 기준이기 때문입니다. 형식의 깔끔함은 대부분의 사람들이 생각하는 것보다 더 중요합니다. 화려한 표, 헤더/푸터, 텍스트 상자는 파서 (parser)를 혼란스럽게 만듭니다.

내가 다르게 했을 것들

1. 기능을 만들기 전에 사용자들과 대화하세요.
저는 아무도 요청하지 않은 LinkedIn 최적화 도구를 만드는 데 3주를 허비했습니다. 제가 거의 만들지 않을 뻔했던 ATS 점수 (ATS score) 기능이야말로 사람들이 실제로 공유하는 핵심 기능입니다.

2. 더 일찍 출시하세요.
제품이 "준비되었다"고 느껴질 때까지 기다렸습니다. 그 결과 6주를 낭비했습니다. 실제 사용자들이 제품을 사용해 보는 것보다 무엇을 만들어야 할지 더 빠르게 가르쳐 주는 것은 없습니다.

3. 첫날부터 SEO (검색 엔진 최적화)에 투자하세요.
4개월이 지난 지금도 새로운 도메인의 Google 인덱싱 (indexing)을 위해 여전히 싸우고 있습니다. 첫 주부터 블로그를 시작하고 백링크 (backlinks)를 구축했다면, 뒤처진 시간을 만회하기 위해 보낸 수개월을 아낄 수 있었을 것입니다.

현재 상태
이 도구는 resumebuilder.pulsestack.in 에서 라이브 상태이며, 다음 기능을 제공합니다:

  • 어떤 직무 기술서 (job description)와도 비교 가능한 ATS 점수 산출
  • 미리보기 + 승인 흐름 (preview + approve flow)을 포함한 AI 이력서 최적화
  • LaTeX로 컴파일된 정식 CV를 포함한 6개의 PDF 템플릿
  • 자기소개서 (Cover letter) 생성기
  • LinkedIn 최적화 도구
  • 신용카드 정보가 필요 없는 무료 티어 (Free tier)
  • 100명 이상의 사용자, 현재까지 순수하게 입소문을 통해 성장 중

Claude API 프롬프팅 전략 (prompting strategy), FastAPI 아키텍처 (architecture), PDF 생성 파이프라인 (generation pipeline) 등 기술적 구현의 어떤 부분에 대해서든 궁금한 점이 있다면 댓글을 통해 더 자세히 설명해 드리겠습니다.

만약 현재 구직 중이라면, ATS checker를 통해 이력서를 돌려보세요. 점수 확인만으로도 보통 눈이 번쩍 뜨일 것입니다.

FastAPI, Next.js, Claude API, PostgreSQL, 그리고 Railway로 구축되었습니다. 소스 코드는 아직 공개되지 않았으나 공개를 고려 중입니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0