Skip to content

[FIX] 2차 QA 수정사항 반영 (약관/탈퇴/설정/홈) - #224

Merged
kimjw2003 merged 6 commits into
developfrom
FLT-33-2차-qa-김종우
Aug 27, 2026

Hidden character warning

The head ref may contain hidden characters: "FLT-33-2\ucc28-qa-\uae40\uc885\uc6b0"
Merged

[FIX] 2차 QA 수정사항 반영 (약관/탈퇴/설정/홈)#224
kimjw2003 merged 6 commits into
developfrom
FLT-33-2차-qa-김종우

Conversation

@kimjw2003

@kimjw2003 kimjw2003 commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

📮 관련 이슈

  • FLT-33 2차 QA 수정사항 반영

📌 작업 내용

🐛 약관 동의 상태가 화면 이동 후 초기화되는 문제 (QA 2건)

  • 자세히 보기 진입 후 복귀 시 동의 상태 유실
  • 온보딩 진입 후 뒤로가기로 복귀 시 동의 상태 유실

두 건 모두 원인이 같습니다. 체크 상태가 OnboardingTermsScreen의 컴포저블 로컬 remember에 있어서, 화면을 벗어나면 컴포지션이 해제되며 초기화됐습니다. agreedTermsIds는 동의하기를 누른 시점에만 채워져 복원에 쓸 수 없었고요.

상태를 OnboardingTermsUiState로 올려 onboarding nav graph에 스코프된 OnboardingViewModel이 들고 있게 했습니다. 인덱스 대신 약관 id를 키로 써서 목록 순서가 바뀌어도 안전합니다.

🐛 로그인 화면에서 뒤로가기 시 이전 화면으로 되돌아가는 문제

navigateToLoginpopUpTo(startDestination)을 쓰고 있었는데, 시작 목적지인 Splash는 홈 진입 시 navigateToHome(clearStackNavOptions)가 이미 제거한 뒤라 아무것도 pop되지 않았습니다.

형제 메서드들과 동일하게 clearStackNavOptions를 쓰도록 통일했고, navigateToLogin을 호출하는 세 경로가 함께 정리됩니다.

호출 경로 수정 전 수정 후
스플래시 → 로그인 정상 (우연히 동작) 정상
로그아웃 → 로그인 설정으로 되돌아감 앱 종료
탈퇴 완료 → 로그인 탈퇴 완료로 되돌아감 앱 종료

🎨 탈퇴 화면 유의사항 목록 간격 / 번호 정렬

  • 항목 사이 간격이 없어 문장 내 줄간격과 구분되지 않던 문제 → Arrangement.spacedBy(24.dp)
  • 번호와 본문의 y 위치가 미세하게 어긋나던 문제 → 기존 offset(y = -3.dp) 보정을 제거하고, 번호와 본문을 하나의 Text로 합쳐 TextIndent(restLine)으로 hanging indent 처리

offset은 레이아웃이 아니라 그리기만 옮기므로 여러 줄 항목에서 블록 전체가 밀려 오히려 더 어긋났습니다. 같은 줄 박스를 쓰게 만들어 어긋남이 구조적으로 발생할 수 없게 했고, 들여쓰기 폭은 TextMeasurer로 번호의 실제 렌더 너비를 재서 폰트 배율이 바뀌어도 맞습니다.

🎨 설정 화면

  • 프로필 수정 버튼 테두리 2dp → 1dp. ColorOutline은 공용 상태라 값을 직접 바꾸지 않고, FlintBasicButtonborderWidth: Dp? = null을 추가해 화면 단위로만 덮어쓰게 했습니다. 기본값이 null이라 기존 사용처는 영향이 없습니다.
  • 카카오 아이콘 에셋 교체. 기존 16×16이라 16dp로 그릴 때 xxhdpi(48px 필요)에서 3배 업스케일돼 뭉개졌고, 새 에셋은 64×64입니다.

🎨 홈 화면

  • 최근 저장한 콘텐츠 부제 문구 변경 → "관심이 가는 작품들을 다시 만나보세요"

✅ 테스트

  • TermsAgreementStateTest 12개 — 약관 상태 전이
  • OnboardingTermsNavigationTest 4개 — 실제 NavHost로 이동/복귀 후 상태 유지 검증
  • 버그를 되살린 대조 실험에서 상태 유지 테스트 3개가 실패하는 것까지 확인 (테스트가 회귀를 실제로 잡는지 검증)
  • 에뮬레이터(Pixel_5) 실기로 QA 시나리오 전부 재현 및 통과

😅 미구현 / 확인 필요

  • Figma 대조 미완료 — Figma MCP 인증이 안 돼서 탈퇴 화면의 나머지 간격(제목목록 28dp, 목록구분선 28dp, 좌우 패딩 28dp)은 대조하지 못했습니다. 항목 간격 24dp도 지시받은 값을 넣은 것이라 스펙 확인 전입니다.
  • ColorOutline 다른 사용처 — 설정 화면에만 1dp 예외를 뒀습니다. 디자인상 이 상태 전체가 1dp라면 다른 화면들은 여전히 2dp입니다.
  • 로그인 화면 ic_kakao.png (78×72) — 교체하지 않았습니다.
  • SavedContentsSection.kt의 Preview 샘플 텍스트는 옛 문구 그대로입니다.

🫛 To. 리뷰어

  • 홈 문구 변경 건은 원문이 전달받은 문장과 달랐습니다. 실제 코드에 있던 문장은 "현재 구독 중인 OTT에서 볼 수 있는 작품들이에요"였고, 홈 화면의 유일한 OTT 문구라 이것으로 판단하고 진행했습니다. 의도한 문장이 맞는지 확인 부탁드립니다.
  • TermRow 체크박스/펼침 아이콘에 contentDescription을 추가했습니다(기존 null). 계측 테스트에서 아이콘을 찾기 위해 필요했고, 스크린리더가 체크 상태를 읽지 못하던 접근성 결함이기도 합니다. 요청 범위 밖 변경이라 원치 않으시면 되돌리겠습니다.

Summary by CodeRabbit

  • 새 기능
    • 온보딩 약관의 개별 선택, 전체 선택, 펼침 상태를 안정적으로 유지합니다.
    • 필수 약관에 동의해야 다음 단계로 진행할 수 있습니다.
    • 버튼 테두리 두께를 선택적으로 설정할 수 있습니다.
    • 로그인 이동 시 이전 화면으로 돌아갈 수 없도록 탐색 기록을 정리합니다.
  • 개선 사항
    • 저장 콘텐츠 안내 문구를 재탐색 중심으로 변경했습니다.
    • 회원 탈퇴 안내문의 번호 및 본문 정렬을 개선했습니다.
    • 약관 선택 및 화면 이동 동작을 검증하는 테스트를 추가했습니다.

kimjw2003 and others added 6 commits August 25, 2026 22:35
2차 QA 2건 대응.
- 약관 동의 후 '자세히 보기' 진입 후 복귀 시 동의 상태가 유지되지 않음
- 약관 동의 후 온보딩 진입 → 뒤로가기로 복귀 시 동의 상태가 유지되지 않음

두 건 모두 원인이 같다. 체크 상태가 OnboardingTermsScreen의 컴포저블 로컬
remember에 있어서, 화면을 벗어나면 컴포지션이 해제되며 초기화됐다.
ViewModel의 agreedTermsIds는 동의하기를 누른 시점에만 채워져 복원에 쓸 수 없었다.

상태를 OnboardingTermsUiState로 올려 onboarding nav graph에 스코프된
OnboardingViewModel이 들고 있게 했다. 인덱스 대신 약관 id를 키로 써
목록 순서가 바뀌어도 안전하다.

- checkedTermIds / expandedTermIds 를 Set<String> 으로 보관
- 전이 로직(toggleChecked/toggleAllChecked/toggleExpanded)과
  파생값(canProceed/isAllChecked/agreedIds)을 상태 클래스의 순수 함수로 분리
- 화면은 상태를 주입받아 렌더링만 담당

TermRow의 체크박스/펼침 아이콘에 contentDescription 추가.
기존에 null이라 스크린리더가 체크 상태를 읽지 못했다.

검증
- TermsAgreementStateTest 12개 (상태 전이)
- OnboardingTermsNavigationTest 4개 (실제 NavHost 이동/복귀)
- 버그를 되살린 대조 실험에서 상태 유지 테스트 3개가 실패하는 것까지 확인
- 에뮬레이터 실기로 QA 시나리오 2건 재현 및 통과

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuxSwiSeddHi5XodSpFyFo
- 항목 사이 간격이 없어 문장 내 줄간격과 구분되지 않던 문제.
  Arrangement.spacedBy(24.dp) 를 넣어 항목 단위가 드러나게 했다.
  Type.kt 의 FigmaLineHeightStyle 이 trim = None 이라 Text 높이가
  Figma 텍스트 노드와 같은 방식(lineHeight x 줄 수)으로 계산되므로,
  이 값은 Figma 오토레이아웃 gap 과 1:1로 대응한다.

- 번호와 본문의 y 위치가 미세하게 어긋나던 문제.
  둘을 별도 Text 로 두면 baseline 이 맞아도 숫자 글리프와 한글 글리프의
  시각 중심이 달라 어긋나 보인다. 기존에는 본문에 offset(y = -3.dp) 를
  걸어 보정했는데, offset 은 레이아웃이 아니라 그리기만 옮기므로
  여러 줄 항목에서 블록 전체가 밀려 오히려 더 어긋났다.

  번호와 본문을 하나의 Text 로 합치고 들여쓰기는
  TextIndent(restLine) 으로 처리했다. 같은 줄 박스를 쓰므로 y 어긋남이
  구조적으로 발생할 수 없고, 들여쓰기 폭은 TextMeasurer 로 번호의 실제
  렌더 너비를 재서 쓰기 때문에 폰트 배율이 바뀌어도 둘째 줄이 본문
  시작선에 맞는다. 하드코딩 상수 없음.

에뮬레이터에서 설정 > 탈퇴하기 경로로 진입해 확인.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuxSwiSeddHi5XodSpFyFo
디자인 QA 반영. ColorOutline 상태의 기본 테두리는 2dp 이고,
Outline / Error 도 같은 2dp 라 상태값 자체는 의도된 기본값으로 보인다.
공용 상태를 바꾸면 이 상태를 쓰는 모든 버튼이 함께 바뀌므로,
화면 단위로 굵기만 덮어쓸 수 있는 경로를 열었다.

- FlintBasicButton 에 borderWidth: Dp? = null 추가.
  null 이면 상태 기본값을 그대로 쓰므로 기존 사용처는 영향이 없다.
  색은 상태에서 가져오고 굵기만 교체한다.
- FlintMediumButton 이 값을 그대로 전달.
- SettingScreen 의 프로필 수정 버튼만 borderWidth = 1.dp.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuxSwiSeddHi5XodSpFyFo
계정 행에 쓰이는 ic_kakao_full.png 를 새 에셋으로 교체.
기존 파일이 16x16 이라 16dp 로 그릴 때 xxhdpi(48px 필요)에서
3배 업스케일돼 뭉개졌다. 새 에셋은 64x64 라 다운스케일이 되어
모든 밀도에서 선명하다.

로그인 버튼이 쓰는 ic_kakao.png 는 별도 리소스라 그대로 둔다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuxSwiSeddHi5XodSpFyFo
"현재 구독 중인 OTT에서 볼 수 있는 작품들이에요"
-> "관심이 가는 작품들을 다시 만나보세요"

SavedContentsSection 은 ProfileScreen 도 쓰지만 거기서는 별도 문구를
넘기므로 홈 화면에만 적용된다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuxSwiSeddHi5XodSpFyFo
로그아웃 후 시작 화면에서 뒤로가기를 누르면 설정 화면으로 돌아갔다.

navigateToLogin 만 popUpTo(startDestination) 을 쓰고 있었는데,
시작 목적지인 Splash 는 홈 진입 시 navigateToHome(clearStackNavOptions) 가
popUpTo(0) 으로 이미 제거한 뒤다. 따라서 로그아웃 시점의 스택
[Home, Setting] 에는 매칭 대상이 없어 아무것도 pop 되지 않았고,
[Home, Setting, Login] 이 되어 뒤로가기가 설정으로 향했다.

형제 메서드(navigateToHome / navigateToOnBoarding /
navigateToWithdrawComplete)와 동일하게 clearStackNavOptions 를 쓰도록
통일했다. navigateToLogin 은 스플래시, 로그아웃, 회원탈퇴 완료
세 경로에서 호출되는데 탈퇴 완료 경로도 같은 증상이 있었고 함께 해결된다.

미사용이 된 findStartDestination import 제거.

에뮬레이터에서 로그아웃 후 뒤로가기가 앱을 종료하는 것을 확인.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuxSwiSeddHi5XodSpFyFo
@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: c304f645-b50d-47e3-9a58-971cbf79a2f2

📥 Commits

Reviewing files that changed from the base of the PR and between 1912bc1 and b1de243.

⛔ Files ignored due to path filters (1)
  • app/src/main/res/drawable/ic_kakao_full.png is excluded by !**/*.png
📒 Files selected for processing (11)
  • app/src/androidTest/java/com/flint/android/presentation/onboarding/OnboardingTermsNavigationTest.kt
  • app/src/main/java/com/flint/android/core/designsystem/component/button/FlintBasicButton.kt
  • app/src/main/java/com/flint/android/core/designsystem/component/button/FlintMediumButton.kt
  • app/src/main/java/com/flint/android/presentation/home/HomeScreen.kt
  • app/src/main/java/com/flint/android/presentation/main/MainNavigator.kt
  • app/src/main/java/com/flint/android/presentation/onboarding/OnboardingTermsScreen.kt
  • app/src/main/java/com/flint/android/presentation/onboarding/OnboardingUiState.kt
  • app/src/main/java/com/flint/android/presentation/onboarding/OnboardingViewModel.kt
  • app/src/main/java/com/flint/android/presentation/setting/SettingScreen.kt
  • app/src/main/java/com/flint/android/presentation/setting/withdraw/WithdrawScreen.kt
  • app/src/test/java/com/flint/android/presentation/onboarding/TermsAgreementStateTest.kt

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

온보딩 약관 상태를 OnboardingViewModelOnboardingTermsUiState에서 관리하도록 변경했다. 화면 복귀 후 상태 유지 계측 테스트를 추가했다. 로그인 백스택 처리와 버튼 테두리, 홈 문구, 탈퇴 안내 레이아웃도 조정했다.

Changes

온보딩 약관 상태

Layer / File(s) Summary
약관 상태 모델과 조작 로직
app/src/main/java/com/flint/android/presentation/onboarding/OnboardingUiState.kt, app/src/main/java/com/flint/android/presentation/onboarding/OnboardingViewModel.kt
약관별 체크와 펼침 상태를 저장한다. 전체 선택, 필수 약관 동의 여부, 진행 가능 여부와 동의 ID를 계산한다.
약관 화면과 동의 흐름
app/src/main/java/com/flint/android/presentation/onboarding/OnboardingTermsScreen.kt
화면 로컬 상태를 제거한다. 상태 변경을 ViewModel 콜백에 연결한다. 동의 시 agreeToTerms()를 호출한다.
약관 상태 및 네비게이션 검증
app/src/test/java/com/flint/android/presentation/onboarding/TermsAgreementStateTest.kt, app/src/androidTest/java/com/flint/android/presentation/onboarding/OnboardingTermsNavigationTest.kt
개별 선택, 전체 선택, 진행 가능 여부, 목록 재로드와 화면 이동 후 상태 유지를 검증한다.

로그인 네비게이션

Layer / File(s) Summary
로그인 이동 백스택 처리
app/src/main/java/com/flint/android/presentation/main/MainNavigator.kt
navigateToLogin이 기본 clearStackNavOptions를 사용하고 백스택 전체를 삭제한다.

화면 표현 조정

Layer / File(s) Summary
버튼 테두리 두께 설정
app/src/main/java/com/flint/android/core/designsystem/component/button/FlintBasicButton.kt, app/src/main/java/com/flint/android/core/designsystem/component/button/FlintMediumButton.kt, app/src/main/java/com/flint/android/presentation/setting/SettingScreen.kt
버튼에 선택적 borderWidth를 추가한다. 프로필 수정 버튼은 1.dp 테두리를 사용한다.
화면 문구와 탈퇴 안내 표시
app/src/main/java/com/flint/android/presentation/home/HomeScreen.kt, app/src/main/java/com/flint/android/presentation/setting/withdraw/WithdrawScreen.kt
홈 저장 콘텐츠 설명 문구를 변경한다. 탈퇴 안내 목록을 hanging indent가 적용된 단일 Text로 표시한다.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Merge Risk: ⚪ Minimal · up to b1de2

The PR updates onboarding state retention, navigation behavior, and localized UI details. No actionable merge-blocking risk remains beyond normal checks and review.

Sequence Diagram(s)

sequenceDiagram
  participant OnboardingTermsScreen
  participant OnboardingViewModel
  participant OnboardingTermsUiState
  participant NavHost
  OnboardingTermsScreen->>OnboardingViewModel: 약관 체크 및 펼침 콜백 호출
  OnboardingViewModel->>OnboardingTermsUiState: 약관 상태 토글
  OnboardingTermsUiState-->>OnboardingTermsScreen: 체크 및 진행 가능 상태 제공
  OnboardingTermsScreen->>OnboardingViewModel: agreeToTerms() 호출
  OnboardingViewModel->>NavHost: 다음 온보딩 화면으로 이동
  NavHost-->>OnboardingTermsScreen: 뒤로가기 후 약관 화면 복귀
Loading

Suggested reviewers: chanmi1125, ckals413

Poem

토끼가 약관을 하나씩 콕,
전체 동의도 톡 하고 쏙.
화면을 다녀와도 체크는 그대로,
버튼 테두리는 반듯하게 빛나고,
당근처럼 깔끔한 변경이 자라요.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 26.83% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 41 functions across 11 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 제목은 약관, 탈퇴, 설정, 홈의 2차 QA 수정사항을 명확히 요약합니다. 변경 범위의 주요 내용을 반영하며 간결합니다.
Description check ✅ Passed 관련 이슈, 작업 내용, 미구현 사항, 테스트 결과, 리뷰어 확인 사항을 포함합니다. 스크린샷 섹션은 없지만 설명이 구체적이고 전체 변경 사항과 검증 결과를 충분히 설명하므로 통과합니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch FLT-33-2차-qa-김종우

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@ckals413 ckals413 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 👍👍👍

@kimjw2003
kimjw2003 merged commit df3728c into develop Aug 27, 2026
2 checks passed
@kimjw2003
kimjw2003 deleted the FLT-33-2차-qa-김종우 branch August 27, 2026 13:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants