docs(creator): 시리즈 탭 구현 검증을 기록한다

This commit is contained in:
2026-06-20 04:50:50 +09:00
parent 015a6ac865
commit a2dba0456b

View File

@@ -310,12 +310,15 @@
- 검증 기록:
- 2026-06-20 구현: `CreatorChannelSeriesItemUiModel`, `CreatorChannelSeriesProgressUiModel`, `toSeriesItemUiModels(isOwner)` mapper를 추가했다. subtitle은 blank segment를 제외하고 ` • `로 join하며, progress는 owner이거나 nullable field가 누락되면 생성하지 않고 `purchasedPaidContentRate / 100f`를 0f..1f로 clamp한다.
- 2026-06-20 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"` PASS.
- 2026-06-20 후속 수정: mapper가 subtitle을 한국어 문자열(`총 n화`, `연재`, `완결`)로 직접 조합하던 문제를 수정했다. `CreatorChannelSeriesSubtitleUiModel``publishedDaysOfWeek`, `contentCount`, `isProceeding` 조각 데이터를 유지하고, Adapter bind 시점에 다국어 string resource로 subtitle을 조합하도록 변경했다.
- 2026-06-20 후속 RED 확인: mapper/layout 테스트 기대값을 subtitle 조각 모델과 resource 기반 bind 계약으로 변경한 뒤 production 수정 전 `item.subtitle``String`이라 `isProceeding`, `contentCount`, `publishedDaysOfWeek` 접근 컴파일 오류가 발생함을 확인했다.
- 2026-06-20 후속 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.CreatorChannelSeriesMapperTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.CreatorChannelSeriesFragmentLayoutTest"` PASS.
---
### Phase 4: Fragment, Adapter, XML UI 구현
- [ ] **Task 4.1: Fragment/Layout RED 테스트 작성**
- [x] **Task 4.1: Fragment/Layout RED 테스트 작성**
- 생성:
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/series/CreatorChannelSeriesFragmentLayoutTest.kt`
- 테스트 케이스:
@@ -330,9 +333,10 @@
- 기대 결과:
- layout/string 미구현으로 RED 실패한다.
- 검증 기록:
- 구현 시 기록한다.
- 2026-06-20 RED 확인: `CreatorChannelSeriesFragmentLayoutTest`를 추가하고 실행했을 때 `CreatorChannelSeriesFragment`, `fragment_creator_channel_series`, `item_creator_channel_series` 및 관련 view id 미구현으로 `compileDebugUnitTestKotlin`이 실패했다.
- 2026-06-20 GREEN 확인: layout/string/Fragment/Adapter 구현 후 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.CreatorChannelSeriesFragmentLayoutTest"` PASS.
- [ ] **Task 4.2: 문자열 리소스 추가**
- [x] **Task 4.2: 문자열 리소스 추가**
- 수정:
- `app/src/main/res/values/strings.xml`
- `app/src/main/res/values-en/strings.xml`
@@ -346,9 +350,10 @@
- 기대 결과:
- 신규 문자열 리소스 병합이 PASS한다.
- 검증 기록:
- 구현 시 기록한다.
- 2026-06-20 구현: `creator_channel_series_empty_message`, error/retry/status/total/progress 문자열을 한국어/영어/일본어 리소스에 추가했다.
- 2026-06-20 검증: `./gradlew --no-daemon :app:mergeDebugResources` PASS.
- [ ] **Task 4.3: 시리즈 탭 fragment layout 작성**
- [x] **Task 4.3: 시리즈 탭 fragment layout 작성**
- 생성:
- `app/src/main/res/layout/fragment_creator_channel_series.xml`
- 작업:
@@ -363,9 +368,10 @@
- 기대 결과:
- ViewBinding `FragmentCreatorChannelSeriesBinding`이 생성된다.
- 검증 기록:
- 구현 시 기록한다.
- 2026-06-20 구현: `fragment_creator_channel_series.xml`에 sort bar, total count, sort label/icon, RecyclerView, empty/error/retry 영역을 추가했다.
- 2026-06-20 검증: `./gradlew --no-daemon :app:mergeDebugResources` PASS, `FragmentCreatorChannelSeriesBinding` 생성 후 `./gradlew --no-daemon :app:compileDebugKotlin` PASS.
- [ ] **Task 4.4: 시리즈 item layout 작성**
- [x] **Task 4.4: 시리즈 item layout 작성**
- 생성:
- `app/src/main/res/layout/item_creator_channel_series.xml`
- 작업:
@@ -382,9 +388,10 @@
- 기대 결과:
- ViewBinding `ItemCreatorChannelSeriesBinding`이 생성된다.
- 검증 기록:
- 구현 시 기록한다.
- 2026-06-20 구현: `item_creator_channel_series.xml`에 122dp x 172dp thumbnail, wrap-content original tag, adult badge, title/subtitle, progress count/percent/fill을 추가하고 우측 `전체소장`/play button 영역은 제외했다.
- 2026-06-20 검증: 최초 `./gradlew --no-daemon :app:compileDebugKotlin`은 존재하지 않는 `@dimen/spacing_2` 참조로 실패했고, `2dp`로 수정 후 PASS.
- [ ] **Task 4.5: Adapter 구현**
- [x] **Task 4.5: Adapter 구현**
- 생성:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/series/ui/CreatorChannelSeriesAdapter.kt`
- 작업:
@@ -399,9 +406,10 @@
- 기대 결과:
- Adapter 컴파일이 PASS한다.
- 검증 기록:
- 구현 시 기록한다.
- 2026-06-20 구현: `CreatorChannelSeriesAdapter`를 추가하고 `submitItems`, item click, title/subtitle/image/original/adult/progress binding, thumbnail radius outline 처리를 구현했다.
- 2026-06-20 검증: `./gradlew --no-daemon :app:compileDebugKotlin` PASS.
- [ ] **Task 4.6: Fragment 구현**
- [x] **Task 4.6: Fragment 구현**
- 생성:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/series/CreatorChannelSeriesFragment.kt`
- 작업:
@@ -421,13 +429,14 @@
- 기대 결과:
- Fragment layout 테스트와 Kotlin 컴파일이 PASS한다.
- 검증 기록:
- 구현 시 기록한다.
- 2026-06-20 구현: `CreatorChannelSeriesFragment`를 추가하고 `newInstance(creatorId)`, `Host`, sort popup, `loadSeries`, `loadMore`, retry, state별 visibility, pagination error toast/consume, content layout key 변경 감지를 구현했다.
- 2026-06-20 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.CreatorChannelSeriesFragmentLayoutTest"` PASS, `./gradlew --no-daemon :app:compileDebugKotlin` PASS.
---
### Phase 5: 채널 탭 연결과 Activity 통합
- [ ] **Task 5.1: PagerAdapter RED 테스트 수정**
- [x] **Task 5.1: PagerAdapter RED 테스트 수정**
- 수정:
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapterTest.kt`
- 작업:
@@ -438,9 +447,10 @@
- 기대 결과:
- production 연결 전 RED 실패한다.
- 검증 기록:
- 구현 시 기록한다.
- 2026-06-20 RED 확인: `CreatorChannelPagerAdapterTest`에 Series 탭이 `CreatorChannelSeriesFragment`를 생성해야 한다는 기대를 추가했고, production 연결 전 `CreatorChannelSeriesFragment` 미구현으로 컴파일 실패했다.
- 2026-06-20 GREEN 확인: PagerAdapter 연결 후 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"` PASS.
- [ ] **Task 5.2: PagerAdapter Series 연결**
- [x] **Task 5.2: PagerAdapter Series 연결**
- 수정:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapter.kt`
- 작업:
@@ -450,9 +460,10 @@
- 기대 결과:
- PagerAdapter 테스트가 GREEN이다.
- 검증 기록:
- 구현 시 기록한다.
- 2026-06-20 구현: `CreatorChannelPagerAdapter.createFragment()``CreatorChannelTab.Series -> CreatorChannelSeriesFragment.newInstance(creatorId)` 분기를 추가했다.
- 2026-06-20 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"` PASS.
- [ ] **Task 5.3: Activity source RED 테스트 수정**
- [x] **Task 5.3: Activity source RED 테스트 수정**
- 수정:
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt`
- 작업:
@@ -466,9 +477,10 @@
- 기대 결과:
- production 연결 전 RED 실패한다.
- 검증 기록:
- 구현 시 기록한다.
- 2026-06-20 RED 확인: `CreatorChannelActivitySourceTest`에 Series Host, tab selected load, load-more, viewport, content changed, detail navigation 계약을 추가했고, production 연결 전 관련 source 문자열 미구현으로 실패하도록 고정했다.
- 2026-06-20 GREEN 확인: Activity 연결 후 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` PASS.
- [ ] **Task 5.4: Activity Series 통합**
- [x] **Task 5.4: Activity Series 통합**
- 수정:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
- 작업:
@@ -488,7 +500,8 @@
- 기대 결과:
- Activity source 테스트와 Kotlin 컴파일이 PASS한다.
- 검증 기록:
- 구현 시 기록한다.
- 2026-06-20 구현: `CreatorChannelActivity``CreatorChannelSeriesFragment.Host`를 구현하도록 연결하고, `findSeriesFragment()`, tab selected/header changed load, load-more 분기, viewport callback, content changed callback, `SeriesDetailActivity` 이동을 추가했다.
- 2026-06-20 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` PASS, `./gradlew --no-daemon :app:compileDebugKotlin` PASS.
---
@@ -548,3 +561,19 @@
- 2026-06-20 검증: `./gradlew --no-daemon :app:compileDebugKotlin` PASS.
- 2026-06-20 검증: `./gradlew --no-daemon :app:ktlintCheck` PASS.
- 2026-06-20 검증: `git diff --check` PASS.
- 2026-06-20 Phase 4/5 RED: 신규 `CreatorChannelSeriesFragmentLayoutTest`, `CreatorChannelPagerAdapterTest`, `CreatorChannelActivitySourceTest` 기대값 추가 후 production 미구현 상태에서 `CreatorChannelSeriesFragment`, 신규 layout/id 미존재로 테스트 컴파일 실패를 확인했다. 병렬 Gradle 실행 중 Kotlin cache lock/EOF 오류가 함께 발생해 이후 검증은 순차 실행으로 진행했다.
- 2026-06-20 Phase 4/5 구현: `CreatorChannelSeriesFragment`, `CreatorChannelSeriesAdapter`, fragment/item XML, 다국어 문자열, PagerAdapter Series 분기, Activity Series Host/load-more/viewport/navigation 연결을 추가했다.
- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.CreatorChannelSeriesFragmentLayoutTest"` PASS.
- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"` PASS.
- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` PASS.
- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"` PASS.
- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Series*"` PASS.
- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"` PASS.
- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:mergeDebugResources` PASS, `./gradlew --no-daemon :app:compileDebugKotlin` PASS, `./gradlew --no-daemon :app:ktlintCheck` PASS, `git diff --check` PASS.
- 2026-06-20 후속 수정 검증: Series item subtitle의 locale 고정 문제를 해결하기 위해 mapper는 subtitle 조각 데이터만 생성하고 Adapter가 `creator_channel_series_subtitle_content_count`, `creator_channel_series_status_proceeding`, `creator_channel_series_status_completed` resource로 subtitle을 조합하도록 변경했다.
- 2026-06-20 후속 수정 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"` PASS.
- 2026-06-20 후속 수정 검증: `./gradlew --no-daemon :app:mergeDebugResources` PASS, `./gradlew --no-daemon :app:compileDebugKotlin` PASS, `./gradlew --no-daemon :app:ktlintCheck` PASS, `git diff --check` PASS.
- 2026-06-20 Phase 4/5 코드 리뷰: `CreatorChannelSeriesFragment`, `CreatorChannelSeriesAdapter`, fragment/item XML, PagerAdapter/Activity 연결부를 검토했다. 발견 사항: `CreatorChannelSeriesMappers.kt`에서 subtitle의 `총 n화`, `연재`, `완결` 문구가 Kotlin 상수/문자열로 고정되어 있어 Phase 4에서 추가한 영어/일본어 상태 문자열이 사용되지 않는다.
- 2026-06-20 Phase 4/5 재검증: sandbox 실행은 `~/.gradle` lock 접근 제한으로 실패했고, escalated 순차 실행으로 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"`, `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Series*"`, `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew --no-daemon :app:mergeDebugResources`, `./gradlew --no-daemon :app:compileDebugKotlin`, `./gradlew --no-daemon :app:ktlintCheck`, `git diff --check` 모두 PASS.
- 2026-06-20 Phase 4/5 코드 리뷰 및 검증: Figma `290:9031`, `290:9036`, `290:9038``CreatorChannelSeriesFragment`, `CreatorChannelSeriesAdapter`, fragment/item XML, PagerAdapter/Activity 연결부를 재검토했다. PRD에서 제거하기로 한 우측 `전체소장`/play 영역 제외는 의도된 차이로 확인했고, 즉시 수정이 필요한 결함은 발견하지 못했다.
- 2026-06-20 Phase 4/5 코드 리뷰 및 검증: 최초 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"` sandbox 실행은 `~/.gradle` lock 접근 제한으로 실패했다. escalated 순차 실행으로 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"`, `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Series*"`, `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew --no-daemon :app:mergeDebugResources`, `./gradlew --no-daemon :app:compileDebugKotlin`, `./gradlew --no-daemon :app:ktlintCheck`, `git diff --check` 모두 PASS.