Jetpack 라이브러리 정리 첫 번째
ViewModel이란?
AACViewModel
원래 ViewModel은 MVVM(Model, View, ViewModel)이라는 디자인 패턴의 구성요소로 부터 나왔다.
Jetpack의 ViewModel을 MVVM패턴의 ViewModel과 구분 짓기 위해 AACViewModel이라고 불린다.
ViewModel 사용 이유
어떤 기술이나 라이브러리는 사용 이유가 곧 정의라고 생각한다. 그래서 ViewModel의 사용 이유에 대해 정리해보자면 다음과 같이 두 가지로 생각할 수 있다.
1. UI 컨트롤러에서의 데이터 처리 로직 분리
기존 ViewModel에 사용이 없는 코드에서는, Activity 및 Fragment에서 서버와 DB에서 데이터를 가져오는 코드, 처리해서 가공하는 코드, 가공된 데이터를 통해 event나 UI에 바인딩 시켜주는 코드 모두가 들어갈 수 밖에 없었다.
하지만 컨트롤러 안에 모든 코드가 들어가 있다면, 후에 유지보수 하기에 알아보기도 힘들고 테스트하기에도 어렵지 않겠는가? 이때 ViewModel을 활용한다면, 데이터 가져오고, 가공하는 코드는 ViewModel에! event를 처리하는 코드는 UI에!
작성함으로써 비대해진 컨트롤러 안의 크기를 줄이고 관심사를 분리할 수 있다.
2. UI 컨트롤러보다 긴 생명주기
일단 위의 그림에서 보이는 것처럼, Activity가 종료되고, 살아나더라도 ViewModel은 살아있는 모습을 볼 수 있다.
이러한 특징은 Activity에 수명주기에 따라 사라지는 데이터를 유지하고, 보존하는 기능으로 활용 할 수 있다.
잠깐 UI 컨트롤러 수명 주기 관리에 대해 짚고 넘어가자.
Android 프레임워크는 Activity & Fragment와 같은 UI 컨트롤러의 수명 주기를 관리한다. 프레임워크는 특정 사용자 작업이나 통제할 수 없는 기기 이벤트에 대한 응답으로 UI 컨트롤러를 제거하거나 다시 만들도록 결정한다.
이때 시스템에서 UI 컨트롤러를 제거하거나 다시 만들 때, 컨트롤러에 저장된 모든 일시적인 UI 데이터가 삭제된다.
즉, 사용자가 가로 -> 세로, 세로 -> 가로로 변경하게 되면
onPause -> onDestroy -> onCreate -> onResume 으로 생명주기가 변하게 되는데, 위에서 언급한 것 처럼 데이터 소실이 발생하게 된다는 것이다.
* onSaveInstanceState() 메소드를 사용해 onCreate() 번들에서 데이터를 다시 복원 할 수는 있지만, 대용량 데이터에는 적합하지 않다고 한다.
해결
ViewModel의 인스턴스는 Activity의 onCreate()에서 요청을 하고, Activity의 인스턴스가 소멸되고 다른 인스턴스가 생성되더라도 위의 그림처럼 ViewModel의 수명주기가 일관되게 유지되기 때문에, 데이터 소실 없이 기존 데이터를 사용할 수 있다는 것이다!
ViewModel 요청 프로세스
VIewModel에 대한 요청이 들어오면
1. ViewModelProvider를 통해 ViewModel 인스턴스 요청
2. ViewModelProvider 내부에서 ViewModelStoreOwner를 참조하여 ViewModelStore를 가져온다.
3. ViewModelStore에 이미 생성된 ViewModel 인스턴스를 요청하고 있으면 가져온다.
4. ViewModelStore가 적합한 인스턴스를 가지고 있지 않으면, Factory를 통해 ViewModel 인스턴스를 생성한다.
5. 생성한 ViewModel 인스턴스를 ViewModelStore에 저장하고 만들어진 ViewModel 인스턴스를 클라이언트에 반환한다.
6. 똑같은 ViewModel 인스턴스가 들어오면, 1 ~ 3 번의 과정을 반복한다.
위의 단계와 같이 ViewModel 인스턴스를 가져올 수 있다.
지금까지 ViewModel에 대해 간단하게 알아봤고, 추가적으로 안드로이드에서 지원해주는 ViewModel 인스턴스 생성에 대해서는 다음에!
참고
https://velog.io/@ashwon1218/Android-JetPack-ViewModel이란-무엇인가
'Android > Android Jetpack' 카테고리의 다른 글
[Android] Jetpack - (4) Room (0) | 2025.03.04 |
---|---|
[Android] Jetpack - (3) Paging3 (1) | 2024.12.01 |
[Android] Jetpack - (2) WorkManager (0) | 2024.07.18 |