주의
이 블로그는 개인적인 생각과 이해를 정리한 곳입니다. 실제와 다를 수 있으니 글에서 참고한 글을 꼭 확인해주세요.
ViewModel(Android)?
Android Jetpack에 포함되어있는 클래스입니다. Activity, Fragment에서 UI 관련 데이터를 저장하고 관리할 수 있도록 설계되어 있습니다. Application Arctitecture 중 MVVM의 VM(ViewModel) 역할로써 사용 가능합니다.
Activity, Fragment는 생명주기를 가지고 있는데 이 생명주기는 효율적인 메모리 관리를 위해서 운영체제가 직접 관리합니다. 그래서 개발자는 생명주기에 민감하게 개발해야 하고, 만약 이를 놓치게 될 경우 View가 null이라고 하는 아주 흔하게 만나는 버그를 만나게 됩니다.
이 생명주기에 대해서 완벽하게 알지 않아도 개발자가 안전하게 개발할 수 있도록 Android 지원하는 게 LiveData(관련 포스트) 클래스입니다. 이 클래스를 관찰(observe)하려면 LifecycleOwner를 알려줘야하는데 이게 핵심적으로 생명주기 관련 이벤트를 알려주고 그에 따라 동작해주기 때문입니다.
LiveData를 사용해서 UI를 갱신하는 방식으로 개발을 하게 되면 개발자는 안심을 할 수 있습니다. LiveData를 사용하게 되면 결국 LiveData를 관리하는 클래스가 필요하게 됩니다. 이때 사용할 수 있는 게 바로 ViewModel입니다. LiveData를 담고 있어서 데이터를 저장하고 관리하는데 용이하고 Activity, Fragment가 onDestroy 되기 전까지 유지해줄 수 있는 ViewModel이 적합합니다.
ViewModel 사용하기
ViewModel을 프로젝트에서 사용하기 위해서는 먼저 프로젝트에 의존성을 추가해야합니다.
dependencies {
def lifecycle_version = "2.2.0"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
}
의존성을 추가한 후에 ViewModel을 사용할 Activity 또는 Fragment에서 ViewModel을 가져오는 코드를 추가해야 합니다.
class TestActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
val viewModel: TestViewModel by viewModels() // 1. Using ktx
// val viewModel = ViewModelProvider(this)[TestViewModel::class.java] 2.
// val viewModel = ViewModelProviders.of(this)[TestViewModel::class.java] 3.
viewModel.getPosts().observe(this, Observer { posts ->
// update UI
})
}
}
ViewModel을 가져오는 코드는 지속적으로 편리해지고 있습니다. 안드로이드에서 KTX라는 이름으로 지원하는 기능들 때문입니다. KTX는 코틀린을 언어를 사용해서 개발을 할 때 불필요한 코드를 최소화시켜주고 깔끔한 코드로 만들 수 있도록 지원해줍니다.
위 코드에서 KTX를 사용한 1번 코드를 보면, by viewModels()로 ViewModel을 간단하게 생성하고 가져올 수 있습니다. by viewModels()는 Kotlin Property Delegate(관련 포스트)를 활용한 코드입니다.
주석된 2, 3번 코드의 경우에는 KTX가 아닌 기존에 사용하던 방법으로 3번의 경우에는 현재 Deprecated 된 방법입니다. ViewModelProvider를 직접 만들어서 ViewModel를 생성하고 가져오는 방법인데, 이때 ViewModelFactory를 같이 전달할 수 있습니다.
ViewModelFactory은 1, 2, 3번 방식 모두 전달할 수 있는데 ViewModelFactory에 대한 설명은 나중에 하겠습니다.
ViewModelFactory?
ViewModelFactory는 ViewModel을 생성하는 부분을 직접 관여하고 싶을 때 사용합니다. 기본적으로 제공하는 ViewModelFactory는 생성자가 없는 ViewModel 클래스 생성과 Application을 가지고 있는 AndroidViewModel 클래스 생성 두 가지입니다. 기본적으로 제공하는 Factory가 기본 생성자와 Application생성자이기 때문에 개발자가 다른 생성자로 ViewModel을 생성하고 싶다면 ViewModelFactory를 만들어서 넣어주어야 합니다.
ViewModel의 제거
ViewModel을 원하는 시점에 Activity 또는 Fragment에서 생성해주면 자동으로 onDestroy에서 삭제됩니다. 이 동작은 ViewModel을 가져올 때 ViewModelStore로 Activity, Fragment를 전달하기 때문에 Activity, Fragment의 onDestroy에서 ViewModelStore를 clear 해주는 과정에서 onClear를 호출해주기 때문입니다.
참고
'Android' 카테고리의 다른 글
안드로이드 Compose: 선언적 UI 개발의 미래 (1) | 2023.09.16 |
---|---|
Android Activity - Lifecycle(생명주기) (0) | 2020.09.25 |
Android LiveData (0) | 2020.09.09 |
Android Dagger Hilt (1) | 2020.09.08 |