docs(creator): 후원 empty 후속 검증을 기록한다

This commit is contained in:
2026-06-22 23:55:56 +09:00
parent c25acea5d4
commit 7e1e453a6b
2 changed files with 46 additions and 9 deletions

View File

@@ -33,6 +33,7 @@
- 전체 후원 탭: `290:9093` - 전체 후원 탭: `290:9093`
- 후원 랭킹 섹션: `290:9097` - 후원 랭킹 섹션: `290:9097`
- 후원 empty 상태: `290:9008` - 후원 empty 상태: `290:9008`
- 후원 empty UI 컨텐츠: `290:9009`
- API endpoint는 `GET /api/v2/creator-channels/{creatorId}/donations`이다. - API endpoint는 `GET /api/v2/creator-channels/{creatorId}/donations`이다.
- 첫 페이지 `page``0`, 기본 `size``20`이다. - 첫 페이지 `page``0`, 기본 `size``20`이다.
- query parameter는 `page`, `size`만 전달한다. - query parameter는 `page`, `size`만 전달한다.
@@ -42,6 +43,8 @@
- 현재 API는 비밀 후원 여부를 별도 필드로 내려주지 않으므로 비밀 후원 전용 UI/표시 분기는 구현하지 않는다. - 현재 API는 비밀 후원 여부를 별도 필드로 내려주지 않으므로 비밀 후원 전용 UI/표시 분기는 구현하지 않는다.
- 본인 채널에서는 content/empty 상태 모두 floating 후원하기 버튼을 숨긴다. - 본인 채널에서는 content/empty 상태 모두 floating 후원하기 버튼을 숨긴다.
- 본인 채널 empty 상태에서는 중앙 `후원하기` button도 숨긴다. - 본인 채널 empty 상태에서는 중앙 `후원하기` button도 숨긴다.
- empty UI는 별도 `minHeight` 없이 표시한다.
- 후원 랭킹 섹션이 표시되는 경우에도 채널 후원 내역이 없으면 랭킹 섹션 아래에 empty UI를 표시한다.
- 후원 성공 후에는 후원 탭의 `donationCount`, `rankings`, `donations`가 최신화되도록 첫 페이지를 재조회한다. - 후원 성공 후에는 후원 탭의 `donationCount`, `rankings`, `donations`가 최신화되도록 첫 페이지를 재조회한다.
- 구현 완료 후 최소 다음 명령을 실행한다. - 구현 완료 후 최소 다음 명령을 실행한다.
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"` - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"`
@@ -472,26 +475,53 @@
- 검증 기록: - 검증 기록:
- 2026-06-22: `onCreatorChannelDonationRankingAllClicked()`에서 `Intent(this, UserProfileDonationAllViewActivity::class.java)`를 생성하고 `putExtra(Constants.EXTRA_USER_ID, creatorId)`로 기존 전체보기 Activity 호출 계약에 맞춰 연결했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationActionTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` 범위는 Phase 5/6 focused GREEN 명령들로 분리 검증했으며 모두 PASS했다. - 2026-06-22: `onCreatorChannelDonationRankingAllClicked()`에서 `Intent(this, UserProfileDonationAllViewActivity::class.java)`를 생성하고 `putExtra(Constants.EXTRA_USER_ID, creatorId)`로 기존 전체보기 Activity 호출 계약에 맞춰 연결했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationActionTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` 범위는 Phase 5/6 focused GREEN 명령들로 분리 검증했으며 모두 PASS했다.
### Phase 6 후속: Empty UI 랭킹 하단 배치
- [x] **Task 6.6: Empty UI 랭킹 하단 배치 후속 수정**
- 수정:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModel.kt`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationFragment.kt`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/ui/CreatorChannelDonationAdapter.kt`
- `app/src/main/res/layout/fragment_creator_channel_donation.xml`
- 필요 시 `app/src/main/res/layout/item_creator_channel_donation_empty.xml`
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationFragmentLayoutTest.kt`
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModelTest.kt`
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationActionTest.kt`
- 작업:
- Figma `290:9009` 기준 empty UI 컨텐츠를 랭킹 섹션 아래에 표시할 수 있도록 adapter item으로 분리한다.
- 채널 후원 내역이 없으면 `rankings` 존재 여부와 관계없이 empty UI를 표시한다.
- `rankings`가 비어 있지 않으면 랭킹 item 다음에 empty item을 배치한다.
- empty UI와 후원 Fragment root에는 별도 `minHeight`를 적용하지 않는다.
- empty 중앙 `후원하기` button은 기존과 동일하게 타인 채널에서만 표시하고 같은 후원 요청 경로를 사용한다.
- 검증:
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationViewModelTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationActionTest"`
- 기대 결과: 구현 전에는 empty item/view model ranking 보존/minHeight 제거 계약 때문에 FAIL하고, 구현 후 PASS한다.
- 검증 기록:
- 2026-06-22: Figma `290:9009` design context와 screenshot을 확인해 empty UI 컨텐츠가 16sp gray/500 문구, 14dp 간격, `soda/400` capsule button으로 구성되며 별도 `minHeight`가 없음을 확인했다. 사용자 후속 요구에 따라 PRD와 계획 문서에 `rankings` 존재 여부와 관계없이 채널 후원이 없으면 empty UI를 표시하고, 랭킹 섹션이 있으면 그 아래에 배치하도록 기록했다.
- 2026-06-22: RED로 `CreatorChannelDonationViewModelTest`에 Empty 상태가 `rankings`를 보존해야 한다는 assertion을 추가하고, `CreatorChannelDonationFragmentLayoutTest`/`CreatorChannelDonationActionTest``item_creator_channel_donation_empty.xml`, adapter empty item, Fragment root `minimumHeight` 제거 계약을 추가했다. 구현 전 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationViewModelTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationActionTest"` 실행 결과 `item_creator_channel_donation_empty` 리소스와 `Empty.rankings` 부재로 `:app:compileDebugUnitTestKotlin`이 FAIL해 RED를 확인했다.
- 2026-06-22: `CreatorChannelDonationViewModel``Empty` 상태에 랭킹 UI 모델을 보존하고, `CreatorChannelDonationFragment`는 empty 상태에서 `donationAdapter.submitEmpty(state.rankings, state.isOwner)`를 호출하도록 수정했다. `fragment_creator_channel_donation.xml`의 empty overlay는 제거하고, `item_creator_channel_donation_empty.xml`을 추가해 `RecyclerView` item으로 empty UI를 표시하도록 했다. `CreatorChannelDonationAdapter`는 랭킹 item 뒤에 empty item을 추가하고 타인 채널에서만 중앙 `후원하기` button을 표시한다. 수정 후 동일 focused 명령이 PASS했다.
### Phase 7: 통합 검증과 수동 확인 ### Phase 7: 통합 검증과 수동 확인
- [ ] **Task 7.1: 후원 탭 focused 테스트 실행** - [x] **Task 7.1: 후원 탭 focused 테스트 실행**
- 실행: - 실행:
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"` - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"`
- 기대 결과: - 기대 결과:
- 후원 탭 mapper/ViewModel/pagination/layout/action 테스트가 모두 PASS한다. - 후원 탭 mapper/ViewModel/pagination/layout/action 테스트가 모두 PASS한다.
- 검증 기록: - 검증 기록:
- 미실행. 구현 시 기록한다. - 2026-06-22: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"` 실행 결과 PASS했다. ktlint unused import 정리 후 동일 명령을 재실행해 PASS를 재확인했다.
- [ ] **Task 7.2: 크리에이터 채널 회귀 테스트 실행** - [x] **Task 7.2: 크리에이터 채널 회귀 테스트 실행**
- 실행: - 실행:
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Donation*"` - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Donation*"`
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"` - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`
- 기대 결과: - 기대 결과:
- 기존 Home/Live/Audio/Series/Community/FanTalk 탭 테스트와 신규 Donation 탭 테스트가 PASS한다. - 기존 Home/Live/Audio/Series/Community/FanTalk 탭 테스트와 신규 Donation 탭 테스트가 PASS한다.
- 검증 기록: - 검증 기록:
- 미실행. 구현 시 기록한다. - 2026-06-22: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Donation*"` 최초 실행에서 `CreatorChannelActivitySourceTest`가 empty button을 기존 Fragment layout에서 찾는 오래된 source 계약으로 FAIL했다. Empty UI가 adapter item으로 이동한 현재 구조에 맞춰 테스트가 `item_creator_channel_donation_empty.xml`을 확인하도록 갱신한 뒤 같은 명령이 PASS했다.
- 2026-06-22: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"` 실행 결과 PASS했다.
- [ ] **Task 7.3: 리소스/컴파일/스타일 검증** - [x] **Task 7.3: 리소스/컴파일/스타일 검증**
- 실행: - 실행:
- `./gradlew :app:mergeDebugResources` - `./gradlew :app:mergeDebugResources`
- `./gradlew :app:compileDebugKotlin` - `./gradlew :app:compileDebugKotlin`
@@ -500,7 +530,10 @@
- 기대 결과: - 기대 결과:
- resource merge, Kotlin compile, ktlint, whitespace check가 모두 PASS한다. - resource merge, Kotlin compile, ktlint, whitespace check가 모두 PASS한다.
- 검증 기록: - 검증 기록:
- 미실행. 구현 시 기록한다. - 2026-06-22: `./gradlew :app:mergeDebugResources`는 sandbox에서 Gradle wrapper lock 파일 접근 권한 문제로 1회 실패했고, 외부 권한으로 동일 명령을 재실행해 PASS했다.
- 2026-06-22: `./gradlew :app:compileDebugKotlin` 실행 결과 PASS했다.
- 2026-06-22: `./gradlew :app:ktlintCheck` 최초 실행에서 `CreatorChannelDonationViewModelTest`의 unused `assertTrue` import로 FAIL했다. 해당 import를 제거한 뒤 동일 명령을 재실행해 PASS했다.
- 2026-06-22: `git diff --check` 실행 결과 PASS했다.
- [ ] **Task 7.4: 수동 UI 확인** - [ ] **Task 7.4: 수동 UI 확인**
- 확인 항목: - 확인 항목:
@@ -515,7 +548,7 @@
- 본인 채널에서는 empty 중앙 `후원하기` button과 floating 후원하기 버튼이 모두 숨겨진다. - 본인 채널에서는 empty 중앙 `후원하기` button과 floating 후원하기 버튼이 모두 숨겨진다.
- 비밀 후원 전용 UI/표시 분기는 없다. - 비밀 후원 전용 UI/표시 분기는 없다.
- 검증 기록: - 검증 기록:
- 미실행. 구현 시 기록한다. - 2026-06-22: 실제 기기/API 수동 확인은 실행하지 않았다. Figma `290:9009` design context/screenshot과 layout/source/test 검증으로 empty UI의 랭킹 하단 배치, `minHeight` 제거, 타인 채널 button 표시 계약을 확인했다.
--- ---

View File

@@ -219,7 +219,10 @@ Sort-bar는 전체 후원 수만 표시한다.
- empty 상태에서는 후원 내역 목록을 표시하지 않는다. - empty 상태에서는 후원 내역 목록을 표시하지 않는다.
- empty 상태에서는 Sort-bar를 숨긴다. - empty 상태에서는 Sort-bar를 숨긴다.
- 후원 랭킹 섹션은 `rankings`가 비어 있으면 숨긴다. - 후원 랭킹 섹션은 `rankings`가 비어 있으면 숨긴다.
- empty 상태는 Figma `290:9008`을 기준으로 표시한다. - 후원 랭킹 섹션이 표시되는 경우 empty 상태는 랭킹 섹션 아래에 배치한다.
- 후원 랭킹 섹션 표시 여부와 관계없이 채널 후원이 없으면 empty UI를 표시한다.
- empty 상태는 Figma `290:9008`/`290:9009`를 기준으로 표시한다.
- empty UI에는 별도 `minHeight`를 적용하지 않는다.
- empty 문구는 `아직 후원이 없습니다.\n처음으로 크리에이터를 후원해 보세요!`이다. - empty 문구는 `아직 후원이 없습니다.\n처음으로 크리에이터를 후원해 보세요!`이다.
- empty 문구는 16sp regular, `gray/500`, center 정렬로 표시한다. - empty 문구는 16sp regular, `gray/500`, center 정렬로 표시한다.
- 타인 채널 empty 상태에서는 문구 아래에 `후원하기` capsule button을 표시한다. - 타인 채널 empty 상태에서는 문구 아래에 `후원하기` capsule button을 표시한다.
@@ -273,7 +276,7 @@ Sort-bar는 전체 후원 수만 표시한다.
## 11. Resolved Decisions ## 11. Resolved Decisions
- 랭킹 섹션의 `전체보기` 버튼은 기존 `UserProfileDonationAllViewActivity`로 이동한다. - 랭킹 섹션의 `전체보기` 버튼은 기존 `UserProfileDonationAllViewActivity`로 이동한다.
- `rankings`는 서버가 항상 최대 8명만 내려준다. - `rankings`는 서버가 항상 최대 8명만 내려준다.
- 후원 내역 empty 상태는 Figma `290:9008`을 기준으로 구현한다. - 후원 내역 empty 상태는 Figma `290:9008`/`290:9009`를 기준으로 구현하고, 랭킹 섹션이 있으면 그 아래에 표시한다.
- 본인 채널에서는 empty 상태의 하단 `후원하기` button과 floating 후원하기 버튼을 모두 숨긴다. - 본인 채널에서는 empty 상태의 하단 `후원하기` button과 floating 후원하기 버튼을 모두 숨긴다.
- 현재 API는 비밀 후원 여부를 별도로 내려주지 않으므로 이번 범위에서는 비밀 후원 관련 UI/표시 분기를 구현하지 않는다. - 현재 API는 비밀 후원 여부를 별도로 내려주지 않으므로 이번 범위에서는 비밀 후원 관련 UI/표시 분기를 구현하지 않는다.
@@ -296,3 +299,4 @@ Sort-bar는 전체 후원 수만 표시한다.
- 2026-06-22: Figma `290:9093`, `290:9097`의 design context와 screenshot을 확인해 후원 랭킹 카드, Sort-bar, 후원 내역 item, floating button 구조를 PRD에 반영했다. - 2026-06-22: Figma `290:9093`, `290:9097`의 design context와 screenshot을 확인해 후원 랭킹 카드, Sort-bar, 후원 내역 item, floating button 구조를 PRD에 반영했다.
- 2026-06-22: 기존 홈 탭 PRD와 `CreatorChannelActivity.onCreatorChannelDonationClicked()`, `CreatorChannelHomeViewModel.postChannelDonation()` 흐름을 확인해 후원 탭 후원하기 액션 재사용 및 성공 후 갱신 요구를 PRD에 반영했다. - 2026-06-22: 기존 홈 탭 PRD와 `CreatorChannelActivity.onCreatorChannelDonationClicked()`, `CreatorChannelHomeViewModel.postChannelDonation()` 흐름을 확인해 후원 탭 후원하기 액션 재사용 및 성공 후 갱신 요구를 PRD에 반영했다.
- 2026-06-22: 사용자 확인사항을 반영해 랭킹 `전체보기`는 기존 `UserProfileDonationAllViewActivity` 이동으로 확정하고, `rankings` 최대 8명 서버 보장, Figma `290:9008` empty 상태, 본인 채널 후원하기 버튼 숨김, 비밀 후원 표시 제외 정책을 PRD에 보강했다. - 2026-06-22: 사용자 확인사항을 반영해 랭킹 `전체보기`는 기존 `UserProfileDonationAllViewActivity` 이동으로 확정하고, `rankings` 최대 8명 서버 보장, Figma `290:9008` empty 상태, 본인 채널 후원하기 버튼 숨김, 비밀 후원 표시 제외 정책을 PRD에 보강했다.
- 2026-06-22: 사용자 후속 요청을 반영해 empty UI는 Figma `290:9009` 컨텐츠 기준으로 별도 `minHeight` 없이 표시하고, 후원 랭킹 섹션이 있으면 그 아래에 배치하며, 랭킹 존재 여부와 관계없이 채널 후원이 없으면 항상 표시하도록 보강했다.