From 3dcc48c9d9a88918094ac3d393f81b68a5d1816e Mon Sep 17 00:00:00 2001 From: klaus Date: Sat, 20 Jun 2026 02:53:43 +0900 Subject: [PATCH] =?UTF-8?q?docs(creator):=20=EC=8B=9C=EB=A6=AC=EC=A6=88=20?= =?UTF-8?q?=ED=83=AD=20Phase=202=EC=99=80=203=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=EC=9D=84=20=EA=B8=B0=EB=A1=9D=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan-task.md | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/docs/20260620_크리에이터_채널_시리즈_탭/plan-task.md b/docs/20260620_크리에이터_채널_시리즈_탭/plan-task.md index 20059a77..0460c172 100644 --- a/docs/20260620_크리에이터_채널_시리즈_탭/plan-task.md +++ b/docs/20260620_크리에이터_채널_시리즈_탭/plan-task.md @@ -184,7 +184,7 @@ ### 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/series/data/CreatorChannelSeriesTabResponse.kt` - 작업: @@ -197,9 +197,10 @@ - 기대 결과: - 신규 DTO 추가 후 컴파일이 PASS한다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 구현: `CreatorChannelSeriesTabResponse`, `CreatorChannelSeriesResponse`를 `series/data` package에 추가하고 `ContentSort`, `coverImageUrl`, pagination field, progress nullable field를 포함했다. + - 2026-06-20 검증: `./gradlew --no-daemon :app:compileDebugKotlin` PASS. -- [ ] **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/CreatorChannelRepository.kt` @@ -212,9 +213,10 @@ - 기대 결과: - API/Repository 추가 후 기존 Koin graph와 충돌 없이 컴파일된다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 구현: `CreatorChannelApi.getSeries()`에 `GET /api/v2/creator-channels/{creatorId}/series` endpoint와 `page`, `size`, `sort`, `Authorization` 전달을 추가하고, `CreatorChannelRepository.getSeries(creatorId, page, size, sort, token)` 위임 method를 추가했다. + - 2026-06-20 검증: `./gradlew --no-daemon :app:compileDebugKotlin` PASS. -- [ ] **Task 2.3: ViewModel RED 테스트 작성** +- [x] **Task 2.3: ViewModel RED 테스트 작성** - 생성: - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/series/CreatorChannelSeriesViewModelTest.kt` - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/series/CreatorChannelSeriesPaginationTest.kt` @@ -238,9 +240,10 @@ - 기대 결과: - production 구현 전 `CreatorChannelSeriesViewModel` 미구현으로 RED 실패한다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 기록: ULTRAWORK TDD 순서상 RED 테스트가 먼저 필요했으나, 실제 작업에서는 production skeleton이 먼저 추가되어 production 미구현 RED는 별도로 확보하지 못했다. 이후 동일 범위 내에서 `CreatorChannelSeriesViewModelTest`, `CreatorChannelSeriesPaginationTest`를 추가해 최초 로드/정렬/empty/progress/pagination/stale response 계약을 고정했다. + - 2026-06-20 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"` PASS. -- [ ] **Task 2.4: `CreatorChannelSeriesViewModel` 구현** +- [x] **Task 2.4: `CreatorChannelSeriesViewModel` 구현** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/series/CreatorChannelSeriesViewModel.kt` - 수정: @@ -260,13 +263,14 @@ - 기대 결과: - ViewModel 테스트가 GREEN이다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 구현: `CreatorChannelSeriesViewModel`을 추가하고 `loadSeries`, `changeSort`, `retrySeries`, `loadMore`, `consumePaginationErrorMessage`, `requestGeneration`, `DEFAULT_PAGE_SIZE=20` 상태 관리를 오디오 탭 패턴에 맞춰 구현했다. `AppDI`에 `CreatorChannelSeriesViewModel` Koin binding을 추가했다. + - 2026-06-20 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"` PASS. --- ### Phase 3: Mapper/UI model 계약 추가 -- [ ] **Task 3.1: Mapper RED 테스트 작성** +- [x] **Task 3.1: Mapper RED 테스트 작성** - 생성: - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/series/CreatorChannelSeriesMapperTest.kt` - 테스트 케이스: @@ -285,9 +289,10 @@ - 기대 결과: - production mapper 미구현으로 RED 실패한다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 기록: ULTRAWORK TDD 순서상 RED 테스트가 먼저 필요했으나, 실제 작업에서는 mapper production 파일이 먼저 추가되어 production 미구현 RED는 별도로 확보하지 못했다. 이후 `CreatorChannelSeriesMapperTest`를 추가해 subtitle, original/adult flag, owner별 progress, partial-null progress, progressScale clamp, blank title 제외 계약을 고정했다. + - 2026-06-20 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"` PASS. -- [ ] **Task 3.2: UI model과 mapper 구현** +- [x] **Task 3.2: UI model과 mapper 구현** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/series/model/CreatorChannelSeriesUiModels.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/series/model/CreatorChannelSeriesMappers.kt` @@ -303,7 +308,8 @@ - 기대 결과: - Mapper 테스트가 GREEN이다. - 검증 기록: - - 구현 시 기록한다. + - 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. --- @@ -536,3 +542,9 @@ ## Verification Log - 구현 완료 후 여러 Phase에 걸친 통합 검증, 회귀 검증, 최종 수동 확인 기록을 이 섹션에 누적한다. +- 2026-06-20 코드 리뷰: Phase 2/3 범위의 API/DTO/Repository/ViewModel/mapper/UI model/test 코드를 검토했으며, 즉시 수정이 필요한 결함은 발견하지 못했다. +- 2026-06-20 검증: 최초 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"` 실행은 sandbox의 `~/.gradle` lock 파일 접근 제한으로 실패했고, escalated 재실행 결과 PASS. +- 2026-06-20 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Series*"` PASS. 테스트 리포트 기준 `CreatorChannelSeriesViewModelTest` 8건, `CreatorChannelSeriesPaginationTest` 5건, `CreatorChannelSeriesMapperTest` 11건 모두 failures/errors/skipped 0. +- 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.