Skip to content

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

Open
wjdrjs00 wants to merge 1 commit intodevelopfrom
refactor/#205-navigation-logic
Open

[Refactor/#205] 네비게이션 로직 수정#206
wjdrjs00 wants to merge 1 commit intodevelopfrom
refactor/#205-navigation-logic

Conversation

@wjdrjs00
Copy link
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
    • 하단 네비게이션 바의 내부 아키텍처를 개선하여 더 안정적인 탭 전환 기능을 제공합니다.
    • 네비게이션 시스템을 강화하여 화면 간 이동이 더욱 신뢰성 있게 동작하도록 개선했습니다.

@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

coderabbitai bot commented Mar 26, 2026

개요

홈 네비게이션 로직을 문자열 기반에서 타입 안전 방식으로 변경했습니다. 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 | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 네비게이션 로직 수정이라는 실제 변경 사항의 주요 내용을 명확하게 반영하고 있습니다.
Description check ✅ Passed PR 설명에서 관련 이슈, 작업 내용이 명시되어 있으나 스크린샷은 N/A로 표기되어 있습니다.
Linked Issues check ✅ Passed PR의 모든 변경사항이 issue #205의 요구사항인 String 기반 네비게이션을 type-safe 방식으로 통합하는 목표를 충족합니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 type-safe 네비게이션으로의 통합이라는 범위 내에서 이루어졌으며 범위를 벗어난 변경은 없습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ 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

@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

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] 네비게이션 로직 수정

1 participant