작동 원리 심층 해부: 시스템은 어떻게 코드를 이해하고 기억하는가
이 시스템의 내부는 생각보다 훨씬 정교한 2계층(2-Layer) 아키텍처로 구성되어 있습니다. 단순히 프롬프트를 한 번 던지고 답변을 받는 단발성 챗봇이 아니라, 목적에 맞게 분리된 에이전트들이 유기적으로 협력하는 구조입니다.
1. 아키텍처 개요 (2-Layer Architecture)
시스템은 크게 ‘명령어 라우팅 및 데이터 수집을 담당하는 코어 모듈’과 ‘실제 추론을 담당하는 AI 에이전트 모듈’로 나뉩니다. 사용자가 터미널에 명령어와 URL을 입력하면, 코어 모듈이 이를 해석하여 웹 브라우저를 백그라운드에서 띄워 데이터를 긁어옵니다. 이후 이 순수한 텍스트 데이터를 AI 에이전트에게 넘겨 분석을 지시하는 방식입니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
flowchart TD
NODE_START["명령어 및 URL 입력"] --> NODE_ROUTE["CLI 라우터 분석"]
NODE_ROUTE --> NODE_SCRAPE["Playwright 포털 스캐너"]
NODE_SCRAPE --> NODE_AGENT["AI 평가 엔진"]
NODE_AGENT --> NODE_SCORE["10차원 A-F 스코어링"]
NODE_AGENT --> NODE_PDF["ATS 최적화 맞춤형 PDF 생성"]
NODE_SCORE --> NODE_DASH["Go 기반 터미널 대시보드 저장"]
NODE_PDF --> NODE_DASH
NODE_DASH --> NODE_END["사용자 최종 검토 및 지원"]
이러한 분리 구조는 확장성에 엄청난 이점을 가져다줍니다. 만약 새로운 구직 사이트가 등장하더라도 스캐너 모듈만 업데이트하면 되고, 새로운 AI 모델(예: Claude 3.5 Sonnet에서 향후 다른 모델로)이 나오더라도 추론 에이전트 쪽만 교체하면 전체 파이프라인을 그대로 유지할 수 있습니다.
2. 채용 공고 수집 및 스캐닝
사용자가 Greenhouse, Ashby, Lever 혹은 일반 기업의 자체 채용 페이지 URL을 입력하면, 시스템은 Playwright(헤드리스 브라우저 자동화 도구)를 통해 해당 페이지에 접근합니다. 이 과정의 핵심은 ‘제로 토큰(Zero-token)’ 스캐닝입니다. 복잡한 HTML 태그나 불필요한 내비게이션 바, 푸터 등의 노이즈를 AI에게 그대로 던지면 엄청난 토큰 비용이 발생하고 환각(Hallucination) 현상을 유발할 수 있습니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
flowchart LR
NODE_URL["채용 공고 URL 입력"] --> NODE_CHK{"플랫폼 식별기"}
NODE_CHK -->|"Greenhouse URL"| NODE_GH["Greenhouse 전용 파서"]
NODE_CHK -->|"Ashby URL"| NODE_ASH["Ashby 전용 파서"]
NODE_CHK -->|"Lever URL"| NODE_LEV["Lever 전용 파서"]
NODE_CHK -->|"기타 도메인"| NODE_GEN["일반 웹사이트 휴리스틱 스캐너"]
NODE_GH --> NODE_CLEAN["노이즈가 제거된 순수 텍스트 공고"]
NODE_ASH --> NODE_CLEAN
NODE_LEV --> NODE_CLEAN
NODE_GEN --> NODE_CLEAN
내장된 스캐너는 페이지의 구조를 파악하고 오직 직무 설명(JD), 자격 요건, 우대 사항 등의 핵심 텍스트만을 정제하여 추출합니다. 현재 기본적으로 150여 개의 주요 채용 포털 형식을 완벽하게 파싱할 수 있도록 최적화되어 있습니다.
3. AI 평가 엔진 (A-F 스코어링)
추출된 직무 텍스트는 사용자의 기본 이력서(Base CV) 데이터와 함께 AI 엔진으로 전달됩니다. 이때 단순히 ‘나에게 어울리는 직무인가?’라고 묻는 것이 아닙니다. 시스템은 사전에 정의된 10개의 독립적인 차원을 바탕으로 각각 A부터 F까지의 등급을 매기고, 이를 가중치에 따라 종합하여 1.0에서 5.0 사이의 절대적인 실수형 점수를 산출합니다.
| 평가 차원 | 설명 | 스코어링 기준 예시 | 가중치 |
|---|
| 기술 스택 일치도 | 공고가 요구하는 핵심 언어 및 프레임워크와의 교집합 | 필수 기술 누락 시 심각한 감점, 초과 시 가점 | 매우 높음 |
| 연차 및 시니어리티 | 요구 연차 대비 지원자의 실제 경력 | 요구 연차보다 부족하면 감점, 과도한 오버스펙도 패널티 | 높음 |
| 도메인 전문성 | 회사의 산업군과 지원자의 과거 프로젝트 일치 여부 | 핀테크 공고에 결제 시스템 개발 경험 존재 시 가점 | 높음 |
| AI 성숙도 | 채용 기업의 AI 기술 이해도 및 적용 의지 | JD에 AI 도입이 구체적으로 명시되어 있는지 평가 | 중간 |
| 역할의 영향력 | 해당 포지션이 조직 내에서 갖는 권한과 책임 | 독립적인 의사결정 권한이 클수록 가점 부여 | 중간 |
이러한 정량적 평가는 내가 어떤 공고에 시간을 투자해야 할지 명확한 기준을 제시합니다. 4.5점 이상의 공고는 즉시 지원을 고려해야 하고, 2.0점 미만의 공고는 뒤도 돌아보지 않고 버리면 됩니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
sequenceDiagram
participant USER as 사용자
participant CORE as 시스템 코어
participant PARSER as 플랫폼 파서
participant AI as AI 추론 엔진
USER->>CORE: /career-ops auto-pipeline [URL]
CORE->>PARSER: 페이지 크롤링 및 텍스트 정제 요청
PARSER-->>CORE: 정제된 직무 텍스트 반환
CORE->>AI: 이력서와 직무 텍스트 대조 및 스코어링 지시
AI-->>CORE: 10개 차원별 점수 및 종합 1.0~5.0 결과
CORE->>AI: 종합 점수를 바탕으로 이력서 커스터마이징 지시
AI-->>CORE: ATS 최적화 PDF 데이터
CORE-->>USER: 분석 리포트 및 최종 맞춤형 이력서 출력
4. 맞춤형 이력서 생성 엔진
평가가 완료되고 지원할 가치가 있다고 판단되면, 시스템은 이력서를 새롭게 작성합니다. 이 과정은 마치 노련한 헤드헌터가 이력서를 다듬는 것과 같습니다. 없는 사실을 지어내는 환각(Hallucination)은 철저히 통제되며, 오직 사용자의 원본 이력서에 있는 사실만을 기반으로 하되 직무 공고에서 강조하는 키워드를 전면으로 재배치합니다.
예를 들어, 지원자가 백엔드와 프론트엔드 모두 경험이 있지만 이번 공고가 ‘데이터베이스 최적화’를 중요하게 여긴다면, 이력서의 서두에는 쿼리 튜닝과 인덱스 설계 경험이 강조되어 작성됩니다. 생성된 데이터는 Node.js 기반의 PDF 제너레이터를 거쳐 완벽한 포맷의 파일로 로컬에 저장됩니다. 이는 기업의 ATS(Applicant Tracking System)가 이력서를 기계적으로 파싱할 때 누락 없이 읽을 수 있도록 최적화된 마크다운 구조를 사용합니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
stateDiagram-v2
[*] --> ST_DISCOVERED
ST_DISCOVERED --> ST_SCANNING : URL 분석
ST_SCANNING --> ST_EVALUATED : AI 스코어링
ST_EVALUATED --> ST_DISCARDED : 점수 미달 (2.5 미만)
ST_EVALUATED --> ST_READY : 점수 우수 (맞춤 이력서 생성)
ST_READY --> ST_APPLIED : 사용자의 최종 지원 승인
ST_APPLIED --> ST_INTERVIEW : 서류 전형 통과
ST_INTERVIEW --> ST_OFFER : 최종 합격
ST_INTERVIEW --> ST_REJECTED : 불합격
ST_OFFER --> [*]
ST_REJECTED --> [*]
ST_DISCARDED --> [*]
5. 로컬 데이터베이스와 Go 기반 대시보드
수백 개의 공고를 관리하다 보면 상태 추적이 가장 큰 골칫거리가 됩니다. career-ops는 이를 위해 Node 22.5 이상 환경에서 지원하는 내장 SQLite를 활용해 초고속 인덱싱을 수행합니다. 모든 지원 기록, 점수, 회사명, 파일 경로 등은 로컬에 구조화되어 저장됩니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
erDiagram
TBL_USER ||--o{ TBL_APPLICATION : "소유 및 관리"
TBL_APPLICATION ||--|| TBL_JOB_POST : "참조"
TBL_APPLICATION ||--|| TBL_RESUME_DOC : "포함"
TBL_USER {
string user_id
string config_profile
}
TBL_APPLICATION {
string app_id
string current_status
float ai_eval_score
}
TBL_JOB_POST {
string job_id
string company_name
string portal_url
}
TBL_RESUME_DOC {
string doc_id
string local_file_path
}
저장된 데이터는 Go 언어로 작성된 터미널 대시보드를 통해 시각화됩니다. 이 대시보드는 Elm 아키텍처를 차용한 Bubble Tea 프레임워크로 만들어져 반응성이 뛰어나고, 마우스 없이 키보드 방향키만으로 수백 개의 지원 내역을 순식간에 필터링하고 조회할 수 있게 해줍니다.
6. 시스템 클래스와 모듈 구조
전체 시스템을 지탱하는 코드베이스는 명확한 관심사 분리(Separation of Concerns) 원칙을 따르고 있습니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
classDiagram
class CLS_CLIHandler {
+parseUserCommand()
+routeToModule()
}
class CLS_Scraper {
+fetchHTML()
+parsePlatformSpecific()
}
class CLS_AgentCore {
+evaluateJobDescription()
+generateTailoredPDF()
}
class CLS_DashboardTUI {
+renderBubbleTeaUI()
+updateStateOnInput()
}
CLS_CLIHandler --> CLS_Scraper
CLS_CLIHandler --> CLS_AgentCore
CLS_AgentCore --> CLS_DashboardTUI