본문 바로가기

Android

Android Jetpack ViewModel

주의

이 블로그는 개인적인 생각과 이해를 정리한 곳입니다. 실제와 다를 수 있으니 글에서 참고한 글을 꼭 확인해주세요.

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 개발의 미래  (0) 2023.09.16
Android Activity - Lifecycle(생명주기)  (0) 2020.09.25
Android LiveData  (0) 2020.09.09
Android Dagger Hilt  (0) 2020.09.08