Skip to content

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

Merged
yong203 merged 1 commit into
devfrom
feat/#42
Jun 22, 2026
Merged

[✨Feat] 최초 첨삭 성공 결과 ReviewVersion 저장 구현#43
yong203 merged 1 commit into
devfrom
feat/#42

Conversation

@yong203

@yong203 yong203 commented Jun 22, 2026

Copy link
Copy Markdown
Member

작업 내용

  • 최초 첨삭 성공 결과를 ReviewVersion과 문항별 ReviewVersionQuestionResult로 저장합니다.
  • 문항 원본 정보와 Unicode code point 기준 길이를 snapshot으로 보존합니다.
  • AI 수정본을 최초 finalAnswer로 초기화합니다.
  • CoverLetter를 REVIEWED로 전환하고 최신 ReviewVersion ID를 기록합니다.
  • LLM Job을 COMPLETED로 전환하고 REVIEW_VERSION resultRef를 기록합니다.
  • 결과 검증, 트랜잭션 rollback, 완료 Job 멱등성을 테스트합니다.

관련 이슈

문서 반영

  • 반영한 문서:
    • docs/status.md
  • API endpoint 계약 변경 없음.

확인 결과

  • ./gradlew test
  • ./gradlew check
  • git diff --check

Summary by CodeRabbit

릴리스 노트

  • New Features

    • 자기소개서 첨삭 완료 후 버전별로 문항 결과를 저장하고 조회할 수 있는 기능이 추가되었습니다.
  • Documentation

    • 기능 로드맵을 업데이트하여 첨삭 기능(REQ-005, REQ-006)의 진행 상황 및 검증 내용을 반영했습니다.
  • Tests

    • 첨삭 버전 저장 및 조회 기능에 대한 테스트를 추가했습니다.

@yong203 yong203 linked an issue Jun 22, 2026 that may be closed by this pull request
10 tasks
@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 649f88f0-af24-4c1c-beca-06c52759444a

📥 Commits

Reviewing files that changed from the base of the PR and between 40db14a and 98a6c89.

📒 Files selected for processing (14)
  • docs/status.md
  • src/main/java/com/daon/rewrite/coverletter/entity/CoverLetter.java
  • src/main/java/com/daon/rewrite/coverletter/repository/CoverLetterRepository.java
  • src/main/java/com/daon/rewrite/llmjob/entity/LlmJob.java
  • src/main/java/com/daon/rewrite/llmjob/repository/LlmJobRepository.java
  • src/main/java/com/daon/rewrite/reviewversion/entity/ReviewVersion.java
  • src/main/java/com/daon/rewrite/reviewversion/entity/ReviewVersionQuestionResult.java
  • src/main/java/com/daon/rewrite/reviewversion/repository/ReviewVersionQuestionResultRepository.java
  • src/main/java/com/daon/rewrite/reviewversion/repository/ReviewVersionRepository.java
  • src/main/java/com/daon/rewrite/reviewversion/service/CompleteFirstReviewResult.java
  • src/main/java/com/daon/rewrite/reviewversion/service/ReviewQuestionResultInput.java
  • src/main/java/com/daon/rewrite/reviewversion/service/ReviewVersionService.java
  • src/test/java/com/daon/rewrite/reviewversion/repository/ReviewVersionRepositoryTest.java
  • src/test/java/com/daon/rewrite/reviewversion/service/ReviewVersionServiceTest.java

📝 Walkthrough

Walkthrough

ReviewVersion·ReviewVersionQuestionResult JPA 엔티티와 리포지토리를 신규 추가하고, ReviewVersionService.completeFirstReview를 구현해 최초 AI 첨삭 결과를 원자적으로 저장한다. CoverLetter·LlmJob에 상태 전환 메서드를 추가하고, 비관적 락 리포지토리 쿼리를 조정했다.

Changes

최초 첨삭 결과 ReviewVersion 저장 흐름

Layer / File(s) Summary
CoverLetter·LlmJob 도메인 상태 전환 및 락 리포지토리 확장
src/main/java/com/daon/rewrite/coverletter/entity/CoverLetter.java, src/main/java/com/daon/rewrite/coverletter/repository/CoverLetterRepository.java, src/main/java/com/daon/rewrite/llmjob/entity/LlmJob.java, src/main/java/com/daon/rewrite/llmjob/repository/LlmJobRepository.java
CoverLettercompleteReview(reviewVersionId, now) 메서드를, LlmJobstartProcessing(progressMessage) 메서드를 추가한다. CoverLetterRepository의 비관적 락 조회 메서드를 ownerId 조건 없이 id만으로 조회하는 findActiveByIdForUpdate로 교체하고, LlmJobRepositoryfindByIdForUpdate를 추가한다.
ReviewVersion·ReviewVersionQuestionResult 엔티티 및 리포지토리
src/main/java/com/daon/rewrite/reviewversion/entity/ReviewVersion.java, src/main/java/com/daon/rewrite/reviewversion/entity/ReviewVersionQuestionResult.java, src/main/java/com/daon/rewrite/reviewversion/repository/ReviewVersionRepository.java, src/main/java/com/daon/rewrite/reviewversion/repository/ReviewVersionQuestionResultRepository.java
review_versions·review_version_question_results 테이블에 매핑되는 JPA 엔티티를 추가한다. ReviewVersionv0.1 고정 팩토리를 제공하고, ReviewVersionQuestionResult는 코드포인트 기반 길이 계산과 finalAnswer=rewrittenAnswer 초기화 로직을 포함한다. 각 엔티티에 대한 JpaRepository 인터페이스도 추가된다.
서비스 입출력 계약 및 ReviewVersionService 구현
src/main/java/com/daon/rewrite/reviewversion/service/ReviewQuestionResultInput.java, src/main/java/com/daon/rewrite/reviewversion/service/CompleteFirstReviewResult.java, src/main/java/com/daon/rewrite/reviewversion/service/ReviewVersionService.java
ReviewQuestionResultInput 입력 레코드와 CompleteFirstReviewResult 출력 레코드를 추가한다. ReviewVersionService.completeFirstReviewLlmJob·CoverLetter를 비관적 락으로 조회해 상태를 검증하고, 질문-입력 1:1 매칭·코드포인트 길이 제약 검증 후 ReviewVersion/ReviewVersionQuestionResult를 저장하며 CoverLetter·LlmJob 완료 상태를 반영한다. COMPLETED Job 재처리 시 기존 결과를 반환한다.
리포지토리·서비스 테스트
src/test/java/com/daon/rewrite/reviewversion/repository/ReviewVersionRepositoryTest.java, src/test/java/com/daon/rewrite/reviewversion/service/ReviewVersionServiceTest.java
ReviewVersionRepositoryTest에서 저장 후 flush/clear 재조회로 필드 라운드트립을 검증한다. ReviewVersionServiceTest에서 성공 케이스의 상태 전파, 잘못된 질문 매핑·공백·길이 초과 거부, 중복 완료 Job 재처리 시 기존 버전 반환, PROCESSING이 아닌 Job 거부를 검증한다.
docs/status.md 진행 상태 갱신
docs/status.md
REQ-005 검증 근거와 완료 경계 메모를 확장하고, REQ-006 상태를 PlannedIn Progress로 변경하며, Next Issue Slice Candidates를 OpenAI 첨삭 client 및 비동기 worker 후보로 교체한다.

Possibly related PRs

  • Rewrite-Team/Rewrite-BE#37: CoverLetterQuestion 저장 PR로, 본 PR의 ReviewVersionQuestionResult가 해당 엔티티와 1:1 매칭 저장 로직을 직접 참조한다.
  • Rewrite-Team/Rewrite-BE#39: LlmJob 엔티티·리포지토리 스켈레톤을 구성한 PR로, 본 PR이 동일 클래스에 startProcessing 메서드와 findByIdForUpdate 리포지토리 메서드를 추가해 코드 레벨에서 직접 연결된다.
  • Rewrite-Team/Rewrite-BE#31: CoverLetterRepositorydeletedAt is null + ownerId 기반 활성 레코드 조회 메서드를 추가한 PR로, 본 PR이 동일 리포지토리의 비관적 락 조회 시그니처에서 ownerId 조건을 제거하는 변경을 가해 직접적으로 연결된다.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 최초 첨삭 성공 결과의 ReviewVersion 저장 구현이라는 핵심 변경사항을 명확하고 구체적으로 설명합니다.
Description check ✅ Passed PR 설명이 필수 섹션(작업 내용, 관련 이슈, 문서 반영, 확인 결과)을 모두 포함하며 충분히 작성되었습니다.
Linked Issues check ✅ Passed ReviewVersion/ReviewVersionQuestionResult 엔티티, 저장 서비스, 트랜잭션 무결성, 멱등성 처리 등 모든 주요 요구사항이 구현되었습니다.
Out of Scope Changes check ✅ Passed docs/status.md 진행상황 업데이트, 엔티티/리포지토리/서비스 구현, 테스트 추가만 포함되며 모두 제시된 범위 내입니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@yong203 yong203 self-assigned this Jun 22, 2026
@yong203 yong203 added the ✨ Feature 새로운 기능 구현 label Jun 22, 2026
@yong203 yong203 marked this pull request as ready for review June 22, 2026 12:40
@codecov

codecov Bot commented Jun 22, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 84.54545% with 17 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...te/reviewversion/service/ReviewVersionService.java 79.16% 5 Missing and 10 partials ⚠️
...in/java/com/daon/rewrite/llmjob/entity/LlmJob.java 60.00% 1 Missing and 1 partial ⚠️

📢 Thoughts on this report? Let us know!

@yong203 yong203 merged commit f3b4d75 into dev Jun 22, 2026
3 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 새로운 기능 구현

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

1 participant