Skip to content

[FEAT] 프로젝트 정보 상세조회시 팀원 이름 조회 로직 연결 - #594

Merged
kangkings merged 1 commit into
devfrom
codex/feat-591-project-team-member-names
Jul 14, 2026
Merged

[FEAT] 프로젝트 정보 상세조회시 팀원 이름 조회 로직 연결#594
kangkings merged 1 commit into
devfrom
codex/feat-591-project-team-member-names

Conversation

@kangkings

@kangkings kangkings commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

#️⃣연관된 이슈

close #591

📝 작업 내용

  • 프로젝트 상세 조회 시 project.team_id → member_semester → member_activity → member 경로로 팀원 이름을 조회하도록 연결했습니다.
  • member_activity.job_family을 기준으로 PM, PD, FE, BE 이름을 기존 TeamMemberNames 응답 형식에 맞게 분류했습니다.
  • 다른 팀과 삭제된 Member/MemberActivity를 제외하고, 구성원이 없는 팀은 직군별 빈 목록을 반환하도록 처리했습니다.
  • Repository 및 Service 테스트를 추가했습니다.

검증

  • ./gradlew test 전체 통과
  • JaCoCo 커버리지 검증 통과
  • 로컬 DB의 프로젝트 1번(HowMeet) 조회 결과와 GET /projects/1 응답의 팀원 이름 일치 확인

🙏 리뷰 요구사항 (선택)

  • 활동 상태는 과거 프로젝트의 완료 구성원도 노출해야 하므로 필터링하지 않고, SEMESTER 유형과 삭제 여부만 적용했습니다. 이 조회 기준을 확인 부탁드립니다.

Summary by CodeRabbit

  • 개선 사항

    • 프로젝트 상세 정보에서 팀 구성원의 이름을 직군별로 표시합니다.
    • PM, PD, 프론트엔드, 백엔드 구성원을 정확히 구분해 제공합니다.
    • 구성원이 없거나 삭제된 구성원·활동은 결과에서 제외됩니다.
  • 테스트

    • 직군별 구성원 조회, 빈 팀, 삭제 데이터 제외 시나리오를 검증했습니다.

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

Changes

팀 구성원 이름 조회

Layer / File(s) Summary
직군별 구성원 이름 조회
src/main/java/org/ject/support/domain/member/repository/*, src/test/java/org/ject/support/domain/member/repository/MemberActivityRepositoryTest.java
팀 ID를 기준으로 학기 구성원의 이름과 직군을 조회하고 PM/PD/FE/BE별 이름 목록으로 반환하는 저장소 메서드와 테스트를 추가했다.
프로젝트 상세 응답 연동
src/main/java/org/ject/support/domain/project/service/ProjectService.java, src/test/java/org/ject/support/domain/project/service/ProjectServiceTest.java
프로젝트 상세 조회가 저장소에서 조회한 TeamMemberNames를 사용하도록 변경하고 관련 서비스 테스트를 갱신했다.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Poem

당근 들고 토끼가 깡충,
이름들을 직군별로 착착.
프로젝트에 담아 주니
빈 목록은 이제 안녕,
깡총! 테스트도 함께 춤춘다.

🚥 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 제목이 프로젝트 상세조회에 팀원 이름 조회 로직을 연결한 핵심 변경을 간결하게 잘 요약합니다.
Linked Issues check ✅ Passed 프로젝트 상세조회에 팀원 이름 조회를 연결하고 직군 분류, 삭제/타팀 제외, 빈 목록 반환까지 요구사항을 충족합니다.
Out of Scope Changes check ✅ Passed 변경은 저장소/서비스 연결과 관련 테스트 추가에 국한되어 있어 요구사항 밖의 기능 변경은 보이지 않습니다.
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 codex/feat-591-project-team-member-names

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.

@kangkings
kangkings requested a review from 023-dev July 14, 2026 12:19
@kangkings kangkings self-assigned this Jul 14, 2026
@kangkings kangkings added the 👨🏻‍💻backend 백엔드 작업 label Jul 14, 2026

@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.

🧹 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

📥 Commits

Reviewing files that changed from the base of the PR and between d18a7e2 and 9e2abc5.

📒 Files selected for processing (5)
  • src/main/java/org/ject/support/domain/member/repository/MemberActivityQueryRepository.java
  • src/main/java/org/ject/support/domain/member/repository/MemberActivityQueryRepositoryImpl.java
  • src/main/java/org/ject/support/domain/project/service/ProjectService.java
  • src/test/java/org/ject/support/domain/member/repository/MemberActivityRepositoryTest.java
  • src/test/java/org/ject/support/domain/project/service/ProjectServiceTest.java

@github-actions

Copy link
Copy Markdown

Test Results

416 tests   416 ✅  13s ⏱️
 77 suites    0 💤
 77 files      0 ❌

Results for commit 9e2abc5.

@github-actions

Copy link
Copy Markdown

📊테스트 커버리지

Overall Project 85.36% 🍏
Files changed 100% 🍏

File Coverage
MemberActivityQueryRepositoryImpl.java 99.56% 🍏
ProjectService.java 93.1% 🍏

@kangkings
kangkings merged commit c17c6e1 into dev Jul 14, 2026
3 checks passed
@kangkings
kangkings deleted the codex/feat-591-project-team-member-names branch July 14, 2026 14:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

👨🏻‍💻backend 백엔드 작업

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

[FEAT] 프로젝트 정보 상세조회시 팀원 이름 조회 로직 연결

2 participants