Skip to content

[FEAT] 프로젝트 목록 meetingCount 실집계 연결 + teamNames 배치 조회 추가 - #260

Merged
mosungjin merged 4 commits into
feat/mo-meetingdatafrom
feat/mnppi-project-meeting-count
Aug 9, 2026
Merged

[FEAT] 프로젝트 목록 meetingCount 실집계 연결 + teamNames 배치 조회 추가#260
mosungjin merged 4 commits into
feat/mo-meetingdatafrom
feat/mnppi-project-meeting-count

Conversation

@MNPPI223

@MNPPI223 MNPPI223 commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

📌 연관 이슈

  • Closes #

(PR #258·#253 후속 작업 — 별도 이슈 없음)


⚠️ 의존 관계 (머지 순서 중요)

이 PR은 develop이 아니라 PR #258(feat/mo-meetingdata) 위에서 시작했고, PR #253
(feat/mnppi-project-list-action-counts)도 merge
해서 포함하고 있습니다.
#258과 #253이 먼저 develop에 머지된 뒤에, 이 PR의 베이스를 develop으로 다시 잡거나
그대로 순차 머지해주세요.
base를 feat/mo-meetingdata로 잡아둔 건 성진님 PR의 새
countMeetingsByProjectIds 계약 없이는 컴파일이 안 되기 때문입니다.


📝 작업 내용

  • 성진(D) PR #258이 제공하는 meeting.application.port.in.MeetingQueryPort.countMeetingsByProjectIds(companyId, projectIds) 계약을 project(C)가 호출
  • project 쪽에 자체 아웃바운드 포트 project.application.port.MeetingQueryPort 신설 + MeetingQueryPortDelegatingAdapter로 위임 — handover(E)의 MeetingQueryPortDelegatingAdapter와 동일한 ACL 패턴(별도 빈 이름 지정 — 같은 단순 클래스명이 이미 handover에 있어서 기본 빈 이름이 충돌함)
  • ProjectSummaryResponse.meetingCount가 더 이상 0 고정이 아니라 실제 회의 수 반환(취소 회의 제외, D 계약 그대로)
  • (추가) ProjectSummaryResponse.teamNames 배치 조회 연결 — 종호(B) 확인 회신 반영. project가 이미 소유한 TeamReferenceRepository(팀 소속 검증용, team 테이블 읽기전용 참조)에 findTeamNames 계약 추가, 목록 조회 시 전체 프로젝트의 teamIds를 한 번에 모아 배치 조회(N+1 없음) 후 id→name 매핑. 신규 크로스 도메인 호출 없음 — 기존 참조 엔티티 재사용
  • (추가) TeamReferenceEntity.@Id@GeneratedValue(IDENTITY) 누락 수정 — 종호(B) 지적. 실제 쓰기 엔티티(B의 Team)와 ID 생성 전략이 다르면 같은 team 테이블에 insert하는 다른 도메인 테스트가 Hibernate 세션 충돌로 깨질 수 있음(action 도메인 참조엔티티에서 이미 겪은 문제와 동일 패턴)

🖥️ 프론트엔드 연동 가이드 (API 명세)

1. 주요 엔드포인트

  • GET /api/projects : meetingCount가 이제 실제 값입니다(기존엔 항상 0). teamNames(부서 이름 배열, 목록 행 부서 칩 표시용) 필드가 새로 추가됐습니다.

4. ⚠️ 프론트엔드 참고 및 주의사항

  • meetingCount는 취소(CANCELED)된 회의는 제외하고 셉니다(SCHEDULED·IN_PROGRESS·DONE만 포함).
  • teamNamesteamIds와 같은 순서로 내려갑니다. 생성/수정 직후 응답(POST/PATCH)에는 빈 배열로 옵니다 — 목록 조회(GET /api/projects)에서만 채워집니다.

💡 백엔드 리뷰 포인트 (Backend Review)

  • 아키텍처 및 도메인: C→D 방향(meetingCount) 조회는 handover(E)가 이미 쓰고 있는 "자체 아웃바운드 포트 + Delegating Adapter" 패턴을 그대로 재사용했습니다. companyId는 handover와 달리 project 쪽 메서드 시그니처에 이미 있어서 SecurityContext에서 따로 꺼낼 필요가 없었습니다. teamNames는 별도 Port 신설 없이 project가 이미 소유한 로컬 참조 엔티티(TeamReferenceEntity)로 처리해 크로스 도메인 애플리케이션 계층 호출 자체가 없습니다(BC 경계 그대로 유지).
  • 우려되는 부분이나 고민: 이 PR 자체보다 위 의존 관계(머지 순서)가 제일 중요한 리뷰 포인트입니다. teamNames 배치조회는 신규 쿼리 없이 기존 findAllByIdInAndCompanyId 재사용이라 리스크가 낮습니다.

✅ 체크리스트

  • 코드 컨벤션을 준수했습니다.
  • 불필요한 주석 및 콘솔 로그를 제거했습니다.
  • API 기능이 정상 동작하는지 테스트했습니다.
  • 예외(잘못된 값) 상황에 대한 검증 및 테스트를 통과했습니다.

ProjectSummaryResponse.actionCount/completedActionCount/progressPct가
2026-08-05부터 0 고정 스텁이었는데, action BC가 다 갖춰진 지금 실집계로 채운다.
ActionQueryPort에 countActionsByProjectIds 배치 조회 신설(project→action
크로스 BC 조회, 기존 findTeamActionsByProjectId와 같은 포트 패턴) — 목록에
프로젝트가 여러 개여도 쿼리 1회로 끝낸다.

ProjectPersistenceAdapter.findAllByCompanyId의 프로젝트별 개별 조회(N+1)도
같이 제거 — project_team 배정을 배치 조회 후 프로젝트 id로 메모리에서 묶는다.

GetProjectListUseCase.list()는 List<Project> 대신 List<ProjectListItem>
(project+실카운트)을 반환하도록 계약 변경 — GetProjectDetailUseCase의
ProjectDetailResult와 같은 패턴. meetingCount는 여전히 0(meeting Port
미비, 모성진에게 요청함). ProjectAttachmentController의 낡은 TBD
주석도 정리 — 첨부파일 목록은 이미 ProjectDetailResponse에 인라인으로
포함돼 있었다.
…ounts' into feat/mnppi-project-meeting-count
성진(D) PR #258이 제공하는 meeting.application.port.in.MeetingQueryPort.
countMeetingsByProjectIds(companyId, projectIds) 계약을 project(C)가
자체 아웃바운드 포트(MeetingQueryPort)+MeetingQueryPortDelegatingAdapter로
위임 호출 — handover(E)의 MeetingQueryPortDelegatingAdapter와 동일 패턴.
ProjectSummaryResponse.meetingCount가 이제 0 고정이 아니라 실제 회의 수를
반환한다(취소 회의 제외, D 계약 그대로).

이 브랜치는 develop이 아니라 PR #258(feat/mo-meetingdata)과 PR #253
(feat/mnppi-project-list-action-counts) 위에서 시작 — 두 PR이 먼저
머지돼야 이 PR도 깨끗하게 머지된다.
@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: fc21610e-4bf5-4c4a-ac90-874bb6b37e3a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@MNPPI223 MNPPI223 self-assigned this Aug 9, 2026
@MNPPI223 MNPPI223 added the enhancement New feature or request label Aug 9, 2026
@MNPPI223 MNPPI223 added this to Z Aug 9, 2026
@github-project-automation github-project-automation Bot moved this to Todo in Z Aug 9, 2026
@MNPPI223 MNPPI223 added this to the [M1] BE 기능 개발 milestone Aug 9, 2026
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@MNPPI223 MNPPI223 changed the title [FEAT] 프로젝트 목록 meetingCount 실집계 연결 [FEAT] 프로젝트 목록 meetingCount 실집계 연결 + teamNames 배치 조회 추가 Aug 9, 2026

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

확인했습니다.

@mosungjin
mosungjin merged commit c4a4a61 into feat/mo-meetingdata Aug 9, 2026
1 check passed
@github-project-automation github-project-automation Bot moved this from Todo to Done in Z Aug 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants