Skip to content

[REFACTOR] AI 멘토 대화 내역 조회 N+1 쿼리 개선 - #164

Merged
ownue merged 1 commit into
developfrom
refactor/#105-mentor-history
Aug 7, 2026
Merged

[REFACTOR] AI 멘토 대화 내역 조회 N+1 쿼리 개선#164
ownue merged 1 commit into
developfrom
refactor/#105-mentor-history

Conversation

@ownue

@ownue ownue commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

📍 개요

AI 멘토 대화 내역 조회(GET /api/analyses/{analysisId}/mentor/messages) 시 발생하던 N+1 쿼리 문제 리팩토링

⛓️‍💥 관련 이슈


🛠️ 작업 내용

  • AnalysisRepositoryfindUserIdById 프로젝션 쿼리 추가
  • MentorService.getMessageHistory()에서 findById + User lazy loading 대신 findUserIdById로 소유자 검증을 단일 쿼리로 처리
  • 관련 단위 테스트(MentorServiceTest) 갱신

🔥 리뷰 요청 사항

리뷰어가 중점적으로 확인해주었으면 하는 내용을 작성해주세요.

  • 리뷰에서 제안된 existsByIdAndUser_UserId 대신 findUserIdById로 owner id를 조회해 비교하는 방식으로 수정했는데, 이 방식이 적절한지

✅ 체크리스트

  • 코드 컨벤션을 준수했습니다.
  • 불필요한 코드 및 import를 제거했습니다.
  • 예외 처리를 적용했습니다.
  • 테스트를 완료했습니다.
  • 관련 Issue를 연결했습니다.

📎 참고 사항

X

Summary by CodeRabbit

  • 기능 개선

    • 분석 ID로 소유자 정보를 확인하도록 개선해 멘토 메시지 이력 조회의 소유권 검증을 간소화했습니다.
    • 분석이 존재하지 않거나 다른 사용자가 접근하는 경우의 오류 처리를 유지했습니다.
  • 버그 수정

    • 빈 세션 및 손상된 판단 근거 데이터에 대한 처리 동작을 검증하고 안정성을 높였습니다.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 338642f9-1a28-4e1f-9bc9-2b02eda09d3a

📥 Commits

Reviewing files that changed from the base of the PR and between ab6beaa and a39d95a.

📒 Files selected for processing (3)
  • src/main/java/com/mr/domain/analysis/repository/AnalysisRepository.java
  • src/main/java/com/mr/domain/mentor/service/MentorService.java
  • src/test/java/com/mr/domain/mentor/service/MentorServiceTest.java

📝 Walkthrough

Walkthrough

분석 엔티티 전체 조회를 제거하고, 분석 ID로 소유자 ID만 조회하여 멘토 대화 이력의 소유권을 검증하도록 변경했습니다. 관련 테스트도 새 저장소 조회 흐름을 사용합니다.

Changes

멘토 대화 이력 소유권 조회

Layer / File(s) Summary
소유자 ID 조회 계약
src/main/java/com/mr/domain/analysis/repository/AnalysisRepository.java
findUserIdById가 분석 ID로 소유자 ID를 조회하고, 결과를 Optional<Long>으로 반환합니다.
멘토 서비스 소유권 검증 전환
src/main/java/com/mr/domain/mentor/service/MentorService.java, src/test/java/com/mr/domain/mentor/service/MentorServiceTest.java
멘토 서비스가 분석 엔티티 대신 소유자 ID를 검증합니다. 분석 미존재 오류와 접근 거부 오류는 유지됩니다. 테스트는 성공, 빈 세션, 권한 거부, 분석 미존재, 손상된 JSON 흐름을 검증합니다.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

  • Musereview/BE#44: AnalysisRepository의 분석 소유자 조회 흐름과 직접 연결됩니다.
  • Musereview/BE#57: 분석 엔티티 대신 소유자 ID를 조회하고 검증하는 변경과 관련됩니다.
  • Musereview/BE#97: MentorServiceMentorServiceTest의 동일한 소유권 검증 흐름을 수정합니다.

Poem

분석은 가볍게, ID만 쏙
소유권 검증은 더 빠르게 톡
목 객체는 떠나고
테스트는 흐름을 따라가네
멘토 기록도 깔끔하게 착!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 AI 멘토 대화 내역 조회의 N+1 쿼리 개선이라는 주요 변경 사항을 정확하고 간결하게 설명합니다.
Linked Issues check ✅ Passed [105]의 AI 멘토 대화 내역 조회 리팩토링 및 N+1 성능 개선 목표를 저장소 프로젝션 쿼리와 서비스 변경으로 충족합니다.
Out of Scope Changes check ✅ Passed 모든 변경 사항이 N+1 쿼리 개선, 소유권 조회 방식 변경, 관련 테스트 갱신 범위에 포함됩니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/#105-mentor-history

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@on1yoneprivate on1yoneprivate left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

수고하셨습니다~

@rkdehdrbs7885-oss rkdehdrbs7885-oss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

만약 existsByIdAndUser_UserId(analysisId, userId)를 사용했다면 반환값이 true/false뿐이라서, false가 나왔을 때 이게 "해당 분석 데이터가 아예 존재하지 않아서(404)"인지, 아니면 "분석 데이터는 있는데 다른 유저의 것이라서(403)"인지 서버 입장에서 원인을 특정할 수 없습니다.

하지만 지금 작성해주신 findUserIdById 방식을 사용하면 데이터가 없으면 Optional.empty()가 반환되어 ANALYSIS_NOT_FOUND 예외를 정확히 던질 수 있고, 데이터는 있지만 주인이 다르면 MENTOR_ACCESS_DENIED 예외를 던질 수 있습니다.

수고하셨습니다!

@ownue
ownue merged commit 9a76aba into develop Aug 7, 2026
2 checks passed
@kimyw1018
kimyw1018 deleted the refactor/#105-mentor-history branch August 9, 2026 12:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

♻️ Refactor - AI 멘토 대화 내역 조회 리팩토링

3 participants