반응형
ViewModelStoreOwner 와 ViewModelProvider 를 통한 특정 Activity, Fragment에서 ViewModel을 관리하는 방법에 대해 살펴보겠습니다.
◼️ MainActivity
val customViewModelOwner: ViewModelStoreOwner = object : ViewModelStoreOwner {
override val viewModelStore: ViewModelStore = ViewModelStore()
}
fun clearCustomViewModelStore() {
customViewModelOwner.viewModelStore.clear()
}
- 위 코드에서 ViewModelStoreOwner 인터페이스를 구현한 객체를 생성합니다.
- customViewModelOwner.viewModelStore.clear()는 customViewModelOwner에 저장된 모든 ViewModel 인스턴스가 제거됩니다.
◼️ 참고
- ViewModelStoreOwner는 ViewModel을 저장하고 관리할 수 있는 인터페이스입니다.
- ViewModelStore는 ViewModel 객체들을 저장하는 데 사용되는 저장소입니다.
- ViewModelStore는 Activity, Fragment의 생명주기와 밀접하게 연결되어 있습니다. 예를 들어, Activity, Fragment가 소멸될 때(onDestroy가 호출될 때), 해당 ViewModelStore에 저장된 ViewModel 인스턴스들도 함께 소멸됩니다.
- viewModelStore는 ViewModel 인스턴스를 한 번만 생성하고 재사용하는 데 중점을 둡니다. 따라서 동일한 ViewModel 인스턴스에 대한 요청이 있을 때마다 새로 생성하는 것이 아니라, 이미 생성된 인스턴스를 반환합니다
- Activity, Fragment의 경우 ViewModelStoreOwner 인터페이스를 구현하여 ViewModel을 저장하고 관리합니다.
◼️ BaseViewModel
open class BaseViewModel : ViewModel() {
init {
Log.d(">>> BaseViewModel", "뷰모델 생성 : ${this.javaClass.simpleName} = ${this.hashCode()}")
}
...
...
override fun onCleared() {
Log.d(">>> BaseViewModel", "뷰모델 해제 ${this.javaClass.simpleName} = ${this.hashCode()}")
super.onCleared()
}
}
◼️ Fragment
private val testViewModel: TestViewModel by lazy {
ViewModelProvider(mainActivity?.customViewModelOwner!!)[TestViewModel::class.java]
}
...
...
mainActivity.clearCustomViewModelStore()
- lazy 위임 프로퍼티를 사용해서 해당 프로퍼티가 처음 접근될 때 초기화되도록 합니다. 이는 ViewModel이 필요할 때만 초기화되도록 하여 불필요한 초기화를 방지할 수 있습니다.
- ViewModelProvider는 ViewModel을 생성하고 제공하는 역할을 합니다. ViewModelProvider는 ViewModel을 요청받으면 기존에 생성된 ViewModel 인스턴스를 반환하거나, 새로운 ViewModel 인스턴스를 생성합니다.
- ViewModelProvider는 ViewModelStoreOwner를 파라미터로 가집니다.
- [TestViewModel::class.java]는 ViewModelProvider에게 반환할 ViewModel의 클래스를 지정합니다.
◼️ Hilt ViewModel 과 차이
위 예시처럼 MainActivity에서 customViewModelOwner를 정의하고 직접 ViewModelStore 인스턴스를 생성하는 경우, 해당 ViewModelStore는 Hilt가 아닌 MainActivity에서 직접 관리하는 ViewModelStore가 됩니다. 즉, Hilt를 사용하여 ViewModel을 관리하는 방식과는 독립적으로 동작하게 됩니다.
- Hilt가 관리하는 ViewModel
Hilt는 ViewModel을 주입하고 생명주기 관리도 함께 처리합니다. Hilt를 사용하여 ViewModel을 생성하는 경우, ViewModelStore은 액티비티 또는 프래그먼트의 생명주기를 따르게 됩니다.- viewModels()
- activityViewModels()
- 직접 관리하는 ViewModelStore
ViewModelStore는 MainActivity, Fragment가 직접 관리합니다. ViewModelStoreOwner를 통해 생성된 ViewModel은 Hilt와 별도로 관리됩니다. 이 접근 방식은 Hilt를 사용하지 않거나, 특정한 용도로 별도의 ViewModelStore가 필요할 때 유용할 수 있습니다.
반응형
'Android > [Android]' 카테고리의 다른 글
[Android Clean Architecture] 멀티 Module 생성 (0) | 2024.06.29 |
---|