20190812
[AndroidX] ViewModel
ViewModel 는 UI와 연관된 데이터를 생명주기를 유의하면서 저장, 관리 하도록 설계된 클래스 입니다.
ViewModel은 보통 onCreate에서 시작해서 UI controller가 완전히 끝나면 onCleared() 로 제거됩니다.
우선 기본 개념 몇 가지를 정리해야 합니다.
- UI 컨트롤러
- ViewModel
- ViewModelFactory
- UI 컨트롤러 : 간단히 말해서 액티비티나 프래그먼트입니다. 말 그래도 UI를 다루고, UI를 화면에 표시하고 유저의 입력 이벤트를 받는 정도의 OS 상호작용을 합니다.
- ViewModel : 연관되어 있는 UI 컨트롤러에서 표시되는 데이터 를 다룸
- ViewModelFactory : ViewModel 객체를 인스턴스화 합니다.
사용
그래들 추가
이 곳 에서 최신 버전을 확인해주세요.
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
뷰 모델 클래스를 만듭니다.
UI 컨트롤러에 뷰 모델을 연결합니다.
UI 컨트롤러 내부에 뷰 모델 인스턴스를 만들어야 합니다.
뷰 모델 인스턴스는 직접 만들면 안되고 항상 ViewModelProvider를 이용해서 만들어야 합니다.
이전에는 ViewModelProviders.of() 를 사용해서 간단하게 인스턴스화하는 방법이 있었지만 ViewModelProviders는 Deprecated 되었습니다. 참조
이제는 팩토리를 만들어야 합니다. 별도의 팩토리 클래스를 만들어도 되지만 간편하게 NewInstanceFactory() 를 이용하는 방법도 있습니다.
뷰 모델에 매개변수를 넣어줘야 할 때는 별도의 팩토리 클래스를 만들어 주는 것이 좋습니다. ViewModelProvider.Factory 클래스를 확장하면 됩니다.
이제 ui 데이터를 뷰 모델로 옮기고 쓰면 됩니다.
주의할 점
- ViewModel은 액티비티, 프래그먼트,
컨텍스트
에 대한 레퍼런스를 가지면 안됩니다!, 또한 ViewModel은 UI 컨트롤러에 대한 레퍼런스를 포함하는 요소들도 포함하면 안됩니다. 예를 들어 View 같은 경우에 Context에 대한 간접적인 레퍼런스를 만들게 됩니다.
- 뷰모델은 데이터베이스가 아닙니다. ViewModel로 데이터를 영구적으로 보존하는 게 아니고 UI 관련된 일시적인 데이터를 잠깐 붙잡고 있는 겁니다.
- ViewModel은 onSaveInstanceState()의 대체재가 아닙니다.
출처
https://developer.android.com/topic/libraries/architecture/viewmodel
https://medium.com/androiddevelopers/viewmodels-a-simple-example-ed5ac416317e
https://medium.com/androiddevelopers/viewmodels-persistence-onsaveinstancestate-restoring-ui-state-and-loaders-fc7cc4a6c090
MVVM 패턴 : https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel