Skip to content

[✨Feat] OpenAI 최초 첨삭 client 구현#45

Merged
yong203 merged 1 commit into
devfrom
feat/#44
Jun 24, 2026
Merged

[✨Feat] OpenAI 최초 첨삭 client 구현#45
yong203 merged 1 commit into
devfrom
feat/#44

Conversation

@yong203

@yong203 yong203 commented Jun 24, 2026

Copy link
Copy Markdown
Member

작업 내용

  • provider-neutral FirstReviewClient와 Spring AI 기반 구현체를 추가합니다.
  • 자기소개서 전체를 한 번 요청하고 문항별 첨삭 결과를 구조화 응답으로 변환합니다.
  • STAR, 구체성, 직무 적합성, 글자 수와 사실 임의 생성 금지 기준을 prompt에 반영합니다.
  • 문항 누락·중복·알 수 없는 ID, blank, 글자 수 초과 응답을 검증합니다.
  • provider 오류와 출력 검증 오류를 client 예외로 구분합니다.
  • worker가 재시도를 관리하도록 Spring AI 내부 재시도를 비활성화합니다.

관련 이슈

문서 반영

  • 반영한 문서:
    • docs/status.md

확인 결과

  • ./gradlew test
  • ./gradlew check
  • git diff --check
  • 실제 OpenAI 네트워크 호출 없이 테스트용 ChatModel로 검증

Summary by CodeRabbit

  • 새 기능

    • 자기소개서 1차 첨삭 결과를 생성하고, 문항별 수정안과 AI 피드백을 함께 확인할 수 있게 되었습니다.
    • 요청 문항 순서에 맞춰 결과를 반환하고, 입력 내용이 더 안전하게 처리되도록 개선되었습니다.
  • 버그 수정

    • 결과 형식이 맞지 않거나 누락된 경우, 더 명확하게 실패 처리되도록 개선되었습니다.
    • AI 응답의 글자 수 초과, 중복/불일치 문항 등 잘못된 결과를 걸러내도록 강화되었습니다.

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

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

FirstReviewClient 인터페이스, 요청/응답/예외 데이터 모델(FirstReviewQuestion, FirstReviewRequest, FirstReviewResult, FirstReviewClientException)을 신규 정의하고, Spring AI ChatClient 기반의 OpenAiFirstReviewClient 구현체와 응답 검증 로직을 추가했다. Spring AI 재시도를 비활성화하는 설정과 네트워크 없이 동작하는 단위 테스트가 함께 포함되며, docs/status.md 로드맵도 갱신됐다.

Changes

OpenAI 최초 첨삭 Client 구현

Layer / File(s) Summary
요청·응답·예외 데이터 모델 및 인터페이스
src/main/java/com/daon/rewrite/reviewversion/client/FirstReviewClient.java, src/main/java/com/daon/rewrite/reviewversion/client/FirstReviewQuestion.java, src/main/java/com/daon/rewrite/reviewversion/client/FirstReviewRequest.java, src/main/java/com/daon/rewrite/reviewversion/client/FirstReviewResult.java, src/main/java/com/daon/rewrite/reviewversion/client/OpenAiFirstReviewResponse.java, src/main/java/com/daon/rewrite/reviewversion/client/FirstReviewClientException.java
FirstReviewClient 인터페이스와 FirstReviewQuestion/FirstReviewRequest/FirstReviewResult 레코드, OpenAiFirstReviewResponse 래퍼, FirstReviewClientException(Reason 열거형·정적 팩토리 3종 포함)을 신규 정의. FirstReviewRequest의 canonical 생성자에서 questionsList.copyOf로 방어적 복사.
OpenAiFirstReviewClient 구현 및 응답 검증
src/main/java/com/daon/rewrite/reviewversion/client/OpenAiFirstReviewClient.java
SYSTEM_PROMPT 상수와 ChatClient.Builder 기반 생성자를 추가. review()에서 요청을 JSON으로 직렬화해 사용자 프롬프트를 구성하고 OpenAI를 호출. validateAndNormalize()에서 null/결과 수 불일치/questionId 누락·중복·불일치/필드 공백/최대 글자 수 초과를 검증하며 실패 시 FirstReviewClientException을 던지고, 통과 시 문항 순서로 정렬된 결과를 반환.
Spring AI 재시도 설정
src/main/resources/application.yaml, src/test/resources/application-test.yaml
spring.ai.retry.max-attempts: 1 설정을 운영 및 테스트 설정 파일에 각각 추가해 provider 내부 자동 재시도를 비활성화.
OpenAiFirstReviewClientTest 단위 테스트
src/test/java/com/daon/rewrite/reviewversion/client/OpenAiFirstReviewClientTest.java
CapturingChatModel(내부 ChatModel 구현)으로 실제 네트워크 없이 정상 순서 반환, 누락/중복/알 수 없는 questionId 거부, 공백·최대 글자 수 초과 거부, malformed JSON의 OUTPUT_VALIDATION_FAILED 분류, provider 예외 래핑 및 cause 보존을 각각 검증하는 5개 테스트와 헬퍼 메서드를 추가.
docs/status.md 로드맵 갱신
docs/status.md
REQ-005/REQ-006 행의 Issue/PR 링크 및 완료 경계·후속 범위 서술을 갱신. Next Issue Slice Candidates에서 "OpenAI 최초 첨삭 client" 항목을 제거하고 "최초 첨삭 비동기 worker" 항목으로 교체.

Possibly related issues

🚥 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 제목이 OpenAI 최초 첨삭 클라이언트 구현이라는 핵심 변경을 간결하게 잘 요약합니다.
Description check ✅ Passed 템플릿의 작업 내용, 관련 이슈, 문서 반영, 확인 결과를 대부분 충족하며 필요한 정보도 포함합니다.
Linked Issues check ✅ Passed 요구된 인터페이스, OpenAI 구현, 요청/응답 모델, 검증, 예외 처리, retry 비활성화와 테스트 조건을 모두 충족합니다.
Out of Scope Changes check ✅ Passed 변경 사항은 문서 갱신과 Spring AI 설정 조정 등 목표 범위 내에 있으며, 뚜렷한 무관한 변경은 보이지 않습니다.

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


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

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

codecov Bot commented Jun 24, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 90.62500% with 6 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
.../reviewversion/client/OpenAiFirstReviewClient.java 87.50% 2 Missing and 4 partials ⚠️

📢 Thoughts on this report? Let us know!

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@src/main/java/com/daon/rewrite/reviewversion/client/OpenAiFirstReviewClient.java`:
- Around line 42-60: The request serialization in OpenAiFirstReviewClient is
being caught by the same try/catch as model invocation, so failures from
buildUserPrompt(request) and JSON_MAPPER.writeValueAsString(request) are
misclassified as OUTPUT_VALIDATION_FAILED. Move the
prompt-building/serialization step outside the
chatClient.prompt().system(...).user(...).call() try block, or catch
serialization separately in buildUserPrompt, so only response parsing from
entity(OpenAiFirstReviewResponse.class) maps to output validation while request
serialization is handled as a distinct provider/request error.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1f77ec49-7eda-4dcf-b674-5b3ab8a69286

📥 Commits

Reviewing files that changed from the base of the PR and between f3b4d75 and 80bbe8f.

📒 Files selected for processing (11)
  • docs/status.md
  • src/main/java/com/daon/rewrite/reviewversion/client/FirstReviewClient.java
  • src/main/java/com/daon/rewrite/reviewversion/client/FirstReviewClientException.java
  • src/main/java/com/daon/rewrite/reviewversion/client/FirstReviewQuestion.java
  • src/main/java/com/daon/rewrite/reviewversion/client/FirstReviewRequest.java
  • src/main/java/com/daon/rewrite/reviewversion/client/FirstReviewResult.java
  • src/main/java/com/daon/rewrite/reviewversion/client/OpenAiFirstReviewClient.java
  • src/main/java/com/daon/rewrite/reviewversion/client/OpenAiFirstReviewResponse.java
  • src/main/resources/application.yaml
  • src/test/java/com/daon/rewrite/reviewversion/client/OpenAiFirstReviewClientTest.java
  • src/test/resources/application-test.yaml

@yong203 yong203 merged commit 96cdb67 into dev Jun 24, 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] OpenAI 최초 첨삭 client 구현

1 participant