개발 요구 사항
최종 갱신 2026-09-28 — 보안 요구(SEC-001)의 구현 현황을 실제 코드 기준으로 표기.
목적
채용 프로세스 전 과정(공고 등록 → 지원 접수 → 서류 검토 → 면접 → 합불 통보)을 하나의 웹 플랫폼으로 구현하고, AI 기술을 접목하여 이력서 분석과 정보 검색을 자동화한다.
개발 범위
| 요구 ID | 기능 | 검수 기준 |
|---|---|---|
| SFR-001 | 이력서 파싱 — PDF/DOCX 업로드 시 이름·학력·경력·기술스택 자동 추출 | 주요 필드 추출 정확도 90% 이상 |
| SFR-002 | 칸반 보드 — 지원자 카드를 드래그하여 채용 단계 전환 | 상태 전환 시 DB 반영 200ms 이내 |
| SFR-003 | Tool-Calling Agent — 자연어 명령으로 지원자 검색·조회·단계 변경·면접관 배정·일정 제안·메일 초안/발송·이력서 드롭 접수 | 도구 12종 · 쓰기 도구는 확인 카드 필수 · 회귀 하네스 40시나리오 · 동일 채점기 23건 기준 Claude 69.6% / 자체학습 v9 73.9% (2026-09-17) |
| SFR-004 | RAG 질의응답·시맨틱 검색 — 이력서·자소서·공고 기반 의미 검색 (ko-sroberta + pgvector, ADR-0021) | 키워드 폴백 병행 · search_mode 로 벡터 가동 여부 응답에 노출 |
| SFR-005 | 지원자 관리 — 지원자 CRUD, 검색·필터링, 채용 단계별 목록 조회 | 전체 CRUD 정상 동작, 커서 페이지네이션 · 10만 건 111ms → 7.8ms |
| SFR-006 | 이메일 알림 — 채용 단계 변경 시 자동 이메일 발송 (n8n 웹훅 + SMTP, ADR-0030) | n8n 장애 시 API 가 5분마다 재발송(최대 3회) · SES·SQS 는 폐기(ADR-0031·0036) |
| SFR-007 | 자동 서류 심사 — 3축(자격요건·우대사항·인재상) 100점 채점 → 임계 기준 자동 단계 이동 (ADR-0034) | 자료 부족 자동 탈락 · 사람 개입 시 자동 판정 제외 · fit-check 24명 정확성 분석으로 가중치 개정 |
| SFR-008 | AI 면접 · 실시간 분석 — 맞춤 질문 · 음성 STT · 답변↔서류 대조 · 1:1 WebRTC · 표정/음성 참고 지표 (ADR-0029·0032·0038) | 참고 지표는 점수·합불에 미반영 · 실시간 STT 는 서버 내 로컬 전사 |
| SFR-009 | 제출물 무결성 원장 — SHA-256 해시 사슬 · DB 트리거 수정/삭제 거부 · Sepolia 앵커 (ADR-0028) | 트리거 상태 변경은 감사 로그 · 서명 키는 서버 밖 |
채용 프로세스 자동화
칸반 보드를 중심으로 채용 전 과정을 관리한다.
단계 흐름:
지원 접수(applied) → 서류 검토(screening) → 면접(interview) → 최종 합격(accepted) / 불합격(rejected)
규칙 — 전진은 한 칸씩 · 역행은 항상 허용(사람이 AI 판정을 되돌리는 안전장치) · 불합격은 어느 단계에서든(사유 필수) · 서류 단계는 AI 자동 판정, 사람이 한 번 손대면 이후 자동 판정에서 제외(ADR-0034) · 일괄 변경은 전부 성공 아니면 전체 롤백.
- 각 단계 전환 시 단계 이력이 자동으로 기록된다(
changed_by=NULL은 시스템 판정) - 단계 변경 시 지원자에게 자동 메일이 발송된다 (n8n 웹훅 + SMTP · 실패 시 API 재발송). 자동 탈락 메일은 마감 뒤 담당자가 일괄 발행
- 면접관 배정 및 단계별 평가(점수·코멘트)를 기록한다
- 모든 이동과 평가는 이력으로 남아 추후 감사 추적이 가능하다
AI 기반 이력서 분석
| 기능 | 설명 | 기술 |
|---|---|---|
| 이력서 텍스트 추출 | PDF/DOCX/HWPX 에서 본문 추출(구형 HWP 미지원) · 학력·경력·기술스택 구조화, AI 가 채운 값엔 「AI 추정」 표식 | pypdf · Claude |
| 요약·평가·추천 3단 체인 | 요지·핵심 역량 → 3축 점수(요건 60 · 우대 10 · 인재상 30) · 강점/우려 → 추천 · 확인 질문 (ADR-0022) | Claude haiku-4-5 · 프롬프트 v2/v3 버전 관리 |
| RAG 시맨틱 검색 | 스킬·학력·경력 임베딩으로 “Python 경험자” 같은 의미 검색, 키워드 폴백 병행 | ko-sroberta + pgvector |
| Tool-Calling Agent ‘아르’ | 자연어 명령을 도구 12종 호출로 분해, 쓰기는 확인 카드, 빈출 요청·기본 질문은 규칙 라우터($0) | Claude Tool Use · 규칙 의도 라우터 |
| 모델 전략 | Qwen3-8B QLoRA 자체학습 3어댑터(chat v9 73.9%)와 Claude 를 동일 채점기로 비교 → 심사 서빙은 클라우드 + Claude, Qwen 은 R&D 자산 (ADR-0024 → 09-18 확정) | 동일 채점기 judge.py · 23건 |
서류 단계 이동은 AI 가 하되 최종 합불 확정은 항상 사람이 한다(ADR-0003 → 0034). 표정·음성 신호는 참고 지표로만 표시되며 점수에 쓰지 않는다(ADR-0029).
지원자 통합 관리 기능
- 지원자 CRUD — 지원자 등록·조회·수정·삭제
- 검색·필터 — 이름·학교·기술스택 기반 검색, 더미 데이터 10만 건 기준 인덱스 튜닝
- 면접관 배정 — 단계별 면접관을 지정하고 평가를 기록
- 공개 지원 폼 — 로그인 없이 외부 링크로 지원서 제출, 이력서 S3 presigned URL 업로드
- 모바일 대응 — 모바일에서도 지원자 목록·상세를 조회할 수 있는 반응형 UI
보안 및 개인정보 보호
| 요구 ID | 항목 | 검수 기준 |
|---|---|---|
| SEC-001 | 인증·인가 — JWT 기반 인증, CORS 설정, 개인정보 암호화 | 미인증 요청 401/403 차단 · 현황: S3 SSE·전송 TLS·최소 권한 IAM (필드 단위 AES-256 은 기획 요구, 미구현) |
| SEC-002 | 데이터 보안 — 이력서 파일 S3 암호화 저장, 접근 권한 IAM 기반 제어 | S3 SSE 활성화, IAM 정책 적용 |
역할 기반 접근 제어 (RBAC) — 권한 등급은 둘(ADR-0017): 위계가 아니라 조작 권한의 유무다. 조회는 로그인만 하면 전부 허용 — 옛 “면접관은 배정된 지원서만” 규칙은 폐지됐다.
| 등급 | 권한 범위 |
|---|---|
| admin | 면접관 배정·해제 · 계정 생성 · 메일 템플릿 · 타인 가용 시간 (admin 전용 넷) |
| member | 그 외 전부 — 단 평가 작성은 배정된 건만 |
| 지원자 | 링크 안 일회성 토큰 또는 이메일 + 생년월일 로그인(ADR-0033) — 담당자 화면과 분리 |
| 시스템·n8n | 서비스 토큰(/internal/*) — 없으면 아예 호출하지 않는다 |
추가 규칙 — JWT 12시간 · 비활성 계정은 이미 발급된 토큰도 401 · APP_ENV=production 에서 공개 가입 차단 · 심사 데모 계정은 비밀번호·역할 변경 403(공유 계정 보호) · 프롬프트에 연락처·주민번호 미포함.
구현 현황 (2026-09-22 기준)
기획 필수 27기능은 09-03 에 27/27 구현을 달성해 유지 중이다(권장·여유 기능은 09-03 기준 22/30 · 0/23 구현이었고, 이후 아래 ADR 편입 범위로 확장을 진행했다).
기획서 밖에서 ADR로 정식 편입되어 배포까지 끝난 범위 — 도구 호출 에이전트(확인 카드·비용 관측·규칙 라우터 $0), 요약·평가·추천 3단 체인 + 자동 서류 심사(ADR-0034), RAG 시맨틱 검색(ADR-0021), 면접 일정 자동화(FAQ 챗봇 포함), AI 면접 — 1:1 화상·STT·표정/음성 참고 지표(ADR-0029·0032·0038), 인적성 설문(ADR-0027), 지원자 로그인(ADR-0033), 제출물 무결성 원장 + Ethereum Sepolia 앵커(ADR-0028), 헥사고날 재편(ADR-0035), 심사위원 데모 계정. AI 모델 전략은 Qwen 자체학습으로 검증한 뒤 클라우드 + Claude 로 확정(ADR-0024 → 09-18). 각 항목은 개발 일정·문제와 극복·개발 로그에서 확인한다.
제외·개정 이력 (전부 ADR로 기록 — 개정은 원문을 지우지 않고 절을 덧붙인다):
| 항목 | 원 결정 | 현재 |
|---|---|---|
| Kubernetes | 제외 — 한 달 안에 실제로 굴렸다고 말할 수 없는 것은 넣지 않는다 (ADR-0001) | 제외 유지 · EC2 1대 + Docker Compose |
| 표정 분석 | 제외 — 직무성과 예측 기여 0.25% 미만, 차별 위험, HireVue 2021 폐기 (ADR-0002) | 개정 도입(ADR-0029) — 담당자 참고 지표까지만, 점수 재료 아님. 원 근거는 문서에 그대로 남김 |
| AI 자동 합불 판정 | AI 는 추천까지만 (ADR-0003) | 개정(ADR-0034) — 서류 단계는 AI 자동 판정, 최종 합불만 사람. 안전장치 셋(이력·일괄 메일·수동 우선) |
| 실시간 화상면접 | 제외 — 견적(시그널링+TURN+SFU 4주)은 3인 이상 전제 | 1:1 만 도입 — 둘이면 SFU 없이 P2P. 집단 면접은 시연 뒤 ADR |
| 음성 감정 분석 · 인적성 성격 판정 | 재서술·전사까지만 (ADR-0026·0027) | 음성 신호는 참고 지표로 표시(점수 미반영) · 성격 판정 금지 유지 |
| 지원자 SNS 크롤링 | 채용절차법·개인정보보호법·약관 위반 | 제외 유지 |
| 실시간 공동 편집 | 제외 (ADR-0005) | 제외 유지 |
| SQS 워커 · SES | 초기 메일 경로 | 폐기(ADR-0031·0036) — n8n + SMTP 로 전환, 스위치 3개로 공급자 교체 가능 |
| 온프레미스 자체 서빙 | 계획 (ADR-0024) | 구축 후 폐쇄 — 로컬 sLLM 도구 오호출·예시 베끼기·JSON 깨짐이 심사 직전 누적. Qwen 어댑터는 R&D 자산 |