Skip to content

fix: 기술 면접관 전공과 질문 재작성 직무를 사용자 직무로 고정함 - #96

Merged
danjee2009 merged 1 commit into
mainfrom
fix/persona-major-user-job
Oct 15, 2026
Merged

danjee2009 merged 1 commit into
mainfrom
fix/persona-major-user-job

Conversation

@kimwuju

@kimwuju kimwuju commented Oct 15, 2026

Copy link
Copy Markdown
Contributor

개요

API 구현 명세 08 "기술 면접관 전공을 사용자 직무로 고정"입니다. main(3d510eb) 기준입니다. DB 변경(Flyway)은 없고, Chat·분석 서버 계약도 바뀌지 않습니다.

  • 문제: SOLO 면접관 2·3의 전공이 FRONTEND로 고정돼 있습니다. 테일러는 면접관 전공을 사용자 직무보다 먼저 봅니다. 그래서 백엔드 사용자가 이 면접관을 고르면 프론트엔드 기준으로 다시 쓴 질문을 받았습니다.
  • 결정(10/15): 기술 면접관 전공은 SOLO·MULTI 모두 사용자 직무로 고정합니다(P1). 테일러 jobRole도 사용자 직무만 씁니다(P2).

변경

1. 사용자 직무 변환 (persona/support/UserJobMajors, 신규)

  • normalize: MAJOR_ 접두사를 떼고, 앞뒤 공백을 지우고, 대문자로 맞춥니다. 비어 있으면 null입니다.
  • toPersonaMajor: BACKEND→BACKEND, FRONTEND·WEB_PUBLISHER→FRONTEND입니다. 직무가 없거나 비개발 직무, 알 수 없는 값은 BACKEND로 두고 info 로그를 남깁니다. 예외는 던지지 않습니다.
    • 마이페이지 직무 저장이 아직 연결되지 않았습니다. 그래서 직무 없는 사용자도 정상 경로에 있습니다.

2. 페르소나 저장 (POST /api/persona/save)

  • 컨트롤러가 @AuthenticationPrincipal AuthUser를 받아 사용자 직무를 서비스에 넘깁니다.
  • TECH 전공은 toPersonaMajor(사용자 직무)로 채웁니다. 요청 본문의 major는 받기만 하고 읽지 않습니다. 구버전 Web 호환용이고, Web이 보낸 값이 사용자 직무를 덮어쓰지 못하게 합니다.
  • "기술 면접관에게는 전공(major)이 필요합니다." 422 검사를 없앴습니다.

3. 테일러 기준 직무 (QuestionTailorService)

  • resolveJobRole이 면접관 전공을 보지 않습니다. 사용자 직무만 정규화해서 원문으로 보냅니다(예: WEB_PUBLISHER). 분석 서버 job_role은 자유 문자열이라, 면접관 전공으로 좁히면 정보가 줄어듭니다.
  • SOLO(resolveProfile)와 MULTI(requestMultiTailor) 두 곳 모두 바꿨습니다. 접두사 처리는 UserJobMajors로 옮겼습니다.
  • 콜백 재개 경로의 drawn.major() 대체와 "직군도 면접관도 없으면 422" 판정은 그대로입니다.

외부에서 보이는 동작 변화

요청 이전 이후
POST /api/persona/save TECH, major 없음 422 201, 전공 = 사용자 직무
POST /api/persona/save TECH, major=FRONTEND, 사용자 MAJOR_BACKEND 전공 FRONTEND 저장 전공 BACKEND 저장(요청값 무시)
POST /api/persona/save HR·CEO 등 전공 null 같음
SOLO 면접 준비, 면접관 전공 FRONTEND·사용자 BACKEND 분석 서버 job_role=FRONTEND job_role=BACKEND
MULTI 면접 준비, 같은 조건 job_role=FRONTEND job_role=BACKEND
사용자 직무 WEB_PUBLISHER 면접관 전공이 우선이라 사실상 BACKEND/FRONTEND 페르소나 전공 FRONTEND, job_role=WEB_PUBLISHER

응답 본문 형태와 오류 메시지 체계는 바뀌지 않습니다. 없어지는 오류는 위의 전공 누락 422 하나입니다.

배포 순서 (중요)

순서 상태 결과
1. API 배포 (이 PR) 구버전 Web이 major를 보냄 무시하고 사용자 직무로 저장합니다. 정상 동작합니다
2. Web 배포 (명세 09) 신버전 Web이 major를 안 보냄 사용자 직무로 저장합니다. 정상 동작합니다
(잘못된 순서) Web 먼저 신버전 Web이 major 없이 TECH 저장 구버전 API가 422로 거부해 면접을 시작할 수 없습니다

이 PR을 병합·배포한 뒤에 Web을 배포해 주세요.

테스트

  • ./gradlew test 전체 633개가 통과했습니다.
  • UserJobMajorsTest(신규): 접두사·공백·소문자 정규화, WEB_PUBLISHER→FRONTEND, 비개발·없음→BACKEND를 확인합니다.
  • PersonaServiceCreateTest
    • 요청 전공보다 사용자 직무가 우선하는지, 전공 없이 저장되는지 확인합니다.
    • WEB_PUBLISHER→FRONTEND, null·DATA_ANALYST→BACKEND, 비기술 면접관 전공 null을 확인합니다.
    • 전공 누락 422 테스트는 지웠습니다.
  • QuestionTailorServiceRequestTest
    • SOLO·MULTI 모두 면접관 전공과 관계없이 사용자 직무를 쓰는지 확인합니다.
    • WEB_PUBLISHER가 원문 그대로 가는지 확인합니다.
  • QuestionTailorServiceWaitingTest(콜백 재개 경로)는 수정하지 않았고 그대로 통과합니다.

참고

  • ChatInterviewHandoffService는 바꾸지 않았습니다. persona.major가 이제 사용자 직무에서 나오고, FALLBACK_MAJOR는 이전에 저장한 페르소나용으로 남겼습니다.
  • 명세 예시는 @Slf4j였지만, 이 레포에는 @Slf4j를 쓰는 곳이 없습니다. 그래서 다른 파일처럼 LoggerFactory를 썼습니다.

🤖 Generated with Claude Code

SOLO 면접관 2·3의 전공이 FRONTEND로 고정돼, 백엔드 사용자가 이 면접관을 고르면
테일러가 면접관 전공을 먼저 보고 프론트엔드 기준으로 질문을 다시 썼다.

- 페르소나 저장: TECH 전공을 로그인 사용자 직무로 채운다. 요청의 major는 읽지 않는다(구버전 Web 호환)
- 전공 누락 422("기술 면접관에게는 전공(major)이 필요합니다.")를 없앤다
- 테일러 jobRole: 면접관 전공 대신 정규화한 사용자 직무 원문만 보낸다(WEB_PUBLISHER 등)
- UserJobMajors: MAJOR_ 접두사·공백·대소문자 정규화, WEB_PUBLISHER→FRONTEND, 그 밖·없음→BACKEND

API를 Web보다 먼저 배포해야 한다. 신버전 Web이 major 없이 저장하면 구버전 API는 422로 막는다.

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

@danjee2009 danjee2009 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사용자 직무를 TECH 페르소나 전공과 SOLO/MULTI 질문 재작성의 job_role에 반영하는 흐름, 직무 누락·미지원 값의 기본 처리, 비기술 페르소나의 전공 제거, 구버전 Web 요청 호환성을 검토했습니다. 확인한 diff에서 수정이 필요한 정확성·보안·호환성 문제는 찾지 못했습니다. GitHub test 체크는 통과했습니다. 로컬 테스트 실행은 하지 않았습니다.

@danjee2009
danjee2009 merged commit bd6663e into main Oct 15, 2026
1 check 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.

2 participants