[Android] MVVM ViewModel과 AAC ViewModel의 차이
결론부터 얘기하자면 2개는 같다고 할 수 없습니다.
# MVVM ViewModel
MVVM의 ViewModel의 역할은 View와 Model 사이에서 데이터를 관리해주고 바인딩 해주는 역할입니다.
# AAC ViewModel
AAC의 ViewModel은 화면 회전 같은 환경에서 데이터를 보관하고 라이프사이클을 알고있어서 Activity나 Fragment의 Destroy시 onClear함수를 통한 데이터 해제의 역할을 하고있습니다.
구글에서 ViewModel의 목적은 데이터를 관리하고 바인딩하라는 목적으로 만든게 아니라고 한다.
하지만 AAC ViewModel이라고 그게 안될리가 없다.
AAC ViewModel에 LiveData를 사용하여 바인딩 시킬 수 있다.
AAC ViewModel은 ViewModelProviders를 사용해서 ViewModel을 만드는데, 이렇게 만들어진 뷰모델은 그 액티비티에서 딱 하나만 존재하게 된다. 액티비티 한 개 내에서만 유효한 싱글톤인 셈이다. (뷰 한개에 뷰모델 유형이 딱 한개 존재해야 한다는 것은 아니다. )
구글은 하나의 뷰에 하나의 뷰모델만 두고 사용하는 것을 권장한다.
SignUpActivity가 있다면, SignUpViewModel 하나만 놔두고, 그 안에 여러 Model과 LiveData를 사용하는 것을 권장하고 있다. 이것은 원래의 MVVM 원칙과 맞지 않는 내용이다. 더 좋고 더 나쁜 방식은 없다. 구글이 추천하는 방식과 원래 MVVM의 원칙 중 어떤것이 더 자신의 프로젝트에 맞는지는 개발자가 판단할 몫이다.
MVVM 읽어보라함
https://gyuwon.github.io/blog/2017/03/05/mvvm-architectural-pattern.html
# 개인적인 생각
안드로이드에서 Activity에 선언하는 ViewModel은 AAC의 ViewModel이고 거기에
MVVM ViewModel(추상적인) 패턴을 적용하여
뷰 상태, 값 변환기, 명령을 통해 뷰모델은 추상화된 뷰가 된다.
추상화된 뷰와 물리적인 뷰를 연결해 줄 수단이 필요하다.
MVVM 패턴에서는 작업흐름 제어보다는 뷰와 뷰모델의 상태를 동기화해 줄 구성요소가 필요한데 데이터 바인딩(data binding)이 그것이다.
현재 우리가 사용하는것은 AAC ViewModel + MVVM ViewModel의 형태인듯 하다.
AAC ViewModel의 역할은?
Android AAC에서 제공하는 ViewModel은 일반적인 ViewModel과는 다르게, Android에서 편하게
사용할 수 있도록 만든 ViewModel이다.
이러한 AAC ViewModel은 Android 개발에 특화되어 있으며, 명칭상 ViewModel일 뿐 실제 ViewModel과는
내부 동작 방법이 다르다.
이러한 부분을 ViewModel과 AAC ViewModel을 비교해 본다.
ViewModel
일반적으로 ViewModel을 설명할 때는 MSDN에서 설명하는 ViewModel을 이야기합니다.
-View와 ViewModel간의 관계를 단절시키기 위함.
-MVP를 활용하는 경우 View와 Presenter는 1:1의 관계를 가지며, 결합도가 높다.
-Presenter에서 View를 알고, 이를 갱신하도록 유도한다.
-View는 Presenter로 부터 View갱신을 유도 받고, 이를 갱신한다.
이러한 이유로 View와 Presenter간의 결합도가 높으며 의존관계를 깨기 어렵다.
-MVVM은 MVP의 View와 Presenter의 높은 결합도를 줄이며, ViewModel에서 View를 알지 못하도록 설계한다.
-ViewModel에서 View를 갱신할 때는 Observable형태로 알리거나, DataBinding을 활용해서 알려야 한다.
-DataBinding과 Observable(RxJava, Listener 등)을 통해 View의 갱신을 할 수 있도록 한다.
-결국 ViewModel의 데이터가 수정되었더라도, View는 수정할게 없도록 설계 할 수 있다.
결국 View와 ViewModel은 서로 의존하지 않는 형태로 구성해야 한다.
-DI을 이용해 의존성을 낮출 수 있다.
ViewModel은 용도에 따라서 최대한 구분하며, 공통 코드를 줄이는 방향으로 설계해야한다.
-한 개의 View에서는 N개의 ViewModel을 가질 수 있으며, 반대로 한 개의 ViewModel은 N개의 View에서 사용될 수 있다.
Application등 Android Lifecycle과 무관하게 동작해야 한다.
AAC ViewModel
Android AAC ViewModel은 화면 회전시 데이터를 유지할 수 있는 구조로 디자인하였으며,
Android Lifecycle의 onDestroy()코드가 동작한다.
AAC ViewModel을 정리하면
목적: 화면 회전시 데이터 유지를 위한 구조로 ViewModel을 디자인 하였다.
Activity/Fragment에 따라서 ViewModel유지를 하고있다.
내부에서 Lifecycle을 사용할 수 있도록 초기화하고 있으며, onDestroy()동작 시 ViewModel내부의 onCleared()
호출을 통해 Release를 유도한다.
참조 :
https://wooooooak.github.io/android/2019/05/07/aac_viewmodel/
https://thdev.tech/androiddev/2018/08/05/Android-Architecture-Components-ViewModel-Inject/
'안드로이드' 카테고리의 다른 글
[Android] 제네릭(Generic)에 대해 알아 보자 (0) | 2022.08.24 |
---|---|
자바 == 와 코틀린 === 비교 (0) | 2022.08.05 |
[Android] 서비스(Service)에 대해 알아보자 (0) | 2022.07.05 |
소스 검색(?) (0) | 2022.06.30 |
[Android] 힐트(Hilt)에 대해 알아보자 (0) | 2022.06.20 |