Files
sodalive-android/docs/20260611_크리에이터_채널_홈_탭/plan-task.md

44 KiB

크리에이터 채널 홈 탭 구현 계획/TASK

For agentic workers: 구현 시 superpowers:subagent-driven-development 또는 superpowers:executing-plans를 사용해 task 단위로 진행한다. 각 단계는 체크박스(- [ ])로 추적하고, 완료 즉시 - [x]로 갱신한다.

Goal: GET /api/v2/creator-channels/{creatorId}/home 응답을 기반으로 크리에이터 채널 신규 페이지의 상단 구성과 탭 컨텐츠를 표시한다.

Architecture: 신규 화면은 kr.co.vividnext.sodalive.v2.creator.channel 하위에 Activity, ViewModel, data/model/ui 패키지를 두고 기존 Retrofit + RxJava3 + ApiResponse<T> + Koin 패턴을 따른다. RecommendedActivityType은 홈 추천 전용 이름을 제거해 공용 CreatorActivityType으로 이동하고, 홈 추천과 크리에이터 채널 홈이 같은 타입을 참조하게 한다. UI는 Android XML Views/ViewBinding 기반으로 구성하고, 홈 탭 외 다른 탭 상세 화면은 이번 범위에서 연결하지 않는다.

Tech Stack: Kotlin, Android XML Views, ViewBinding, RecyclerView/NestedScroll, Retrofit, Gson, RxJava3, Koin, JUnit4/Robolectric local unit test.


전제와 성공 기준

  • PRD: docs/20260611_크리에이터_채널_홈_탭/prd.md
  • Figma 전체 페이지: 296:14890
  • 크리에이터 이미지 영역: 296:14892
  • title-bar 상태별 Figma:
    • 팔로우 상태가 아님: 296:14287
    • 팔로우 중 + 알림 받기 중: 296:14288
    • 팔로우 중 + 알림 받기 중이 아님: 296:14289
  • 이번 범위는 크리에이터 채널 전체 구성과 탭에 한정한다.
  • tab-bar 목록은 , 라이브, 오디오, 시리즈, 커뮤니티, 팬Talk, 후원 순서를 따른다.
  • 라이브, 오디오, 시리즈, 커뮤니티, 팬Talk, 후원 탭의 상세 컨텐츠와 pagination은 구현하지 않는다.
  • 홈 API는 GET /api/v2/creator-channels/{creatorId}/home을 사용한다.
  • 팔로우/알림 변경은 기존 UserRepository.creatorFollow()CreatorFollowNotifyFragment 사용 패턴을 재사용한다.
  • 대화하기TalkApi.createChatRoom 호출 후 반환된 chatRoomIdChatRoomActivity, DM 보내기DmChatRoomActivity.newIntentByCreatorId()로 이동한다.
  • title-bar black 전환 기준은 title-bar와 tab-bar의 실제 거리 및 프로필 이미지가 절반 이상 사라졌는지를 함께 사용한다.
  • 구현 완료 후 최소 다음 명령을 실행한다.
    • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.common.*"
    • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"
    • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*"
    • ./gradlew :app:mergeDebugResources
    • ./gradlew :app:compileDebugKotlin
    • ./gradlew :app:ktlintCheck

Figma 참조 필요 Phase

  • Phase 1: 부분 참조
    • 구현 범위 확인 시 PRD의 Figma 노드 기준만 확인한다.
    • 실제 치수/레이어 구현 판단은 하지 않는다.
  • Phase 2: Figma 참조 불필요
    • CreatorActivityType 공용화는 서버 타입/기존 홈 추천 타입 정리 작업이다.
  • Phase 3: Figma 참조 불필요
    • API/DTO/Repository는 서버 계약과 기존 네트워크 패턴만 따른다.
  • Phase 4: 부분 참조
    • CreatorChannelHomeSection 순서와 section 표시 여부를 Figma 296:14890 홈 구성 기준으로 맞출 때 참조한다.
    • title-bar 아이콘 상태 자체는 PRD와 리소스명으로 검증 가능하지만, 우측 액션 배치 우선순위는 Figma 상태별 노드 296:14287, 296:14288, 296:14289를 확인한다.
  • Phase 5: 필수 참조
    • activity_creator_channel_home.xml, title-bar overlay, 크리에이터 이미지 영역, 버튼 영역 보존/중앙 정렬, tab-bar 배치, 홈 section item layout은 Figma 296:14890, 296:14892, 296:14287, 296:14288, 296:14289를 기준으로 구현한다.
  • Phase 6: 필수 참조
    • sticky tab-bar 위치, title-bar와 tab-bar가 가까워지는 시점, 프로필 이미지가 절반 이상 사라지는 기준을 실제 화면 배치와 비교해야 하므로 Figma 296:14890296:14892를 참조한다.
  • Phase 7: 부분 참조
    • 팔로우/알림 API 연결은 Figma가 필요 없지만, tab-bar 7개 항목의 시각 표시와 title-bar 아이콘 click target 배치는 Figma 기준을 확인한다.
  • Phase 8: 필수 참조
    • 수동 화면 검증은 Figma와 실제 구현 화면을 비교해 PRD Metrics를 확인한다.

파일 구조

  • 생성: app/src/main/java/kr/co/vividnext/sodalive/v2/common/CreatorActivityType.kt
    • 기존 RecommendedActivityType을 대체하는 공용 활동 타입을 정의한다.
  • 수정/삭제 후보: app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/RecommendedActivityType.kt
    • 공용 타입 이동 후 기존 파일은 제거하거나 호환 alias가 반드시 필요한 경우 최소 범위로 남긴다.
  • 수정: app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationMappers.kt
    • RecommendedActivityType 참조를 CreatorActivityType으로 변경한다.
  • 수정: app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiModels.kt
    • 최근 활동 크리에이터 UI 모델의 타입을 공용 CreatorActivityType으로 변경한다.
  • 수정: app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/RecommendedActivityTypeTest.kt
    • 테스트명을 유지하거나 CreatorActivityTypeTest로 이동해 공용 타입 검증으로 변경한다.
  • 생성: app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivity.kt
    • 크리에이터 채널 홈 화면, intent 진입, edge-to-edge/inset, title/tab scroll, click 연결을 담당한다.
  • 생성: app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeViewModel.kt
    • 홈 API 호출, 팔로우/알림 변경, loading/error/content 상태를 관리한다.
  • 생성: app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeApi.kt
    • GET /api/v2/creator-channels/{creatorId}/home endpoint를 정의한다.
  • 생성: app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeModels.kt
    • PRD의 서버 DTO를 Android DTO로 정의한다.
  • 생성: app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeRepository.kt
    • 홈 API, 기존 크리에이터 팔로우 API, 기존 TalkApi.createChatRoom 호출을 ViewModel에 제공한다.
  • 생성: app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelHomeUiModels.kt
    • 화면 상태, tab 항목, header/action/home section UI model을 정의한다.
  • 생성: app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelHomeMappers.kt
    • API 응답을 UI model로 변환한다.
  • 생성: app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelTitleBarState.kt
    • 팔로우/알림 조합별 title-bar 아이콘 상태와 버튼 표시 상태를 순수 모델로 정의한다.
  • 생성: app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelScrollState.kt
    • title-bar black 전환과 tab-bar sticky 기준을 순수 함수로 계산한다.
  • 생성: app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt
    • 홈 탭 section 목록을 RecyclerView로 표시한다.
  • 생성 후보: app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelTabAdapter.kt
    • 기존 TextTabBarView로 7개 탭 표시가 어렵거나 Figma tab-bar와 맞지 않을 때만 추가한다.
  • 생성: app/src/main/res/layout/activity_creator_channel_home.xml
    • 크리에이터 이미지 영역, title-bar, tab-bar, 홈 컨텐츠 RecyclerView를 포함한 화면 레이아웃이다.
  • 생성: app/src/main/res/layout/item_creator_channel_home_*.xml
    • 홈 탭 섹션별 item layout을 필요한 만큼 추가한다.
  • 수정: app/src/main/AndroidManifest.xml
    • CreatorChannelHomeActivity를 등록한다.
  • 수정: app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt
    • 신규 API, Repository, ViewModel을 Koin에 등록한다.
  • 테스트 생성/수정:
    • 생성: app/src/test/java/kr/co/vividnext/sodalive/v2/common/CreatorActivityTypeTest.kt
    • 생성: app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeMapperTest.kt
    • 생성: app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelTitleBarStateTest.kt
    • 생성: app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelScrollStateTest.kt
    • 생성: app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeViewModelTest.kt
    • 생성: app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivitySourceTest.kt

Phase 1: 기존 구조 확인과 작업 경계 고정

  • Task 1.1: 기존 v2 홈/채팅/팔로우 구조 확인

    • 확인:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/data/HomeRecommendationApi.kt
      • app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeRecommendationViewModel.kt
      • app/src/main/java/kr/co/vividnext/sodalive/user/UserRepository.kt
      • app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/CreatorFollowNotifyFragment.kt
      • app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatRoomActivity.kt
      • app/src/main/java/kr/co/vividnext/sodalive/chat/talk/TalkApi.kt
      • app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/CreateChatRoomRequest.kt
      • app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/CreateChatRoomResponse.kt
      • app/src/main/java/kr/co/vividnext/sodalive/chat/character/detail/detail/CharacterDetailViewModel.kt
      • app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/dm/DmChatRoomActivity.kt
      • app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt
    • 검증:
      • REST는 Retrofit + RxJava3 + ApiResponse<T> 패턴을 따른다.
      • AI 채팅 이동은 TalkApi.createChatRoom(CreateChatRoomRequest(characterId)) 호출 후 CreateChatRoomResponse.chatRoomId를 받아 ChatRoomActivity.newIntent(context, roomId)로 이동하는 패턴을 따른다.
      • DM 이동은 DmChatRoomActivity.newIntentByCreatorId(context, creatorId)를 사용할 수 있음을 확인한다.
      • 팔로우/알림 변경은 UserRepository.creatorFollow(creatorId, follow, notify, token)를 재사용할 수 있음을 확인한다.
  • Task 1.2: 구현 제외 범위 재확인

    • 확인:
      • docs/20260611_크리에이터_채널_홈_탭/prd.md
    • 제외:
      • 라이브, 오디오, 시리즈, 커뮤니티, 팬Talk, 후원 탭 상세 화면
      • 홈 탭 pagination
      • 신규 팔로우/알림 API
      • ChatRoomActivity, DmChatRoomActivity 내부 동작 변경
      • 별도 analytics/logging
    • 검증:
      • 이후 Phase의 모든 Task가 위 제외 범위를 침범하지 않는지 확인한다.

Phase 2: CreatorActivityType 공용화

  • Task 2.1: 공용 활동 타입 RED 테스트 작성

    • 생성:
      • app/src/test/java/kr/co/vividnext/sodalive/v2/common/CreatorActivityTypeTest.kt
    • 수정:
      • app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/RecommendedActivityTypeTest.kt
    • 작업:
      • LIVE, LIVE_REPLAY, AUDIO, COMMUNITY가 대소문자 무시로 파싱되는지 검증한다.
      • 각 타입의 label resource가 기존 RecommendedActivityType과 동일한지 검증한다.
      • 알 수 없는 code는 null을 반환하는지 검증한다.
      • 대소문자 무시 파싱은 홈 추천 등 클라이언트 helper 호환성 검증이며, 크리에이터 채널 홈 API의 서버 enum 계약은 대문자 code만 내려오는 것으로 본다.
    • 검증 명령:
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.common.CreatorActivityTypeTest"
    • 기대 결과:
      • 공용 타입 미구현으로 RED 실패한다.
  • Task 2.2: CreatorActivityType 생성 및 홈 추천 참조 변경

    • 생성:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/common/CreatorActivityType.kt
    • 수정:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationMappers.kt
      • app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiModels.kt
      • app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt
    • 삭제 후보:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/RecommendedActivityType.kt
    • 작업:
      • 기존 enum 값과 code, labelResId를 그대로 유지해 CreatorActivityType을 생성한다.
      • HomeRecommendationRecentlyActiveCreatorUiModel.activityType 타입을 CreatorActivityType?으로 변경한다.
      • HomeRecommendationMappers.kt의 parser helper 이름은 toCreatorActivityTypeLabelRes()로 변경하거나, 기존 테스트 호환을 위해 같은 파일 안에서 최소 alias만 유지한다.
      • 홈 추천 테스트의 import와 enum 참조를 CreatorActivityType으로 변경한다.
    • 검증 명령:
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.common.CreatorActivityTypeTest"
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*"
    • 기대 결과:
      • 공용 타입 테스트와 기존 홈 추천 테스트가 PASS한다.

Phase 3: 크리에이터 채널 홈 API/DTO/Repository 추가

  • Task 3.1: API DTO와 endpoint 정의

    • 생성:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeApi.kt
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeModels.kt
    • 작업:
      • PRD의 CreatorChannelHomeResponse와 하위 DTO를 모두 @Keep, @SerializedName 기반 data class로 추가한다.
      • CreatorChannelCreatorResponse에는 creatorId: LongcharacterId: Long?를 모두 추가한다.
      • CreatorChannelScheduleResponse.type은 공용 CreatorActivityType을 사용한다.
      • 백엔드 CreatorActivityType 원본 enum은 LIVE, AUDIO, COMMUNITY, LIVE_REPLAY 대문자 code를 내려주므로 DTO에서 공용 enum을 직접 사용하는 것을 정상 계약으로 본다.
      • 이후 코드리뷰에서는 별도 서버 계약 변경 근거가 없는 한 type 대소문자 불일치 대응 또는 Gson enum TypeAdapter 부재를 문제로 보지 않는다.
      • Retrofit endpoint는 @GET("/api/v2/creator-channels/{creatorId}/home")로 정의한다.
      • 반환 타입은 Single<ApiResponse<CreatorChannelHomeResponse>>를 사용한다.
    • 검증 명령:
      • ./gradlew :app:compileDebugKotlin
    • 기대 결과:
      • 신규 DTO와 API가 컴파일된다.
  • Task 3.2: Repository 추가

    • 생성:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeRepository.kt
    • 작업:
      • getHome(creatorId: Long, token: String)에서 홈 API를 호출한다.
      • 기존 UserRepository를 생성자 인자로 받아 followCreator(creatorId, follow, notify, token)를 얇게 위임한다.
      • 기존 TalkApi를 생성자 인자로 받아 createChatRoom(characterId, token)에서 CreateChatRoomRequest(characterId)TalkApi.createChatRoom을 호출한다.
      • token 문자열은 기존 ViewModel 패턴과 맞춰 ViewModel에서 "Bearer ${SharedPreferenceManager.token}"로 만든다.
    • 검증 명령:
      • ./gradlew :app:compileDebugKotlin
    • 기대 결과:
      • Repository가 기존 DI 패턴과 충돌 없이 컴파일된다.
  • Task 3.3: Koin DI 등록

    • 수정:
      • app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt
    • 작업:
      • CreatorChannelHomeApi, CreatorChannelHomeRepository, CreatorChannelHomeViewModel import를 추가한다.
      • networkModulesingle { ApiBuilder().build(get(), CreatorChannelHomeApi::class.java) }를 추가한다.
      • 기존 networkModuleTalkApi 등록을 재사용한다.
      • repositoryModulefactory { CreatorChannelHomeRepository(api = get(), userRepository = get(), talkApi = get()) }를 추가한다.
      • viewModelModuleviewModel { CreatorChannelHomeViewModel(get()) }를 추가한다.
      • 참고: Phase 3 현재 구현에서는 CreatorChannelHomeViewModel 클래스가 Phase 4 산출물이므로 컴파일을 깨지 않기 위해 ViewModel DI 등록은 Phase 4로 보류하고, API/Repository 등록만 완료했다.
    • 검증 명령:
      • ./gradlew :app:compileDebugKotlin
    • 기대 결과:
      • Koin 등록과 import가 컴파일된다.

Phase 4: UI 모델/매퍼/ViewModel 구현

  • Task 4.1: 홈 응답 매퍼 RED 테스트 작성

    • 생성:
      • app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeMapperTest.kt
    • 작업:
      • creator.characterId, creator.isFollow, creator.isNotify, creator.isAiChatAvailable, creator.isDmAvailable가 UI model에 그대로 반영되는지 검증한다.
      • tab 목록이 , 라이브, 오디오, 시리즈, 커뮤니티, 팬Talk, 후원 순서인지 검증한다.
      • currentLive, latestAudioContent가 null이면 해당 홈 section이 생성되지 않는지 검증한다.
      • 빈 list는 crash 없이 빈 section 또는 hidden section 정책으로 매핑되는지 검증한다.
      • SNS URL이 빈 문자열이면 해당 SNS item이 숨김 또는 disabled 상태로 매핑되는지 검증한다.
    • 검증 명령:
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeMapperTest"
    • 기대 결과:
      • UI model/mapper 미구현으로 RED 실패한다.
  • Task 4.2: UI model과 mapper 구현

    • 생성:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelHomeUiModels.kt
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelHomeMappers.kt
    • 작업:
      • CreatorChannelHomeUiState.Loading, Content, Empty, Error를 정의한다.
      • CreatorChannelTab.Home, Live, Audio, Series, Community, FanTalk, Donation을 정의한다.
      • CreatorChannelHeaderUiModelcreatorId, characterId, nickname, profileImageUrl, followerCount, isFollow, isNotify, isAiChatAvailable, isDmAvailable을 둔다.
      • 홈 section은 Figma 순서에 맞춰 sealed interface CreatorChannelHomeSection으로 정의한다.
      • CreatorChannelHomeResponse.toUiContent() 매퍼를 구현한다.
    • 검증 명령:
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeMapperTest"
    • 기대 결과:
      • 매퍼 테스트가 PASS한다.
  • Task 4.3: title-bar 상태 순수 모델 테스트와 구현

    • 생성:
      • app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelTitleBarStateTest.kt
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelTitleBarState.kt
    • 작업:
      • isFollow=false이면 follow icon은 ic_new_follow, bell icon은 없음으로 계산한다.
      • isFollow=true && isNotify=true이면 follow icon은 ic_new_following, bell icon은 ic_bar_bell_colored로 계산한다.
      • isFollow=true && isNotify=false이면 follow icon은 ic_new_following, bell icon은 ic_bar_bell로 계산한다.
      • 상태 변경 중에는 중복 클릭 방지를 위한 isActionEnabled=false 상태를 표현한다.
    • 검증 명령:
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelTitleBarStateTest"
    • 기대 결과:
      • title-bar 상태 테스트가 PASS한다.
  • Task 4.4: ViewModel RED 테스트와 구현

    • 생성:
      • app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeViewModelTest.kt
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeViewModel.kt
    • 작업:
      • loadHome(creatorId)creatorId > 0일 때만 홈 API를 호출한다.
      • API 성공 시 CreatorChannelHomeUiState.Content를 발행한다.
      • API 실패 또는 exception 시 Error와 unknown error toast를 발행한다.
      • follow(follow, notify)는 기존 팔로우 API를 호출하고 성공 시 로컬 header의 isFollow, isNotify를 갱신한다.
      • createChatRoom(characterId)characterId > 0일 때만 TalkApi.createChatRoom 위임 API를 호출하고, 성공 시 ChatRoomActivity 이동에 사용할 chatRoomId 이벤트를 발행한다.
      • 팔로우/알림 변경 중에는 중복 요청을 막는다.
      • 채팅방 생성 중에는 중복 요청을 막는다.
    • 검증 명령:
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest"
    • 기대 결과:
      • ViewModel 테스트가 PASS한다.

Phase 5: 레이아웃과 홈 탭 UI 연결

  • Task 5.1: 화면 layout 생성

    • 생성:
      • app/src/main/res/layout/activity_creator_channel_home.xml
    • 작업:
      • root는 CoordinatorLayout, ConstraintLayout, NestedScrollView/RecyclerView 중 기존 sticky 구현에 가장 적합한 구조를 선택한다.
      • 크리에이터 이미지 영역은 status bar 영역까지 확장 가능하게 상단에 배치한다.
      • title-bar는 이미지 위 overlay로 배치하고 ic_new_bar_back, ic_new_more를 사용한다.
      • follow, following, bell icon view를 title-bar 우측에 배치한다.
      • 대화하기, DM 보내기 버튼 영역은 버튼이 없어도 높이를 보존할 수 있는 container로 만든다.
      • tab-bar는 7개 탭을 표시할 container로 만든다.
      • 홈 컨텐츠는 RecyclerView 또는 기존 섹션 패턴에 맞는 container로 둔다.
    • 검증 명령:
      • ./gradlew :app:mergeDebugResources
    • 기대 결과:
      • 신규 layout과 drawable 참조가 resource merge를 통과한다.
  • Task 5.2: 홈 섹션 Adapter와 item layout 추가

    • 생성:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt
      • app/src/main/res/layout/item_creator_channel_home_live.xml
      • app/src/main/res/layout/item_creator_channel_home_latest_audio.xml
      • app/src/main/res/layout/item_creator_channel_home_donation.xml
      • app/src/main/res/layout/item_creator_channel_home_notice.xml
      • app/src/main/res/layout/item_creator_channel_home_schedule.xml
      • app/src/main/res/layout/item_creator_channel_home_audio.xml
      • app/src/main/res/layout/item_creator_channel_home_series.xml
      • app/src/main/res/layout/item_creator_channel_home_community.xml
      • app/src/main/res/layout/item_creator_channel_home_fantalk.xml
      • app/src/main/res/layout/item_creator_channel_home_introduce.xml
      • app/src/main/res/layout/item_creator_channel_home_activity.xml
      • app/src/main/res/layout/item_creator_channel_home_sns.xml
    • 작업:
      • 모든 section을 한 번에 과하게 완성하지 말고, API 필드를 화면에 표시할 최소 텍스트/이미지 영역부터 연결한다.
      • 기존 AudioContentCardView, SeriesContentCardView, FeedAdapter, LiveThumbnail* 위젯을 재사용할 수 있는 section은 우선 재사용한다.
      • 빈 list 또는 null section은 adapter item으로 추가하지 않는다.
    • 검증 명령:
      • ./gradlew :app:mergeDebugResources
      • ./gradlew :app:compileDebugKotlin
    • 기대 결과:
      • section adapter와 item layout이 컴파일된다.
  • Task 5.3: Activity 생성 및 ViewModel observe 연결

    • 생성:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivity.kt
      • app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivitySourceTest.kt
    • 수정:
      • app/src/main/AndroidManifest.xml
    • 작업:
      • EXTRA_CREATOR_IDnewIntent(context, creatorId)를 추가한다.
      • creatorId <= 0이면 API 호출 없이 finish한다.
      • onCreate에서 ViewModel observe, adapter, tab-bar, title-bar click listener를 연결한다.
      • onCreate 또는 onStart에서 viewModel.loadHome(creatorId)를 호출한다.
      • Manifest에 Activity를 등록한다.
    • 검증 명령:
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"
      • ./gradlew :app:compileDebugKotlin
    • 기대 결과:
      • intent extra, invalid creatorId 처리, Manifest 등록 검증이 PASS한다.
  • Task 5.4: title-bar와 이미지 영역 bind 구현

    • 수정:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivity.kt
    • 작업:
      • creator.profileImageUrl, nickname, followerCount를 이미지 영역에 표시한다.
      • CreatorChannelTitleBarState에 따라 ic_new_follow, ic_new_following, ic_bar_bell_colored, ic_bar_bell을 표시한다.
      • title-bar 초기 배경은 투명 overlay로 시작한다.
      • 뒤로가기는 finish()로 처리한다.
      • 더보기는 기존 프로필/크리에이터 더보기 메뉴 패턴을 확인해 최소 연결하거나, 기존 패턴이 명확하지 않으면 click handler만 분리하고 후속 구현 대상으로 남긴다.
    • 검증 명령:
      • ./gradlew :app:compileDebugKotlin
    • 기대 결과:
      • header/title bind가 컴파일된다.
  • Task 5.5: 대화하기/DM 버튼 표시와 이동 연결

    • 수정:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivity.kt
    • 작업:
      • isAiChatAvailable=false이거나 characterId == null이면 대화하기 버튼을 숨긴다.
      • isDmAvailable=false이면 DM 보내기 버튼을 숨긴다.
      • 두 버튼 중 하나만 보일 때는 버튼 container 안에서 가운데 정렬한다.
      • 두 버튼이 모두 숨김이어도 버튼 영역 container 높이는 유지한다.
      • 대화하기는 ViewModel의 createChatRoom(characterId)를 호출한다.
      • 채팅방 생성 성공 이벤트의 chatRoomId를 받아 ChatRoomActivity.newIntent(context, roomId)로 이동한다.
      • 채팅방 생성 실패 시 기존 unknown error toast 패턴을 따른다.
      • DM 보내기DmChatRoomActivity.newIntentByCreatorId(context, creatorId)로 이동한다.
    • 검증 명령:
      • ./gradlew :app:compileDebugKotlin
    • 기대 결과:
      • 버튼 표시 조건과 AI 채팅/DM 이동이 컴파일된다.

Phase 6: sticky tab-bar와 scroll 상태 구현

  • Task 6.1: scroll 상태 계산 RED 테스트 작성

    • 생성:
      • app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelScrollStateTest.kt
    • 작업:
      • title-bar와 tab-bar의 실제 거리가 기준 이하이고 프로필 이미지가 절반 이상 사라졌을 때 black 전환이 true인지 검증한다.
      • 둘 중 하나라도 만족하지 않으면 black 전환이 false인지 검증한다.
      • tab-bar sticky top은 status bar 높이와 title-bar 높이를 합산해 계산되는지 검증한다.
    • 검증 명령:
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelScrollStateTest"
    • 기대 결과:
      • scroll 상태 모델 미구현으로 RED 실패한다.
  • Task 6.2: scroll 상태 계산 모델 구현

    • 생성:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelScrollState.kt
    • 작업:
      • shouldUseBlackTitleBar(titleBarBottom: Int, tabBarTop: Int, profileImageVisibleHeight: Int, profileImageTotalHeight: Int): Boolean을 추가한다.
      • 실제 거리 조건은 tabBarTop <= titleBarBottom 또는 기존 layout에서 측정 가능한 최소 gap 기준으로 구현한다.
      • 프로필 이미지 절반 이상 사라짐은 profileImageVisibleHeight <= profileImageTotalHeight / 2로 계산한다.
      • sticky top 계산 helper는 statusBarHeight + titleBarHeight를 반환한다.
    • 검증 명령:
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelScrollStateTest"
    • 기대 결과:
      • scroll 상태 테스트가 PASS한다.
  • Task 6.3: Activity scroll listener 연결

    • 수정:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivity.kt
    • 작업:
      • system bar inset을 읽어 이미지 영역이 status bar 뒤까지 확장되도록 적용한다.
      • title-bar content에는 status bar inset만큼 top padding 또는 margin을 적용해 터치 영역을 보존한다.
      • scroll listener에서 tab-bar sticky 위치와 title-bar black 배경을 갱신한다.
      • tab-bar가 sticky 된 이후에는 홈 컨텐츠만 계속 스크롤되도록 header/tab translate 또는 parent scroll range를 조정한다.
    • 검증 명령:
      • ./gradlew :app:compileDebugKotlin
    • 수동 확인:
      • 상단에서 이미지가 status bar 영역까지 표시된다.
      • 스크롤 시 tab-bar가 title-bar 아래에 고정된다.
      • 프로필 이미지가 절반 이상 사라지고 tab-bar가 title-bar에 가까워지면 title-bar가 black으로 전환된다.

Phase 7: 팔로우/알림 변경과 탭 동작 연결

  • Task 7.1: 팔로우/알림 click 흐름 연결

    • 수정:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivity.kt
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeViewModel.kt
    • 작업:
      • 미팔로우 상태에서 follow icon 클릭 시 viewModel.follow(follow = true, notify = true)를 호출한다.
      • 팔로우 중 상태에서 follow/following icon 클릭 시 CreatorFollowNotifyFragment를 띄운다.
      • 알림 모두 받기, 알림 받지 않기, 언팔로우 선택은 각각 기존 follow=true/notify=true, follow=true/notify=false, follow=false/notify=false 조합으로 호출한다.
      • 요청 중에는 title-bar follow/bell click을 막는다.
    • 검증 명령:
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest"
      • ./gradlew :app:compileDebugKotlin
    • 기대 결과:
      • 팔로우/알림 상태 변경 테스트와 컴파일이 PASS한다.
  • Task 7.2: tab-bar 7개 항목 표시와 홈 외 탭 클릭 정책 적용

    • 수정:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivity.kt
      • app/src/main/res/layout/activity_creator_channel_home.xml
    • 생성 후보:
      • app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelTabAdapter.kt
    • 작업:
      • tab-bar에 , 라이브, 오디오, 시리즈, 커뮤니티, 팬Talk, 후원을 표시한다.
      • 기본 선택은 이다.
      • 홈 외 탭 클릭 시 상세 화면을 로드하지 않는다.
      • 홈 외 탭 클릭 정책은 구현 시점에 최소 동작으로 둔다.
        • 선택 상태만 바꾸지 않고 유지하거나,
        • 선택은 가능하되 컨텐츠 전환은 하지 않는 방식 중 기존 tab 컴포넌트 동작과 가장 충돌이 적은 방식을 선택한다.
    • 검증 명령:
      • ./gradlew :app:compileDebugKotlin
    • 수동 확인:
      • 7개 탭이 가로 폭을 초과해도 표시/스크롤이 가능하다.
      • 홈 외 탭을 눌러도 crash가 발생하지 않는다.

Phase 8: 최종 검증과 문서 기록

  • Task 8.1: 단위 테스트 실행

    • 실행:
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.common.*"
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"
      • ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*"
    • 기대 결과:
      • 신규 공용 타입, 크리에이터 채널 홈, 기존 홈 추천 관련 테스트가 모두 BUILD SUCCESSFUL로 통과한다.
  • Task 8.2: 리소스/컴파일/린트 검증

    • 실행:
      • ./gradlew :app:mergeDebugResources
      • ./gradlew :app:compileDebugKotlin
      • ./gradlew :app:ktlintCheck
    • 기대 결과:
      • 모든 명령이 BUILD SUCCESSFUL로 통과한다.
  • Task 8.3: 수동 화면 검증

    • 확인:
      • 크리에이터 이미지가 OS status bar 영역까지 표시된다.
      • title-bar 좌측 ic_new_bar_back, 우측 ic_new_more가 표시된다.
      • 팔로우/알림 상태별 아이콘 조합이 PRD와 일치한다.
      • 대화하기, DM 보내기 버튼 표시 조합별 레이아웃이 유지된다.
      • tab-bar가 title-bar 아래에 sticky 되고 title-bar black 전환 기준이 동작한다.
      • 홈 API 응답의 각 section이 홈 탭에 표시된다.
    • 기대 결과:
      • PRD Metrics 항목을 모두 만족한다.
  • Task 8.4: 검증 기록 누적

    • 수정:
      • docs/20260611_크리에이터_채널_홈_탭/plan-task.md
      • docs/20260611_크리에이터_채널_홈_탭/prd.md
    • 작업:
      • 실행한 테스트/빌드/린트 명령과 결과를 검증 기록에 누적한다.
      • 실패 후 수정한 명령이 있다면 실패 기록을 삭제하지 않고 후속 성공 기록을 추가한다.
    • 기대 결과:
      • 문서 하단에 구현 후 검증 이력이 남는다.

Verification Log

  • 2026-06-12: docs/20260611_크리에이터_채널_홈_탭/prd.md, docs/agent-guides/work-plan-docs.md, docs/agent-guides/build-test-style.md, docs/agent-guides/code-style.md를 확인해 계획 문서 작성 규칙과 검증 명령 규칙을 확인했다.

  • 2026-06-12: 기존 HomeRecommendationApi, HomeRecommendationModels, HomeRecommendationRepository, HomeRecommendationViewModel, RecommendedActivityType, HomeRecommendationMappers, HomeRecommendationUiModels, AppDI, ChatRoomActivity, DmChatRoomActivity를 확인해 신규 크리에이터 채널 홈 구현 계획의 파일 경계와 재사용 지점을 정리했다.

  • 2026-06-12: 이번 단계는 구현 계획/TASK 문서 작성만 수행했으며 구현/빌드/테스트는 실행하지 않았다.

  • 2026-06-12: Figma Design 참조가 필요한 Phase를 점검해 Phase 5, Phase 6, Phase 8은 필수 참조, Phase 1, Phase 4, Phase 7은 부분 참조, Phase 2, Phase 3은 참조 불필요로 계획 문서에 명시했다.

  • 2026-06-12: Phase 1 진행으로 HomeRecommendationApi, HomeRecommendationRepository, HomeRecommendationViewModel을 확인해 기존 v2 홈 네트워크가 Retrofit + RxJava3 Single<ApiResponse<T>>Bearer ${SharedPreferenceManager.token} 패턴을 사용함을 재확인했다.

  • 2026-06-12: UserRepository.creatorFollow(creatorId, follow, notify, token)CreatorFollowNotifyFragment의 알림 전체/없음/언팔로우 callback 구조를 확인해 크리에이터 채널 홈의 팔로우/알림 변경에 기존 API와 bottom sheet를 재사용할 수 있음을 확인했다.

  • 2026-06-12: ChatRoomActivitynewIntent(context, roomId) 계약으로 roomId가 필요하고, DmChatRoomActivity.newIntentByCreatorId(context, creatorId)가 존재함을 확인해 계획서의 AI 채팅/DM 이동 경계를 재확인했다.

  • 2026-06-12: TalkApi.createChatRoom, CreateChatRoomRequest(characterId), CreateChatRoomResponse.chatRoomId, CharacterDetailViewModel.createChatRoom(characterId)를 확인해 대화하기characterId 기반 채팅방 생성 후 chatRoomIdChatRoomActivity에 진입해야 함을 확인했다.

  • 2026-06-12: AppDInetworkModule, repositoryModule, viewModelModule 등록 패턴을 확인해 Phase 3 이후 신규 API/Repository/ViewModel 등록 위치와 형태를 확인했다.

  • 2026-06-12: prd.md의 Non-Goals와 Technical Constraints를 확인해 라이브, 오디오, 시리즈, 커뮤니티, 팬Talk, 후원 탭 상세, 홈 pagination, 신규 팔로우/알림 API, 채팅 내부 동작 변경, 별도 analytics/logging을 Phase 1 기준 제외 범위로 유지했다. Phase 1은 문서 확인/체크 갱신만 수행했으며 구현/빌드/테스트는 실행하지 않았다.

  • 2026-06-12: 사용자 추가 요구사항에 따라 CreatorChannelCreatorResponse.characterId: Long?를 PRD/계획에 반영하고, CharacterDetailViewModel.createChatRoom과 동일하게 TalkApi.createChatRoom(CreateChatRoomRequest(characterId)) 호출 후 반환된 chatRoomIdChatRoomActivity에 이동하도록 Phase 3/4/5 작업을 갱신했다. 이번 단계는 문서 수정만 수행했으며 구현/빌드/테스트는 실행하지 않았다.

  • 2026-06-13: Phase 2 RED 테스트로 CreatorActivityTypeTest를 먼저 추가하고 ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.common.CreatorActivityTypeTest"를 실행해 CreatorActivityType 미구현으로 실패함을 확인했다.

  • 2026-06-13: RecommendedActivityTypev2/common/CreatorActivityType으로 공용화하고 홈 추천 mapper/model/test 참조를 갱신했다. RecommendedActivityType.kt는 제거했으며 rg -n "RecommendedActivityType|toRecommendedActivityTypeLabelRes" app/src/main app/src/test 결과 남은 참조가 없음을 확인했다.

  • 2026-06-13: Phase 3 RED 테스트로 CreatorChannelHomeModelsTest를 추가해 Gson이 CreatorChannelScheduleResponse.typeCreatorActivityType으로 파싱하고 nullable 필드를 보존하는지 검증하도록 했다. 초기 실행은 CreatorChannelHomeResponseCreatorActivityType 미구현으로 실패했다.

  • 2026-06-13: CreatorChannelHomeApi, CreatorChannelHomeModels, CreatorChannelHomeRepository를 추가하고 AppDICreatorChannelHomeApiCreatorChannelHomeRepository를 등록했다. CreatorChannelHomeViewModel 등록은 Phase 4 클래스가 아직 없으므로 컴파일 유지를 위해 보류했다.

  • 2026-06-13: ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.common.*", ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creatorchannel.*", ./gradlew :app:compileDebugKotlin, ./gradlew :app:mergeDebugResources, ./gradlew :app:ktlintCheck를 실행해 모두 BUILD SUCCESSFUL을 확인했다.

  • 2026-06-13: ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*"는 88개 중 8개가 HomeMainFragmentLayoutTest.kt:1410FileNotFoundException으로 실패했다. 별도 focused 실행인 HomeCreatorActivityTypeLabelResTest와 recent activity route 관련 2개 테스트는 BUILD SUCCESSFUL로 통과해 이번 타입 공용화 변경과 직접 관련된 회귀는 없음을 확인했다.

  • 2026-06-13: reviewer gate를 실행해 Phase 2/3 구현 범위, PRD DTO 일치, stale 참조 제거, DI 등록 범위, 검증 증거에 대해 무조건 승인을 받았다.

  • 2026-06-13: HomeMainFragmentLayoutTest.kt의 source-path helper가 실제 파일 위치와 다른 v2/main/HomeMainFragment.kt를 읽고 있어 FileNotFoundException이 발생함을 확인하고, 실제 위치인 v2/main/home/HomeMainFragment.kt로 수정했다.

  • 2026-06-13: 백엔드 CreatorActivityType 원본 enum이 LIVE, AUDIO, COMMUNITY, LIVE_REPLAY 대문자 상수와 동일한 code를 사용함을 확인해 Android Gson enum 파싱용 별도 TypeAdapter는 추가하지 않기로 판단했다.

  • 2026-06-13: 사용자 추가 요청에 따라 신규 크리에이터 채널 홈 패키지를 kr.co.vividnext.sodalive.v2.creatorchannel에서 kr.co.vividnext.sodalive.v2.creator.channel로 변경하고, 계획 본문의 신규 파일 경로와 테스트 필터를 새 패키지명 기준으로 갱신했다.

  • 2026-06-13: ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.common.*" --tests "kr.co.vividnext.sodalive.v2.creator.channel.*" --tests "kr.co.vividnext.sodalive.v2.main.home.*" :app:compileDebugKotlin를 실행해 BUILD SUCCESSFUL을 확인했다.

  • 2026-06-13: 패키지 이동 후 ./gradlew :app:ktlintCheck를 실행해 BUILD SUCCESSFUL을 확인했다.

  • 2026-06-13: 사용자 확인에 따라 백엔드 CreatorActivityType 원본 enum이 LIVE, AUDIO, COMMUNITY, LIVE_REPLAY 대문자 code를 내려주는 계약임을 Phase 2/3 작업 항목에 명시했다. 이후 코드리뷰에서는 별도 서버 계약 변경 근거가 없는 한 크리에이터 채널 홈 DTO의 CreatorActivityType 직접 사용과 Gson enum TypeAdapter 부재를 대소문자 대응 문제로 제기하지 않는다. 이번 단계는 문서 수정만 수행했으며 빌드/테스트는 실행하지 않았다.

  • 2026-06-13: Phase 4 TDD RED로 CreatorChannelHomeMapperTest, CreatorChannelTitleBarStateTest, CreatorChannelHomeViewModelTest를 먼저 추가했다. 각 focused 명령은 CreatorChannelHomeUiModels, CreatorChannelHomeMappers, CreatorChannelTitleBarState, CreatorChannelHomeViewModel 미구현 참조로 compileDebugUnitTestKotlin 실패함을 확인했다.

  • 2026-06-13: Phase 4 GREEN으로 UI state/tab/header/section/SNS 모델, CreatorChannelHomeResponse.toUiContent(), title-bar 상태 모델, CreatorChannelHomeViewModel, AppDI ViewModel 등록을 최소 구현했다. ic_bar_bell_colored는 기존 drawable-mdpi/ic_bar_bell_colored.png가 있어 신규 리소스를 추가하지 않았다.

  • 2026-06-13: Phase 4 검증으로 ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeMapperTest", ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelTitleBarStateTest", ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest", ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*", ./gradlew :app:compileDebugKotlin 모두 BUILD SUCCESSFUL을 확인했다. 병렬 Gradle 실행 중 KSP 캐시 StreamCorruptedException이 한 차례 발생해 ./gradlew --stop 후 순차 재실행했다.

  • 2026-06-13: Phase 4 자체 검증 중 CreatorChannelHomeViewModelTestnull data 케이스 assertion이 실제로는 API failure만 검증하고 있음을 확인해 별도 홈 API null data는 Error와 unknown toast를 emit한다 테스트를 추가했다. 이후 ./gradlew :app:ktlintCheck는 unused import와 긴 whenever(...) 라인으로 실패했으며, 테스트 파일 import/line wrapping을 수정했다.

  • 2026-06-13: Phase 4 보강 후 ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest", ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*", ./gradlew :app:compileDebugKotlin, ./gradlew :app:ktlintCheck를 재실행해 모두 BUILD SUCCESSFUL을 확인했다. ktlintCheck.editorconfig disabled_rules deprecation 경고는 기존 설정 경고로 이번 변경과 무관하다.

  • 2026-06-13: Phase 4 review-work gate에서 code quality 리뷰어가 chatRoomIdLiveData를 일반 MutableLiveData<Long>로 두면 화면 재생성/재구독 시 채팅방 이동이 반복될 수 있다고 지적해 FAIL했다. 기존 DmChatEvent<T>.consume() 패턴을 참고해 CreatorChannelEvent<T> 소비형 이벤트로 변경하고, chatRoomIdLiveData 테스트에서 첫 번째 consume()chatRoomId, 두 번째 consume()null임을 검증하도록 보강했다.

  • 2026-06-13: 소비형 이벤트 수정 후 ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest", ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*", ./gradlew :app:compileDebugKotlin, ./gradlew :app:ktlintCheck를 재실행해 모두 BUILD SUCCESSFUL을 확인했다.

  • 2026-06-13: 추가 코드리뷰에서 팔로우/채팅방 생성 액션 실패도 showUnknownError()를 통해 홈 상태를 Error로 덮어 기존 Content가 사라질 수 있다는 P1 지적을 받았다. 팔로우 실패는 현재 content를 유지하고 unknown toast만 emit한다, 채팅방 생성 실패는 현재 content를 유지하고 unknown toast만 emit한다 테스트를 먼저 추가했고, 기존 구현에서 ClassCastException으로 실패하는 RED를 확인했다.

  • 2026-06-13: 홈 로드 실패는 기존처럼 CreatorChannelHomeUiState.Error를 유지하되, 팔로우/채팅방 생성 액션 실패는 showUnknownErrorToast()만 호출하도록 분리했다. 수정 후 ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest"를 실행해 BUILD SUCCESSFUL을 확인했다.