docs(creator): 후원 탭 구현 검증을 기록한다
This commit is contained in:
@@ -190,7 +190,7 @@
|
|||||||
|
|
||||||
### Phase 2: API/DTO/Repository/ViewModel 계약 추가
|
### Phase 2: API/DTO/Repository/ViewModel 계약 추가
|
||||||
|
|
||||||
- [ ] **Task 2.1: 후원 탭 DTO 추가**
|
- [x] **Task 2.1: 후원 탭 DTO 추가**
|
||||||
- 생성:
|
- 생성:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/data/CreatorChannelDonationTabResponse.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/data/CreatorChannelDonationTabResponse.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
@@ -201,9 +201,9 @@
|
|||||||
- 실행: `./gradlew :app:compileDebugKotlin`
|
- 실행: `./gradlew :app:compileDebugKotlin`
|
||||||
- 기대 결과: 신규 DTO 추가 후 컴파일이 PASS한다.
|
- 기대 결과: 신규 DTO 추가 후 컴파일이 PASS한다.
|
||||||
- 검증 기록:
|
- 검증 기록:
|
||||||
- 미실행. 구현 시 기록한다.
|
- 2026-06-22: `CreatorChannelDonationTabResponse`, `MemberDonationRankingResponse`, `CreatorChannelDonationResponse`를 `@Keep`/`@SerializedName`으로 추가했다. focused GREEN 실행 중 `:app:compileDebugKotlin`이 PASS해 DTO 컴파일을 확인했다.
|
||||||
|
|
||||||
- [ ] **Task 2.2: 후원 탭 endpoint와 Repository method 추가**
|
- [x] **Task 2.2: 후원 탭 endpoint와 Repository method 추가**
|
||||||
- 수정:
|
- 수정:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelApi.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelApi.kt`
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelRepository.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelRepository.kt`
|
||||||
@@ -216,9 +216,9 @@
|
|||||||
- 실행: `./gradlew :app:compileDebugKotlin`
|
- 실행: `./gradlew :app:compileDebugKotlin`
|
||||||
- 기대 결과: API/Repository 추가 후 기존 Koin graph와 충돌 없이 컴파일된다.
|
- 기대 결과: API/Repository 추가 후 기존 Koin graph와 충돌 없이 컴파일된다.
|
||||||
- 검증 기록:
|
- 검증 기록:
|
||||||
- 미실행. 구현 시 기록한다.
|
- 2026-06-22: `CreatorChannelApi.getDonations(creatorId, page, size, Authorization)`와 `CreatorChannelRepository.getDonations(creatorId, page, size, token)`를 추가했다. focused GREEN 실행 중 `:app:compileDebugKotlin`이 PASS해 endpoint/repository 컴파일을 확인했다.
|
||||||
|
|
||||||
- [ ] **Task 2.3: 후원 ViewModel RED 테스트 작성**
|
- [x] **Task 2.3: 후원 ViewModel RED 테스트 작성**
|
||||||
- 생성:
|
- 생성:
|
||||||
- `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/CreatorChannelDonationViewModelTest.kt`
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationPaginationTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationPaginationTest.kt`
|
||||||
@@ -233,9 +233,9 @@
|
|||||||
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationViewModelTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationPaginationTest"`
|
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationViewModelTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationPaginationTest"`
|
||||||
- 기대 결과: 구현 전에는 신규 타입/메서드 부재로 FAIL한다.
|
- 기대 결과: 구현 전에는 신규 타입/메서드 부재로 FAIL한다.
|
||||||
- 검증 기록:
|
- 검증 기록:
|
||||||
- 미실행. 구현 시 RED 결과를 기록한다.
|
- 2026-06-22: `CreatorChannelDonationViewModelTest`, `CreatorChannelDonationPaginationTest`를 작성한 뒤 focused 테스트를 실행했다. 구현 전 `CreatorChannelDonationViewModel`, `CreatorChannelDonationTabResponse`, `CreatorChannelRepository.getDonations` 등 신규 타입/메서드 부재로 `:app:compileDebugUnitTestKotlin`이 FAIL하여 RED를 확인했다.
|
||||||
|
|
||||||
- [ ] **Task 2.4: 후원 ViewModel 구현**
|
- [x] **Task 2.4: 후원 ViewModel 구현**
|
||||||
- 생성:
|
- 생성:
|
||||||
- `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/CreatorChannelDonationViewModel.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
@@ -248,9 +248,9 @@
|
|||||||
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationViewModelTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationPaginationTest"`
|
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationViewModelTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationPaginationTest"`
|
||||||
- 기대 결과: RED 테스트가 PASS한다.
|
- 기대 결과: RED 테스트가 PASS한다.
|
||||||
- 검증 기록:
|
- 검증 기록:
|
||||||
- 미실행. 구현 시 기록한다.
|
- 2026-06-22: `CreatorChannelDonationViewModel`에 Loading/Empty/Error/Content, 첫 페이지 조회, retry/refresh, loadMore append, pagination error consume, 후원 성공 후 can 차감/첫 페이지 재조회/성공 event를 구현했다. focused GREEN 명령에서 ViewModel/Pagination 테스트가 PASS했다.
|
||||||
|
|
||||||
- [ ] **Task 2.5: Koin binding 추가**
|
- [x] **Task 2.5: Koin binding 추가**
|
||||||
- 수정:
|
- 수정:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
@@ -260,11 +260,11 @@
|
|||||||
- 실행: `./gradlew :app:compileDebugKotlin`
|
- 실행: `./gradlew :app:compileDebugKotlin`
|
||||||
- 기대 결과: Koin binding 추가 후 컴파일이 PASS한다.
|
- 기대 결과: Koin binding 추가 후 컴파일이 PASS한다.
|
||||||
- 검증 기록:
|
- 검증 기록:
|
||||||
- 미실행. 구현 시 기록한다.
|
- 2026-06-22: `AppDI`에 `CreatorChannelDonationViewModel(get(), get())` binding을 추가했다. focused GREEN 실행 중 `:app:compileDebugKotlin`이 PASS해 Koin binding 컴파일을 확인했다.
|
||||||
|
|
||||||
### Phase 3: UI model/mapper/공통 후원 표시 정책
|
### Phase 3: UI model/mapper/공통 후원 표시 정책
|
||||||
|
|
||||||
- [ ] **Task 3.1: 후원 mapper RED 테스트 작성**
|
- [x] **Task 3.1: 후원 mapper RED 테스트 작성**
|
||||||
- 생성:
|
- 생성:
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationMapperTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationMapperTest.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
@@ -278,9 +278,9 @@
|
|||||||
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationMapperTest"`
|
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationMapperTest"`
|
||||||
- 기대 결과: 구현 전에는 신규 mapper 부재로 FAIL한다.
|
- 기대 결과: 구현 전에는 신규 mapper 부재로 FAIL한다.
|
||||||
- 검증 기록:
|
- 검증 기록:
|
||||||
- 미실행. 구현 시 RED 결과를 기록한다.
|
- 2026-06-22: `CreatorChannelDonationMapperTest`를 작성한 뒤 focused 테스트를 실행했다. 구현 전 donation data/model/mapper 부재로 `:app:compileDebugUnitTestKotlin`이 FAIL하여 RED를 확인했다.
|
||||||
|
|
||||||
- [ ] **Task 3.2: 후원 UI model과 mapper 구현**
|
- [x] **Task 3.2: 후원 UI model과 mapper 구현**
|
||||||
- 생성:
|
- 생성:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/model/CreatorChannelDonationUiModels.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/model/CreatorChannelDonationUiModels.kt`
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/model/CreatorChannelDonationMappers.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/model/CreatorChannelDonationMappers.kt`
|
||||||
@@ -295,11 +295,11 @@
|
|||||||
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationMapperTest"`
|
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationMapperTest"`
|
||||||
- 기대 결과: mapper 테스트가 PASS한다.
|
- 기대 결과: mapper 테스트가 PASS한다.
|
||||||
- 검증 기록:
|
- 검증 기록:
|
||||||
- 미실행. 구현 시 기록한다.
|
- 2026-06-22: 후원 랭킹/후원 목록 UI model과 mapper를 추가했다. 랭킹 rank는 응답 순서 기준 1부터 부여하고, `profileImage`를 `profileImageUrl`로 매핑하며, blank message는 기존 `creator_channel_donation_fallback_message`를 사용한다. header 색상은 홈 helper와 동일한 기준을 donation mapper 내부 함수로 구현했다. focused GREEN 명령에서 mapper 테스트가 PASS했다.
|
||||||
|
|
||||||
### Phase 4: 후원 탭 content UI 구현
|
### Phase 4: 후원 탭 content UI 구현
|
||||||
|
|
||||||
- [ ] **Task 4.1: 후원 탭 layout/source RED 테스트 작성**
|
- [x] **Task 4.1: 후원 탭 layout/source RED 테스트 작성**
|
||||||
- 생성:
|
- 생성:
|
||||||
- `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/CreatorChannelDonationFragmentLayoutTest.kt`
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationActionTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationActionTest.kt`
|
||||||
@@ -308,14 +308,14 @@
|
|||||||
- `item_creator_channel_donation_ranking.xml`에 `후원 랭킹`, ranking container, `전체보기` button id가 존재해야 한다는 source test를 작성한다.
|
- `item_creator_channel_donation_ranking.xml`에 `후원 랭킹`, ranking container, `전체보기` button id가 존재해야 한다는 source test를 작성한다.
|
||||||
- `item_creator_channel_donation.xml`에 profile, nickname, createdAt, can badge, message id가 존재해야 한다는 source test를 작성한다.
|
- `item_creator_channel_donation.xml`에 profile, nickname, createdAt, can badge, message id가 존재해야 한다는 source test를 작성한다.
|
||||||
- 본인 채널에서는 floating button이 숨겨진다는 Fragment/source 계약 테스트를 작성한다.
|
- 본인 채널에서는 floating button이 숨겨진다는 Fragment/source 계약 테스트를 작성한다.
|
||||||
- `전체보기` 클릭이 `UserProfileDonationAllViewActivity`와 `Constants.EXTRA_USER_ID`를 사용한다는 source 계약 테스트를 작성한다.
|
- Phase 4에서는 `전체보기` 클릭이 `CreatorChannelDonationFragment.Host` callback으로 전달된다는 source 계약 테스트를 작성한다. `UserProfileDonationAllViewActivity`와 `Constants.EXTRA_USER_ID` 연결은 Phase 6에서 검증한다.
|
||||||
- 검증:
|
- 검증:
|
||||||
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationActionTest"`
|
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationActionTest"`
|
||||||
- 기대 결과: 구현 전에는 신규 layout/Fragment 부재로 FAIL한다.
|
- 기대 결과: 구현 전에는 신규 layout/Fragment 부재로 FAIL한다.
|
||||||
- 검증 기록:
|
- 검증 기록:
|
||||||
- 미실행. 구현 시 RED 결과를 기록한다.
|
- 2026-06-22: `CreatorChannelDonationFragmentLayoutTest`, `CreatorChannelDonationActionTest`를 작성한 뒤 production UI 파일 추가 전 focused 테스트를 실행했다. `fragment_creator_channel_donation` 및 후원 layout/id 미존재로 `:app:compileDebugUnitTestKotlin`이 FAIL하여 RED를 확인했다. Phase 4 범위에 맞춰 전체보기는 Activity 직접 이동이 아니라 `Host.onCreatorChannelDonationRankingAllClicked()` callback 계약으로 검증했다.
|
||||||
|
|
||||||
- [ ] **Task 4.2: 후원 content layout과 adapter 구현**
|
- [x] **Task 4.2: 후원 content layout과 adapter 구현**
|
||||||
- 생성:
|
- 생성:
|
||||||
- `app/src/main/res/layout/fragment_creator_channel_donation.xml`
|
- `app/src/main/res/layout/fragment_creator_channel_donation.xml`
|
||||||
- `app/src/main/res/layout/item_creator_channel_donation_ranking.xml`
|
- `app/src/main/res/layout/item_creator_channel_donation_ranking.xml`
|
||||||
@@ -336,9 +336,9 @@
|
|||||||
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationActionTest"`
|
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationActionTest"`
|
||||||
- 기대 결과: layout/source 계약 테스트가 PASS한다.
|
- 기대 결과: layout/source 계약 테스트가 PASS한다.
|
||||||
- 검증 기록:
|
- 검증 기록:
|
||||||
- 미실행. 구현 시 기록한다.
|
- 2026-06-22: `fragment_creator_channel_donation.xml`, 랭킹/랭킹 member/후원 item layout, 랭킹 전체보기 capsule drawable, `CreatorChannelDonationAdapter`, `CreatorChannelDonationRankingAdapter`를 추가했다. Figma `290:9093`, `290:9097` 기준으로 black background, 52dp count bar, gray_900 랭킹 카드, 75dp 랭킹 프로필 grid, 전체보기 capsule, 후원 card header/profile/can badge/message를 구현했다. `./gradlew :app:mergeDebugResources`와 Phase 4 layout/source 테스트가 PASS했다.
|
||||||
|
|
||||||
- [ ] **Task 4.3: 후원 Fragment 구현**
|
- [x] **Task 4.3: 후원 Fragment 구현**
|
||||||
- 생성:
|
- 생성:
|
||||||
- `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/CreatorChannelDonationFragment.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
@@ -353,7 +353,7 @@
|
|||||||
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"`
|
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"`
|
||||||
- 기대 결과: 후원 탭 단위 테스트가 PASS한다.
|
- 기대 결과: 후원 탭 단위 테스트가 PASS한다.
|
||||||
- 검증 기록:
|
- 검증 기록:
|
||||||
- 미실행. 구현 시 기록한다.
|
- 2026-06-22: `CreatorChannelDonationFragment`를 추가해 `newInstance(creatorId)`, `Host` interface, 탭 최초 로드, refresh/loadMore/viewport entry, content adapter submit, owner floating button 숨김, 후원 요청 submit callback, pagination/action toast consume, 후원 성공 event callback을 구현했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"`가 PASS했다.
|
||||||
|
|
||||||
### Phase 5: Empty/Error/문자열 리소스 구현
|
### Phase 5: Empty/Error/문자열 리소스 구현
|
||||||
|
|
||||||
@@ -518,4 +518,7 @@
|
|||||||
|
|
||||||
## Verification Log
|
## Verification Log
|
||||||
|
|
||||||
|
- 2026-06-22: Phase 2, 3, 4 코드 리뷰 및 재검증을 수행했다. API/DTO/Repository/ViewModel 계약, mapper 정책, content layout/adapter/Fragment 흐름을 대조했으며 차단급 코드 이슈는 발견하지 않았다. `./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:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다. `:app:mergeDebugResources`는 sandbox에서 Gradle wrapper lock 파일 접근 권한 문제로 1회 실패했고, 외부 권한으로 동일 명령을 재실행해 PASS를 확인했다.
|
||||||
|
- 2026-06-22: 리뷰 지적에 따라 후원 성공 event가 `Content` 상태에 종속되지 않도록 후속 수정했다. RED로 `CreatorChannelDonationActionTest`에 `후원 fragment source는 성공 이벤트를 content 상태와 독립적으로 전달한다`를 추가했고, 기존 구현에서 `handleDonationSuccessEvent()` 부재로 FAIL하는 것을 확인했다. 이후 `CreatorChannelDonationFragment.observeViewModel()`의 상태 bind 후 공통 경로에서 `handleDonationSuccessEvent()`를 호출하도록 변경해 `Empty`, `Error`, `Content` 재조회 결과 모두 `Host.onCreatorChannelDonationCompleted()` 전달 대상이 되도록 했다. 수정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다.
|
||||||
- 2026-06-22: `docs/20260622_크리에이터_채널_후원_탭/prd.md`, `docs/agent-guides/work-plan-docs.md`, 기존 `docs/20260622_FanTalk_탭/plan-task.md` 구조를 확인해 후원 탭 구현 계획/TASK 문서를 작성했다. 이번 단계는 문서 작성만 수행했으며 구현/빌드/테스트는 실행하지 않았다.
|
- 2026-06-22: `docs/20260622_크리에이터_채널_후원_탭/prd.md`, `docs/agent-guides/work-plan-docs.md`, 기존 `docs/20260622_FanTalk_탭/plan-task.md` 구조를 확인해 후원 탭 구현 계획/TASK 문서를 작성했다. 이번 단계는 문서 작성만 수행했으며 구현/빌드/테스트는 실행하지 않았다.
|
||||||
|
- 2026-06-22: Phase 2, 3, 4 코드 리뷰 및 검증을 수행했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다. 최초 `mergeDebugResources` 병렬 실행은 Gradle wrapper lock 파일 접근 권한 문제로 실패했으나 동일 명령을 단독 재실행해 PASS를 확인했다. 리뷰 결과, 후원 성공 event가 `Content` 상태 bind 중에만 `Host.onCreatorChannelDonationCompleted()`로 전달되어 후원 성공 후 첫 페이지 재조회가 `Empty` 또는 `Error`로 끝나는 경우 홈 탭 refresh hook이 호출되지 않을 수 있는 위험을 확인했다.
|
||||||
|
|||||||
Reference in New Issue
Block a user