[FEAT] 프로젝트 정보 상세조회시 팀원 이름 조회 로직 연결 - #594
Conversation
WalkthroughChanges팀 구성원 이름 조회
Estimated code review effort: 3 (Moderate) | ~20 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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.
🧹 Nitpick comments (2)
src/main/java/org/ject/support/domain/member/repository/MemberActivityQueryRepositoryImpl.java (1)
103-117: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
Collectors.groupingBy를 활용한 그룹화 방식 고려현재 구현은 직군별로 리스트를 순회하며 필터링(
filter)하고 있습니다. 팀 구성원 수가 적어 성능상 문제는 전혀 없지만, Java의Collectors.groupingBy를 활용하면 데이터를 한 번만 순회하여 그룹화할 수 있어 보다 선언적인 구현이 가능합니다.필수가 아닌 선택적인 리팩토링 제안이므로, 현재 구현이 더 가독성이 좋다고 판단되시면 그대로 유지하셔도 좋습니다.
💡 제안하는 단일 순회 리팩토링 코드
- return new TeamMemberNames( - findNamesByJobFamily(teamMembers, JobFamily.PM), - findNamesByJobFamily(teamMembers, JobFamily.PD), - findNamesByJobFamily(teamMembers, JobFamily.FE), - findNamesByJobFamily(teamMembers, JobFamily.BE) - ); - } - - // 조회 결과에서 지정 직군의 이름만 분리 - private List<String> findNamesByJobFamily(List<Tuple> teamMembers, JobFamily jobFamily) { - return teamMembers.stream() - .filter(teamMember -> jobFamily == teamMember.get(memberActivity.jobFamily)) - .map(teamMember -> teamMember.get(member.name)) - .toList(); + Map<JobFamily, List<String>> groupedNames = teamMembers.stream() + .collect(Collectors.groupingBy( + t -> t.get(memberActivity.jobFamily), + Collectors.mapping(t -> t.get(member.name), Collectors.toList()) + )); + + return new TeamMemberNames( + groupedNames.getOrDefault(JobFamily.PM, Collections.emptyList()), + groupedNames.getOrDefault(JobFamily.PD, Collections.emptyList()), + groupedNames.getOrDefault(JobFamily.FE, Collections.emptyList()), + groupedNames.getOrDefault(JobFamily.BE, Collections.emptyList()) + ); }🤖 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/org/ject/support/domain/member/repository/MemberActivityQueryRepositoryImpl.java` around lines 103 - 117, Optional: refactor the team-member aggregation around TeamMemberNames and findNamesByJobFamily to group teamMembers by memberActivity.jobFamily with Collectors.groupingBy in a single traversal, then populate each job-family list from that grouping while preserving the existing ordering and empty-list behavior. If the current filtering implementation is clearer, no change is required.src/main/java/org/ject/support/domain/project/service/ProjectService.java (1)
43-50: 📐 Maintainability & Code Quality | 🔵 Trivial팀원 정보 변경 시점의 프로젝트 캐시 무효화 확인
프로젝트 상세 응답 데이터(
ProjectDetailResponse)에 팀원 이름 목록이 새롭게 포함되었습니다. 기존에는 프로젝트 자체의 변경만 고려하면 되었으나, 이제는 구성원(MemberActivity,Member)의 이름 변경, 직군 변경, 삭제, 팀 합류 등 구성원 데이터가 변경될 때에도 이 메서드의 캐시(value = "project", key = "#projectId")가 무효화(evict)되어야 합니다.데이터 정합성을 위해 팀원 데이터를 조작하는 도메인 서비스(예:
MemberService,TeamService) 측에서 관련 캐시 초기화 로직이 누락 없이 설정되어 있는지 확인을 권장합니다.🤖 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/org/ject/support/domain/project/service/ProjectService.java` around lines 43 - 50, Ensure the "project" cache entries keyed by projectId are evicted whenever team-member data used by findProjectDetails changes, including member name or role updates, deletion, and team membership changes. Add or verify cache invalidation in the relevant member/team domain service methods, preserving the existing findProjectDetails cache configuration.
🤖 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.
Nitpick comments:
In
`@src/main/java/org/ject/support/domain/member/repository/MemberActivityQueryRepositoryImpl.java`:
- Around line 103-117: Optional: refactor the team-member aggregation around
TeamMemberNames and findNamesByJobFamily to group teamMembers by
memberActivity.jobFamily with Collectors.groupingBy in a single traversal, then
populate each job-family list from that grouping while preserving the existing
ordering and empty-list behavior. If the current filtering implementation is
clearer, no change is required.
In `@src/main/java/org/ject/support/domain/project/service/ProjectService.java`:
- Around line 43-50: Ensure the "project" cache entries keyed by projectId are
evicted whenever team-member data used by findProjectDetails changes, including
member name or role updates, deletion, and team membership changes. Add or
verify cache invalidation in the relevant member/team domain service methods,
preserving the existing findProjectDetails cache configuration.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: a84037c0-3aa1-4de8-80a8-151f254b3654
📒 Files selected for processing (5)
src/main/java/org/ject/support/domain/member/repository/MemberActivityQueryRepository.javasrc/main/java/org/ject/support/domain/member/repository/MemberActivityQueryRepositoryImpl.javasrc/main/java/org/ject/support/domain/project/service/ProjectService.javasrc/test/java/org/ject/support/domain/member/repository/MemberActivityRepositoryTest.javasrc/test/java/org/ject/support/domain/project/service/ProjectServiceTest.java
Test Results416 tests 416 ✅ 13s ⏱️ Results for commit 9e2abc5. |
📊테스트 커버리지
|
#️⃣연관된 이슈
close #591
📝 작업 내용
project.team_id → member_semester → member_activity → member경로로 팀원 이름을 조회하도록 연결했습니다.member_activity.job_family을 기준으로 PM, PD, FE, BE 이름을 기존TeamMemberNames응답 형식에 맞게 분류했습니다.검증
./gradlew test전체 통과GET /projects/1응답의 팀원 이름 일치 확인🙏 리뷰 요구사항 (선택)
SEMESTER유형과 삭제 여부만 적용했습니다. 이 조회 기준을 확인 부탁드립니다.Summary by CodeRabbit
개선 사항
테스트