fix(home): 팔로잉 탭 후속 검증을 반영한다

This commit is contained in:
2026-07-31 03:22:50 +09:00
parent f600d10e8b
commit 49f6fe592c
37 changed files with 2918 additions and 447 deletions

View File

@@ -0,0 +1,227 @@
# Phase 6 Figma 후속 수정 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 6 / Task 6.1~6.8 |
| 기준 commit 또는 working tree | `f600d10e8b63b6fdc812b18a874b077dfe072ca8` + 2026-07-31 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | 대상 `prd.md`, `plan-task.md` |
| 리뷰 상태 | 수정 검증 완료 / 수동 검증 보류 |
## 2. 리뷰 목적과 범위
### 목적
- 크리에이터·최근 대화 UI 보정과 최근 소식 Feed 위젯 전환이 현재 코드에 유지되는지 확인한다.
- 전환 후 사용되지 않는 전용 resource가 남았는지 확인한다.
- 최근 대화 item의 XML 고정 폭이 adapter binding 이후에도 유지되는지 확인한다.
- creator·최근 대화 source test가 현행 UI 표현 속성 테스트 금지 규칙을 준수하는지 확인한다.
### 포함 범위
- `fragment_v2_main_home.xml`, creator/chat/news adapter와 layout, Feed 위젯 참조, source test.
### 제외 범위
- Phase 7 이후 Feed 내부 spacing과 Phase 9 DTO 계약.
## 3. 판정 기준
- runtime 기능에는 영향이 없지만 잘못된 preview와 obsolete resource를 남긴 문제는 Low로 판정했다.
## 4. 검토한 근거
### 문서와 코드
- `HomeFollowingNewsAdapter.kt:32-55`: Feed layout 3종 사용
- `fragment_v2_main_home.xml:359-368`: 과거 content layout preview 참조
- `item_home_following_news_rank.xml`, `item_home_following_news_content.xml`
- `HomeFollowingFragmentSourceTest.kt:185-218`
- `item_home_following_chat.xml:4`: root width `284dp`
- Task 6.7 수정 전 `HomeFollowingChatAdapter``HomeRecyclerItemLayoutParams.kt:7-14`: inflate된 width를 `WRAP_CONTENT`로 교체
- 현재 `HomeFollowingChatAdapter.kt:23-27`: inflate된 `RecyclerView.LayoutParams`의 width/height를 보존하고 end margin만 적용
- `HomeFollowingFragmentSourceTest.kt:292-360`: creator/chat XML 크기·orientation·style·maxLines·ellipsize 문자열 assertion
- `docs/agent-guides/code-style.md`: View 크기·margin·padding·constraint·visibility 등 UI 표현 속성 테스트 금지
### 실행한 검증
| 명령 | 결과 | 핵심 증거 |
|---|---|---|
| `rg -n "item_home_following_news_(rank|content)" ...` | 성공 | runtime adapter 참조 없음, preview/doc/test만 존재 |
| `./gradlew --no-daemon :app:testDebugUnitTest --tests "...HomeFollowingFragmentSourceTest"` | 성공 | 16개 테스트 실패 0 |
| resource merge/compile/ktlint | 성공 | BUILD SUCCESSFUL |
| Task 6.7 수정 후 chat layout parameter 정적 대조 | 성공 | XML `284dp` width를 보존하고 end margin만 추가 |
| 2026-07-31 Phase 1~13 통합 focused 회귀 | 성공 | 15개 suite, 113개 test, failures/errors 0 |
## 5. 발견 사항 요약
| ID | 심각도 | 상태 | 제목 | 소유 Task | 후속 goal |
|---|---|---|---|---|---|
| `REV-P6-001` | Low | 수정 완료 | Feed 전환 전 최근 소식 layout 2개와 preview 참조가 남음 | Task 6.5 | `P6-R1` 완료 |
| `REV-P6-002` | Low | 수정 완료 | 삭제된 최근 소식 layout이 상단 파일 구조에 생성 대상으로 남음 | Task 6.6 | `P6-R2` 완료 |
| `REV-P6-003` | Medium | 수정 완료 | 최근 대화 item의 XML `284dp` 폭이 런타임 `WRAP_CONTENT`로 덮임 | Task 6.7 | `P6-R3` 완료 |
| `REV-P6-004` | Low | 수정 완료 | creator·최근 대화 UI 표현 속성을 source 문자열로 검증함 | Task 6.8 | `P6-R4` 완료 |
## 6. 발견 사항 상세
### REV-P6-001 — Feed 전환 전 최근 소식 layout이 남음
- **심각도:** Low
- **상태:** 수정 완료
- **관련 요구사항:** Task 6.4 Feed 위젯 재사용
- **소유 Task:** Task 6.5
**관찰 내용**
runtime adapter는 `view_feed_rank/content/community`만 inflate하지만 과거 전용 news layout 두 개가 유지되고, RecyclerView preview는 그중 하나를 계속 가리킨다.
**근거**
- 코드: `HomeFollowingNewsAdapter.kt:38-55`
- resource: `fragment_v2_main_home.xml:368`
- 검색: `item_home_following_news_rank`는 runtime 참조 없음
**영향**
Layout Editor preview와 실제 UI가 다르고, 유지보수자가 사용 중인 resource로 오해할 수 있다.
**권장 조치**
preview를 `view_feed_content`로 바꾸고 obsolete layout 2개를 삭제한다.
**판정 기록**
- 2026-07-30 — 전체 resource 참조 검색으로 확정.
- 2026-07-30 — Task 6.5에서 preview 교체와 obsolete layout 삭제 후 resource/회귀 검증을 완료.
### REV-P6-002 — 삭제된 최근 소식 layout이 파일 구조에 남음
- **심각도:** Low
- **상태:** 수정 완료
- **관련 요구사항:** Task 6.5, 계획 문서 범위 변경 선반영 규칙
- **소유 Task:** Task 6.6
**관찰 내용**
Task 6.5와 현재 resource는 `item_home_following_news_rank.xml`, `item_home_following_news_content.xml`을 삭제했지만, `plan-task.md` 상단 `파일 구조`는 두 파일을 여전히 Create 대상으로 설명한다.
**근거**
- 문서: `plan-task.md` 상단 `파일 구조`와 Task 6.5
- 코드: `HomeFollowingNewsAdapter``view_feed_rank`, `view_feed_content`, `view_feed_community`를 사용
- resource: 두 obsolete layout은 현재 working tree에서 삭제 상태
**영향**
후속 작업자가 삭제된 resource를 현재 필수 파일로 오인하거나 다시 생성할 수 있다.
**권장 조치**
상단 파일 구조를 현재 Feed 위젯 재사용 구조에 맞추되 Task 6.5의 삭제 이력은 유지한다.
**판정 기록**
- 2026-07-30 — 현재 파일 목록, adapter 참조, 계획 문서 상단 목록을 대조해 확정.
- 2026-07-30 — Task 6.6에서 상단 파일 구조를 Feed layout 재사용/obsolete layout 삭제 이력 기준으로 갱신하고 대체 검증을 완료.
### REV-P6-003 — 최근 대화 고정 폭이 adapter에서 보존되지 않음
- **심각도:** Medium
- **상태:** 수정 완료
- **관련 요구사항:** Task 6.2의 Figma `284dp` box card, Task 6.3의 폭 보정 기록
- **소유 Task:** Task 6.7
**관찰 내용**
`item_home_following_chat.xml` root는 `284dp`지만 `HomeFollowingChatAdapter.onCreateViewHolder()`가 inflate 직후 `recyclerItemLayoutParams(parent)`로 전체 layout parameter를 교체한다. 해당 helper는 width와 height를 모두 `WRAP_CONTENT`로 새로 생성하므로 문서에 기록된 “XML 폭 유지”가 실제 코드에서는 성립하지 않는다.
**근거**
- layout: `item_home_following_chat.xml:4-5`
- adapter: `HomeFollowingChatAdapter.kt:23-26`
- helper: `HomeRecyclerItemLayoutParams.kt:7-14`
- 문서: Task 6.3의 최근 대화 item 폭 보정 검증 기록
**영향**
가로 목록에서 카드 폭이 Figma `284dp`가 아니라 자식 content의 wrap-content 측정값으로 결정되어 제목·메시지 영역과 item 간격이 설계와 다르게 보일 수 있다.
**권장 조치**
inflate된 root의 기존 width/height는 유지하고 end margin만 추가한다. 공통 helper 전체 리팩터링 없이 `HomeFollowingChatAdapter` 한 곳을 최소 수정하고, UI 크기 자동 테스트 대신 resource/compile/정적 대조와 Task 5.3 수동 확인을 사용한다.
**판정 기록**
- 2026-07-30 — XML root width, adapter 대입문, helper 반환값을 end-to-end로 대조해 확정.
- 2026-07-30 — 구현 전 Phase 6 Task 6.7 / `P6-R3`로 전환.
- 2026-07-30 — Task 6.7에서 inflate된 `RecyclerView.LayoutParams`의 width/height를 보존하고 end margin만 적용하도록 수정한 뒤 회귀 검증을 완료.
### REV-P6-004 — creator·최근 대화 UI 표현 속성을 source test로 고정함
- **심각도:** Low
- **상태:** 수정 완료
- **관련 요구사항:** `docs/agent-guides/code-style.md` 테스트 관례, Task 6.1~6.2
- **소유 Task:** Task 6.8
**관찰 내용**
`HomeFollowingFragmentSourceTest`가 creator item의 `75dp` 폭/높이와 typography style, 최근 대화 section의 XML orientation, `284dp`/`62dp` 폭/높이, `maxLines`/`ellipsize`를 파일 문자열로 검증한다. 이는 로직 테스트만 추가하고 UI 레이아웃/표현 속성 테스트를 작성하지 않는 현행 가이드와 맞지 않는다.
**근거**
- test: `HomeFollowingFragmentSourceTest.kt:292-302`, `331-361`
- guide: `docs/agent-guides/code-style.md` “신규 테스트는 로직에 대한 테스트 코드만 작성” 및 UI 표현 속성 검증 금지
- 비교: 동일 리뷰의 Task 7.7, 8.4, 10.3, 12.4는 같은 종류의 assertion을 이미 제거함
**재현 또는 검증 절차**
1. `rg -n 'layout_(width|height)|orientation|maxLines|ellipsize|Typography' HomeFollowingFragmentSourceTest.kt`를 실행한다.
2. Phase 6 creator/chat 테스트 범위에서 XML 표현 값 assertion을 확인한다.
3. production 동작은 정상이지만 테스트 정책 위반은 재현된다.
**영향**
런타임 결함은 아니지만 디자인 값 조정이 로직 회귀 실패로 잘못 표시되고, 가이드에서 정한 수동/Figma 대조 경계를 흐린다.
**권장 조치**
XML 크기·방향·style·말줄임 문자열 assertion만 제거하고, creator header 제거 구조, Direct badge 결정, 상대 시간 formatter, 필수 field 바인딩은 유지한다. production UI 값은 변경하지 않는다.
**판정 기록**
- 2026-07-31 — test source 검색과 현행 가이드를 대조해 확정.
- 2026-07-31 — production/test는 수정하지 않고 Phase 6 Task 6.8 / `P6-R4`로 전환.
- 2026-07-31 — Task 6.8에서 금지된 UI 표현 속성 source assertion만 제거하고 구조·바인딩·클릭 계약 회귀 검증을 완료.
## 7. 확정 항목의 plan·goal 전환
- Phase 6에 Task 6.5 / `P6-R1`을 추가해 완료했다.
- 재점검에서 Task 6.6 / `P6-R2`를 추가해 완료했다.
- 추가 재점검에서 Task 6.7 / `P6-R3`를 추가해 완료했다.
- 2026-07-31 재점검에서 Task 6.8 / `P6-R4`를 추가해 완료했다.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | UI resource와 adapter 참조 검색 |
| 후보 항목 판정 완료 | 충족 | REV-P6-001~004 판정 완료 |
| 확정 항목 plan 반영 | 충족 | Task 6.5~6.8 |
| 검증 명령과 결과 기록 | 충족 | source test 및 build PASS |
**최종 결론:** 확정 발견 사항 모두 수정 완료 / 실기기 검증은 외부 조건 대기
**남은 항목:** Phase 5 Task 5.3 실기기 확인
## 9. 수정 후 검증 기록
- 2026-07-30: 최근 소식 preview `tools:listitem`을 실제 runtime Feed layout인 `@layout/view_feed_content`로 교체하고 obsolete `item_home_following_news_rank.xml`, `item_home_following_news_content.xml`을 삭제했다. `rg` 기준 runtime 참조는 없고 문서/테스트 검증 참조만 남았다. `:app:mergeDebugResources`, `HomeFollowingFragmentSourceTest`, 팔로잉 전체 회귀, `:app:compileDebugKotlin`, `:app:ktlintCheck`, `git diff --check` PASS.
- 2026-07-30: Task 6.6으로 `plan-task.md` 상단 파일 구조를 현재 resource 구성에 맞춰 갱신했다. obsolete layout 2개는 삭제 이력으로만 남기고, 최근 소식 runtime layout은 `view_feed_rank`, `view_feed_content`, `view_feed_community` 재사용으로 명시했다. `rg` 대조와 `git diff --check` PASS.
- 2026-07-30: Task 6.7로 `HomeFollowingChatAdapter`가 새 `WRAP_CONTENT` layout parameter를 만들지 않고 inflate된 root의 `284dp` width와 height를 보존한 채 `spacing_12` end margin만 적용하도록 수정했다. focused test, 팔로잉 전체 회귀, resource merge, Kotlin compile, ktlint PASS. 연결 기기가 없어 실기기 확인은 Task 5.3 보류 상태를 유지했다.
- 2026-07-31 재점검: Phase 1~13 focused 회귀 15개 suite/113개 test, resource merge, Kotlin compile, ktlint는 PASS했다. `REV-P6-004`는 가이드 대조로 확정했고, 이번 리뷰에서 production/test 코드는 수정하지 않았다.
- 2026-07-31: `REV-P6-004` 보완으로 creator·최근 대화 source test에서 UI 표현 속성 문자열 assertion을 제거했다. creator header 제거, 필수 field id, Direct badge, 상대 시간 formatter, click listener 계약 검증은 유지했다. `rg` 대체 검증, `HomeFollowingFragmentSourceTest`, 팔로잉 전체 회귀, resource merge, Kotlin compile, ktlint PASS. 연결 기기가 없어 실기기 표현 확인은 Task 5.3 보류 상태를 유지했다.
- 2026-07-31 최종 검증: creator·최근 대화 회귀를 포함한 통합 20개 suite·306개 test와 resource merge, Kotlin compile, ktlint가 PASS했다. 추가 확정 수정 사항은 없고 실기기 확인은 Phase 5 Task 5.3에 유지한다.
- 2026-07-31 이번 리뷰 재검증: creator/chat 고정 폭 보존, Feed 위젯 재사용과 obsolete layout 제거 상태를 다시 대조했다. 통합 16개 suite·120개 test, resource merge, Kotlin compile, ktlint가 PASS해 `REV-P6-001~004` 수정 완료 판정을 유지하고, 시각 대조는 Phase 5 Task 5.3에 유지한다.