From 092dff2a9d9361fe2e406b05898a5889f2ff3960 Mon Sep 17 00:00:00 2001 From: klaus Date: Mon, 22 Jun 2026 23:22:45 +0900 Subject: [PATCH] =?UTF-8?q?docs(creator):=20=ED=9B=84=EC=9B=90=20=ED=83=AD?= =?UTF-8?q?=20=ED=9B=84=EC=86=8D=20=EA=B2=80=EC=A6=9D=EC=9D=84=20=EA=B8=B0?= =?UTF-8?q?=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/20260622_크리에이터_채널_후원_탭/plan-task.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/20260622_크리에이터_채널_후원_탭/plan-task.md b/docs/20260622_크리에이터_채널_후원_탭/plan-task.md index 5e1952a2..723b00a1 100644 --- a/docs/20260622_크리에이터_채널_후원_탭/plan-task.md +++ b/docs/20260622_크리에이터_채널_후원_탭/plan-task.md @@ -521,6 +521,13 @@ ## Verification Log +- 2026-06-22: 후원 랭킹 item 순위 text 하단이 보이지 않는 원인을 재확인했다. rank `TextView`는 profile `1:1` 컨테이너 안에서 `0.63` 지점부터 아래로 그려져야 하는데, profile 컨테이너와 root item의 child drawing이 bounds 안으로 clipping되어 컨테이너 밖으로 내려오는 하단 영역이 보이지 않는 구조였다. 따라서 앞선 padding 접근은 제거하고, root와 profile 컨테이너에 `android:clipChildren="false"`를 적용해 rank text가 profile 하단 밖으로 overflow되어도 보이도록 수정했다. 순위 text 상단 위치는 사용자 확인 기준대로 `0.63` guideline에 맞췄다. RED로 `CreatorChannelDonationFragmentLayoutTest`가 기존 XML에서 FAIL하는 것을 확인했고, 수정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationFragmentLayoutTest"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `./gradlew :app:mergeDebugResources`, `git diff --check`가 PASS했다. `:app:mergeDebugResources`는 sandbox에서 Gradle wrapper lock 파일 접근 권한 문제로 1회 실패했고, 외부 권한으로 동일 명령을 재실행해 PASS를 확인했다. +- 2026-06-22: 사용자 추가 확인에 따라 후원 랭킹 item 순위 text 하단 clipping과 위치를 재조정한다. 기존 `0.68` guideline은 눈으로 봤을 때 Figma보다 낮게 보이므로 `0.63`으로 올리고, `@font/pattaya_regular` + shadow가 `includeFontPadding=false` 상태에서 하단 여유 없이 그려져 잘릴 수 있어 rank text에 bottom padding을 추가한다. 구현 전 RED로 `CreatorChannelDonationFragmentLayoutTest`가 기존 XML에서 FAIL하는 것을 확인했다. +- 2026-06-22: 후원 랭킹 item 순위 표시 위치를 Figma `290:9097` 기준으로 수정했다. `get_design_context`와 screenshot에서 `75dp` profile 기준 rank text `top=51dp`를 확인했고, profile 높이의 약 `68%` 지점을 기준으로 rank text가 시작되도록 profile 영역을 `1:1` nested `ConstraintLayout`으로 분리한 뒤 horizontal guideline `0.68`에 rank top을 연결했다. 기존 bottom constraint + `translationY` 방식은 제거했다. RED로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationFragmentLayoutTest"`가 기존 XML에서 FAIL하는 것을 확인했고, 수정 후 동일 focused 테스트가 PASS했다. 회귀 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Donation*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다. `:app:mergeDebugResources`는 sandbox에서 Gradle wrapper lock 파일 접근 권한 문제로 1회 실패했고, 외부 권한으로 동일 명령을 재실행해 PASS를 확인했다. +- 2026-06-22: 사용자 추가 확인에 따라 후원 랭킹 item 순위 표시 위치를 Figma `290:9097` 기준으로 재검토했다. Figma에서 순위 text는 `75dp` profile 기준 `top=51dp` 지점에 시작하므로 profile 높이의 약 `68%` 지점을 기준으로 overlay되도록 후속 수정한다. 구현 전 RED 테스트로 기존 bottom constraint + `translationY` 방식이 Figma 위치 계약과 다름을 고정한다. +- 2026-06-22: 사용자 피드백에 따라 후원 랭킹 섹션과 우측 하단 채널 후원 floating button을 Figma 기준으로 후속 수정했다. Figma `290:9097`, `290:9093` design context/screenshot을 재확인했고, 랭킹 grid는 고정 `75dp`가 아니라 가용 폭에서 `14dp` 간격 3개를 제외한 뒤 4등분되도록 `GridLayoutManager` + `CreatorChannelDonationRankingItemDecoration`으로 수정했다. 랭킹 member profile은 column 폭에 맞춰 `1:1` 비율로 측정되도록 바꾸고, 순위 표시는 `@font/pattaya_regular`, `28sp`, profile 하단 overlay 기준으로 조정했다. 우측 하단 후원 floating button은 `fragment_creator_channel_donation.xml`에서 제거하고 `activity_creator_channel.xml` overlay로 옮겨 `66dp` 크기, `14dp` end/bottom margin, `38dp` icon, Activity 우하단 고정 위치로 표시되게 했다. `CreatorChannelDonationFragment`는 content/owner 상태에 따라 Activity에 floating button visibility를 전달하고, Activity button click은 현재 Donation Fragment의 `onCreatorChannelDonationFloatingButtonClicked()`를 호출한다. +- 2026-06-22: 후속 수정 RED로 `CreatorChannelDonationFragmentLayoutTest`에 responsive ranking grid/item 계약을 추가하고, `CreatorChannelActivitySourceTest`에 Activity overlay floating button 계약을 추가했다. 기존 구현에서 랭킹 grid 폭/간격/순위 폰트 및 Fragment 내부 floating button 구조 때문에 FAIL하는 것을 확인한 뒤 수정했다. 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Donation*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다. `:app:mergeDebugResources`는 sandbox에서 Gradle wrapper lock 파일 접근 권한 문제로 1회 실패했고, 외부 권한으로 동일 명령을 재실행해 PASS를 확인했다. 참고로 `donation.*`와 `*Donation*` 테스트 필터를 한 Gradle 명령에 합쳐 실행하면 `SharedPreferenceManager.can` 전역 상태를 사용하는 테스트들이 겹쳐 기존 ViewModel 테스트가 흔들릴 수 있어, 계획 문서의 명령처럼 분리 실행했다. +- 2026-06-22: 사용자 확인 사항에 따라 후속 수정 범위를 추가했다. 후원 랭킹 섹션은 Figma `290:9097` 기준으로 grid gap `14dp`, 4열 responsive profile cell, rank overlay `28sp`/profile 하단 위치를 맞춘다. `402dp` 화면에서는 profile cell이 `75dp`가 되지만 고정값으로 두지 않고 가용 폭에 따라 계산되도록 한다. 우측 하단 채널 후원 floating button은 Figma `290:9093` 및 홈 탭 owner FAB 패턴처럼 `66dp` 크기, `14dp` end/bottom margin, `38dp` icon, Activity overlay 고정 위치로 옮기고, 후원 탭 content/empty 상태와 owner 여부에 따라 표시만 제어한다. 구현 전 RED 테스트로 layout/source 계약을 먼저 고정한다. - 2026-06-22: Phase 5, 6 코드 리뷰 및 검증을 수행했다. 리뷰에서 empty 중앙 `후원하기` button 배경색이 `@color/white`라 `soda/400` 요구와 맞지 않는 문제, empty 상태 후원 실패 메시지가 `Content` 전용 action toast 상태에 막혀 사용자에게 표시되지 않을 수 있는 문제를 발견해 RED 테스트 후 수정했다. 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.CreatorChannelDonationViewModelTest"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Donation*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다. `:app:mergeDebugResources`는 sandbox에서 Gradle wrapper lock 파일 접근 권한 문제로 1회 실패했고, 외부 권한으로 동일 명령을 재실행해 PASS를 확인했다. - 2026-06-22: Phase 2, 3, 4 코드 리뷰 및 재검증을 수행했다. API/DTO/Repository/ViewModel 계약, mapper 정책, content layout/adapter/Fragment 흐름을 대조했으며 차단급 코드 이슈는 발견하지 않았다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Donation*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다. `:app:mergeDebugResources`는 sandbox에서 Gradle wrapper lock 파일 접근 권한 문제로 1회 실패했고, 외부 권한으로 동일 명령을 재실행해 PASS를 확인했다. - 2026-06-22: 리뷰 지적에 따라 후원 성공 event가 `Content` 상태에 종속되지 않도록 후속 수정했다. RED로 `CreatorChannelDonationActionTest`에 `후원 fragment source는 성공 이벤트를 content 상태와 독립적으로 전달한다`를 추가했고, 기존 구현에서 `handleDonationSuccessEvent()` 부재로 FAIL하는 것을 확인했다. 이후 `CreatorChannelDonationFragment.observeViewModel()`의 상태 bind 후 공통 경로에서 `handleDonationSuccessEvent()`를 호출하도록 변경해 `Empty`, `Error`, `Content` 재조회 결과 모두 `Host.onCreatorChannelDonationCompleted()` 전달 대상이 되도록 했다. 수정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.donation.*"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다.