Files
sodalive-android/docs/20260625_메인_홈_팔로잉_탭/reviews/phase3-following-viewmodel-review.md

4.9 KiB

Phase 3 ViewModel 상태와 API 호출 리뷰

1. 리뷰 정보

항목 내용
리뷰 대상 Phase 3 / Task 3.1~3.4
기준 commit 또는 working tree f600d10e8b63b6fdc812b18a874b077dfe072ca8 + 2026-07-31 working tree
리뷰 일자 2026-07-31
리뷰어 Codex
기준 문서 대상 prd.md, plan-task.md
리뷰 상태 수정 검증 완료

2. 리뷰 목적과 범위

목적

  • Loading, success/login-required/error와 optional header 흐름이 구현·테스트에서 일치하는지 확인한다.
  • 완료 기록이 주장하는 상태 발행 순서가 실제 assertion으로 보호되는지 확인한다.

포함 범위

  • HomeFollowingViewModel.kt, DI 등록, HomeFollowingViewModelTest.kt

제외 범위

  • Fragment rendering과 pull refresh UI.

3. 판정 기준

  • 확정 상태 전환 요구사항 위반은 High, 기능은 맞지만 완료 증거가 누락된 검증 문제는 Low로 판정했다.

4. 검토한 근거

문서와 코드

  • HomeFollowingViewModel.kt:38-78
  • HomeFollowingViewModelTest.kt:56-65, 67-128
  • Task 3.1의 “loading 후 content 상태를 발행한다” 테스트 케이스와 Task 3.2 완료 기록

실행 환경

OS: Darwin 25.0.0 x86_64
JDK: OpenJDK 17.0.15
Gradle wrapper: 8.14.3

실행한 검증

명령 결과 핵심 증거
./gradlew --no-daemon :app:testDebugUnitTest --tests "...HomeFollowingViewModelTest" 성공 7개 테스트 실패 0
테스트 assertion 수동 대조 문제 확인 첫 테스트는 최종 Content와 isLoading=false만 확인하고 Loading 이력은 수집하지 않음

5. 발견 사항 요약

ID 심각도 상태 제목 소유 Task 후속 goal
REV-P3-001 Low 수정 완료 Loading → 결과 발행 순서가 테스트 이름과 완료 기록과 달리 검증되지 않음 Task 3.4 P3-R1 완료

6. 발견 사항 상세

REV-P3-001 — Loading → 결과 발행 순서가 테스트로 보호되지 않음

  • 심각도: Low
  • 상태: 수정 완료
  • 관련 요구사항: Task 3.1 loading 후 content 상태 발행
  • 소유 Task: 신규 Task 3.4

관찰 내용

production은 Loading을 먼저 설정하지만 테스트는 loadFollowing() 완료 후 LiveData의 마지막 값만 읽는다. 테스트가 통과해도 Loading 발행이 제거되는 회귀를 잡지 못한다.

근거

  • 코드: HomeFollowingViewModel.kt:43-57
  • 테스트: HomeFollowingViewModelTest.kt:56-65
  • 문서: Task 3.1, Task 3.2 검증 기록

재현 또는 검증 절차

  1. loadFollowing은 loading 후 content 상태를 발행한다 테스트를 확인한다.
  2. observer 이력 수집이나 Loading assertion이 없는지 대조한다.
  3. 실제 결과는 최종 ContentisLoading=false만 검증된다.

영향

로딩 UI 계약이 회귀해도 Phase 3 focused test와 완료 기록은 계속 PASS할 수 있다.

권장 조치

observer가 수집한 상태 이력을 이용해 Loading, Content 순서를 한 테스트에서 검증한다. production 변경은 필요하지 않으며, 이미 존재하는 동작의 coverage 보강이므로 의도적인 RED를 만들지 않는다.

판정 기록

  • 2026-07-30 — 테스트와 완료 기준을 직접 대조해 확정.
  • 2026-07-30 — Task 3.4에서 observer 상태 이력 assertion을 추가하고 focused/전체 회귀 PASS로 수정 완료.

7. 확정 항목의 plan·goal 전환

  • plan-task.md Phase 3에 Task 3.4 / P3-R1을 추가했다.
  • objective: [P3-R1]의 REV-P3-001을 테스트로 고정하고 Phase 3 회귀를 방지한다.

8. 리뷰 종료 판정

판정 항목 결과 근거
리뷰 범위 전체 확인 충족 ViewModel, DI, test 확인
후보 항목 판정 완료 충족 REV-P3-001 확정
확정 항목 plan 반영 충족 Task 3.4 추가
검증 명령과 결과 기록 충족 focused test 7개 PASS

최종 결론: 수정 검증 완료

남은 항목: 없음

9. 수정 후 검증 기록

  • 2026-07-30: HomeFollowingViewModelTest에 observer 상태 이력 assertion을 추가해 Loading → Content 발행 순서를 검증했다. production 변경 없이 focused test와 팔로잉 전체 회귀, git diff --check PASS.
  • 2026-07-31 재점검: ViewModel 7개 test와 Phase 1~13 focused 회귀 113개 test, resource merge, Kotlin compile, ktlint PASS. 추가 확정 발견 사항 없음.
  • 2026-07-31 최종 검증: ViewModel 상태 전이를 포함한 통합 20개 suite·306개 test와 Kotlin compile, ktlint가 PASS했다. 추가 확정 발견 사항 없음.
  • 2026-07-31 이번 리뷰 재검증: Loading → Content, optional auth, login-required, 초기 오류와 refresh fallback 상태를 다시 대조했다. 통합 16개 suite·120개 test와 Kotlin compile·ktlint가 PASS해 추가 확정 발견 사항이 없다.