Skip to content

feat: 역량 축 채점(competency-v1) 질문 카테고리 저장·송신과 콜백 새 필드 저장 - #121

Merged
kimwuju merged 1 commit into
mainfrom
feat/competency-scoring
Oct 21, 2026
Merged

kimwuju merged 1 commit into
mainfrom
feat/competency-scoring

Conversation

@kimwuju

@kimwuju kimwuju commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

연관 이슈 없음 (채점 축 재구성 — API 서버 담당분, 구현 명세 03 문서)

Task

  • 질문 카테고리 저장 (V42)
    • interview_question.category VARCHAR(64) 추가. 채팅 서버가 면접 결과 저장 때 이미 보내던 category를 지금까지 버리고 있었습니다.
    • 앞뒤 공백을 빼고 소문자로 맞춘 뒤 ^[a-z][a-z0-9_]{0,63}$일 때만 저장합니다. 옛 채팅 면접은 이 자리에 질문 의도 문장을 보내므로 그 경우는 null입니다.
    • 의도가 비었을 때 category 문자열을 의도로 쓰는 기존 동작(intentionOf)은 그대로입니다.
  • 채점 요청에 category 송신
    • FeedbackSoloRequest.Question, FeedbackMultiRequest.Question에 category(NON_NULL). 값이 없으면 키를 보내지 않습니다.
    • 꼬리질문의 부모 상속은 분석 서버가 합니다. API는 저장된 값만 보냅니다.
  • 콜백 새 필드 저장 (V42)
    • feedback_item.response_level SMALLINT, feedback_item.competencies JSONB 추가.
    • 문항의 responseLevel·competencies는 JsonNode로 받아 새 CompetencyReader가 풉니다. 등급 04, 점수 0100, 역량 6개·역할 2개 값 밖의 항목은 버리고, 근거 인용은 slot 140자·quote 11,000자(code point)만 남깁니다.
    • 산출 근거: 축의 verdict·evidenceCount, 그리고 response·motivation·credibility를 ScoreBreakdownReader가 읽습니다. 모순 항목은 문항 id·인용이 문자열 두 개씩 맞아야 남고, 모르는 kind는 OTHER로 둡니다.
    • 응답 적중·지원 동기는 축 목록에 넣지 않아 종합 점수 재계산 경고(warnIfTotalDiffers)에 섞이지 않습니다.
  • 조회 응답
    • GET /api/feedbacks의 scoreBreakdown·personas[].scoreBreakdown·feedbacks[]에 새 필드가 그대로 나갑니다.
    • 산출 근거의 새 필드는 NON_NULL이라 axis-v4 결과의 응답에는 키가 생기지 않습니다.

ETC

  • 배포 순서: 이 PR → 웹(버전별 표시) → 분석 서버 코드(기본 axis-v4) → 설정 전환. 분석 서버가 axis-v4인 동안은 새 컬럼이 비어 있을 뿐 동작이 바뀌지 않습니다. 되돌려도 컬럼은 남겨 둡니다.
  • 리뷰 포인트
    • response_level은 SMALLINT라 엔티티에 @JdbcTypeCode(SqlTypes.SMALLINT)를 붙였습니다. 없으면 ddl-auto: validate에서 기동이 막힙니다.
    • 인용은 답변 원문이라 로그에는 사유와 길이만 남깁니다.
    • AxisScoreResponse·ScoreBreakdownResponse에는 axis-v4 모양 생성자를 남겼습니다. 콜백 Item은 필드가 둘 늘어 기존 테스트 생성자 호출에 인자를 붙였습니다.
  • 계약 문서 메모: 연동 계약(01 문서) 4.2 예시의 totalScore 68은 축 점수·가중치로 계산하면 66이라 계약의 보장 식과 맞지 않습니다. 테스트는 66으로 썼습니다. 문서 예시도 고쳐야 합니다.
  • 테스트: 일회용 PostgreSQL 16에서 ./gradlew test 1123개 통과(실패·오류·건너뜀 0), V42 적용 포함
    • 카테고리 저장: 정상·대소문자·공백 정리, 의도 문장·64자 초과·형식 위반 → null, 의도 대체 유지
    • 요청: 1:1·N:1에 실림, null이면 키 없음
    • 리더: 01 문서 예시, axis-v4 본문 그대로, 판정 오타·음수 개수·짝 안 맞는 모순·긴 인용·이모지 인용
    • 실제 DB: 01 문서 예시 콜백 저장 → 재조회 → 조회 응답 JSON 왕복, axis-v4 결과 응답에 새 키 없음

🤖 Generated with Claude Code

- V42: interview_question.category, feedback_item.response_level(SMALLINT)·competencies(jsonb)를 추가한다. 기존 행은 채우지 않는다.
- 면접 결과 저장 때 질문 category를 소문자 스네이크케이스 1~64자일 때만 저장한다. 옛 채팅 면접이 보내는 의도 문장은 비우고, 의도가 비었을 때 그 문장을 의도로 쓰는 기존 동작은 둔다.
- 1:1·N:1 채점 요청에 category를 싣는다. 값이 없으면 키를 보내지 않는다.
- 콜백 문항의 responseLevel·competencies를 CompetencyReader가 읽어 저장한다. 산출 근거의 verdict·evidenceCount·response·motivation·credibility는 ScoreBreakdownReader가 읽는다. 모양이 어긋난 항목·인용만 버리고, 인용 원문은 로그에 남기지 않는다.
- 조회 응답에 새 필드를 그대로 내보낸다. 산출 근거의 새 필드는 NON_NULL이라 axis-v4 결과의 응답은 바뀌지 않는다.

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.

검토 범위: 전체 diff와 관련된 요청/응답 DTO, 콜백 검증·저장, 카테고리 정규화, DB 마이그레이션을 확인했습니다. 확인한 변경에서 구체적인 정확성, 보안, API 호환성 또는 데이터 일관성 문제는 찾지 못했습니다. GitHub Actions 테스트 검사는 현재 대기 중이며, 이 환경에서 테스트를 별도로 실행하지는 않았습니다.

@kimwuju
kimwuju merged commit 22dcf50 into main Oct 21, 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.

3 participants