Skip to content

[Refactor/#205] 네비게이션 로직 수정#206

Merged
wjdrjs00 merged 2 commits intodevelopfrom
refactor/#205-navigation-logic
Mar 29, 2026
Merged

[Refactor/#205] 네비게이션 로직 수정#206
wjdrjs00 merged 2 commits intodevelopfrom
refactor/#205-navigation-logic

Conversation

@wjdrjs00
Copy link
Copy Markdown
Member

@wjdrjs00 wjdrjs00 commented Mar 26, 2026

[ PR Content ]

homeRoute 부분에 사용중이던 String 방식을 제거하고 type-safe 방식으로 통일했습니다.

Related issue

Screenshot 📸

  • N/A

Work Description

  • HomeRoute를 Enum에서 @serializable Sealed Interface로 변경
  • HomeNavigator 내 경로 확인 및 이동 로직을 Type-safe 방식으로 수정
  • HomeBottomNavigationBar에서 NavController 의존성 제거 및 상태/이벤트 기반으로 변경

To Reviewers 📢

  • 간단한 작업이라 없을거 같긴한데 궁금한게 있다면 리뷰 남겨주세요~
  • nav3로 마이그레이션 할때 좀 더 편해질거 같네용..,
  • 추가로 작업하면서 발견한 이슈긴 한데 홈화면에서 바텀탭 이동을 기준으로 status bar icon 색을 동적으로 변경하고 있는데 (홈 -> 감정등록, 루틴 등록, 제보 등)이 경우에는 바텀탭이 아닌 외부 화면(MainNavHost)로 이동한것이라 색상이 변하지 않는 문제를 발견했습니다.. 해당 문제를 해결하려면 mian, home 으로 나뉜 NavHost를 하나의 NavHost로 통합하는 방법 or 각 화면에서 status bar icon색을 설정하는 방법이 있는데 둘중 고민이네용 (일단 엄청 후순위로 당분간은 하지 않은거 같긴합니다 ㅎ)

Summary by CodeRabbit

릴리스 노트

  • Refactor
    • 하단 탭 제어를 상태/이벤트 기반으로 전환해 탭 선택이 더 예측 가능하고 일관되게 동작합니다.
    • 하단 탭 목록을 중앙에서 관리하여 아이콘·타이틀 표시가 통일되었습니다.
  • New Features
    • 하단 바 프리뷰가 간소화되어 개발 중 화면 미리보기가 더 간편해졌습니다.
  • 버그 수정
    • 탭 전환 시 백스택 처리와 플로팅 버튼 표시가 보다 정확하게 동작합니다.

@wjdrjs00 wjdrjs00 requested a review from l5x5l March 26, 2026 07:47
@wjdrjs00 wjdrjs00 self-assigned this Mar 26, 2026
@wjdrjs00 wjdrjs00 added 🔨 Refactor 기존 기능 개선 📱 UI UI 추가 및 수정 (비지니스 로직을 포함하지 않는 작업) 🧤 대현 labels Mar 26, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 26, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 9ddbf750-a9f3-437e-a2f0-c864ffa3cfc0

📥 Commits

Reviewing files that changed from the base of the PR and between faea8a4 and 9567d7c.

📒 Files selected for processing (2)
  • app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavigator.kt
  • app/src/main/java/com/threegap/bitnagil/navigation/home/HomeRoute.kt
🚧 Files skipped from review as they are similar to previous changes (2)
  • app/src/main/java/com/threegap/bitnagil/navigation/home/HomeRoute.kt
  • app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavigator.kt

Walkthrough

홈 네비게이션을 문자열 기반에서 타입 안전 방식으로 전환하고, NavController 기반 제어를 상태/콜백 기반 API로 바꿨습니다. HomeRoute를 직렬화 가능한 봉인 인터페이스로 재구성하고, Navigator와 BottomBar/Host 간 인터페이스를 타입 안전한 HomeRoute로 연결했습니다.

Changes

Cohort / File(s) Summary
홈 라우트 모델
app/src/main/java/com/threegap/bitnagil/navigation/home/HomeRoute.kt
enum class@Serializable sealed interface로 변경. 각 라우트를 data object 싱글톤으로 정의하고 showFloatingButton 속성으로 대체. HomeTab 데이터 클래스 및 homeTabList 추가.
네비게이터 타입 안전화
app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavigator.kt
startDestinationStringHomeRoute로, currentRoute: String?currentHomeRoute: HomeRoute?로 변경. 라우트 판별 로직을 NavDestinationHomeRoute 매핑으로 전환하고 navigateTo(route: HomeRoute) 헬퍼 추가.
홈 호스트 및 바/탭 제어
app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavHost.kt, app/src/main/java/com/threegap/bitnagil/navigation/home/HomeBottomNavigationBar.kt
BottomBar가 NavController 주입 대신 selectedTab: HomeRoute + onTabSelected: (HomeRoute) -> Unit 콜백으로 변경. 탭 렌더링은 homeTabList 순회로 변경. NavHost composable 호출을 제네릭 composable<HomeRoute.*> 형태로 변경.
사소한 API/시그니처 변경
app/src/main/.../HomeBottomNavigationBar.kt (private 함수)
HomeBottomNavigationItem의 인자 순서 조정 (onClick 위치 변경) 및 preview 업데이트(더 이상 NavController 생성 없음).

Sequence Diagram(s)

sequenceDiagram
    participant User as "사용자(UI)"
    participant BottomBar as "HomeBottomNavigationBar"
    participant Navigator as "HomeNavigator"
    participant NavCtrl as "NavController / NavHost"

    User->>BottomBar: 탭 선택 (HomeRoute)
    BottomBar->>Navigator: onTabSelected(HomeRoute)
    Navigator->>NavCtrl: navigateTo(HomeRoute) (popUpTo clear)
    NavCtrl->>NavCtrl: 현재 destination 업데이트
    NavCtrl->>Navigator: destination 변경 반영 (currentHomeRoute)
    Navigator-->>BottomBar: selectedTab 업데이트 (state)
    BottomBar-->>User: 선택된 탭 반영 UI 갱신
Loading

Estimated code review effort

🎯 3 (보통) | ⏱️ ~20분

개요

홈 네비게이션 로직을 문자열 기반에서 타입 안전 방식으로 변경했습니다. HomeRoute를 열거형에서 직렬화 가능한 봉인 인터페이스로 전환하고, 네비게이션 제어를 NavController에서 상태 기반 콜백 방식으로 전환했습니다.

변경 사항

변경 그룹 / 파일(들) 요약
HomeRoute 구조 재설계
app/src/main/java/com/threegap/bitnagil/navigation/home/HomeRoute.kt
enum class에서 @Serializable sealed interface로 변환. 각 라우트를 data object 싱글톤으로 변경하고, 문자열 기반 경로 제거. 새로운 HomeTab 데이터 클래스와 homeTabList 추가.
네비게이터 타입 안전화
app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavigator.kt
startDestinationString에서 HomeRoute로 변경. currentRoute: String?currentHomeRoute: HomeRoute?로 변경하고, 라우트 비교 로직을 NavDestination.hasRoute<...>() 기반으로 업데이트. navigateTo(route: HomeRoute) 메서드 추가.
상태 기반 UI 제어
app/src/main/java/com/threegap/bitnagil/navigation/home/HomeBottomNavigationBar.kt, app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavHost.kt
NavController 주입에서 selectedTab: HomeRouteonTabSelected: (HomeRoute) -> Unit 콜백 기반으로 변경. homeTabList를 순회하여 탭 렌더링. 제네릭 composable<HomeRoute.*> 선언으로 업데이트.

코드 리뷰 추정 난이도

🎯 3 (보통) | ⏱️ ~20분

토끼의 축하 시

🐰 문자열은 이제 안녕!
타입 안전한 길로 나아가네,
봉인 인터페이스가 반겨주고,
콜백이 춤을 추며,
네비게이션이 명확해졌어! ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 PR의 주요 변경사항(String 기반 네비게이션을 type-safe 방식으로 리팩토링)을 정확히 요약하고 있습니다.
Description check ✅ Passed PR 설명이 필수 섹션(Related issue, Work Description, To Reviewers)을 모두 포함하고 있으며 변경사항이 명확하게 기술되어 있습니다.
Linked Issues check ✅ Passed 코드 변경사항이 #205 이슈의 요구사항을 모두 충족합니다: String 기반 로직 제거 및 type-safe 방식으로의 완벽한 전환이 이루어졌습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 #205 이슈의 type-safe 네비게이션 로직 리팩토링 범위 내에 있으며 범위를 벗어난 변경은 없습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/#205-navigation-logic

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
Copy Markdown

@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: 1

🧹 Nitpick comments (1)
app/src/main/java/com/threegap/bitnagil/navigation/home/HomeBottomNavigationBar.kt (1)

47-54: 현재 탭 재선택 이벤트는 가드하는 것을 권장합니다.

Line 53에서 선택된 탭에도 콜백이 발생해 불필요한 네비게이션 호출이 생길 수 있습니다.

♻️ 제안 수정안
             homeTabList.forEach { homeTab ->
                 HomeBottomNavigationItem(
                     modifier = Modifier.weight(1f),
                     icon = homeTab.icon,
                     title = homeTab.title,
                     selected = selectedTab == homeTab.route,
-                    onClick = { onTabSelected(homeTab.route) },
+                    onClick = {
+                        if (selectedTab != homeTab.route) {
+                            onTabSelected(homeTab.route)
+                        }
+                    },
                 )
             }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@app/src/main/java/com/threegap/bitnagil/navigation/home/HomeBottomNavigationBar.kt`
around lines 47 - 54, 현재 선택된 탭을 다시 누를 때 불필요한 네비게이션 콜백이 발생하므로
HomeBottomNavigationItem의 onClick에서 selectedTab과 homeTab.route를 비교해 같으면
onTabSelected를 호출하지 않도록 가드하세요; 구체적으로 homeTabList.forEach 블록의
HomeBottomNavigationItem(onClick = { ... }) 내부에서 selectedTab != homeTab.route
조건을 확인하고 참일 때만 onTabSelected(homeTab.route)를 호출하도록 변경하십시오.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavigator.kt`:
- Around line 33-36: The navigateTo implementation in HomeNavigator uses
popUpTo(0) which clears the entire back stack and loses UI state; update
navigateTo(navController.navigate(route) { ... }) to pop up to the start
destination ID instead (use navController.graph.findStartDestination().id),
enable saveState = true inside the popUpTo block, and also set launchSingleTop =
true and restoreState = true to preserve and restore tab state (scroll/input)
when switching HomeRoute tabs.

---

Nitpick comments:
In
`@app/src/main/java/com/threegap/bitnagil/navigation/home/HomeBottomNavigationBar.kt`:
- Around line 47-54: 현재 선택된 탭을 다시 누를 때 불필요한 네비게이션 콜백이 발생하므로
HomeBottomNavigationItem의 onClick에서 selectedTab과 homeTab.route를 비교해 같으면
onTabSelected를 호출하지 않도록 가드하세요; 구체적으로 homeTabList.forEach 블록의
HomeBottomNavigationItem(onClick = { ... }) 내부에서 selectedTab != homeTab.route
조건을 확인하고 참일 때만 onTabSelected(homeTab.route)를 호출하도록 변경하십시오.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f4416fe4-3131-40a3-be95-5426e6e9b56e

📥 Commits

Reviewing files that changed from the base of the PR and between 9d266a9 and faea8a4.

📒 Files selected for processing (4)
  • app/src/main/java/com/threegap/bitnagil/navigation/home/HomeBottomNavigationBar.kt
  • app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavHost.kt
  • app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavigator.kt
  • app/src/main/java/com/threegap/bitnagil/navigation/home/HomeRoute.kt

Copy link
Copy Markdown
Contributor

@l5x5l l5x5l left a comment

Choose a reason for hiding this comment

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

🚀🚀

@wjdrjs00 wjdrjs00 merged commit ae9b324 into develop Mar 29, 2026
2 checks passed
@wjdrjs00 wjdrjs00 deleted the refactor/#205-navigation-logic branch March 29, 2026 08:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔨 Refactor 기존 기능 개선 📱 UI UI 추가 및 수정 (비지니스 로직을 포함하지 않는 작업) 🧤 대현

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[REFACTOR] 네비게이션 로직 수정

2 participants