Skip to content

[FEAT] project 상세조회·수정·벌크상태변경·타임라인 엔드포인트 배선 - #146

Merged
mosungjin merged 3 commits into
developfrom
feat/mnppi-project-crud-endpoints
Aug 6, 2026
Merged

[FEAT] project 상세조회·수정·벌크상태변경·타임라인 엔드포인트 배선#146
mosungjin merged 3 commits into
developfrom
feat/mnppi-project-crud-endpoints

Conversation

@MNPPI223

@MNPPI223 MNPPI223 commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

📌 연관 이슈

해결하거나 관련된 이슈 번호를 적어주세요.

  • 관련 이슈 없음 — project BC 인수인계 문서(7차 세션, C 담당 김민섭)에 남아있던 잔여 작업. domain/application 계층은 이미 완성돼 있었고 컨트롤러 배선만 남아있던 항목들을 마무리했습니다.

📝 작업 내용

구현한 주요 기능 및 작업 내역을 요약해 주세요.

  • FR-PJ-02(상세조회) : GET /api/projects/{projectId} 배선 — 이미 완성돼 있던 GetProjectDetailUseCase/ProjectService.getDetail에 컨트롤러·Response DTO 연결
  • FR-PJ-03(수정) : PATCH /api/projects/{projectId} 배선 — UpdateProjectUseCase/ProjectService.update에 컨트롤러·Request DTO 연결
  • FR-PJ-06(보드 상태 일괄변경) : PATCH /api/projects/status/bulk 배선 — 빈 record였던 BulkUpdateProjectStatusRequest에 필드 채우고 컨트롤러 연결
  • FR-PJ-07(타임라인) : GET /api/projects/{projectId}/timeline 신규 구현 — 유일하게 계약(GetProjectTimelineUseCase)까지 빈 상태였어서 설계부터 진행. action 도메인에 ActionQueryPort 신설(action이 선언·구현, project가 호출 — ProjectQueryPort와 반대 방향의 동일 패턴)해서 project가 action 엔티티를 직접 참조하지 않고 팀 액션을 조회하도록 함
  • 🚨 배선하면서 발견해 같이 막은 IDOR : 상세조회·타임라인 모두 원래 companyId 검증이 없어서, 로그인만 하면 다른 회사 프로젝트 상세를 id로 직접 조회할 수 있었습니다. companyId 불일치 시 PROJECT_NOT_FOUND로 응답하도록 막았습니다(존재 여부 자체를 노출하지 않음).
  • 테스트 : ProjectServiceTest 신설(회사 스코프·OWNER 검증·벌크 all-or-nothing·타임라인 지연 배지 계산, 정상+예외), ProjectControllerTest에 신규 엔드포인트 4개 배선 검증 추가

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

1. 주요 엔드포인트

  • GET /api/projects/{projectId} : 프로젝트 상세(기획 탭) 조회 — 전 구성원 공개
  • PATCH /api/projects/{projectId} : 프로젝트 수정 — OWNER 전용, tag·status는 받지 않음(불변/별도 엔드포인트)
  • PATCH /api/projects/status/bulk : 보드 "저장" 버튼용 상태 일괄변경 — OWNER 전용, all-or-nothing
  • GET /api/projects/{projectId}/timeline : 타임라인 탭 조회 — 전 구성원 공개, 한 행 = 팀 액션 카드

2. 요청 파라미터 (Request)

PATCH /api/projects/{projectId}

파라미터명 위치 필수 여부 설명
name Body O 최대 150자
description Body X 기획 내용
color Body O #RRGGBB
dueDate Body O
teamIds Body O 지정 부서 목록(전체 교체)

PATCH /api/projects/status/bulk

파라미터명 위치 필수 여부 설명
items[].projectId Body O
items[].status Body O TODO/IN_PROGRESS/DONE

3. 정상 응답 예시 (200 OK)

GET /api/projects/{projectId}/timeline
{
  "httpStatus": 200,
  "message": "프로젝트 타임라인을 조회했습니다.",
  "data": [
    {
      "actionId": 10,
      "title": "백엔드 API 설계",
      "teamId": 1,
      "teamName": "개발팀",
      "status": "IN_PROGRESS",
      "dueDate": "2026-08-01",
      "isDelayed": true
    }
  ]
}

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

  • isDelayed는 DB 컬럼이 아니라 서버가 계산해서 내려주는 파생값입니다(마감일이 지났고 상태가 DONE이 아닌 경우).
  • 수정 요청에 tag·status 필드를 보내도 무시됩니다 — tag는 생성 후 불변(FR-PJ-04), status는 벌크 엔드포인트 전용입니다.
  • 다른 회사 소속 프로젝트를 id로 조회/타임라인 조회하면 404(PJ-001)가 납니다.

🚨 주요 에러 코드 및 예외 (Exceptions)

  • PJ-001 : 존재하지 않거나 다른 회사 소속인 프로젝트 (상세조회·수정·벌크·타임라인 공통)
  • PJ-002 : 프로젝트 소유자가 아닌 사람이 수정/상태변경 시도
  • PJ-006 : 소속되지 않은 부서를 teamIds에 지정

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

  • 아키텍처 및 도메인:
    • ActionQueryPort는 action 도메인이 선언·구현하고 project가 소비합니다. 기존 ProjectQueryPort(project가 선언·구현, meeting이 소비)와 방향이 반대인 동일 패턴이라 이해하기 쉬울 겁니다.
    • ActionPersistenceAdapterfindTeamActionsByProjectId 구현 시, 완료된 프로젝트 필터링에 쓰던 것과 동일하게 2단계 파생 쿼리(팀 액션 조회 → teamId로 팀명 배치조회)로 처리해 Gate 1(QUERY_002, 신규 @Query 금지)을 준수했습니다.
  • 우려되는 부분이나 고민:
    • IDOR 수정(companyId 스코프 검증)이 원래 스코프에 없던 변경입니다 — 배선하다 발견해서 같이 막았는데, FE 계약 자체는 안 바뀝니다(원래도 존재하지 않는 프로젝트는 404였고, 지금은 "다른 회사 프로젝트"도 같은 404로 묶일 뿐).

✅ 체크리스트

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

🤖 Generated with Claude Code

Summary by CodeRabbit

  • 새로운 기능

    • 프로젝트 상세 정보를 조회하고 수정할 수 있습니다.
    • 여러 프로젝트의 상태를 한 번에 변경할 수 있습니다.
    • 프로젝트별 팀 액션 타임라인을 조회할 수 있습니다.
    • 완료되지 않은 기한 초과 액션을 지연 상태로 확인할 수 있습니다.
  • 개선 사항

    • 프로젝트 조회 시 회사 소속과 권한을 검증합니다.
    • 프로젝트 상세 정보에 태그, 색상, 팀, 첨부파일 등이 표시됩니다.
    • 요청값의 필수 항목과 형식 검증이 강화되었습니다.

FR-PJ-02,03,06,07 — domain/application 계층은 이미 완성돼 있던 상태라
ProjectController 연결과 Request/Response DTO 필드 채우기가 핵심이다.

- 상세조회(GET /{id})·수정(PATCH /{id})·벌크상태변경(PATCH /status/bulk) 배선
- 상세조회·타임라인에 companyId 스코프 검증 추가(다른 회사 프로젝트를 id로 직접
  조회할 수 있던 IDOR 구멍을 배선하면서 함께 막음)
- 타임라인(GetProjectTimelineUseCase)은 설계부터 필요해서 action 도메인에
  ActionQueryPort 신설(ProjectQueryPort와 동일한 방향의 조회 포트) — project는
  action 엔티티를 직접 참조하지 않고 이 포트로만 팀 액션을 조회한다
ProjectServiceTest 신설(회사 스코프·OWNER 검증·all-or-nothing·지연 배지 계산),
ProjectControllerTest에 신규 엔드포인트 4개 배선 검증 추가.
@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: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ce76f5f3-5287-4bfe-8115-facb23ed7c10

📥 Commits

Reviewing files that changed from the base of the PR and between aec0b07 and e066a05.

📒 Files selected for processing (1)
  • src/main/java/com/module06/backend/action/infrastructure/persistence/ActionPersistenceAdapter.java
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/java/com/module06/backend/action/infrastructure/persistence/ActionPersistenceAdapter.java

📝 Walkthrough

Walkthrough

프로젝트 상세 조회에 회사 소속 검증을 추가했다. 프로젝트 수정과 상태 일괄 변경 API를 구현했다. 액션 조회 포트를 연결해 프로젝트 타임라인과 지연 상태를 반환한다. 요청·응답 DTO와 서비스·컨트롤러 테스트를 추가했다.

Changes

프로젝트 관리 흐름

Layer / File(s) Summary
액션 조회 계약 및 영속성 구현
src/main/java/com/module06/backend/action/application/port/ActionQueryPort.java, src/main/java/com/module06/backend/action/infrastructure/persistence/*
프로젝트 ID로 팀 액션 요약을 조회하는 포트와 저장소 구현을 추가했다.
프로젝트 서비스 및 타임라인 계약
src/main/java/com/module06/backend/project/application/service/ProjectService.java, src/main/java/com/module06/backend/project/application/usecase/*
프로젝트 상세 조회에 회사 검증을 추가했다. 액션 요약을 타임라인 항목으로 변환하고 지연 상태를 계산한다.
프로젝트 API와 데이터 변환
src/main/java/com/module06/backend/project/presentation/api/*
상세 조회, 수정, 상태 일괄 변경, 타임라인 조회 엔드포인트를 추가했다. 요청 검증과 응답 변환을 구현했다.
서비스 및 컨트롤러 동작 검증
src/test/java/com/module06/backend/project/application/service/ProjectServiceTest.java, src/test/java/com/module06/backend/project/presentation/api/ProjectControllerTest.java
소속·소유자 검증, 상태 변경, 지연 판정, 인증 정보 전달, 예외 응답을 검증했다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

Suggested labels: enhancement

Suggested reviewers: mosungjin

Sequence Diagram(s)

sequenceDiagram
  actor 인증 사용자
  participant ProjectController
  participant ProjectService
  participant ActionPersistenceAdapter
  participant SpringDataActionRepository

  인증 사용자->>ProjectController: GET /{projectId}/timeline
  ProjectController->>ProjectService: companyId, projectId 전달
  ProjectService->>ActionPersistenceAdapter: findTeamActionsByProjectId(projectId)
  ActionPersistenceAdapter->>SpringDataActionRepository: 액션 유형·프로젝트 ID 조회
  SpringDataActionRepository-->>ActionPersistenceAdapter: 액션 목록 반환
  ActionPersistenceAdapter-->>ProjectService: TeamActionSummary 목록 반환
  ProjectService-->>ProjectController: 지연 여부를 계산한 TimelineItem 목록
  ProjectController-->>인증 사용자: ProjectTimelineItemResponse 목록
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 17.50% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 프로젝트 상세조회·수정·벌크 상태변경·타임라인 엔드포인트 연결이라는 PR의 주요 변경 내용을 구체적으로 요약합니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/mnppi-project-crud-endpoints

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

develop이 #142(ActionDistributionPort 실구현) 반영 후 앞서나가서 발생한
ActionPersistenceAdapter.java 충돌 해결 — develop의 toEntity() 추출과
이 브랜치의 findTeamActionsByProjectId()를 모두 보존.
@MNPPI223 MNPPI223 self-assigned this Aug 6, 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 c8389ec into develop Aug 6, 2026
9 checks passed
@MNPPI223
MNPPI223 deleted the feat/mnppi-project-crud-endpoints branch August 7, 2026 08:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants