Feature/#91 스터디 상세 조회 필드 추가 - #91
Conversation
📝 WalkthroughWalkthrough스터디 상세 응답에 시작일과 참여자 이름 목록을 추가했습니다. 서비스는 스터디 ID로 참여자를 조회하고, 변환기는 해당 데이터를 Changes스터디 상세 응답
Estimated code review effort: 2 (Simple) | ~10 minutes Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 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/stology/be/domain/study/repository/MemberStudyRepository.java`:
- Around line 75-76: StudyService의 참여자 이름 조회 흐름에서 MemberStudy 엔티티의 지연 로딩으로 발생하는
N+1 조회를 제거하세요. 해당 흐름은 MemberStudyRepository의 findByStudyId 대신 기존
findMemberNamesByStudyId를 사용해 이름을 한 번에 조회하도록 변경하고, findByStudyId에 다른 사용처가 없다면 해당
메서드와 불필요한 관련 코드를 제거하세요.
In `@src/main/java/com/stology/be/domain/study/service/StudyService.java`:
- Around line 274-278: getStudyDetail에서 참여자 이름을 조회하기 전에
MemberStudyRepository.existsByStudyIdAndMemberId(studyId, member.getId())로 현재
사용자의 참여 여부를 확인하세요. 참여하지 않은 요청은 거부하고, 참여가 확인된 경우에만 기존 members 조회와
StudyConverter.toGetStudyDetail 호출을 수행하도록 수정하세요.
🪄 Autofix
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: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 9be3f023-3423-4bae-8b56-d3b5f171a8a5
📒 Files selected for processing (4)
src/main/java/com/stology/be/domain/study/converter/StudyConverter.javasrc/main/java/com/stology/be/domain/study/dto/StudyResDTO.javasrc/main/java/com/stology/be/domain/study/repository/MemberStudyRepository.javasrc/main/java/com/stology/be/domain/study/service/StudyService.java
|
|
||
| List<MemberStudy> findByStudyId(Long studyId); |
There was a problem hiding this comment.
🚀 Performance & Scalability | 🟠 Major | ⚡ Quick win
findByStudyId로 인한 N+1 조회를 제거하세요.
MemberStudy.member는 FetchType.LAZY입니다. StudyService.java Lines 274-277은 각 MemberStudy에서 getMember().getName()을 호출하므로 참여자마다 Member 조회가 추가될 수 있습니다. 같은 리포지토리의 findMemberNamesByStudyId Lines 73-74는 member.name을 한 번에 조회합니다. 서비스에서 기존 메서드를 사용하세요. 다른 사용처가 없다면 새 메서드도 제거하세요.
제안하는 변경
- List<String> members = memberStudyRepository.findByStudyId(study.getId())
- .stream()
- .map(memberStudy -> memberStudy.getMember().getName())
- .toList();
+ List<String> members =
+ memberStudyRepository.findMemberNamesByStudyId(study.getId());🤖 Prompt for 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.
In
`@src/main/java/com/stology/be/domain/study/repository/MemberStudyRepository.java`
around lines 75 - 76, StudyService의 참여자 이름 조회 흐름에서 MemberStudy 엔티티의 지연 로딩으로 발생하는
N+1 조회를 제거하세요. 해당 흐름은 MemberStudyRepository의 findByStudyId 대신 기존
findMemberNamesByStudyId를 사용해 이름을 한 번에 조회하도록 변경하고, findByStudyId에 다른 사용처가 없다면 해당
메서드와 불필요한 관련 코드를 제거하세요.
| List<String> members = memberStudyRepository.findByStudyId(study.getId()) | ||
| .stream() | ||
| .map(memberStudy -> memberStudy.getMember().getName()) | ||
| .toList(); | ||
| return StudyConverter.toGetStudyDetail(study, currentWeek, isLeader, members); |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
# 상세 조회의 인증 및 참여 권한 검사를 확인합니다.
rg -n -C 6 \
'getStudyDetail|existsByStudyIdAndMemberId|`@PreAuthorize`|requestMatchers|authenticated' \
--glob '*.{java,yml,yaml}' .Repository: Stology/BE
Length of output: 9855
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' '--- StudyService ---'
sed -n '1,90p;265,285p' src/main/java/com/stology/be/domain/study/service/StudyService.java
printf '%s\n' '--- StudyController ---'
sed -n '1,45p;132,141p' src/main/java/com/stology/be/domain/study/controller/StudyController.java
printf '%s\n' '--- SecurityConfig ---'
sed -n '35,55p' src/main/java/com/stology/be/global/security/config/SecurityConfig.java
printf '%s\n' '--- Study detail authorization references ---'
rg -n -C 3 'requireStudyMember|getStudyDetail|STUDY_MEMBER_FORBIDDEN' src/main/java src/test || true
printf '%s\n' '--- Static behavior probe ---'
python3 - <<'PY'
from pathlib import Path
service = Path("src/main/java/com/stology/be/domain/study/service/StudyService.java").read_text()
method = service[service.index("public StudyResDTO.GetStudyDetail getStudyDetail"):
service.index("\n }", service.index("public StudyResDTO.GetStudyDetail getStudyDetail")) + 6]
print("detail_method_calls_membership_check=" +
str("existsByStudyIdAndMemberId" in method or "requireStudyMember" in method))
print("detail_method_returns_member_names=" +
str("getMember().getName()" in method))
print("detail_method_uses_member_for_leader_only=" +
str("member.getId()" in method and "existsByStudyIdAndMemberId" not in method))
PYRepository: Stology/BE
Length of output: 15834
스터디 참여 권한을 확인하세요.
SecurityConfig는 인증만 요구하고 getStudyDetail은 참여 여부를 확인하지 않습니다. 인증된 비참여 사용자가 studyId를 변경하여 다른 스터디의 참여자 이름을 조회할 수 있습니다. MemberStudyRepository.existsByStudyIdAndMemberId(studyId, member.getId()) 검사 후 비참여 요청을 거부하세요.
🤖 Prompt for 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.
In `@src/main/java/com/stology/be/domain/study/service/StudyService.java` around
lines 274 - 278, getStudyDetail에서 참여자 이름을 조회하기 전에
MemberStudyRepository.existsByStudyIdAndMemberId(studyId, member.getId())로 현재
사용자의 참여 여부를 확인하세요. 참여하지 않은 요청은 거부하고, 참여가 확인된 경우에만 기존 members 조회와
StudyConverter.toGetStudyDetail 호출을 수행하도록 수정하세요.
스터디 상세 조회에 반환 필드 추가
Summary by CodeRabbit