From 0d7512fee2a630a1201b414403e5c9f27a8c1fcd Mon Sep 17 00:00:00 2001 From: klaus Date: Sat, 27 Jun 2026 08:30:22 +0900 Subject: [PATCH] =?UTF-8?q?docs(content):=20=EC=A0=84=EC=B2=B4=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0=20=EA=B5=AC=ED=98=84=20=EA=B2=80=EC=A6=9D=EC=9D=84=20?= =?UTF-8?q?=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 --- docs/20260627_콘텐츠_전체보기/plan-task.md | 127 +++++++++++++++++++-- 1 file changed, 119 insertions(+), 8 deletions(-) diff --git a/docs/20260627_콘텐츠_전체보기/plan-task.md b/docs/20260627_콘텐츠_전체보기/plan-task.md index f55f1f5c..f11cd7cf 100644 --- a/docs/20260627_콘텐츠_전체보기/plan-task.md +++ b/docs/20260627_콘텐츠_전체보기/plan-task.md @@ -316,7 +316,7 @@ ### Phase 5: 신규 전체보기 API, DTO, Repository, UI model 추가 -- [ ] **Task 5.1: ContentOverview API/DTO/Repository 추가** +- [x] **Task 5.1: ContentOverview API/DTO/Repository 추가** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/overview/data/ContentOverviewApi.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/overview/data/ContentOverviewModels.kt` @@ -335,8 +335,16 @@ - Expected: 신규 data layer와 DI 등록이 컴파일된다. - 검증 기록: - 구현 시 이 Task 아래에 명령, 결과, 확인 내용을 한국어로 누적한다. + - 2026-06-27 구현: `ContentOverviewApi`, `ContentOverviewPageResponse`, `ContentOverviewType`, `ContentOverviewItemResponse`, `ContentOverviewRepository`를 추가했다. endpoint는 `GET /api/v2/contents`, query key는 `page`, `size`, `type`만 사용한다. + - 2026-06-27 DI 등록: `AppDI`의 `networkModule`에 `ContentOverviewApi`, `repositoryModule`에 `ContentOverviewRepository`를 등록했다. ViewModel DI는 Phase 6.5에서 등록하도록 이 Task에서는 제외했다. + - 2026-06-27 실행: `./gradlew :app:compileDebugKotlin` + - 결과: PASS. + - 2026-06-27 코드 리뷰 확인: PRD/계획서의 응답 필드 계약은 `items`, `contentId`, `coverImage`인데 현재 DTO는 `contents`, `audioContentId`, `imageUrl`, `totalCount`를 사용한다. 서버 최신 계약 변경이 아니라면 API 응답 파싱 실패 위험이 있어 수정이 필요하다. + - 2026-06-27 리뷰 후속 RED 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.*"` + - RED 결과: 테스트 fixture를 문서 계약인 `items`, `contentId`, `coverImage`로 변경하자 기존 DTO의 `contents`, `audioContentId`, `imageUrl`, `totalCount` 생성자와 맞지 않아 컴파일 실패했다. + - 2026-06-27 리뷰 후속 구현: `ContentOverviewPageResponse`를 `items` 기반으로, `ContentOverviewItemResponse`를 `contentId`, `coverImage` 기반으로 수정하고 mapper도 동일 계약을 사용하도록 변경했다. -- [ ] **Task 5.2: Mapper RED 테스트 작성** +- [x] **Task 5.2: Mapper RED 테스트 작성** - 생성: - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/overview/ContentOverviewMapperTest.kt` - 테스트 케이스: @@ -353,8 +361,11 @@ - Expected: mapper 구현 전 RED 실패. - 검증 기록: - 구현 시 이 Task 아래에 명령, 결과, 확인 내용을 한국어로 누적한다. + - 2026-06-27 RED 테스트 추가: `ContentOverviewMapperTest`를 생성해 type title resource, tag mapping, adult badge, paging metadata/type 보존을 검증하도록 했다. + - 2026-06-27 RED 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.ContentOverviewMapperTest"` + - RED 결과: `overview.model` mapper/UI model 미구현으로 `Unresolved reference 'model'`, `toTitleResId`, `toUiModel`, `toContent` 컴파일 실패를 확인했다. -- [ ] **Task 5.3: UI model과 mapper 구현** +- [x] **Task 5.3: UI model과 mapper 구현** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/overview/model/ContentOverviewUiState.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/overview/model/ContentOverviewUiModels.kt` @@ -371,12 +382,16 @@ - Expected: mapper 테스트 PASS. - 검증 기록: - 구현 시 이 Task 아래에 명령, 결과, 확인 내용을 한국어로 누적한다. + - 2026-06-27 구현: `ContentOverviewUiState`, `ContentOverviewUiModel`, `ContentOverviewType.toTitleResId()`, `ContentOverviewPageResponse.toContent()`, `ContentOverviewItemResponse.toUiModel()`을 추가했다. + - 2026-06-27 확인: `NEW_AND_HOT_AUDIO`는 `New&Hot`, `FIRST_AUDIO_CONTENT`는 `처음부터 함께 성장!` title resource로 매핑하고, `Original/First/Point/Free` tag 및 adult badge를 DTO boolean/price 기준으로 매핑했다. + - 2026-06-27 GREEN 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.ContentOverviewMapperTest"` + - GREEN 결과: PASS. --- ### Phase 6: 신규 전체보기 ViewModel, Activity, Adapter 구현 -- [ ] **Task 6.1: ViewModel RED 테스트 작성** +- [x] **Task 6.1: ViewModel RED 테스트 작성** - 생성: - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/overview/ContentOverviewViewModelTest.kt` - 테스트 케이스: @@ -393,8 +408,11 @@ - Expected: ViewModel 구현 전 RED 실패. - 검증 기록: - 구현 시 이 Task 아래에 명령, 결과, 확인 내용을 한국어로 누적한다. + - 2026-06-27 RED 테스트 추가: `ContentOverviewViewModelTest`를 생성해 초기 load, Content/Empty/Error, toast, load-more append, `hasNext=false` 추가 요청 방지, pagination error 보존, stale response 방지를 검증하도록 했다. + - 2026-06-27 RED 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.ContentOverviewViewModelTest"` + - RED 결과: `ContentOverviewViewModel` 미구현으로 `Unresolved reference 'ContentOverviewViewModel'`, `loadFirstPage`, `loadMore`, `overviewStateLiveData` 컴파일 실패를 확인했다. -- [ ] **Task 6.2: ViewModel 구현** +- [x] **Task 6.2: ViewModel 구현** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/overview/ContentOverviewViewModel.kt` - 작업: @@ -408,8 +426,11 @@ - Expected: ViewModel 테스트 PASS. - 검증 기록: - 구현 시 이 Task 아래에 명령, 결과, 확인 내용을 한국어로 누적한다. + - 2026-06-27 구현: `ContentOverviewViewModel`을 추가해 `page=0`, `size=20`, `Bearer ${SharedPreferenceManager.token}`, `requestGeneration`, 첫 페이지 `isLoading`, 추가 페이지 `Content.isLoadingMore`/`paginationErrorMessage` 패턴을 구현했다. + - 2026-06-27 GREEN 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.ContentOverviewViewModelTest"` + - GREEN 결과: PASS. -- [ ] **Task 6.3: Activity layout과 Adapter 구현** +- [x] **Task 6.3: Activity layout과 Adapter 구현** - 생성: - `app/src/main/res/layout/activity_content_overview.xml` - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/overview/ui/ContentOverviewAdapter.kt` @@ -428,8 +449,13 @@ - Expected: 신규 layout과 resource reference가 merge된다. - 검증 기록: - 구현 시 이 Task 아래에 명령, 결과, 확인 내용을 한국어로 누적한다. + - 2026-06-27 구현: Figma `482:15105` 기준으로 black root, 60dp title bar, 좌측 `ic_new_bar_back`, 22sp bold title(`Typography.Heading2`), 2열 RecyclerView layout을 추가했다. + - 2026-06-27 구현: `ContentOverviewAdapter`를 추가해 `item_content_audio_card.xml`/`AudioContentCardView`를 재사용하고 `setGridItemWidthPx`, `setContent`, `setTags`, `setAdultVisible`, `loadUrl`을 바인딩했다. + - 2026-06-27 구현: `AndroidManifest.xml`에 `.v2.main.content.overview.ContentOverviewActivity`를 등록했다. + - 2026-06-27 실행: `./gradlew :app:mergeDebugResources` + - 결과: PASS. -- [ ] **Task 6.4: Activity source RED 테스트 작성** +- [x] **Task 6.4: Activity source RED 테스트 작성** - 생성: - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/overview/ContentOverviewActivitySourceTest.kt` - 테스트 케이스: @@ -443,8 +469,11 @@ - Expected: Activity 구현 전 또는 연결 전 RED 실패. - 검증 기록: - 구현 시 이 Task 아래에 명령, 결과, 확인 내용을 한국어로 누적한다. + - 2026-06-27 RED 테스트 추가: `ContentOverviewActivitySourceTest`를 생성해 `newIntent`, intent extra, Figma layout id, 2열 `GridLayoutManager`, 하단 scroll `loadMore`, 상세 이동 extra, manifest 등록, Phase 7 라우팅 미추가를 검증하도록 했다. + - 2026-06-27 RED 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.ContentOverviewActivitySourceTest"` + - RED 결과: layout/manifest/Phase 7 미연결 검증은 통과했고 `ContentOverviewActivity.kt` 미생성으로 Activity source 관련 테스트 2건이 `FileNotFoundException`으로 실패하는 것을 확인했다. -- [ ] **Task 6.5: Activity 구현과 ViewModel 연결** +- [x] **Task 6.5: Activity 구현과 ViewModel 연결** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/overview/ContentOverviewActivity.kt` - 수정: @@ -463,6 +492,38 @@ - Expected: overview mapper/ViewModel/source 테스트 PASS. - 검증 기록: - 구현 시 이 Task 아래에 명령, 결과, 확인 내용을 한국어로 누적한다. + - 2026-06-27 구현: `ContentOverviewActivity`를 추가해 `newIntent(context, type)`, type title, back `finish()`, `Loading/Content/Empty/Error` 렌더링, 2열 grid width 계산, scroll bottom `loadMore()`, `AudioContentDetailActivity` 상세 이동을 연결했다. + - 2026-06-27 구현: `AppDI.viewModelModule`에 `ContentOverviewViewModel`을 등록했다. intent type extra가 없거나 파싱 실패하면 계획서 기본값인 `NEW_AND_HOT_AUDIO`를 사용한다. + - 2026-06-27 GREEN 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.*"` + - GREEN 결과: PASS. + - 2026-06-27 추가 검증: 포맷 수정 후 동일 overview 테스트 재실행 결과 PASS. + - 2026-06-27 코드 리뷰 확인: PRD edge case의 `contentId <= 0` 상세 이동 무시 조건이 현재 `ContentOverviewActivity.openAudioContentDetail(contentId)` 또는 adapter click 경로에 반영되어 있지 않다. 잘못된 id 응답 시 상세 화면을 열 수 있어 수정이 필요하다. + - 2026-06-27 리뷰 후속 RED 테스트 추가: `ContentOverviewActivitySourceTest`에 Activity의 `if (contentId <= 0) return` 및 Adapter의 `return@setOnClickListener` 검증을 추가했다. + - 2026-06-27 리뷰 후속 구현: `ContentOverviewActivity.openAudioContentDetail(contentId)`와 `ContentOverviewAdapter` click listener에 `contentId <= 0` 상세 이동 무시 조건을 추가했다. + +- [x] **Task 6.6: 신규 전체보기 loading UI 표시 후속 수정** + - 수정: + - `app/src/main/res/layout/activity_content_overview.xml` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/overview/ContentOverviewActivity.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/overview/ContentOverviewActivitySourceTest.kt` + - 작업: + - 첫 페이지 `Loading` 상태에서 사용자에게 보이는 중앙 progress view를 표시한다. + - `Content.isLoadingMore`가 true일 때 기존 목록은 유지하고 하단 progress view를 표시한다. + - `Empty`, `Error`, `Content`의 비로딩 상태에서는 progress view를 숨긴다. + - skeleton loading, 신규 정렬/필터, Phase 7 신규 전체보기 라우팅은 추가하지 않는다. + - 검증: + - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.ContentOverviewActivitySourceTest"` + - Expected: first-page/loading-more progress source 테스트 PASS. + - 검증 기록: + - 구현 시 이 Task 아래에 명령, 결과, 확인 내용을 한국어로 누적한다. + - 2026-06-27 작업 결정: PRD의 첫 페이지 로딩/추가 페이지 로딩 상태 구분 요구를 엄격히 충족하기 위해 `LoadingDialog`가 아닌 inline progress view 2개를 추가하는 최소 수정으로 진행한다. + - 2026-06-27 RED 테스트 추가: `ContentOverviewActivitySourceTest`에 first-page progress id, load-more progress id, `viewModel.isLoading.observe(this)`, `renderLoading()` progress 표시, `state.isLoadingMore`에 따른 load-more progress 표시 검증을 추가했다. + - 2026-06-27 RED 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.ContentOverviewActivitySourceTest"` + - RED 결과: `ContentOverviewActivitySourceTest.kt:48`, `ContentOverviewActivitySourceTest.kt:59`에서 예상 실패했다. 원인은 `activity_content_overview.xml`에 progress view가 없고 `ContentOverviewActivity`가 로딩 progress를 바인딩하지 않았기 때문이다. + - 2026-06-27 구현: `activity_content_overview.xml`에 `pb_content_overview_initial_loading`, `pb_content_overview_load_more`를 추가하고, `ContentOverviewActivity`에서 `viewModel.isLoading`과 `Content.isLoadingMore`에 따라 progress visibility를 제어하도록 했다. + - 2026-06-27 GREEN 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.ContentOverviewActivitySourceTest"` + - GREEN 결과: PASS. + - 2026-06-27 코드 리뷰 및 검증 재확인: 첫 페이지/loading-more progress view와 Activity binding이 유지되어 있고, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.*"` 재실행 결과 PASS. --- @@ -551,3 +612,53 @@ - 2026-06-27 Phase 3~4 범위 실행: `./gradlew :app:ktlintCheck`는 신규 source 테스트의 긴 줄로 1회 실패 후 포맷 수정, 재실행 결과 PASS. 기존 `.editorconfig`의 `disabled_rules` deprecation 경고는 출력되었으나 실패 원인은 아니었다. - 2026-06-27 Phase 3~4 범위 실행: `git diff --check` 결과 PASS(출력 없음). - 2026-06-27 수동 화면 검증: Android 기기/에뮬레이터를 사용할 수 없어 Phase 4 기존 전체 탭 이동 수동 클릭 검증은 완료하지 못했다. Task 4.2에 BLOCKED/미완료로 기록했다. +- 2026-06-27 Phase 5~6 범위 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.*"` 결과 PASS. +- 2026-06-27 Phase 5~6 인접 회귀 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"` 결과 PASS. +- 2026-06-27 Phase 5~6 인접 회귀 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentSourceTest"` 결과 PASS. +- 2026-06-27 Phase 5~6 범위 실행: `./gradlew :app:mergeDebugResources` 결과 PASS. +- 2026-06-27 Phase 5~6 범위 실행: `./gradlew :app:compileDebugKotlin` 결과 PASS. +- 2026-06-27 Phase 5~6 범위 실행: `./gradlew :app:ktlintCheck`는 신규 overview 테스트의 긴 줄/unused import로 1회 실패 후 포맷 수정, 재실행 결과 PASS. 기존 `.editorconfig`의 `disabled_rules` deprecation 경고는 출력되었으나 실패 원인은 아니었다. +- 2026-06-27 Phase 5~6 범위 실행: `git diff --check` 결과 PASS(출력 없음). +- 2026-06-27 Phase 5~6 범위 확인: `rg -n "viewHomeFirstAudioTitle\.ivSectionTitleChevron\.setOnClickListener|viewContentNewAndHotTitle\.ivSectionTitleChevron\.setOnClickListener" app/src/main/java/kr/co/vividnext/sodalive/v2/main/home app/src/main/java/kr/co/vividnext/sodalive/v2/main/content` 결과 매치 없음. Phase 7 신규 전체보기 이동 라우팅은 아직 추가하지 않았다. +- 2026-06-27 Phase 5~6 코드 리뷰 확인: 문서 기준 발견 사항 2건을 확인했다. 1) 신규 API DTO 필드명이 PRD/계획서의 `items/contentId/coverImage`와 달리 `contents/audioContentId/imageUrl`로 구현되어 서버 계약 확인 또는 수정이 필요하다. 2) `contentId <= 0` item 상세 이동 무시 조건이 누락되어 수정이 필요하다. +- 2026-06-27 Phase 5~6 재검증 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.*"` 결과 PASS. +- 2026-06-27 Phase 5~6 재검증 실행: `./gradlew :app:mergeDebugResources`는 sandbox의 `~/.gradle` lock 접근 제한으로 1회 실패 후 권한 상승 재실행 결과 PASS. +- 2026-06-27 Phase 5~6 재검증 실행: `./gradlew :app:compileDebugKotlin` 결과 PASS. +- 2026-06-27 Phase 5~6 재검증 실행: `./gradlew :app:ktlintCheck` 결과 PASS. +- 2026-06-27 Phase 5~6 재검증 실행: `git diff --check` 결과 PASS(출력 없음). +- 2026-06-27 Phase 5~6 인접 회귀 재검증 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"` 결과 PASS. +- 2026-06-27 Phase 5~6 인접 회귀 재검증 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentSourceTest"` 결과 PASS. +- 2026-06-27 Phase 5~6 리뷰 후속 RED 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.*"` 결과 예상 실패. 테스트가 문서 계약 `items/contentId/coverImage`와 invalid `contentId <= 0` guard를 요구하지만 production이 아직 이전 DTO 계약과 guard 누락 상태였음을 확인했다. +- 2026-06-27 Phase 5~6 리뷰 후속 GREEN 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.*"` 결과 PASS. +- 2026-06-27 Phase 5~6 리뷰 후속 확인: `rg -n "totalCount|contents|audioContentId|imageUrl" "app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/overview" "app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/overview"` 실행 결과 `audioContentId`, `imageUrl` 잔여 참조는 없고 `contents`는 API path/문자열 이름의 정상 매치만 남았다. +- 2026-06-27 Phase 5~6 리뷰 후속 재검증 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.*"` 결과 PASS. +- 2026-06-27 Phase 5~6 리뷰 후속 재검증 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"` 결과 PASS. +- 2026-06-27 Phase 5~6 리뷰 후속 재검증 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentSourceTest"` 결과 PASS. +- 2026-06-27 Phase 5~6 리뷰 후속 재검증 실행: `./gradlew :app:compileDebugKotlin` 결과 PASS. +- 2026-06-27 Phase 5~6 리뷰 후속 재검증 실행: `./gradlew :app:ktlintCheck`는 테스트 fixture 들여쓰기 문제로 1회 실패 후 수정, 재실행 결과 PASS. 기존 `.editorconfig`의 `disabled_rules` deprecation 경고는 출력되었으나 실패 원인은 아니었다. +- 2026-06-27 Phase 5~6 리뷰 후속 재검증 실행: `git diff --check` 결과 PASS(출력 없음). +- 2026-06-27 Git 상태 확인: `app/src/main/res/drawable-mdpi/ic_new_arrow_up_gray.png`, `app/src/main/res/drawable-mdpi/ic_new_arrow_up_white.png`가 `AD` 상태이며 현재 소스/문서에서 참조되지 않는다. 커밋 전 포함 여부 정리가 필요하다. +- 2026-06-27 Phase 5~6 코드 리뷰 재확인: `ContentOverviewActivity.renderLoading()`은 RecyclerView와 empty/error TextView를 숨기기만 하고, `activity_content_overview.xml`에도 loading/progress view가 없어 PRD의 첫 페이지 로딩/추가 페이지 로딩 상태 구분 요구가 사용자에게 표시되지 않는다. `ContentOverviewViewModel.isLoading`도 Activity에서 observe하지 않는다. 코드 수정이 필요하다. +- 2026-06-27 Phase 5~6 fresh 검증 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.*"` 결과 PASS. +- 2026-06-27 Phase 5~6 fresh 검증 실행: `./gradlew :app:compileDebugKotlin` 결과 PASS. +- 2026-06-27 Phase 5~6 fresh 검증 실행: `./gradlew :app:ktlintCheck` 결과 PASS. +- 2026-06-27 Phase 5~6 fresh 검증 실행: `git diff --check` 결과 PASS(출력 없음). +- 2026-06-27 Phase 5~6 fresh 검증 실행: `./gradlew :app:mergeDebugResources`는 sandbox의 `~/.gradle` wrapper lock 접근 제한으로 1회 실패 후 권한 상승 재실행 결과 PASS. +- 2026-06-27 Phase 5~6 인접 회귀 fresh 검증 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"` 결과 PASS. +- 2026-06-27 Phase 5~6 인접 회귀 fresh 검증 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentSourceTest"` 결과 PASS. +- 2026-06-27 Phase 5~6 loading UI 후속 작업 시작: PRD의 첫 페이지 로딩/추가 페이지 로딩 상태 구분 요구를 사용자에게 보이는 UI로 반영하기 위해 Task 6.6을 추가했다. Phase 7 라우팅과 legacy 파일 수정은 범위에서 제외한다. +- 2026-06-27 Phase 5~6 loading UI 후속 RED 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.ContentOverviewActivitySourceTest"` 결과 예상 실패. layout progress id와 Activity 로딩 바인딩이 아직 없음을 확인했다. +- 2026-06-27 Phase 5~6 loading UI 후속 GREEN 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.ContentOverviewActivitySourceTest"` 결과 PASS. +- 2026-06-27 Phase 5~6 loading UI 후속 검증 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.*"` 결과 PASS. +- 2026-06-27 Phase 5~6 loading UI 후속 검증 실행: `./gradlew :app:mergeDebugResources` 결과 PASS. +- 2026-06-27 Phase 5~6 loading UI 후속 검증 실행: `./gradlew :app:compileDebugKotlin` 결과 PASS. +- 2026-06-27 Phase 5~6 loading UI 후속 검증 실행: `./gradlew :app:ktlintCheck` 결과 PASS. 기존 `.editorconfig`의 `disabled_rules` deprecation 경고는 출력되었으나 실패 원인은 아니었다. +- 2026-06-27 Phase 5~6 loading UI 후속 검증 실행: `git diff --check` 결과 PASS(출력 없음). +- 2026-06-27 Phase 5~6 코드 리뷰 및 검증 재확인: Phase 5 API/DTO/Repository/UI model과 Phase 6 ViewModel/Activity/Adapter 구현을 PRD/계획서 기준으로 재검토했고 추가 코드 수정이 필요한 발견 사항은 없었다. `Task 6.6`은 코드와 검증 기록이 완료 상태라 체크박스를 완료로 갱신했다. +- 2026-06-27 Phase 5~6 재검증 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.overview.*"` 결과 PASS. +- 2026-06-27 Phase 5~6 재검증 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"` 결과 PASS. +- 2026-06-27 Phase 5~6 재검증 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*"` 결과 PASS. +- 2026-06-27 Phase 5~6 재검증 실행: `./gradlew :app:mergeDebugResources`는 sandbox의 `~/.gradle` wrapper lock 접근 제한으로 1회 실패 후 권한 상승 재실행 결과 PASS. +- 2026-06-27 Phase 5~6 재검증 실행: `./gradlew :app:compileDebugKotlin` 결과 PASS. +- 2026-06-27 Phase 5~6 재검증 실행: `./gradlew :app:ktlintCheck` 결과 PASS. +- 2026-06-27 Phase 5~6 재검증 실행: `git diff --check` 결과 PASS(출력 없음).