Skip to content

feat(session): 직무 맞춤 면접 모드 — 회사·JD 기반 질문 + 직무 적합도 피드백#119

Merged
i3months merged 3 commits into
devfrom
feature/job-tailored-interview
Jun 25, 2026
Merged

feat(session): 직무 맞춤 면접 모드 — 회사·JD 기반 질문 + 직무 적합도 피드백#119
i3months merged 3 commits into
devfrom
feature/job-tailored-interview

Conversation

@i3months

Copy link
Copy Markdown
Member

변경 사항

새 면접 모드 JOB_TAILORED(직무 맞춤 면접) 을 추가합니다. 지원 회사명 + 채용공고(JD)를 받아 회사·직무에 대한 이해를 바탕으로 면접을 진행합니다.

  • 질문: JD 요구 ↔ 이력서/레포의 교집합·갭을 겨냥한 적합도 검증 + 지원동기·컬처핏 질문
  • 피드백: JD 대비 직무 적합도(충족/갭) 평가 추가

기존 모드(기술/인성/통합)와 직교합니다 — JD 입력·프롬프트·피드백이 전부 mode == JOB_TAILORED 하나로 깔끔하게 분기됩니다.

⚠️ 이 PR은 #118 위에 스택되어 있습니다(피드백 consumer 재사용). 아래 diff는 #118이 dev에 머지되면 직무 맞춤 변경만 남도록 자동 축소됩니다. 머지 순서는 무관 — 이 브랜치가 #118의 상위집합이라 어느 쪽을 먼저 머지해도 안전합니다.

상세

Core

  • SessionMode.JOB_TAILORED + V18 마이그레이션(mode CHECK 갱신 + target_company_name/target_job_description 컬럼)
  • 그 모드만 JD 필수(SessionService 검증 → SESSION_JD_REQUIRED), InterviewSession.assignTargetRole 로 보관(create 시그니처 불변)
  • JD 를 SelfIntroAnsweredEventgenerate.questionsgenerate.feedback 페이로드에 동봉. SessionResult/SessionResponse 라운드트립

AI

  • 질문: GenerateQuestionsRequest + chain 에 company/JD 추가, 프롬프트가 target_role 블록으로 받아 적합도·지원동기 질문 우선(다른 모드는 '(일반 면접)' 안내라 무시)
  • 피드백: chain/prompts/job_fit_evaluation.py + LlmJobFitEvaluator(Pro). 직무 맞춤 + JD 있을 때 panel_breakdownevaluator="직무 적합도" 항목 append — 종합 점수엔 미포함(feat(feedback): 자기소개 첫인상 평가 추가 (종합 점수 미포함) #118 첫인상과 동일 병렬·미집계 메커니즘). InterviewMode Literal 에 JOB_TAILORED 추가
  • 그 외 모드/빈 JD/평가 실패는 건너뜀(피드백은 정상 발행)

Frontend

  • 모드 선택지 추가 + 직무 맞춤 선택 시 회사명 + JD 입력(JD 필수 검증). 피드백 리포트에 "직무 적합도" 전용 섹션. OpenAPI 타입 재생성

테스트

  • Core: SessionServiceTest JD 필수·저장 케이스 추가, 전체 백엔드 스위트 통과(Flyway V18 검증 포함)
  • AI: 질문 JD forwarding, 직무 적합도 append/skip(모드·JD 분기), evaluator forwarding → 266 passed, black·flake8 통과
  • Frontend: tsc + 인터뷰/피드백 테스트 통과

문서

  • docs/database.md(V18 컬럼·mode CHECK), docs/messaging.md(payload), docs/glossary.md, backend·ai CLAUDE.md

🤖 Generated with Claude Code

새 면접 모드 JOB_TAILORED 추가. 지원 회사명 + 채용공고(JD)를 받아, 적합도·
지원동기·갭(이력서↔JD 교집합) 질문을 생성하고, 피드백에 '직무 적합도' 평가를
더한다. 기존 모드(기술/인성/통합)와 직교 — JD 입력·프롬프트·피드백이 모두
mode==JOB_TAILORED 하나로 분기된다.

- Core: SessionMode.JOB_TAILORED + V18(mode CHECK 갱신 + target_company_name/
  target_job_description 컬럼). 그 모드만 JD 필수(SESSION_JD_REQUIRED) +
  assignTargetRole 보관. JD 를 generate.questions(SelfIntroAnsweredEvent 경유)·
  generate.feedback 페이로드에 함께 실음. SessionResult/Response 라운드트립.
- AI(질문): GenerateQuestionsRequest + chain 에 company/JD 추가, 프롬프트가
  target_role 블록으로 받아 적합도·지원동기 질문 우선(다른 모드는 무시).
- AI(피드백): job_fit_evaluation 프롬프트 + LlmJobFitEvaluator(Pro). 직무 맞춤
  모드 + JD 있을 때 JD 대비 적합도·갭 평가를 panel_breakdown 의 evaluator=직무 적합도
  항목으로 append(첫인상과 같은 병렬·미집계). InterviewMode Literal 에 JOB_TAILORED.
- Frontend: 모드 선택지 + 직무 맞춤 시 회사명/JD 입력(JD 필수), 피드백 리포트에
  '직무 적합도' 섹션. OpenAPI 재생성.
- 테스트(Core/AI) + docs(database/messaging/glossary/CLAUDE) 갱신.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 25, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
stackup Ready Ready Preview, Comment Jun 25, 2026 5:18am

검토 중 발견한 직무 맞춤 모드의 프론트 노출 공백 보강:
- 히스토리 카드(SessionCard) 모드 라벨에 JOB_TAILORED='직무 맞춤' 추가
  (기존엔 'JOB_TAILORED' 원문이 그대로 노출됐음).
- 제목 미입력 시 직무 맞춤 면접은 회사명을 제목 앞에 붙임
  ("토스 백엔드 직무 맞춤 면접") — 입력한 회사명이 히스토리·라이브 헤더에
  드러나게(기존엔 회사명이 UI 어디에도 안 보였음).
- 프론트 테스트: 직무 맞춤 선택 시 JD 입력 노출·필수 검증·요청 페이로드 커버.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
면접의 본질이 직무 적합성이라, 직무 맞춤 모드 피드백을 두 축으로 분리했다:
- 직무 적합도(fit): JD 요구 기술·경험·책임을 실제로 갖췄는가(역량 매칭)
- 직무 이해도(understanding): 직무가 무엇을 하는 자리인지 이해하고 지원동기로
  연결했는가(역량 보유와 독립)

한 번의 구조화 LLM 호출(JobFitResult{fit, understanding})로 두 축을 함께
평가해 추가 비용 없이, panelBreakdown 에 evaluator='직무 적합도'·'직무 이해도'
두 항목으로 분리해 표시한다(종합 점수 미집계 유지). 프론트 리포트에 '직무 이해도'
전용 섹션 추가. 프롬프트가 두 축을 독립적으로 채점하도록 명시.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@i3months i3months merged commit 14689ab into dev Jun 25, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant