I automated my entire job search with AI — here's the full stack I built

개요

AI를 활용하여 채용 공고 검색, 평가, 맞춤형 서류 작성 및 이메일 발송까지 전체 구직 과정을 자동화하는 풀스택 도구를 구축했습니다.

주요 내용

* 기능: LinkedIn, Indeed, Glassdoor, ZipRecruiter, Google Jobs에서 채용 공고를 스크랩하고, Gemini AI를 사용하여 지원자의 이력서와 직무 설명 간의 일치율을 0~100%로 점수화하며, 일치율이 일정 기준(기본 75%) 미만인 공고는 제외합니다. 또한, 직무 설명에 맞춰 이력서의 내용을 수정하고, 해당 역할과 회사에 맞춤화된 자기소개서를 작성하여 요약본과 함께 이메일로 발송합니다.
* 기술 스택:
* 백엔드: FastAPI (Python 3.11)
* 프론트엔드: React + TypeScript + Tailwind CSS
* 데이터베이스: SQLite (SQLAlchemy ORM 사용)
* AI: Google Gemini API
* 채용 공고 스크래핑: jobspy 라이브러리
* 이메일: Resend SMTP
* 인증: httpOnly cookie sessions + bcrypt
* 호스팅: Coolify + Cloudflare CDN
* 스크래핑 계층: jobspy 라이브러리를 사용하여 여러 채용 플랫폼에서 데이터를 수집하며, 전체 직무 설명을 얻기 위해 linkedin_fetch_description=True 옵션을 사용합니다.
* AI 점수화 파이프라인: Gemini API에 이력서와 직무 설명을 전달하여 점수, 이유, 누락된 기술 목록을 포함한 JSON 응답을 받습니다. Gemini API의 속도 제한을 고려하여 요청 실패 시 지수 백오프(exponential-backoff)를 적용한 재시도 로직을 구현했습니다.
* 실시간 결과 스트리밍: Server-Sent Events (SSE)를 사용하여 프론트엔드에서 작업이 완료되는 대로 채용 공고 목록을 실시간으로 확인할 수 있도록 구현했습니다.
* 인증된 API 캐싱 문제 해결: Cloudflare가 인증 쿠키를 무시하고 /api/jobs 응답을 캐싱하여 다른 사용자의 데이터가 표시되는 문제를 발견했습니다. Cache-Control: no-store, no-cache, must-revalidate, privateVary: Cookie 헤더를 설정하고 Cloudflare 캐시 규칙을 조정하여 해결했습니다.
* 프리미엄 모델: Gemini API 사용량 초과를 방지하기 위해 사용자 티어별로 일일 검색 횟수 제한을 두는 프리미엄 모델을 적용했습니다.
* 개선점: PostgreSQL을 초기부터 사용하고, AI 관련 로직을 추상화된 모듈로 분리하며, 로깅 및 오류 추적과 같은 관측 가능성(observability) 기능을 사전에 구축하는 것이 좋다고 언급했습니다.
* 오픈소스 및 AI 코딩 지원: 해당 프로젝트는 오픈 소스로 공개되어 있으며, Claude Code와 같은 AI 코딩 지원 도구를 활용하여 개발 속도를 높였습니다.

시사점

AI를 활용한 구직 자동화 도구 구축은 시간과 노력을 절약하여 구직 과정의 효율성을 크게 향상시킬 수 있으며, 오픈소스 프로젝트로서 FastAPI + React 기반의 풀스택 애플리케이션 개발 및 AI 통합 사례를 학습하는 데 유용합니다.

원문 읽기 →
원문을 불러오는 중...

댓글

GitHub Discussions