docs(creator): 커뮤니티 탭 Phase 5 검증을 기록한다

This commit is contained in:
2026-06-22 01:44:34 +09:00
parent a36c3b74e8
commit cb5d4f954d

View File

@@ -418,7 +418,7 @@
### Phase 5: Activity/Pager/Owner CTA/Pagination 연결 ### Phase 5: Activity/Pager/Owner CTA/Pagination 연결
- [ ] **Task 5.1: PagerAdapter에서 Community Fragment 연결** - [x] **Task 5.1: PagerAdapter에서 Community Fragment 연결**
- 수정: - 수정:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapter.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapter.kt`
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapterTest.kt` - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapterTest.kt`
@@ -429,8 +429,11 @@
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"` - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"`
- 기대 결과: - 기대 결과:
- Community 탭이 신규 Fragment로 연결됨이 검증된다. - Community 탭이 신규 Fragment로 연결됨이 검증된다.
- 검증 기록:
- 2026-06-22: RED로 `CreatorChannelPagerAdapterTest`에 Community 실제 Fragment 기대값을 먼저 추가했고, production 변경 전 `CreatorChannelPagerAdapterTest > createFragment는 Home Live Audio Series Community를 실제 Fragment로 생성하고 나머지는 placeholder를 유지한다``CreatorChannelPagerAdapterTest.kt:31` assertion으로 실패함을 확인했다.
- 2026-06-22: `CreatorChannelPagerAdapter.createFragment()``CreatorChannelTab.Community -> CreatorChannelCommunityFragment.newInstance(creatorId)` 분기를 추가하고 placeholder 기대에서 Community를 제외했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"` PASS로 Community 탭 Fragment 연결을 확인했다.
- [ ] **Task 5.2: `CreatorChannelActivity` Host 연결** - [x] **Task 5.2: `CreatorChannelActivity` Host 연결**
- 수정: - 수정:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt` - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt`
@@ -445,8 +448,11 @@
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"`
- 기대 결과: - 기대 결과:
- Community 탭 선택/스크롤/높이 갱신 source 검증이 PASS한다. - Community 탭 선택/스크롤/높이 갱신 source 검증이 PASS한다.
- 검증 기록:
- 2026-06-22: RED로 `CreatorChannelActivitySourceTest`에 Community Host/pagination/owner CTA source 계약을 먼저 추가했고, production 변경 전 `CreatorChannelActivitySourceTest > Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다``CreatorChannelActivitySourceTest.kt:455` assertion으로 실패함을 확인했다.
- 2026-06-22: `CreatorChannelActivity``CreatorChannelCommunityFragment.Host`를 구현하도록 연결하고, `findCommunityFragment()`, 탭 선택/header 변경 시 `onCreatorChannelCommunityTabSelected()`, 하단 스크롤 시 `onCreatorChannelCommunityScrolledToBottom()`, load-more 대상 포함, `onCreatorChannelCommunityContentChanged()`의 높이 갱신/추가 load-more 재평가를 추가했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"` PASS로 source 계약을 확인했다.
- [ ] **Task 5.3: Owner CTA Community 연결** - [x] **Task 5.3: Owner CTA Community 연결**
- 수정: - 수정:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
- 작업: - 작업:
@@ -459,8 +465,11 @@
- `./gradlew :app:mergeDebugResources` - `./gradlew :app:mergeDebugResources`
- 기대 결과: - 기대 결과:
- 본인 채널 Community 탭 하단 CTA 연결이 source/resource 검증으로 확인된다. - 본인 채널 Community 탭 하단 CTA 연결이 source/resource 검증으로 확인된다.
- 검증 기록:
- 2026-06-22: `currentOwnerCtaTab()`에 Community를 포함하고, Community 탭 CTA는 `ic_new_upload_community_post`/`creator_channel_owner_fab_community`를 bind하며 클릭 시 기존 `onOwnerFabCommunityClicked()`를 호출하도록 연결했다. `findCommunityFragment()?.onCreatorChannelCommunityOwnerCtaVisibilityChanged(ownerCtaTab == CreatorChannelTab.Community)` 경로도 추가해 Fragment padding 반영을 호출한다.
- 2026-06-22: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"` PASS, `./gradlew :app:mergeDebugResources` PASS로 source/resource 검증을 확인했다.
- [ ] **Task 5.4: media player 생명주기와 adapter 갱신 연결** - [x] **Task 5.4: media player 생명주기와 adapter 갱신 연결**
- 수정: - 수정:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/community/CreatorChannelCommunityFragment.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/community/CreatorChannelCommunityFragment.kt`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/community/ui/CreatorChannelCommunityListAdapter.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/community/ui/CreatorChannelCommunityListAdapter.kt`
@@ -473,6 +482,29 @@
- `./gradlew :app:compileDebugKotlin` - `./gradlew :app:compileDebugKotlin`
- 기대 결과: - 기대 결과:
- 기존 media player manager import와 호출이 컴파일된다. - 기존 media player manager import와 호출이 컴파일된다.
- 검증 기록:
- 2026-06-22: Phase 4에서 이미 구현된 `CreatorChannelCommunityFragment``CreatorCommunityMediaPlayerManager(requireContext()) { listAdapter.notifyDataSetChanged() }`, `CreatorCommunityContentItem(item.postId, audioUrl)` 기반 `toggleContent()`, adapter `isPlayingContent(postId)` icon bind, `onPause()`/`onDestroyView()` 정리 경로를 Phase 5 source test로 재확인했다. 신규 production 변경은 Activity/Pager 연결에 한정했다.
- 2026-06-22: `./gradlew :app:compileDebugKotlin` PASS로 기존 media player manager import와 호출 컴파일을 확인했다.
- [x] **Task 5.5: reviewer gate 후속 no-op Host API 제거**
- 수정:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/community/CreatorChannelCommunityFragment.kt`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt`
- 작업:
- `CreatorChannelCommunityFragment.Host`에서 실제 호출되지 않는 `postId` 기반 owner more fallback API를 제거한다.
- `CreatorChannelActivity``onCreatorChannelCommunityOwnerMoreClicked(postId: Long) = Unit` no-op 구현을 제거한다.
- 검증 명령:
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"`
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Community*"`
- `./gradlew :app:compileDebugKotlin`
- 기대 결과:
- owner more Host API가 item 기반 콜백으로 단일화되고 no-op 구현 없이 컴파일된다.
- 검증 기록:
- 2026-06-22: RED로 `CreatorChannelActivitySourceTest``onCreatorChannelCommunityOwnerMoreClicked(postId: Long)``onCreatorChannelCommunityOwnerMoreClicked(item.postId)` fallback 부재 검증을 추가했고, production 보정 전 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"``CreatorChannelActivitySourceTest.kt:481` assertion으로 실패함을 확인했다.
- 2026-06-22: `CreatorChannelCommunityFragment.Host`를 item 기반 `onCreatorChannelCommunityOwnerMoreClicked(item)` 단일 API로 정리하고, `CreatorChannelActivity``onCreatorChannelCommunityOwnerMoreClicked(postId: Long) = Unit` no-op override를 제거했다.
- 2026-06-22: 단일 GREEN으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"` PASS를 확인했다. 회귀로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Community*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.community.*"` PASS를 확인했다.
- 2026-06-22: `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check` PASS를 확인했다. 최초 Gradle 실행은 sandbox의 `~/.gradle` lock 파일 접근 제한으로 실패했으며, 사용자 승인 후 동일 명령을 재실행했다.
--- ---
@@ -576,3 +608,32 @@
- 리소스/컴파일/린트: `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck` PASS. - 리소스/컴파일/린트: `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck` PASS.
- 공백 검증: `git diff --check` PASS. - 공백 검증: `git diff --check` PASS.
- 참고: Gradle 실행 중 기존 `WeekCalendarAdapter.kt` Kotlin annotation target 경고, 기존 테스트 deprecation 경고, 기존 `.editorconfig``disabled_rules` deprecation 경고가 출력됐으나 이번 Phase 4 변경 파일의 실패는 없었다. - 참고: Gradle 실행 중 기존 `WeekCalendarAdapter.kt` Kotlin annotation target 경고, 기존 테스트 deprecation 경고, 기존 `.editorconfig``disabled_rules` deprecation 경고가 출력됐으나 이번 Phase 4 변경 파일의 실패는 없었다.
- 2026-06-22 Phase 5 검증:
- RED: `CreatorChannelPagerAdapterTest`는 production 연결 전 Community가 placeholder라 `CreatorChannelPagerAdapterTest.kt:31` assertion으로 실패했고, `CreatorChannelActivitySourceTest > Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다`는 production 연결 전 `CreatorChannelActivitySourceTest.kt:455` assertion으로 실패함을 확인했다.
- Production: `CreatorChannelPagerAdapter`에서 `CreatorChannelTab.Community``CreatorChannelCommunityFragment.newInstance(creatorId)`로 연결했다. `CreatorChannelActivity`에는 `CreatorChannelCommunityFragment.Host`, `findCommunityFragment()`, 탭 선택/header 변경 최초 로드, nested scroll pagination, content changed 높이 갱신/추가 load-more 재평가, Community owner CTA icon/text/click/padding callback 연결을 추가했다.
- GREEN: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"` PASS, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"` PASS.
- 회귀: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Community*"` PASS, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"` PASS. 기존 `tab source는 기존 custom tab no op 정책을 제거한다`의 Community 부재 assertion은 Phase 5 목표와 충돌해 제거했다.
- 리소스/컴파일/린트: `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check` PASS. `ktlintCheck`는 신규 source test의 긴 assertion formatting-only 수정 후 PASS했다.
- 참고: 초반 병렬 Gradle 실행으로 `app/build/kspCaches/debugUnitTest` KSP cache corruption과 Kotlin daemon 충돌이 발생했다. 생성 캐시 `app/build/kspCaches/debugUnitTest`를 제거하고 `./gradlew --stop` 후 순차 재실행해 동일 테스트가 PASS함을 확인했다.
- 2026-06-22 Phase 5 reviewer gate 수정 및 재검증:
- 초기 결과: reviewer gate가 `CreatorChannelActivity.onCreatorChannelCommunityOwnerMoreClicked(item)``onClickPin`/`onClickModify`/`onClickDelete` no-op 콜백을 차단 이슈로 FAIL했다. 이는 기존 `CreatorCommunityPostMenuBottomSheetDialog` 수정/삭제/고정/고정 해제 정책을 따른다는 Phase 1.3/Phase 5 요구사항과 충돌하는 것으로 확인했다.
- RED: `CreatorChannelActivitySourceTest`에 owner more callback no-op 방지 검증을 추가했고, production 보정 전 `CreatorChannelActivitySourceTest.kt:473` assertion으로 실패함을 확인했다.
- 수정 기록: `CreatorChannelActivity`에 기존 `CreatorCommunityAllViewModel`을 주입해 `updateCommunityPostFixed(item.postId, !item.isPinned)`, `CreatorCommunityModifyActivity` 결과 launcher, delete 확인 `SodaDialog``deleteCommunityPostList(postId = item.postId)`를 연결했다. write/modify/pin/delete 성공 후 현재 Community Fragment가 `onCreatorChannelCommunityRefreshRequested()`로 첫 페이지를 재조회하도록 `CreatorChannelCommunityFragment`/`CreatorChannelCommunityViewModel` refresh entry를 추가했다.
- 후속 reviewer 결과: pin/delete 성공 후 refresh가 기존 `CreatorCommunityAllViewModel.communityPostListLiveData` emit에 의존하면 빈 목록 성공 시 최신 화면 갱신이 누락될 수 있다는 차단 이슈를 확인했다. 또한 레거시 코드는 수정하지 않는다는 작업 원칙에 따라 `CreatorCommunityAllViewModel` 변경을 제거했다.
- 최종 수정 기록: `CreatorChannelActivity`에서 기존 레거시 ViewModel을 수정/주입하지 않고 `CreatorCommunityRepository`를 직접 호출해 고정/고정 해제와 삭제 요청을 수행한다. 성공 응답에서는 즉시 `findCommunityFragment()?.onCreatorChannelCommunityRefreshRequested()`를 호출해 마지막 게시글 삭제처럼 빈 목록이 되는 경우에도 Community 탭이 자체 first page refresh를 수행하도록 보정했다. 수정 진입은 기존 `CreatorCommunityModifyActivity`를 호출만 하며, 결과 성공 시 동일 refresh entry를 호출한다.
- GREEN: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"` PASS.
- 회귀: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Community*"` PASS, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"` PASS.
- 리소스/컴파일/whitespace: `./gradlew :app:mergeDebugResources` PASS, `./gradlew :app:compileDebugKotlin` PASS, `git diff --check` PASS.
- 린트 참고: `./gradlew :app:ktlintCheck`는 현재 diff가 없는 레거시 `CreatorCommunityAllViewModel.kt`의 기존 package underscore/indentation 위반으로 FAIL했다. 사용자 지침에 따라 레거시 파일은 수정하지 않았고, `GIT_MASTER=1 git diff -- app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/creator_community/all/CreatorCommunityAllViewModel.kt` 결과 변경 없음으로 확인했다.
- 최종 reviewer gate: Phase 5 변경, owner more callback, pin/delete 성공 refresh, 레거시 `CreatorCommunityAllViewModel.kt` 미수정 상태, 레거시 ktlint 실패 범위 문서화를 재검토했고 PASS를 확인했다.
- 2026-06-22 Phase 5 후속 no-op Host API 제거 및 최종 검증:
- 코드 리뷰: `CreatorChannelCommunityFragment.Host`에 실제 호출 경로가 item 기반으로 전환된 뒤에도 `postId` fallback API가 남아 있고, `CreatorChannelActivity`가 이를 no-op으로 구현하는 불필요한 확장 지점을 확인했다. owner more는 `CreatorChannelCommunityPostUiModel``isPinned` 등 item 상태가 필요하므로 item 기반 콜백 하나로 단일화하는 것이 Phase 5 요구사항에 더 맞다고 판단했다.
- RED: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"`는 production 보정 전 `CreatorChannelActivitySourceTest.kt:481` assertion으로 실패함을 확인했다.
- 수정 기록: `CreatorChannelCommunityFragment.Host``onCreatorChannelCommunityOwnerMoreClicked(postId: Long)` fallback API와 `CreatorChannelActivity`의 no-op override를 제거했고, source test에 no-op/fallback 부재 검증을 추가했다.
- GREEN: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"` PASS.
- 회귀: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Community*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.community.*"` PASS.
- 리소스/컴파일/린트/공백: `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check` PASS.
- 참고: 첫 Gradle 실행은 sandbox의 `~/.gradle` lock 파일 접근 제한으로 실패했고, 사용자 승인 후 같은 테스트를 재실행해 RED/GREEN을 확인했다. 이번 최종 `ktlintCheck`는 PASS했으며 `.editorconfig disabled_rules` deprecation 경고만 출력됐다.