Skip to content

[REFACTOR] 4차 QA 진행#147

Merged
rbqks529 merged 16 commits intoTHIP-TextHip:developfrom
Nico1eKim:refactor/#144-qa4
Oct 26, 2025
Merged

[REFACTOR] 4차 QA 진행#147
rbqks529 merged 16 commits intoTHIP-TextHip:developfrom
Nico1eKim:refactor/#144-qa4

Conversation

@Nico1eKim
Copy link
Member

@Nico1eKim Nico1eKim commented Oct 24, 2025

➕ 이슈 링크


🔎 작업 내용

  • 프로필에 팔로워 수 제대로 뜨지 않는 것 수정했습니다
  • 회원가입 시 칭호 스크롤되게 수정했습니다
  • 모임방 사용성 개선작업 했습니다

📸 스크린샷


😢 해결하지 못한 과제

  • [] TASK


📢 리뷰어들에게

  • 참고해야 할 사항들을 적어주세요

Summary by CodeRabbit

릴리스 노트

  • 새 기능

    • 룸 필터에 "완료" 상태 옵션 추가
    • 그룹 노트에서 백 버튼 시 오버레이 창 자동 닫힘 처리 개선
  • 스타일

    • 네비게이션 애니메이션 비활성화
    • 투표 제목 입력 안내 텍스트 업데이트
    • UI 텍스트 및 아이콘 리소스 개선
  • 기타

    • 앱 버전 코드 조정

@coderabbitai
Copy link

coderabbitai bot commented Oct 24, 2025

Walkthrough

이 PR은 QA 피드백을 반영하여 앱을 리팩토링합니다. GroupDone 화면과 관련 네비게이션을 제거하고, 카드 컴포넌트에 만료 상태 표시 기능을 추가하며, UI 컴포넌트 API를 개선하고 필터 시스템을 업데이트합니다.

Changes

Cohort / File(s) Change Summary
Build & Manifest Configuration
app/build.gradle.kts, app/src/main/AndroidManifest.xml
버전 코드 11에서 9로 변경. Google Play 광고 ID 권한(com.google.android.gms.permission.AD_ID) 추가
Navigation System - GroupDone 제거
app/src/main/java/com/texthip/thip/ui/group/done/.../*, app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt, app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt, app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt, app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt
완료된 방 화면(GroupDoneScreen) 및 관련 ViewModel, UiState 제거. GroupRoutes에서 Done 라우트 삭제. 네비게이션 확장 및 GraphBuilder에서 GroupDone 관련 코드 제거. GroupScreen 서명에서 onNavigateToGroupDone 파라미터 제거
UI Component - 카드 및 Top Bar 개선
app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt, app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt
CardItemRoom에 isExpired: Boolean = false 파라미터 추가, isExpired일 때 endDate 블록 숨김. LogoTopAppBar의 leftIcon을 Painter? 선택형으로 변경 (기본값: null)
Feed 화면 - 팔로워 수 표시 수정
app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt, app/src/main/java/com/texthip/thip/ui/feed/screen/FeedMyScreen.kt, app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt
FeedSubscribeBarlist에 followerNum: Int = 0 파라미터 추가. 팔로워 수 표시를 followerProfileImageUrls.size에서 followerNum으로 변경. FeedMyScreen과 FeedOthersScreen에서 호출 시 userInfo.followerCount 전달
Room Type & Filter 리팩토링
app/src/main/java/com/texthip/thip/ui/group/myroom/mock/RoomType.kt, app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt, app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt, app/src/main/java/com/texthip/thip/ui/group/myroom/viewmodel/GroupMyUiState.kt
RoomType 상수 PLAYING_AND_RECRUITING을 ALL로 변경. EXPIRED 타입 추가. GroupMyRoomFilterRow에 "finish" 필터 옵션 추가 (3개 필터로 확장). GroupMyScreen의 필터 토글 로직 업데이트, CardItemRoom에 isExpired 플래그 전달. GroupMyUiState 기본값을 ALL로 업데이트
네비게이션 애니메이션 및 뒤로 가기 개선
app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt, app/src/main/java/com/texthip/thip/MainActivity.kt, app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt
MainNavHost와 RootNavHost의 모든 트랜지션을 None으로 설정 (네비게이션 애니메이션 비활성화). GroupNoteContent에 BackHandler 추가, overlay 상태에 따라 우선순위 있게 처리
검색 및 회원가입 화면
app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookScreen.kt, app/src/main/java/com/texthip/thip/ui/signin/screen/SignupGenreScreen.kt
SearchBookScreen 타이틀을 "book_search_topappbar"에서 "nav_search"로 변경. SignupGenreScreen에 SignupGenreContent 컴포저블 추가, 마지막 item에 bottom padding(40.dp) 추가
Resource 업데이트
app/src/main/res/values/strings.xml, app/src/main/res/drawable/ic_plusfriend.xml
vote_title_placeholder 문자열 업데이트 ("투표 내용을" → "투표 제목을"). book_search_topappbar 문자열 제거. ic_plusfriend 아이콘 뷰포트를 25dp×25dp에서 24dp×24dp로 축소

Sequence Diagrams

sequenceDiagram
    participant User
    participant GroupScreen
    participant GroupNavigation
    participant GroupRoom
    
    Note over User,GroupRoom: Before: GroupDone 제거 전
    User->>GroupScreen: Navigate (onNavigateToGroupDone)
    GroupScreen->>GroupNavigation: onNavigateToGroupDone()
    GroupNavigation->>GroupRoom: Navigate to GroupRoutes.Done
    
    Note over User,GroupRoom: After: GroupDone 제거 후
    User->>GroupScreen: Navigate (onNavigateToGroupDone removed)
    Note over GroupScreen: Direct navigation<br/>to GroupRoom only
    GroupScreen->>GroupNavigation: Room selection → isExpired check
Loading
sequenceDiagram
    participant GroupNoteContent
    participant BackHandler
    participant OverlayState
    
    User->>BackHandler: Back press
    BackHandler->>GroupNoteContent: Trigger back handling
    
    alt Comment sheet visible
        GroupNoteContent->>OverlayState: Close comment sheet
        GroupNoteContent->>OverlayState: Refresh posts
    else Menu visible
        GroupNoteContent->>OverlayState: Clear selected post
    else Delete dialog visible
        GroupNoteContent->>OverlayState: Close delete dialog
    else Pin dialog visible
        GroupNoteContent->>OverlayState: Close pin dialog
    else None visible
        GroupNoteContent->>GroupNoteContent: System back default
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

변경 사항은 여러 파일을 포함하지만, 대부분 직관적인 추가/제거/파라미터 변경입니다. 다만 GroupDone 관련 기능 제거가 광범위하고 여러 계층에 걸쳐 있으며, 카드 컴포넌트와 네비게이션 로직의 상호연관된 변경으로 인해 검토 시간이 증가합니다.

Possibly related PRs

Suggested reviewers

  • rbqks529
  • JJUYAAA

Poem

🐰 완료된 방은 가버리고
카드는 더 똑똑해졌네~
팔로워 수도 제대로 뜨고
뒤로가기도 부드럽게 작동해요
QA 피드백 반영 완료! ✨

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings, 1 inconclusive)
Check name Status Explanation Resolution
Out of Scope Changes Check ⚠️ Warning 범위를 벗어난 변경사항들이 여러 개 발견됩니다. app/build.gradle.kts에서 versionCode가 11에서 9로 감소하였고, AndroidManifest.xml에 com.google.android.gms.permission.AD_ID 권한이 추가되었으며, MainActivity.kt와 MainNavHost.kt에서 네비게이션 애니메이션이 비활성화되었습니다. 또한 app/src/main/res/drawable/ic_plusfriend.xml에서 벡터 드로어블의 뷰포트 크기가 25dp에서 24dp로 변경되었습니다. 이러한 변경사항들은 이슈 #144의 세 가지 체크리스트 항목과 직접적인 관련이 없으며, 문서화되지 않은 부수적 변경으로 보입니다. versionCode 감소, AD_ID 권한 추가, 네비게이션 애니메이션 비활성화, 아이콘 크기 변경 등의 변경사항에 대해 설명을 추가하시기 바랍니다. 이들 변경이 의도된 것인지, QA 프로세스의 일부인지, 아니면 실수로 포함된 것인지 명확히 하고 필요시 별도의 커밋으로 분리하는 것을 권장합니다.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title Check ❓ Inconclusive "[REFACTOR] 4차 QA 진행"은 너무 일반적이고 모호한 제목입니다. 실제 변경사항을 보면 팔로워 수 표시 수정, 회원가입 시 칭호 스크롤 기능, 모임방 사용성 개선, GroupDone 화면 제거 등 여러 중요한 변경이 있는데, 제목은 이러한 구체적인 내용을 명확히 반영하지 않고 단순히 "QA 진행"이라는 일반적인 표현만 사용하고 있습니다. 프리뷰로 제목을 스캔할 때 주요 변경 내용을 파악하기 어렵습니다. 제목을 더 구체적으로 수정하여 주요 변경사항을 명확히 드러내도록 권장합니다. 예를 들어 "[REFACTOR] 프로필 팔로워 수 표시 및 모임방 사용성 개선" 또는 변경의 핵심을 강조하는 다른 표현으로 변경하는 것이 좋습니다.
✅ Passed checks (2 passed)
Check name Status Explanation
Linked Issues Check ✅ Passed 코드 변경사항이 이슈 #144의 세 가지 체크리스트 항목과 일치합니다. 첫째, FeedSubscribelistBar의 followerNum 파라미터 추가와 FeedMyScreen, FeedOthersScreen에서 userInfo.followerCount 전달로 프로필 팔로워 수 표시 문제가 해결되었습니다. 둘째, SignupGenreScreen.kt에서 SignupGenreContent 추가 및 LazyVerticalGrid를 통해 회원가입 시 칭호가 스크롤 가능하도록 개선되었습니다. 셋째, GroupMyRoomFilterRow에 세 번째 필터 추가, RoomType 리네이밍, GroupDone 화면 제거 등으로 모임방 사용성이 개선되었습니다.
Description Check ✅ Passed PR 설명은 필수 섹션을 모두 포함하고 있습니다. 이슈 링크(#144), 작업 내용(프로필 팔로워 수 수정, 회원가입 칭호 스크롤, 모임방 사용성 개선), 스크린샷, 해결하지 못한 과제, 리뷰어 노트 섹션이 모두 존재합니다. 다만 스크린샷 경로가 "파일주소" 플레이스홀더 상태이고 리뷰어 노트가 비워져 있으나, 핵심 정보(작업 내용)는 충분히 설명되어 있어 전체적으로 필요한 정보를 포함하고 있습니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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 and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
app/src/main/java/com/texthip/thip/ui/signin/screen/SignupGenreScreen.kt (1)

103-129: 스크롤 기능이 비활성화되어 PR 목표와 모순됩니다.

Line 109의 userScrollEnabled = false로 인해 그리드가 스크롤되지 않습니다. 이는 PR 목표인 "회원가입 시 타이틀을 스크롤 가능하게 만들기"와 직접적으로 모순됩니다. 장르 옵션이 많을 경우 사용자가 모든 항목을 볼 수 없게 됩니다.

다음 수정사항을 적용하세요:

             LazyVerticalGrid(
                 columns = GridCells.Adaptive(minSize = 152.dp), // 카드 최소 크기
                 modifier = Modifier
                     .fillMaxWidth(),
                 horizontalArrangement = Arrangement.spacedBy(16.dp),
                 verticalArrangement = Arrangement.spacedBy(16.dp),
-                userScrollEnabled = false,
+                contentPadding = androidx.compose.foundation.layout.PaddingValues(bottom = 40.dp)
             ) {
                 itemsIndexed(uiState.roleCards) { index, roleItem ->
-                    val modifier = if (index == uiState.roleCards.lastIndex) {
-                        Modifier.padding(bottom = 40.dp)
-                    } else {
-                        Modifier
-                    }
-
                     RoleCard(
-                        modifier = modifier,
+                        modifier = Modifier,
                         genre = roleItem.genre,
                         role = roleItem.role,
                         imageUrl = roleItem.imageUrl,
                         roleColor = roleItem.roleColor,
                         selected = uiState.selectedIndex == index,
                         onClick = { onCardSelected(index) }
                     )
                 }
             }

변경 사항:

  1. userScrollEnabled = false 제거 (기본값 true로 스크롤 활성화)
  2. 마지막 아이템 개별 패딩 대신 contentPadding을 사용하여 더 관용적인 방식으로 하단 여백 적용
app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt (1)

50-50: Preview 데이터 불일치로 인한 크래시 발생 가능

컴포넌트는 3개 요소의 배열(selectedStates[0], [1], [2])을 기대하지만, Preview에서는 2개 요소만 제공합니다. 이로 인해 ArrayIndexOutOfBoundsException이 발생합니다.

다음과 같이 수정해주세요:

-        var selectedStates by remember { mutableStateOf(booleanArrayOf(true, false)) }
+        var selectedStates by remember { mutableStateOf(booleanArrayOf(true, false, false)) }
🧹 Nitpick comments (6)
app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt (1)

149-157: 만료된 방 상태 처리 로직이 정확하게 구현되었습니다.

GroupRoom 네비게이션에 isExpired 파라미터를 전달하여 만료된 방을 적절히 처리하도록 개선되었습니다.

다만, 151번 라인의 비교 연산자 주위 괄호는 불필요합니다:

-                val isExpired = (room.type == RoomType.EXPIRED.value)
+                val isExpired = room.type == RoomType.EXPIRED.value
app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt (1)

24-28: 네비게이션 애니메이션 비활성화 구현 확인

모든 전환 애니메이션을 None으로 설정하여 네비게이션 애니메이션을 비활성화했습니다. 구현은 올바르게 되어 있습니다.

참고: MainActivity.kt의 RootNavHost에서도 동일한 전환 설정이 사용되고 있습니다. 만약 앱 전체에서 일관된 전환 정책을 유지하려면, 이러한 설정을 공통 함수나 상수로 추출하여 중복을 제거하는 것을 고려해볼 수 있습니다.

app/src/main/java/com/texthip/thip/MainActivity.kt (1)

182-186: 루트 네비게이션 애니메이션 비활성화 구현 확인

RootNavHost에서 모든 전환 애니메이션을 None으로 설정하여 네비게이션 애니메이션을 비활성화했습니다. 구현은 올바르게 되어 있습니다.

MainNavHost.kt와 동일한 전환 설정이 사용되고 있어, 앱 전체에서 일관된 애니메이션 정책이 적용됩니다. 필요시 이러한 공통 설정을 별도의 확장 함수나 상수로 추출하여 유지보수성을 높일 수 있습니다.

예시:

// NavigationExtensions.kt
fun NavGraphBuilder.noAnimationNavHost(
    startDestination: Any,
    builder: NavGraphBuilder.() -> Unit
) = NavHost(
    startDestination = startDestination,
    enterTransition = { EnterTransition.None },
    exitTransition = { ExitTransition.None },
    popEnterTransition = { EnterTransition.None },
    popExitTransition = { ExitTransition.None },
    builder = builder
)
app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt (1)

117-139: Preview 함수에서 followerNum 파라미터를 전달해주세요.

Preview 함수들이 followerNum 파라미터를 전달하지 않아 기본값 0이 사용됩니다. 이로 인해 프로필 이미지는 표시되지만 "0명이 띱하는 중" 텍스트가 보여 혼란을 줄 수 있습니다.

다음과 같이 수정하여 Preview에서도 올바른 팔로워 수가 표시되도록 개선할 수 있습니다:

         // Case 1: 팔로워 0
         FeedSubscribeBarlist(
+            followerNum = 0,
             followerProfileImageUrls = emptyList(),
             onClick = {}
         )
 
         // Case 2: 팔로워 3
         FeedSubscribeBarlist(
+            followerNum = 3,
             followerProfileImageUrls = listOf(
                 "https://example.com/image1.jpg",
                 "https://example.com/image2.jpg",
                 "https://example.com/image3.jpg"
             ),
             onClick = {}
         )
 
         // Case 3: 팔로워 6
         FeedSubscribeBarlist(
+            followerNum = 6,
             followerProfileImageUrls = List(6) {
                 "https://example.com/profile$it.jpg"
             },
             onClick = {}
         )
app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt (1)

178-178: 백엔드 "expired" 값 검증 완료 - 코드 일관성 개선 제안

백엔드에서 정확히 "expired" 문자열을 반환한다는 것이 확인되었습니다. RoomUtilswhen 문과 RoomType enum 정의에서 모두 "expired" 값을 명시적으로 처리하고 있습니다.

다만, 유사한 타입 확인 로직에서 패턴 불일치가 있습니다:

  • 174번 줄: 유틸리티 함수 사용 RoomUtils.isRecruitingByType(room.type)
  • 178번 줄: 직접 비교 room.type == RoomType.EXPIRED.value

유지보수성을 위해 RoomUtilsisExpiredByType() 함수를 추가하거나, 두 경우 모두 통일된 패턴으로 변경하는 것을 권장합니다.

app/src/main/java/com/texthip/thip/ui/group/myroom/mock/RoomType.kt (1)

4-4: ALL 상수의 이름과 값이 의도적이지만 명확하지 않음

ALL("playingAndRecruiting")은 백엔드 API 계약과 일치하며 기능상 정상입니다. 하지만 상수 이름 ALL은 모든 상태를 포함한다는 인상을 주는 반면, 실제 값은 EXPIRED 상태를 제외합니다. UI 로직(GroupMyScreen)에서 PLAYING과 RECRUITING이 함께 선택될 때만 ALL을 사용하는 것으로 보아 의도적인 설계입니다.

명확성을 위해 다음 중 하나를 고려해주세요:

  1. 상수명을 PLAYING_AND_RECRUITING으로 변경
  2. 주석 추가: ALL // 모집중 및 진행중 상태만 포함 (완료 상태 제외)
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Jira integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 8aedb16 and 2864d07.

📒 Files selected for processing (26)
  • app/build.gradle.kts (1 hunks)
  • app/src/main/AndroidManifest.xml (1 hunks)
  • app/src/main/java/com/texthip/thip/MainActivity.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/feed/screen/FeedMyScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/done/mock/MyRoomCardData.kt (0 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/done/screen/GroupDoneScreen.kt (0 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/done/viewmodel/GroupDoneUiState.kt (0 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/done/viewmodel/GroupDoneViewModel.kt (0 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/mock/RoomType.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt (4 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/viewmodel/GroupMyUiState.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt (0 hunks)
  • app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt (0 hunks)
  • app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookScreen.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/signin/screen/SignupGenreScreen.kt (3 hunks)
  • app/src/main/res/drawable/ic_plusfriend.xml (1 hunks)
  • app/src/main/res/values/strings.xml (1 hunks)
💤 Files with no reviewable changes (6)
  • app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt
  • app/src/main/java/com/texthip/thip/ui/group/done/viewmodel/GroupDoneUiState.kt
  • app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt
  • app/src/main/java/com/texthip/thip/ui/group/done/viewmodel/GroupDoneViewModel.kt
  • app/src/main/java/com/texthip/thip/ui/group/done/mock/MyRoomCardData.kt
  • app/src/main/java/com/texthip/thip/ui/group/done/screen/GroupDoneScreen.kt
🧰 Additional context used
🧬 Code graph analysis (3)
app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt (1)
app/src/main/java/com/texthip/thip/ui/common/buttons/OptionChipButton.kt (1)
  • OptionChipButton (30-93)
app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt (1)
app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupNoteViewModel.kt (1)
  • onEvent (142-189)
app/src/main/java/com/texthip/thip/ui/signin/screen/SignupGenreScreen.kt (1)
app/src/main/java/com/texthip/thip/ui/mypage/component/RoleCard.kt (1)
  • RoleCard (34-91)
🔇 Additional comments (26)
app/src/main/res/drawable/ic_plusfriend.xml (2)

7-7: 경로 데이터 변경 사항 시각적 검증 권장 — 모든 path 요소의 pathData 좌표가 상당히 변경되었습니다. 아이콘이 의도대로 렌더링되는지 시각적 검증을 권장합니다.

변경 전후 아이콘 모양을 비교하여 다음을 확인해주세요:

  • 이전 버전과의 시각적 일관성
  • 모든 경로가 올바르게 렌더링되는지 확인
  • 선 두께(strokeWidth: 1.5)와 모서리 처리(strokeLineCap: round)가 의도대로 적용되는지 확인

Also applies to: 14-14, 21-21, 28-28


2-2: 아이콘 표준화 범위 명확화 필요ic_plusfriend.xml이 24dp로 변경되었지만, 50개 이상의 다른 아이콘들은 여전히 25dp 크기입니다.

검증 결과, Kotlin 코드는 painterResource()를 통해 동적으로 리소스를 로드하므로 하드코딩된 크기 의존성은 없습니다. 다만 다음을 확인해주세요:

  • 이 PR이 아이콘 표준화의 일부라면, 다른 아이콘들도 함께 24dp로 통일하는 것을 검토하세요
  • 또는 ic_plusfriend만 격리된 업데이트인지 명확히 해주세요

참고: 대부분의 25dp 아이콘들이 width=25dp, height=24dp로 비일관적입니다 (예: ic_done.xml, ic_rankup.xml, ic_plus.xml 등).

app/src/main/res/values/strings.xml (2)

240-240: 투표 제목 입력창 플레이스홀더 텍스트 개선

"투표 내용을" 에서 "투표 제목을"로 변경된 것은 좋은 개선입니다. 이 필드가 투표의 제목/주제를 입력받는 필드이므로 더욱 명확하고 정확한 표현입니다. PR 목표인 "타이틀 입력 개선" 과 잘 맞아떨어집니다.


1-462: book_search_topappbar 문자열 제거 확인 완료

포괄적인 검색 결과, book_search_topappbar 문자열이 코드베이스 어디에서도 참조되고 있지 않습니다. 모든 파일 유형에 대한 검색, 리소스 참조 패턴 검색, 깃 히스토리 검색 모두 결과가 없으므로 이 문자열은 안전하게 제거되었습니다.

app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt (2)

27-27: 좋은 API 개선입니다!

왼쪽 아이콘을 선택적으로 만들어 컴포넌트의 유연성을 높였습니다. 기본값을 null로 설정하여 기존 호출 코드와의 호환성도 유지됩니다.


59-66: 널 안전성 구현이 올바르고 모든 호출 부분이 호환됩니다.

코드베이스 검증 결과:

  • FeedScreen.kt: leftIcon 값을 전달하여 올바르게 처리
  • GroupScreen.kt: leftIcon 미전달로 기본값(null) 사용, let 블록에서 안전하게 처리됨
  • Preview: 양쪽 시나리오 모두 적절히 테스트

leftIcon?.let 블록 구현은 아이콘이 존재할 때만 렌더링하고, onLeftClick 콜백도 안전하게 제한됩니다. 모든 호출 부분이 이미 호환되므로 추가 수정이 필요하지 않습니다.

app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt (1)

3-4: 필요한 import 추가 확인

네비게이션 전환 설정을 위해 필요한 import가 올바르게 추가되었습니다.

app/src/main/java/com/texthip/thip/MainActivity.kt (1)

10-11: 필요한 import 추가 확인

네비게이션 전환 설정을 위해 필요한 import가 올바르게 추가되었습니다.

app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt (1)

136-136: 팔로워 수 표시 수정이 올바르게 적용되었습니다.

followerProfileImageUrls.size 대신 userInfo.followerCount를 명시적으로 전달하여 팔로워 수가 정확하게 표시되도록 수정되었습니다. 프로필 이미지 URL 목록은 최근 몇 개만 포함할 수 있지만, 실제 팔로워 수는 이보다 클 수 있으므로 올바른 수정입니다.

app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt (1)

39-39: 팔로워 수 표시 로직이 올바르게 개선되었습니다.

followerNum 파라미터를 추가하여 팔로워 수를 명시적으로 받도록 변경한 것은 올바른 수정입니다. 이전에는 followerProfileImageUrls.size로 계산했는데, 이는 표시용 이미지 목록의 크기일 뿐 실제 팔로워 수와 다를 수 있었습니다.

Also applies to: 63-64

app/src/main/java/com/texthip/thip/ui/feed/screen/FeedMyScreen.kt (1)

124-125: 팔로워 수 표시 수정이 일관되게 적용되었습니다.

FeedOthersScreen.kt와 동일하게 followerNum 파라미터를 추가하여 정확한 팔로워 수를 전달하고 있습니다. 두 화면에서 일관된 방식으로 수정되어 좋습니다.

app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt (2)

3-3: LGTM!

BackHandler 기능을 위한 필수 import가 올바르게 추가되었습니다.


230-244: 뒤로가기 처리 로직이 잘 구현되었습니다!

BackHandler가 오버레이 상태를 올바른 우선순위로 처리하고 있으며, 상태 정리도 철저하게 이루어지고 있습니다. 댓글 시트를 닫을 때 RefreshPosts를 호출하여 데이터 일관성을 유지하는 것도 좋습니다 (기존 onDismiss 로직과 일치).

단, 댓글 시트 닫힐 때마다 RefreshPosts가 호출되어 네트워크 요청이 발생할 수 있습니다. 사용자가 빠르게 뒤로가기를 여러 번 누르는 경우를 고려하여, ViewModel의 loadPosts 함수가 적절히 디바운싱되거나 중복 요청을 처리하는지 확인해보시기 바랍니다.

app/src/main/java/com/texthip/thip/ui/signin/screen/SignupGenreScreen.kt (1)

81-86: 레이아웃 구조 개선이 적절합니다.

weight(1f) 추가로 Column이 남은 공간을 채우도록 하여 스크롤 가능한 레이아웃 구조를 올바르게 구성했습니다.

app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookScreen.kt (2)

36-38: 임포트 재정렬 변경 사항 확인

java.text 및 java.util 임포트가 다른 임포트 블록 뒤로 이동되었습니다. 이는 순수하게 구조적인 변경이며 기능에는 영향을 미치지 않습니다 (line 179에서 여전히 정상적으로 사용됨).


152-152: 변경 사항 검증 완료 - 리뷰 우려사항 없음

nav_search 문자열 리소스는 두 곳에서 사용됩니다:

  1. SearchBookScreen.kt:152 - 도서 검색 화면 app bar 타이틀
  2. NavBarItems.kt:21 - 네비게이션 바 아이템 타이틀

이는 navigation-wide 일관성을 위한 의도적인 리소스 통합이며, "검색"이라는 문자열 값이 검색 화면의 타이틀로서 문맥상 적절합니다. 변경 사항은 타당하고 사용자 경험에 문제가 없습니다.

app/src/main/java/com/texthip/thip/ui/group/myroom/viewmodel/GroupMyUiState.kt (1)

8-8: 변경 사항 확인 완료

기본값이 RoomType.ALL로 변경되어 전체 방 목록을 기본으로 표시하는 것이 적절합니다.

app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt (2)

48-48: API 확장 적절함

isExpired 파라미터 추가로 만료된 방의 표시를 제어할 수 있게 되었고, 기본값 false로 하위 호환성이 유지됩니다.


165-180: 조건부 렌더링 로직 확인 완료

만료된 방(isExpired = true)일 때 종료일 블록을 표시하지 않는 것이 적절합니다. 코드가 명확하고 의도가 잘 드러납니다.

app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt (1)

37-42: 세 번째 필터 버튼 추가 확인

완료 상태 필터 버튼이 기존 두 버튼과 동일한 패턴으로 잘 구현되었습니다.

app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt (3)

52-62: 네비게이션 단순화 확인

onNavigateToGroupDone 파라미터가 제거되어 불필요한 네비게이션 콜백이 정리되었습니다. PR 전반의 리팩토링 의도와 일치합니다.


93-107: GroupContent 시그니처 업데이트 적절

onNavigateToGroupDone 제거로 인해 함수 시그니처가 깔끔해졌습니다.


131-131: 패딩 미세 조정

상단 패딩이 72.dp에서 75.dp로 3dp 증가했습니다. UI 정렬 개선으로 보입니다.

app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt (3)

95-99: 필터 상태 매핑 로직 개선

세 가지 필터 상태(진행중, 모집중, 완료)를 명확하게 처리하고, 선택되지 않은 경우 전체로 표시하는 것이 적절합니다.


127-157: 필터 토글 로직 검토

각 필터 버튼 클릭 시 이미 선택된 상태면 ALL로 돌아가는 토글 동작이 구현되었습니다. 사용자 경험 측면에서 일관성 있는 동작입니다.


277-277: Preview 데이터 업데이트 확인

Preview의 기본 currentRoomTypeRoomType.ALL로 업데이트되어 새로운 필터 로직과 일치합니다.

Comment on lines +7 to +8
<uses-permission android:name="com.google.android.gms.permission.AD_ID"
tools:ignore="AdvertisingIdPolicy" />
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

광고 ID 권한 추가가 PR 목표와 일치하지 않습니다.

이 PR의 목표는 프로필 팔로워 수 수정, 가입 중 제목 스크롤 가능 설정, 미팅룸 사용성 개선입니다. 그러나 com.google.android.gms.permission.AD_ID 권한 추가는 이러한 목표와 관련이 없어 보입니다.

추가 고려사항:

  • tools:ignore="AdvertisingIdPolicy"의 사용은 린트 경고 억제로 보여, 비즈니스 목적 없이 권한이 추가되었을 가능성을 시사합니다.
  • 광고 ID는 개인정보보호 및 규정준수(GDPR/CCPA)와 관련된 민감한 권한입니다.
  • 이 권한을 사용하는 코드가 이 PR에서 추가되었는지, 그리고 개인정보보호정책이 업데이트되었는지 확인이 필요합니다.

이 권한 추가의 목적을 설명해주시고, 다음을 확인하도록 요청드립니다:

  1. 이 권한이 실제로 PR의 변경사항과 관련이 있는지 여부
  2. 이 권한을 사용하는 코드가 추가되었는지 여부
  3. 앱의 개인정보보호정책이 광고 ID 사용에 대해 업데이트되었는지 여부
  4. 의도치 않은 변경이라면, 별도 PR로 분리하는 것을 권장합니다.

다음 스크립트를 실행하여 광고 ID 사용 여부를 확인할 수 있습니다:


🏁 Script executed:

#!/bin/bash
# Description: Search for Google Advertising ID usage in the codebase

# Search for AD_ID permission usage
rg -i "ad_id|advertising.*id|google.*ad" --type kotlin --type java -C 3

Length of output: 0


🏁 Script executed:

#!/bin/bash
# Search for AdvertisingIdPolicy mentions
rg -i "advertisingidpolicy" -C 3

# Search for Google Play Services imports
rg "com\.google\.android\.gms" --type kotlin --type java -C 2

# Search for any references in manifest to services/activities that might use ad ID
rg "service|activity|receiver" app/src/main/AndroidManifest.xml -C 2

Length of output: 3953


사용되지 않는 광고 ID 권한을 제거해야 합니다.

광고 ID 권한(com.google.android.gms.permission.AD_ID)이 추가되었으나 전체 코드베이스에서 어떤 곳에서도 사용되지 않고 있습니다. 검색 결과:

  • 광고 ID 관련 코드: 0건
  • 광고 ID API 임포트: 0건
  • Google Play Services 의존성: play-services-auth만 있음 (Google 로그인용)
  • 사용 중인 GMS 기능: 인증(GoogleSignIn), Firebase 메시징만 해당

tools:ignore="AdvertisingIdPolicy"는 사용되지 않는 권한에 대한 린트 경고를 억제하기 위한 것으로 보입니다.

조치:

  1. AndroidManifest.xml의 AD_ID 권한 선언 제거 (7-8줄)
  2. tools:ignore 속성도 함께 제거

이는 불필요한 개인정보보호 민감 권한을 앱에서 제거하는 것으로, 앱 스토어 규정 준수와 사용자 개인정보 보호 차원에서 권장됩니다.

🤖 Prompt for AI Agents
In app/src/main/AndroidManifest.xml around lines 7-8, remove the unused AD_ID
permission declaration and its tools:ignore attribute: delete the
<uses-permission android:name="com.google.android.gms.permission.AD_ID"
tools:ignore="AdvertisingIdPolicy" /> entry so the manifest no longer requests
the advertising ID permission; after removal, rebuild and verify no references
to AD_ID remain and lint no longer needs the suppressed AdvertisingIdPolicy
warning.

Copy link
Collaborator

@rbqks529 rbqks529 left a comment

Choose a reason for hiding this comment

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

코드를 조금 더 문제 없도록 처리한거 같네요 수고하셨습니다! 머지하고 이어서 작업 진행할게요

Copy link
Collaborator

Choose a reason for hiding this comment

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

이 코드는 혹시 어떻게 로직이 수정된건가용

Copy link
Member Author

Choose a reason for hiding this comment

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

이건 화면 전환할 때 들어간 애니메이션 효과를 없앤겁니둣

@rbqks529 rbqks529 merged commit de7165d into THIP-TextHip:develop Oct 26, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[REFACTOR] QA 진행 [(THIP2025-364)]

2 participants