Navigation — 화면 이동·백스택·타입 안전 경로
앱은 여러 화면을 오간다 — 목록에서 상세로, 뒤로 가기, 딥링크로 특정 화면 진입. 이 화면 이동과 백스택을 일관되게 다루는 게 Navigation 컴포넌트다. 현대 안드로이드는 단일 Activity + 여러 컴포저블 목적지 구조를 권장하고, Navigation이 그 사이 이동·인자 전달·백스택을 관리한다. (출처: Android — Navigation / Navigation Compose.)
단일 Activity 아키텍처
예전엔 화면마다 Activity였지만, 현대 권장은 단일 Activity + 화면은 컴포저블(또는 Fragment) 목적지다 — 화면 전환이 가볍고, 공유 요소·상태·백스택을 한 곳에서 관리한다. Navigation이 목적지(destination) 그래프를 들고 이동을 조율한다.
Navigation Compose — NavHost와 navigate
val navController = rememberNavController()
NavHost(navController, startDestination = "list") {
composable("list") {
ListScreen(onItemClick = { id -> navController.navigate("detail/$id") })
}
composable(
"detail/{id}",
arguments = listOf(navArgument("id") { type = NavType.LongType })
) { backStackEntry ->
val id = backStackEntry.arguments?.getLong("id") ?: return@composable
DetailScreen(id)
}
}
NavHost— 목적지 그래프를 들고 현재 목적지를 그린다.navController.navigate(route)— 이동(백스택에 push).- 인자 — 경로에
{id}로 싣고arguments로 타입 지정.
타입 안전 경로 (Navigation 2.8+)
문자열 경로("detail/$id")는 오타·타입 오류가 런타임에야 터진다. *Navigation 2.8+*는 타입 안전 경로 — 직렬화 가능한 객체/data class를 목적지로 써서 컴파일 타임에 검증한다.
@Serializable data class Detail(val id: Long) // 타입 안전 목적지
composable<Detail> { entry ->
val args = entry.toRoute<Detail>()
DetailScreen(args.id)
}
navController.navigate(Detail(id = 42)) // 타입 안전 이동
백스택과 popUpTo
navigate는 백스택에 쌓고, *뒤로 가기/popBackStack()*은 pop한다. 로그인 후 로그인 화면을 스택에서 제거하거나 탭 전환에서 중복을 막을 때 popUpTo·launchSingleTop을 쓴다.
navController.navigate("home") {
popUpTo("login") { inclusive = true } // 로그인까지 스택에서 제거
launchSingleTop = true // 맨 위면 중복 생성 안 함
}
중첩 그래프·딥링크
- 중첩 그래프(nested graph) — 기능 단위로 그래프를 묶어(예: 인증 플로우) 모듈화([andarch 06]).
- 딥링크(deep link) — URL/알림으로 특정 목적지에 바로 진입. 백스택을 합성해 자연스러운 뒤로 가기를 만든다.
정리 — 이동과 백스택을 한 곳에서
Navigation의 핵심 — 단일 Activity + 컴포저블 목적지, NavHost+navController.navigate로 이동·인자 전달, 2.8+의 타입 안전 경로로 컴파일 타임 검증, popUpTo/launchSingleTop으로 백스택 제어, 중첩 그래프·딥링크. 화면 이동을 그래프로 선언하면 백스택·인자·딥링크가 일관되게 다뤄진다.
한 줄 요약 — 단일 Activity + 목적지 그래프.
NavHost+navigate(route), 인자는 경로{id}/navArgument. 2.8+ 타입 안전 경로(@Serializable data class·navigate(Detail(id)))로 컴파일 검증. 백스택은popBackStack/popUpTo/launchSingleTop. 중첩 그래프·딥링크.
(출처: Android — Navigation Compose / Type safety / Navigate with arguments / Navigation 2.8 type-safe routes.)