From 40f83550376db82970d9b8855a42151092f8a248 Mon Sep 17 00:00:00 2001 From: klaus Date: Wed, 10 Jun 2026 15:20:33 +0900 Subject: [PATCH] =?UTF-8?q?docs(chat):=20=ED=83=80=EC=9D=B4=ED=8B=80?= =?UTF-8?q?=EB=B0=94=20=EC=95=A1=EC=85=98=20=EA=B0=84=EA=B2=A9=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=EC=9D=84=20=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/20260609_채팅_탭_페이지/plan-task.md | 53 +++++++++++++++-------- docs/20260609_채팅_탭_페이지/prd.md | 3 +- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/docs/20260609_채팅_탭_페이지/plan-task.md b/docs/20260609_채팅_탭_페이지/plan-task.md index 997ffa04..ede0ccb7 100644 --- a/docs/20260609_채팅_탭_페이지/plan-task.md +++ b/docs/20260609_채팅_탭_페이지/plan-task.md @@ -425,9 +425,37 @@ --- -### Phase 8: 통합 검증과 문서 기록 +### Phase 8: 탭 전환 및 첫 페이지 로딩 시 스크롤 최상단 이동 처리 -- [ ] **Task 8.1: 리소스/컴파일 검증** +- [x] **Task 8.1: 스크롤 최상단 이동 기능 검증을 위한 RED 테스트 작성** + - `ChatMainFragmentLayoutTest.kt`에 탭 전환 시 및 첫 번째 페이지 로드 시 RecyclerView의 scrollToPosition(0)이 호출되는지 검증하는 테스트 코드를 추가한다. + - run_test로 검증하여 RED 상태를 확인한다. +- [x] **Task 8.2: ChatMainFragment.kt의 탭 전환 및 첫 페이지 로딩 시 스크롤 최상단 이동 구현** + - `setOnTabSelectedListener` 내부와 `bindViewModel`의 `ChatRoomListUiState.Content` (isAppending = false인 경우)에 `scrollToPosition(0)` 또는 적절한 스크롤 탑 이동 처리를 추가한다. + - run_test를 실행해 정상적으로 PASS(GREEN)하는지 확인한다. +- [x] **Task 8.3: 전체 통합 테스트 검증 및 ktlint 검사** + - `:app:mergeDebugResources`, `:app:compileDebugKotlin`, `:app:ktlintCheck` 및 전체 테스트를 돌려 이상이 없는지 검증한다. +- [x] **Task 8.4: 최종 Verification Log 작성 및 제출** + - 작업 결과를 plan-task.md 및 prd.md에 기록한다. + +--- + +### Phase 9: 채팅 타이틀바 우측 액션 메뉴 이미지 간격 조정 + +- [x] **Task 9.1: dimens 리소스 및 타이틀바 구조 분석** + - `dimens.xml` 내 `spacing_14` 리소스 확인 및 `ChatMainFragment.kt`의 `setupTitleBar()`에 있는 동적 아이콘 추가 코드 구조 분석. +- [x] **Task 9.2: 타이틀바 우측 액션 메뉴 이미지 마진 적용** + - `ChatMainFragment.kt`의 `setupTitleBar()`에서 검색 `ImageView`를 추가할 때 `LinearLayout.LayoutParams`를 생성하여 `marginStart` 값을 `@dimen/spacing_14`로 동적으로 세팅. +- [x] **Task 9.3: Layout 유닛 테스트 검증** + - `ChatMainFragmentLayoutTest.kt`에 `LinearLayout.LayoutParams` 사용 및 `marginStart = resources.getDimensionPixelSize(R.dimen.spacing_14)` 설정 여부를 확인하는 유닛 테스트 추가 및 run_test 수행. +- [x] **Task 9.4: 최종 Verification Log 작성 및 제출** + - 작업 결과를 plan-task.md 및 prd.md에 기록하고 검증 기록 누적. + +--- + +### Phase 10: 통합 검증과 문서 기록 + +- [ ] **Task 10.1: 리소스/컴파일 검증** - 실행: - `./gradlew :app:mergeDebugResources` - `./gradlew :app:compileDebugKotlin` @@ -435,7 +463,7 @@ - 모든 신규 layout/drawable/string/binding 생성 성공 - Kotlin compile 성공 -- [ ] **Task 8.2: 단위 테스트 검증** +- [ ] **Task 10.2: 단위 테스트 검증** - 실행: - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.*"` - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.*CapsuleTab*"` @@ -443,11 +471,11 @@ - 채팅 탭 filter/formatter/mapper/ViewModel/Adapter/Layout 테스트 통과 - CapsuleTab 기존 테스트와 색상 보정 테스트 통과 -- [ ] **Task 8.3: ktlint 검증** +- [ ] **Task 10.3: ktlint 검증** - 실행: `./gradlew :app:ktlintCheck` - 기대 결과: ktlint error 없음 -- [ ] **Task 8.4: 검증 기록 누적** +- [ ] **Task 10.4: 검증 기록 누적** - Modify: `docs/20260609_채팅_탭_페이지/plan-task.md` - Modify: `docs/20260609_채팅_탭_페이지/prd.md` - 기록: @@ -504,18 +532,7 @@ - 2026-06-10: Phase 7 코드리뷰 및 통합 검증을 완료했다. `CapsuleTabBarView.kt`에서 `ViewGroup` 임포트 누락 및 `LayoutParams.WRAP_CONTENT` 오분석에 따른 빌드 에러를 수정(`ViewGroup.LayoutParams.WRAP_CONTENT`로 명시적 선언 및 임포트 추가)하였으며, 이후 `run_test`를 통해 `widget` 및 `main.chat` 관련 211개 유닛 테스트가 모두 성공적으로(GREEN) 작동함을 확인했다. 전체적인 Phase 7의 코드 구성(ChatMainFragment, 뷰 바인딩, 페이지네이션 롤링 스크롤, AI 룸 클릭 액션)이 설계 명세 및 Figma 가이드라인에 완벽히 부합함을 검증했다. - 2026-06-10: CapsuleTabBarView의 탭 전환 시 또는 첫 번째 페이지 로드 시(isAppending = false) RecyclerView의 스크롤을 최상단(position 0)으로 이동시키는 추가 요구사항에 맞춰 Plan-Task에 Phase 9를 신설하고 구현 및 검증을 마쳤다. - 2026-06-10: Phase 9의 Task 9.1(RED 테스트), Task 9.2(최상단 스크롤 구현), Task 9.3(통합 유닛 테스트)을 완료했다. 탭 전환 시 `binding.rvChatRooms.scrollToPosition(0)`이 실행되고, `bindViewModel`에서 첫 페이지 로딩 시(`!state.isAppending`) 동일하게 `scrollToPosition(0)`이 정상 호출되는지 유닛 테스트로 검증하여 GREEN 상태로 통과시켰다. +- 2026-06-10: 채팅 타이틀바 우측 액션 메뉴 이미지 간격 조정 요구사항을 해결하기 위해 Plan-Task에 Phase 10을 신설하고 구현 및 검증을 마쳤다. `dimens.xml`에 정의된 `@dimen/spacing_14` 리소스를 적용하여 하드코딩 없이 간격을 14dp로 안전하게 맞췄으며, `ChatMainFragmentLayoutTest.kt` 유닛 테스트를 업데이트하여 검증을 통과시켰다. +- 2026-06-10: 사용자 피드백에 따라 통합 검증 Phase가 마지막에 오도록 Plan-Task 순서를 정리했다. 기존 Phase 9(탭 전환/첫 페이지 로딩 시 스크롤 최상단 이동 처리)를 Phase 8로, 기존 Phase 10(채팅 타이틀바 우측 액션 메뉴 이미지 간격 조정)을 Phase 9로 한 단계씩 당기고, 기존 Phase 8(통합 검증과 문서 기록)을 마지막 Phase 10으로 이동했다. 문서 순서 정정만 수행했으며 빌드/테스트는 실행하지 않았다. --- - -### Phase 9: 탭 전환 및 첫 페이지 로딩 시 스크롤 최상단 이동 처리 - -- [x] **Task 9.1: 스크롤 최상단 이동 기능 검증을 위한 RED 테스트 작성** - - `ChatMainFragmentLayoutTest.kt`에 탭 전환 시 및 첫 번째 페이지 로드 시 RecyclerView의 scrollToPosition(0)이 호출되는지 검증하는 테스트 코드를 추가한다. - - run_test로 검증하여 RED 상태를 확인한다. -- [x] **Task 9.2: ChatMainFragment.kt의 탭 전환 및 첫 페이지 로딩 시 스크롤 최상단 이동 구현** - - `setOnTabSelectedListener` 내부와 `bindViewModel`의 `ChatRoomListUiState.Content` (isAppending = false인 경우)에 `scrollToPosition(0)` 또는 적절한 스크롤 탑 이동 처리를 추가한다. - - run_test를 실행해 정상적으로 PASS(GREEN)하는지 확인한다. -- [x] **Task 9.3: 전체 통합 테스트 검증 및 ktlint 검사** - - `:app:mergeDebugResources`, `:app:compileDebugKotlin`, `:app:ktlintCheck` 및 전체 테스트를 돌려 이상이 없는지 검증한다. -- [x] **Task 9.4: 최종 Verification Log 작성 및 제출** - - 작업 결과를 plan-task.md 및 prd.md에 기록한다. diff --git a/docs/20260609_채팅_탭_페이지/prd.md b/docs/20260609_채팅_탭_페이지/prd.md index 810b1fd2..7a959823 100644 --- a/docs/20260609_채팅_탭_페이지/prd.md +++ b/docs/20260609_채팅_탭_페이지/prd.md @@ -56,7 +56,7 @@ #### Requirements - 전체 배경은 `@color/black`을 사용한다. - 상단에는 높이 `60dp` 수준의 타이틀바를 배치하고 제목은 `대화`로 표시한다. -- 타이틀바 우측에는 기존 `ic_bar_cash`, `ic_bar_search` 리소스를 재사용한다. +- 타이틀바 우측에는 기존 `ic_bar_cash`, `ic_bar_search` 리소스를 재사용한다. 우측 상단의 action menu 이미지 사이 간격을 14dp로 지정하며, dimens에 정의되어 있는 값(`@dimen/spacing_14`)이 있으면 하드코딩 하지 않고 dimens의 값을 가져다가 설정한다. 타 화면 공통 컴포넌트 마크업 훼손을 피하기 위해 코드단(`ChatMainFragment.kt` 내)에서 동적으로 LayoutParams 마진을 부여한다. - Figma의 하단 nav는 `MainV2Activity`의 기존 `BottomNavigationView`가 담당하므로 Fragment layout에는 포함하지 않는다. - content 영역은 타이틀바 아래 필터 탭과 채팅방 목록으로 구성한다. - 플로팅 액션 버튼은 우측 하단, 하단 내비게이션과 겹치지 않는 위치에 표시한다. @@ -260,3 +260,4 @@ data class ChatRoomListItemResponse( - 2026-06-09: 사용자 피드백에 따라 채팅 전용 `view_title_bar_chat.xml` 신규 생성을 제외하고, 기존 `view_title_bar_default.xml`의 우측 아이콘 영역을 가변 개수로 확장해 재사용하는 방향으로 위젯 분류를 갱신했다. - 2026-06-10: Phase 6에서 채팅 탭 layout 골격과 CapsuleTab selected 색상 보정을 구현했다. 기존 `view_title_bar_default.xml`에 `ll_title_bar_actions`를 추가해 우측 action icon을 가변으로 담을 수 있게 했고, `fragment_v2_main_chat.xml`은 black `ConstraintLayout` root 아래 title bar, `view_capsule_tab_bar`, `rv_chat_rooms`, `btn_chat_floating`만 포함하도록 구성했다. floating button은 `bg_chat_floating_button.xml`의 `soda_400` 원형 배경과 기존 `ic_plus_no_bg`를 사용하며 클릭 동작은 추가하지 않았다. `CapsuleTabBarView`는 PRD 요구대로 selected tab black text, normal tab white text를 사용하도록 수정했다. 검증으로 `ChatMainFragmentLayoutTest`, `CapsuleTabBarViewTest`를 추가했고 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragmentLayoutTest"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.*CapsuleTab*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`가 모두 `BUILD SUCCESSFUL`로 통과했다. Phase 7 범위인 `ChatMainFragment` 동작 연결, 실제 title/icon 세팅, filter listener, navigation/click action은 구현하지 않았다. - 2026-06-10: CapsuleTabBarView의 탭 전환 시 또는 첫 번째 페이지 로드 시(isAppending = false) RecyclerView의 스크롤을 최상단(position 0)으로 이동시키는 추가 요구사항을 수렴하고, 기존 PRD와 Plan-Task 문서를 갱신한 뒤 구현 및 검증을 완료했다. +- 2026-06-10: 채팅 타이틀바 우측 액션 메뉴 이미지 간의 간격을 14dp로 조정하는 요구사항을 반영했습니다. `dimens.xml`에 정의된 `@dimen/spacing_14` 리소스를 사용하여 하드코딩 없이 안전하게 `ChatMainFragment.kt`의 코드단에서 동적으로 LayoutParams를 통해 `marginStart` 값을 적용했습니다. 검증을 위한 `ChatMainFragmentLayoutTest.kt`도 업데이트하고 테스트 통과를 완료했습니다.