Jetpack Compose에서 ViewModel의 생명주기는 ViewModelStoreOwner에 의해 결정됩니다.
즉, ViewModel 자체가 화면이 아니라 소유자(owner) 에 묶여서 살아있다가, owner가 사라질 때 같이 파괴됩니다.
ViewModel은 화면의 생명주기(Lifecycle) 와는 조금 다릅니다.
실제로는 ViewModelStoreOwner(예: Activity, NavBackStackEntry)에 묶여서 유지됩니다.
일반적인 경우:
// Activity 범위 ViewModel
val vm = viewModel<MainViewModel>()
// → Activity가 살아있는 동안 계속 유지됨.
// → 다른 화면 전환 후에도 같은 인스턴스 사용 가능.
// Navigation backStackEntry 범위 ViewModel
val vm = viewModel<MainViewModel>(backStackEntry = navBackStackEntry)
// → 이 backStackEntry가 pop될 때 ViewModel이 파괴됨.
// → 화면 전환 시 다른 인스턴스로 교체 가능.
backStackEntry를 사용하는 이유NavBackStackEntry라는 owner를 가짐.viewModel(backStackEntry)로 지정하면ViewModel.onCleared() 호출 후 메모리에서 제거됨.composable(route) { backStackEntry -> ... } 구문에서backStackEntry가 곧 ViewModelStoreOwner 역할을 합니다.viewModel() 함수는 현재 Composition의 LocalViewModelStoreOwner를 자동으로 가져와 사용합니다.| ViewModel 범위 | 소유자(ViewModelStoreOwner) | 파괴 시점 |
|---|---|---|
| Activity 범위 | Activity | Activity 종료 시 |
| Navigation 범위 | NavBackStackEntry | backStackEntry pop 시 |
| Fragment 범위 | Fragment | Fragment 종료 시 |
📌 핵심