새소식

Android/[Android]

[Android] ViewModelStoreOwner 와 ViewModelProvider

  • -
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
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.