# PRD: 크리에이터 채널 홈 커뮤니티 응답 확장 ## 문서 정보 | 항목 | 내용 | |---|---| | 문서 상태 | 구현 기준 확정 | | 작성일 | 2026-08-10 | | 최종 수정일 | 2026-08-10 | | 대상 제품 | 크리에이터 채널 홈 API | | 작성자·결정권자 | 사용자 | | 관련 API Contract | 별도 문서 없음, 이 문서의 `7. API 계약`을 기준으로 함 | | 관련 구현 계획 | `docs/20260810_크리에이터_채널_홈_커뮤니티_응답_확장/plan-task.md` | | 관련 review | 없음 | ## 1. Overview 크리에이터 채널 홈 API의 `notices`와 `communities` 게시글 응답에 고정 여부와 댓글 가능 여부를 각각 `isPinned`, `isCommentAvailable`로 제공한다. 기존 조회 결과가 이미 보유한 값을 응답에 그대로 반영해 클라이언트가 별도 추론 없이 게시글 상태를 표시할 수 있게 한다. ## 2. Problem Statement - 현재 `GET /api/v2/creator-channels/{creatorId}/home`의 게시글 도메인 모델에는 고정 여부와 댓글 가능 여부가 있지만 홈 응답 DTO에는 두 값이 없다. - 클라이언트는 홈의 게시글이 고정 글인지, 댓글 작성이 가능한지 응답만으로 일관되게 판단할 수 없다. - `notices`와 `communities`가 같은 `CreatorChannelCommunityPostResponse`를 사용하므로 두 배열의 계약을 함께 확장해야 한다. 문제를 해결했다는 판단은 두 배열의 각 게시글에 실제 도메인 값과 일치하는 non-null Boolean 필드가 직렬화되는지로 한다. ## 3. Goals - 홈 응답의 `notices[*]`와 `communities[*]`에 `isPinned`를 제공한다. - 홈 응답의 `notices[*]`와 `communities[*]`에 `isCommentAvailable`을 제공한다. - 기존 커뮤니티 조회 결과의 값을 변형하거나 재계산하지 않고 그대로 사용한다. - 기존 홈 API의 endpoint, 인증 정책과 기존 응답 필드를 유지한다. ## 4. Non-Goals - 커뮤니티 조회 조건, 고정 정렬, 최대 노출 개수는 변경하지 않는다. - 댓글 작성·수정·삭제 정책과 API는 변경하지 않는다. - 커뮤니티 탭 및 게시글 상세 API 계약은 변경하지 않는다. - DB schema, entity, domain model과 repository query는 변경하지 않는다. - `notices`와 `communities` 전용 응답 DTO를 새로 분리하지 않는다. - 관련 없는 홈 응답 필드나 패키지 구조는 리팩터링하지 않는다. ## 5. Target Users and Permissions - 대상 사용자: 인증 후 크리에이터 채널 홈을 조회하는 앱 사용자 - 인증 및 권한: 기존 홈 API 정책을 그대로 사용한다. - 차단, 성인 콘텐츠와 구매 여부 정책: 기존 홈 API 조회 결과를 그대로 사용한다. ## 6. 기능 요구사항 | ID | 상태 | 요구사항 | 수용 기준 | 계약/Goal 연결 | |---|---|---|---|---| | `CCHC-001` | 확정 | `notices[*]`와 `communities[*]`에 `isPinned`를 제공한다. | JSON 필드명이 정확히 `isPinned`이고 값은 `CreatorChannelCommunityPost.isPinned`와 일치한다. | `7. API 계약`, `P1-T1` | | `CCHC-002` | 확정 | `notices[*]`와 `communities[*]`에 `isCommentAvailable`을 제공한다. | JSON 필드명이 정확히 `isCommentAvailable`이고 값은 `CreatorChannelCommunityPost.isCommentAvailable`과 일치한다. | `7. API 계약`, `P1-T1` | | `CCHC-003` | 확정 | 두 필드는 non-null Boolean으로 응답한다. | 게시글이 존재하면 두 필드가 누락되거나 `null`이 되지 않는다. | `P1-T1`, `P1-GATE` | | `CCHC-004` | 확정 | 기존 홈 API 계약과 조회 정책을 보존한다. | endpoint, 인증 정책, 기존 응답 필드와 게시글 선택·정렬 결과가 변경되지 않는다. | `P1-GATE` | ### 상태별 기대값 | 배열 | `isPinned` | `isCommentAvailable` | |---|---:|---| | `notices` | 해당 게시글의 실제 값. 현재 홈 조회 조건상 `true` | 해당 게시글의 댓글 허용 설정값 | | `communities` | 해당 게시글의 실제 값. 현재 홈 조회 조건상 `false` | 해당 게시글의 댓글 허용 설정값 | - 댓글 수가 `0`이어도 `isCommentAvailable`을 별도로 계산하지 않는다. - 빈 `notices` 또는 `communities`는 기존처럼 빈 배열로 응답한다. ## 7. API 계약 ### 7.1 Endpoint - Method: `GET` - Path: `/api/v2/creator-channels/{creatorId}/home` - 요청과 인증 정책: 변경 없음 ### 7.2 응답 확장 `data.notices[*]`와 `data.communities[*]`에 다음 필드를 추가한다. | 필드 | 타입 | nullable | 의미 | |---|---|---:|---| | `isPinned` | Boolean | 아니요 | 해당 커뮤니티 게시글의 고정 여부 | | `isCommentAvailable` | Boolean | 아니요 | 해당 커뮤니티 게시글의 댓글 작성 허용 여부 | 예시: ```json { "data": { "notices": [ { "postId": 301, "isPinned": true, "isCommentAvailable": true } ], "communities": [ { "postId": 302, "isPinned": false, "isCommentAvailable": false } ] } } ``` 예시는 추가 필드와 배열별 의미만 나타내며 기존 게시글 응답 필드는 그대로 유지한다. ## 8. 기술적 제약 - Kotlin + Java 17, Spring Boot 2.7.14와 기존 Jackson 직렬화 방식을 유지한다. - 기존 공유 `CreatorChannelCommunityPostResponse`와 `from` 변환을 재사용한다. - `is*` JSON 이름이 변경되지 않도록 기존 Boolean 응답 필드의 `@JsonProperty` 관례를 따른다. - 신규 dependency와 별도 abstraction을 추가하지 않는다. - 구현은 응답 DTO와 직접 영향받는 테스트로 제한한다. ## 9. 성공 기준 - [ ] `notices[*].isPinned`와 `notices[*].isCommentAvailable`이 실제 값으로 응답된다. (`CCHC-001~003`) - [ ] `communities[*].isPinned`와 `communities[*].isCommentAvailable`이 실제 값으로 응답된다. (`CCHC-001~003`) - [ ] 기존 홈 API 응답 및 조회 흐름 회귀 테스트가 통과한다. (`CCHC-004`) - [ ] `ktlintCheck`가 통과한다. - [ ] 전체 회귀 테스트를 생략하면 작은 응답 DTO 변경이라는 근거와 대신 실행한 focused·영향 범위 테스트를 검증 기록에 남긴다. ## 10. Open Questions 없음. ## 11. 요구사항 추적표 | 요구사항 범위 | 계획 Phase | Goal | 자동 검증 | 수동 검증 | |---|---:|---|---|---| | `CCHC-001~003` | 1 | `P1-T1` | `CreatorChannelHomeControllerTest` | 홈 응답 JSON 필드명과 Boolean 값 확인 | | `CCHC-004` | 1 | `P1-GATE` | `CreatorChannelHomeEndToEndTest`, `ktlintCheck` | 기존 필드 유지 여부 확인 | ## 12. Decision Log | 날짜 | ID | 상태 | 결정 | 근거 | 영향 요구사항·Goal | |---|---|---|---|---|---| | 2026-08-10 | `DEC-001` | 확정 | `isPinned`, `isCommentAvailable`을 `notices`와 `communities` 모두에 추가한다. | 두 배열이 같은 게시글 응답 DTO를 사용하며 사용자가 인터뷰 선택지 A를 승인했다. | `CCHC-001~004`, `P1-T1`, `P1-GATE` | | 2026-08-10 | `DEC-002` | 확정 | 공유 응답 DTO를 확장하고 전용 DTO는 분리하지 않는다. | 기존 도메인 값과 변환 경로를 재사용하는 최소 변경이다. | `CCHC-001~004`, `P1-T1` | | 2026-08-10 | `DEC-003` | 확정 | PRD를 구현 기준으로 승인한다. | 사용자가 작성된 PRD를 검토하고 승인했다. | 문서 전체, `plan-task.md` |