docs(home): AI 캐릭터 이동 검증을 기록한다
This commit is contained in:
@@ -538,18 +538,37 @@
|
||||
- `HomeMainFragmentLayoutTest`에 activity type별 route와 Intent extra 계약 회귀 테스트를 추가한다.
|
||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route maps activity type to target destination" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route ignores live unknown and missing target" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route creates expected intents"`로 RED/GREEN을 확인한다.
|
||||
|
||||
- [x] **Task 11.2: AI 캐릭터 item 크리에이터 채널 이동으로 변경**
|
||||
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/data/HomeRecommendationModels.kt`
|
||||
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiModels.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/HomeMainFragment.kt`
|
||||
- 수정: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt`
|
||||
- 구현 내용:
|
||||
- `HomeAiCharacterItem`에 `@SerializedName("creatorId") val creatorId: Long`을 추가한다.
|
||||
- `HomeRecommendationAiCharacterUiModel` 또는 동등한 UI model에 `creatorId`를 보존한다.
|
||||
- `HomeAiCharacterItem.toUiModel()`에서 `characterId`는 `CharacterChatThumbnailItem.characterId` 표시 계약에 유지하고, `creatorId`는 클릭 라우팅 전용 값으로 분리해 전달한다.
|
||||
- `HomeAiCharacterAdapter` callback은 AI 캐릭터 UI model을 그대로 전달하고, `HomeMainFragment`에서 `creatorId > 0L`일 때 `CreatorChannelActivity.newIntent(requireContext(), creatorId)`로 이동한다.
|
||||
- 기존 `CharacterDetailActivity` import와 `openCharacterDetail()` 사용은 제거한다.
|
||||
- `creatorId <= 0L`이면 앱이 crash 되지 않고 이동하지 않는다.
|
||||
- 검증:
|
||||
- `HomeMainFragmentLayoutTest`에 `HomeAiCharacterItem.creatorId`가 UI model로 보존되는 mapper 회귀 테스트를 추가한다.
|
||||
- `HomeMainFragmentLayoutTest`에 AI 캐릭터 item route가 `CreatorChannelActivity` intent와 `creatorId` extra를 생성하고, `creatorId <= 0L`에서는 intent를 생성하지 않는 회귀 테스트를 추가한다.
|
||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest"`로 RED/GREEN을 확인한다.
|
||||
- `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`로 회귀를 확인한다.
|
||||
|
||||
---
|
||||
|
||||
### Phase 12: 최종 검증과 문서 기록
|
||||
|
||||
- [ ] **Task 12.1: 단위 테스트와 빌드 검증**
|
||||
- [x] **Task 12.1: 단위 테스트와 빌드 검증**
|
||||
- 실행: `./gradlew :app:testDebugUnitTest`
|
||||
- 실행: `./gradlew :app:compileDebugKotlin`
|
||||
- 실행: `./gradlew :app:mergeDebugResources`
|
||||
- 실행: `./gradlew :app:ktlintCheck`
|
||||
- 기대 결과: 모두 성공.
|
||||
|
||||
- [ ] **Task 12.2: 수동 확인**
|
||||
- [ ] **Task 12.2: 수동 확인** `[blocked: 연결된 Android 기기 없음]`
|
||||
- 확인 항목:
|
||||
- 추천 tab 선택 상태
|
||||
- tab 전환은 글자 터치로만 동작하고 swipe 전환은 없음
|
||||
@@ -560,13 +579,14 @@
|
||||
- 첫 오디오 태그 조건
|
||||
- activity type 다국어 문자열
|
||||
- 방금 활동한 크리에이터 목적지별 클릭 이동
|
||||
- AI 캐릭터 item 크리에이터 채널 클릭 이동
|
||||
- 모두 팔로우 success 후 완료 상태
|
||||
- 배너 목적지별 클릭 이동
|
||||
- 인기 커뮤니티 유료/무료/구매 완료 이미지 상태
|
||||
- 사업자 정보 더보기/접기
|
||||
- 기대 결과: PRD Metrics 항목 충족.
|
||||
|
||||
- [ ] **Task 12.3: 검증 기록 누적**
|
||||
- [x] **Task 12.3: 검증 기록 누적**
|
||||
- 수정: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
||||
- 수정: `docs/20260601_메인_홈_추천_UI와_API_연동/prd.md`
|
||||
- 구현 내용: 실행 명령, 결과, 실패 시 원인과 후속 조치를 문서 하단 `검증 기록`에 누적한다.
|
||||
@@ -583,6 +603,12 @@
|
||||
---
|
||||
|
||||
## 검증 기록
|
||||
- 2026-06-23: Task 11.2와 Phase 12 코드 리뷰 및 검증을 재수행했다. 리뷰 범위는 `HomeAiCharacterItem.creatorId` DTO 추가, `HomeRecommendationAiCharacterUiModel.creatorId` 보존, `CharacterChatThumbnailItem.characterId` 표시 계약 유지, `HomeRecommendationAiCharacterRoute.Creator` 라우팅, `CreatorChannelActivity.newIntent(context, creatorId)` intent 생성, `creatorId <= 0L` no-op, `CharacterDetailActivity` 제거, `HomeAiCharacterAdapter` callback 변경, 회귀 테스트 추가다. 코드 리뷰 결과 blocking finding은 없었다. 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest"`는 BUILD SUCCESSFUL을 확인했다. 첫 `./gradlew :app:testDebugUnitTest` 실행은 `CreatorChannelHomeViewModelTest > 채널 후원 성공은 기존 후원 API를 호출하고 홈을 다시 로드한다`의 `SharedPreferenceManager.can` assert에서 1건 실패했으나, 이번 변경 파일과 무관한 `v2.creator.channel` 영역이고 해당 테스트 단독 실행 및 `CreatorChannelHomeViewModelTest` 클래스 실행은 모두 BUILD SUCCESSFUL이었다. 이후 전체 `./gradlew :app:testDebugUnitTest` 재실행도 BUILD SUCCESSFUL을 확인했다. `./gradlew :app:compileDebugKotlin`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:ktlintCheck`도 BUILD SUCCESSFUL을 확인했다. `adb devices`는 권한 실행 기준 연결된 Android 기기가 없어 Phase 12.2 실제 화면 수동 확인은 계속 `[blocked: 연결된 Android 기기 없음]`으로 유지한다.
|
||||
- 2026-06-23: Phase 12.1 후속 조치로 기존 `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/CreatorChannelFanTalkFragmentLayoutTest.kt:78`의 긴 줄을 동작 변경 없이 줄바꿈만 수정했다. 관련 테스트 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.fantalk.CreatorChannelFanTalkFragmentLayoutTest"`와 `./gradlew :app:ktlintCheck`는 BUILD SUCCESSFUL을 확인했다. 이후 Phase 12.1 전체 명령 `./gradlew :app:testDebugUnitTest`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:ktlintCheck`를 재실행했고 모두 BUILD SUCCESSFUL을 확인해 Task 12.1을 완료 처리했다.
|
||||
- 2026-06-23: Phase 12.2 수동 확인을 위해 `adb devices`를 실행했으나 연결된 Android 기기가 없어 실제 앱 화면 수동 확인은 수행하지 못했다. 자동 검증으로 추천 tab/스크롤/섹션/라우팅/빈 리스트/태그/배너/커뮤니티/사업자 정보 관련 `HomeMainFragmentLayoutTest` 전체와 전체 unit test는 통과했지만, 실제 기기 수동 확인 항목은 `[blocked: 연결된 Android 기기 없음]`으로 남긴다.
|
||||
- 2026-06-23: Phase 12.1 검증으로 `./gradlew :app:testDebugUnitTest`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:mergeDebugResources`를 실행했고 모두 BUILD SUCCESSFUL을 확인했다. `./gradlew :app:ktlintCheck`는 이번 변경 파일이 아닌 `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/CreatorChannelFanTalkFragmentLayoutTest.kt:78`의 기존 줄 길이/인자 줄바꿈 위반으로 실패했다. `git diff -- app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/CreatorChannelFanTalkFragmentLayoutTest.kt` 결과 변경 없음으로 확인해 이번 Task 11.2 변경과 분리했다. 따라서 Phase 12.1은 ktlint 외부 이슈 해소 전까지 완료 처리하지 않는다.
|
||||
- 2026-06-23: Task 11.2 구현으로 `HomeAiCharacterItem.creatorId`를 DTO에 추가하고, `HomeRecommendationAiCharacterUiModel`에 `creatorId`를 보존하도록 매핑했다. `characterId`는 기존 `CharacterChatThumbnailItem.characterId` 표시 계약에 유지하고, AI 캐릭터 item 클릭 라우팅은 `HomeRecommendationAiCharacterRoute.Creator`와 `CreatorChannelActivity.newIntent(context, creatorId)`로 분리했다. `HomeAiCharacterAdapter` callback은 UI model을 전달하도록 변경했고, `HomeMainFragment`에서는 `creatorId > 0L`일 때만 이동하며 기존 `CharacterDetailActivity` import와 `openCharacterDetail()` 사용을 제거했다. RED 검증은 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home ai character mapper preserves creator id for routing and character id for display" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home ai character route uses creator id and ignores invalid ids" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home ai character route creates creator channel intent"`에서 `HomeRecommendationAiCharacterRoute`, `toHomeRecommendationAiCharacterIntent`, `toHomeRecommendationAiCharacterRoute`, `HomeAiCharacterItem.creatorId` 미정의 컴파일 실패로 확인했다. 구현 후 동일 명령과 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest"`는 모두 BUILD SUCCESSFUL을 확인했다.
|
||||
- 2026-06-23: 사용자 추가 요청에 따라 `HomeAiCharacterItem.creatorId` 추가와 `크리에이터와 이야기를 나눠요!` item 터치 목적지를 캐릭터 상세에서 크리에이터 채널로 변경하는 후속 작업을 `Task 11.2`로 추가했다. DTO, UI model, mapper, `HomeMainFragment` 라우팅, mapper/intent 회귀 테스트, `creatorId <= 0L` no-op guard, `CharacterDetailActivity` 제거 항목을 구현 기준으로 명시했다. 문서 변경만 수행했으므로 Gradle 검증은 실행하지 않고 문서 재읽기로 확인한다.
|
||||
- 2026-06-06: 사용자 요청에 따라 `Phase 11: 방금 활동한 크리에이터 터치 액션 연결`을 추가하고 기존 `Phase 11: 최종 검증과 문서 기록`을 `Phase 12`로 뒤로 밀었다. 구현으로 최근 활동 카드 클릭 시 `Live`는 no-op, `LiveReplay`/`Audio`는 `AudioContentDetailActivity` + `Constants.EXTRA_AUDIO_CONTENT_ID = targetId`, `Community`는 `CreatorCommunityAllActivity` + `Constants.EXTRA_COMMUNITY_CREATOR_ID = targetId`로 이동하도록 연결했다. RED 검증은 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route maps activity type to target destination" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route ignores live unknown and missing target" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route creates expected intents"`에서 `HomeRecommendationRecentlyActiveCreatorRoute`, `toHomeRecommendationRecentlyActiveCreatorRoute()`, `toHomeRecommendationRecentlyActiveCreatorIntent()` 미정의 컴파일 실패로 확인했다. 구현 후 동일 명령은 BUILD SUCCESSFUL을 확인했다.
|
||||
- 2026-06-06: Task 11.1 회귀 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`를 실행했고 모두 BUILD SUCCESSFUL을 확인했다. `ktlintCheck`에서는 기존 `.editorconfig`의 `disabled_rules` 속성 deprecation warning만 출력되었고 신규 실패는 없었다. 변경 파일 4개로 리뷰 게이트를 수행했고, `Live` no-op, `LiveReplay`/`Audio`/`Community` 목적지 및 extra 계약, invalid target no-op, Fragment callback 연결, Phase 11/12 문서 이동, 테스트 커버리지에 대해 blocking finding 없음으로 승인받았다.
|
||||
- 2026-06-05: Task 10.1 구현으로 홈 추천 배너 클릭 라우팅을 연결했다. `eventItem`은 `EventDetailActivity` + `Constants.EXTRA_EVENT`, `creatorId`는 `UserProfileActivity` + `Constants.EXTRA_USER_ID`, `seriesId`는 `SeriesDetailActivity` + `Constants.EXTRA_SERIES_ID`, `link`는 `Intent.ACTION_VIEW`로 실행한다. 여러 대상이 함께 내려오면 `eventItem` → `creatorId` → `seriesId` → `link` 순서로 우선 처리한다. RED 검증은 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home banner route uses event creator series link priority"`에서 `HomeRecommendationBannerRoute`, `toHomeRecommendationBannerRoute()` 미정의 컴파일 실패로 확인했다. 구현 후 동일 테스트는 최초 `:app:kspDebugKotlin`의 `java.io.EOFException`으로 중단되었고, `--rerun-tasks` 재실행에서 BUILD SUCCESSFUL을 확인했다. 이후 내부 딥링크 판별 누락 지적에 따라 `BuildConfig.APPSCHEME` custom scheme과 `https://${BuildConfig.APPSCHEME}.onelink.me` app link만 내부 딥링크로 인정하고, `mailto:` 같은 외부 custom scheme은 이동하지 않도록 보강했다. RED 검증은 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home banner route maps creator series web and internal deeplink" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home banner route ignores blank malformed and scheme-less links"`에서 2개 테스트 실패로 확인했고, 수정 후 동일 명령은 BUILD SUCCESSFUL을 확인했다.
|
||||
|
||||
Reference in New Issue
Block a user