Skip to content

[✨Feat] 최초 첨삭 성공 결과 ReviewVersion 저장 구현 #42

Description

@yong203

목표

최초 AI 첨삭의 성공 결과를 하나의 ReviewVersion과 문항별 ReviewVersionQuestionResult로 저장하고, 자기소개서와 LLM Job의 완료 상태를 원자적으로 반영한다.

이 완료 경계는 후속 OpenAI client와 비동기 worker가 호출한다.

작업 범위

  • 관련 요구사항/API:

    • REQ-005
    • REQ-006
    • API-015 resultRef
    • API-017, API-018 선행 persistence
  • 포함할 것:

    • ReviewVersion JPA entity/repository 구현
    • ReviewVersionQuestionResult JPA entity/repository 구현
    • 최초 첨삭 성공 결과 저장 service 구현
    • provider 결과 입력 모델: questionId, aiReport, rewrittenAnswer
    • 저장된 자기소개서 문항과 provider 결과의 1:1 매칭 검증
    • 질문, 순서, 최대 글자 수, 원본 답변 snapshot 저장
    • Unicode code point 기준 답변 길이 저장
    • finalAnswer 초기값을 rewrittenAnswer와 동일하게 저장
    • 최초 버전 label을 v0.1, requestInstruction을 null로 저장
    • CoverLetter.status=REVIEWEDlatestReviewVersionId 갱신
    • LLM Job을 COMPLETED로 전환하고 resultRef=REVIEW_VERSION 기록
    • 같은 완료 Job 재처리 시 기존 ReviewVersion을 반환해 중복 저장 방지
    • entity/repository/service 테스트
    • docs/status.md 진행 상태와 검증 근거 갱신
  • 제외할 것:

    • 실제 OpenAI/Spring AI 호출
    • 프롬프트와 구조화 응답 파싱
    • background worker와 비동기 실행
    • API-016 SSE
    • API-017/018 조회 endpoint
    • 재첨삭과 버전 증가
    • 최종 작성본 수정 API
    • LLM 실패와 자동 재시도 처리

완료 기준

  • 성공 결과를 저장하면 v0.1 ReviewVersion이 하나 생성된다.
  • 모든 자기소개서 문항에 ReviewVersionQuestionResult가 정확히 하나씩 생성된다.
  • 원본 문항 정보와 글자 수가 snapshot으로 저장된다.
  • finalAnswer가 최초 AI 수정본으로 초기화된다.
  • CoverLetter가 REVIEWED가 되고 최신 버전 ID가 기록된다.
  • Job이 COMPLETED가 되고 ReviewVersion resultRef가 기록된다.
  • 문항 결과가 누락·중복되거나 알 수 없는 questionId가 포함되면 아무 상태도 부분 저장되지 않는다.
  • blank 결과나 최대 글자 수를 초과한 수정본은 저장되지 않는다.
  • 같은 완료 Job을 다시 처리해도 새 ReviewVersion이 생성되지 않는다.
  • git diff --check, ./gradlew test, ./gradlew check가 통과한다.

참고

Metadata

Metadata

Assignees

Labels

✨ Feature새로운 기능 구현

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions