From e57998654b10be4c9da136d83dd5b03d97ca3fe4 Mon Sep 17 00:00:00 2001 From: klaus Date: Mon, 14 Sep 2026 22:51:55 +0900 Subject: [PATCH] =?UTF-8?q?docs(dm):=20=EC=88=98=EC=8B=A0=EC=9E=90=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=EB=9D=BC=EB=B2=A8=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=EC=82=AC=ED=95=AD=EC=9D=84=20=EA=B8=B0=EB=A1=9D=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan-task.md | 79 ++++++++++++++++++- .../prd.md | 8 ++ 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/docs/20260914_크리에이터의_리스너_DM_시작/plan-task.md b/docs/20260914_크리에이터의_리스너_DM_시작/plan-task.md index 3020749f..31b1f7b3 100644 --- a/docs/20260914_크리에이터의_리스너_DM_시작/plan-task.md +++ b/docs/20260914_크리에이터의_리스너_DM_시작/plan-task.md @@ -6,7 +6,7 @@ | 작성일 | `2026-09-14` | | 요구사항 기준 | `docs/20260914_크리에이터의_리스너_DM_시작/prd.md` | | API 기준 | 서버 `CreateUserCreatorChatRoomRequest(recipientId?, creatorId?)` 계약 제공됨 | -| 현재 Phase | Phase 4 완료 | +| 현재 Phase | Phase 5 완료 | | 현재 활성 Goal | 없음 | ## 목표 @@ -21,6 +21,7 @@ | 2 | 완료 | `4/4` | 없음 | 없음 | | 3 | 완료 | `1/1` | 없음 | 없음 | | 4 | 완료 | `2/2` | 없음 | 없음 | +| 5 | 완료 | `1/1` | 없음 | 없음 | - 동시에 하나의 미완료 goal만 운용한다. - 완료된 Task와 검증 기록은 되돌리거나 삭제하지 않는다. @@ -40,6 +41,8 @@ - 기존 크리에이터 채널 DM 생성 API 재사용, 신규 리스너 DM은 `recipientId`, 기존 크리에이터 채널 DM은 `creatorId` request 계약 유지. - DM 방에서 뒤로 돌아와 대화 탭이 다시 보일 때 현재 filter의 대화방 목록 첫 페이지 갱신. - Figma `2372:23496`, `2372:23506` 기준 수신자 선택/검색 결과 화면 상단 toolbar와 `검색결과 N` 라벨 정합성 수정. +- 수신자 선택 화면에서 팔로워 0명일 때 `팔로워` 섹션 문구 숨김. +- `검색결과 0`과 `팔로워` 문구 크기 통일, 검색결과 숫자만 `gray/500` 색상 적용. ### 제외 @@ -440,6 +443,61 @@ **Expected:** 0 exit code. Figma source contract, `검색결과 0` state, 기존 recipient flow와 DM request 회귀가 통과한다. +## Phase 5. 팔로워 0명 섹션 라벨 숨김 + +**Phase 결과:** 수신자 선택 화면의 팔로워 목록이 비어 있으면 `팔로워` 섹션 라벨을 표시하지 않고, `검색결과 0`과 `팔로워` 라벨 스타일이 요구사항과 일치한다. + +**선행조건:** Phase 4 수신자 선택 화면 구현 완료, 사용자 후속 요구 `DM-022`, `DM-023` 확정. + +**Phase 완료 조건:** `P5-T1`, `P5-GATE` 완료, 검증 기록 누적. + +### 구현 항목 + +#### Task 5.1 팔로워 라벨 표시 조건 수정 + +**Goal 실행 `P5-T1`:** 팔로워 모드라도 표시할 수신자가 0명이면 `팔로워` 라벨을 숨기고, `검색결과 0`과 `팔로워` 라벨의 문구 크기와 검색결과 숫자 색상을 맞춘다. + +- **시작 조건:** PRD `DM-022`, `DM-023` 확정. +- **완료 증거:** source/layout RED/GREEN, focused test와 영향 범위 검증 결과 기록. +- **범위 밖:** 검색 결과 count 정책, 팔로워 empty 문구 신규 정의, 기기·에뮬레이터 UI 조작. + +**Files:** + +- Modify: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/recipient/DmRecipientPickerActivity.kt` +- Modify: `app/src/main/res/layout/activity_dm_recipient_picker.xml` +- Test: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/chat/recipient/DmRecipientPickerSourceTest.kt` +- Modify: `docs/20260914_크리에이터의_리스너_DM_시작/prd.md`, `plan-task.md` + +- [x] **RED:** source test가 `tvFollowers` 표시 조건이 팔로워 모드와 수신자 목록 non-empty 조건을 함께 사용하는지, layout/source test가 두 라벨 style 통일과 검색결과 숫자 `gray_500` span을 검증하도록 작성한다. +- [x] **RED 확인:** focused source test를 실행해 현재 팔로워 모드만 보는 조건, 라벨 style 불일치, 숫자 span 부재 때문에 실패함을 확인한다. +- [x] **GREEN:** Activity binding과 XML을 최소 수정해 팔로워 0명 라벨 숨김, 라벨 크기 통일, 검색결과 숫자 `gray_500` span을 적용한다. +- [x] **GREEN 확인:** 같은 focused test를 다시 실행해 성공을 확인한다. +- [x] **REFACTOR:** 신규 state나 abstraction 없이 중복만 점검하고 focused test·직접 영향 회귀·build/ktlint 결과를 Progress에 기록한다. + +### 완료 조건 + +- [x] `P5-T1`의 체크박스와 완료 증거가 모두 충족됐다. +- [x] 팔로워 모드에서 수신자가 0명이면 `팔로워` 라벨이 숨겨진다. +- [x] `검색결과 0`과 `팔로워` 라벨의 style이 같고 검색결과 숫자 범위에만 `@color/gray_500` span을 적용한다. +- [x] 검색 모드의 `검색결과 N`, empty state, 기존 DM 생성 흐름이 유지된다. + +### 검증 방법 + +#### Phase 5 Gate + +**Goal 실행 `P5-GATE`:** 팔로워 라벨 숨김과 기존 수신자 기능 회귀를 최종 판정한다. + +- **시작 조건:** `P5-T1` 완료. +- **완료 증거:** 아래 focused/영향 범위 검증 통과와 Progress 기록. +- **범위 밖:** 기기·에뮬레이터 UI 조작, screenshot, visual QA. + +```bash +./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.recipient.DmRecipientPickerSourceTest" +./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.recipient.*" --tests "kr.co.vividnext.sodalive.v2.main.chat.dm.DmChatRepositoryTest" :app:assembleDebug :app:ktlintCheck +``` + +**Expected:** 0 exit code. 팔로워 라벨 source contract, 라벨 typography/숫자 color contract, 기존 recipient flow와 DM request 회귀가 통과한다. + ## 실행 순서와 의존성 | 순서 | Goal | 선행조건 | 병행 가능 | 차단 시 다음 행동 | @@ -727,3 +785,22 @@ P1-T1 -> P1-GATE -> P2-T1 -> P2-T2 -> P2-T3 -> P2-GATE -> P3-T1 -> P3-GATE -> P4 - 사용자 지시에 따라 `app/src/androidTest`, 기기·에뮬레이터 조작, screenshot, visual QA는 실행하지 않았다. - LSP diagnostics 도구는 제공되지 않아 Kotlin 컴파일과 ktlint로 대체했다. - 남은 항목: 없음. + +### Phase 5 Gate 검증 — 2026-09-14 + +- 상태: 완료 +- 무엇을: 팔로워 0명 라벨 숨김, `팔로워`/`검색결과 0` 라벨 문구 크기 통일, 검색결과 숫자 `gray_500` span 적용을 검증했다. +- 왜: `P5-T1`이 `DM-022`, `DM-023`의 후속 UI 요구를 충족하는지 확인하기 위해서다. +- 어떻게: + - RED focused test로 기존 구현이 팔로워 모드만 보고 라벨을 표시하고, 검색결과 라벨 style과 숫자 색상 span이 요구와 다름을 확인했다. + - GREEN focused test로 `DmRecipientPickerSourceTest` 통과를 확인했다. + - recipient 영향 범위와 기존 `DmChatRepositoryTest`, `assembleDebug`, `ktlintCheck`를 한 번에 실행했다. + - `git diff --check`로 whitespace 오류가 없음을 확인했다. +- 결과: + - 최종 Gradle 명령: `BUILD SUCCESSFUL`, exit 0. + - `testDebugUnitTest`, `assembleDebug`, `ktlintCheck` 통과. + - `git diff --check` 출력 없음. +- 수동/제외 검증: + - 사용자 지시에 따라 `app/src/androidTest`, 기기·에뮬레이터 조작, screenshot, visual QA는 실행하지 않았다. + - LSP diagnostics 도구는 제공되지 않아 Kotlin 컴파일과 ktlint로 대체했다. +- 남은 항목: 없음. diff --git a/docs/20260914_크리에이터의_리스너_DM_시작/prd.md b/docs/20260914_크리에이터의_리스너_DM_시작/prd.md index 4cc45e8e..3dabcf76 100644 --- a/docs/20260914_크리에이터의_리스너_DM_시작/prd.md +++ b/docs/20260914_크리에이터의_리스너_DM_시작/prd.md @@ -150,6 +150,8 @@ MainV2Activity | DM-019 | 확정 | DM 생성 요청 DTO는 `recipientId`와 `creatorId`를 모두 표현할 수 있어야 한다. | 신규 크리에이터→리스너 DM은 `recipientId`만 보내고, 기존 크리에이터 채널 DM은 `creatorId`를 유지한다. | `P2-T1` | | DM-020 | 확정 | DM 방에서 뒤로 돌아와 대화 탭이 다시 보이면 대화방 목록을 첫 페이지부터 갱신한다. | 기존 표시 목록을 비운 뒤 현재 선택 filter로 첫 페이지를 다시 요청하고, 요청 cursor는 `null`이다. | `P3-T1` | | DM-021 | 확정 | 수신자 선택 화면은 Figma `2372:23496`, 검색 결과 화면은 Figma `2372:23506`과 동일한 상단 검색 toolbar, 섹션/검색결과 라벨, 리스트 행 구조를 사용한다. | 별도 `detail_toolbar`를 쓰지 않고 뒤로가기와 검색 input이 같은 54dp 검색 toolbar 안에 배치되며, 검색 모드에서는 0건도 `검색결과 0`을 표시한다. | `P4-T1` | +| DM-022 | 확정 | 수신자 선택 화면의 팔로워 목록이 0명이면 `팔로워` 섹션 문구를 표시하지 않는다. | 팔로워 모드라도 표시할 수신자가 0명이면 `팔로워` 라벨이 숨겨진다. | `P5-T1` | +| DM-023 | 확정 | `검색결과 0`과 `팔로워` 문구 크기를 통일하고, 검색결과 숫자만 `gray/500`으로 한다. | 두 라벨은 같은 typography style을 사용하고, 검색결과 라벨의 숫자 범위에만 `@color/gray_500` span을 적용한다. | `P5-T1` | ## 9. UI/UX Expectations @@ -165,8 +167,10 @@ MainV2Activity - 최초 로딩: 기존 팔로우 목록 API 로딩 정책을 따른다. - 팔로우 목록 empty: 기존 팔로우 목록 페이지 정책을 확인 후 재사용한다. +- 팔로우 목록 count: 팔로워가 0명이면 `팔로워` 섹션 문구를 숨긴다. - 검색 결과 empty: `DM-010` 문구를 중앙에 표시한다. - 검색 결과 count: 검색 결과가 0건이어도 Figma `2372:23506` 위치에 `검색결과 0`을 표시한다. +- 검색 결과 count style: `팔로워` 라벨과 같은 문구 크기를 사용하고 숫자만 `gray/500` 색상으로 표시한다. - 검색 오류: 기존 검색/목록 오류 toast 또는 empty 정책을 확인 후 최소 변경으로 맞춘다. - 보내기 진행 중: 중복 터치를 막고 기존 로딩/비활성화 패턴을 따른다. @@ -220,6 +224,8 @@ MainV2Activity - [x] 사용자 선택 후 팝업에서 `보내기`를 터치하면 `recipientId`로 기존 DM 생성 API를 호출하고, 기존 크리에이터 채널 DM은 `creatorId`로 유지된다. (`DM-013`~`DM-019`) - [x] DM 방에서 뒤로 돌아오면 대화 탭의 기존 목록이 비워지고 현재 filter의 첫 페이지가 다시 표시된다. (`DM-020`) - [x] 수신자 선택 화면 상단이 Figma 검색 toolbar 구조와 일치하고, 검색 결과가 0건이어도 `검색결과 0`이 표시된다. (`DM-021`) +- [x] 팔로워가 0명이면 수신자 선택 화면의 `팔로워` 라벨이 표시되지 않는다. (`DM-022`) +- [x] `검색결과 0`과 `팔로워` 라벨의 문구 크기가 같고 검색결과 숫자만 `gray/500` 색상이다. (`DM-023`) ### 13.2 추적성 완료 기준 @@ -247,6 +253,8 @@ MainV2Activity | `DM-013~019` | 2 | `P2-T1`, `P2-T3` | request serialization, dialog action, navigation test | 코드 구현 단계에서 팝업 확인 | | `DM-020` | 3 | `P3-T1` | Fragment source wiring test, ViewModel first-page reset regression test | 사용자가 확인한 뒤로가기 흐름 | | `DM-021` | 4 | `P4-T1` | 수신자 layout/source test, 검색 결과 count ViewModel test | Figma screenshot 대조 | +| `DM-022` | 5 | `P5-T1` | 팔로워 라벨 표시 조건 source test | 없음 | +| `DM-023` | 5 | `P5-T1` | 수신자 layout typography와 숫자 color span source test | 없음 | ## 16. Decision Log