MVC와 MVP에서 View와 Model 간의 의존성은 없었지만 Controller 혹은 Presenter와 View 사이의 의존성은 여전히 존재했다.
MVVM에서는 ViewModel이라는 새로운 개념을 도입하였고, ViewModel은 View를 참조하지 않기 때문에 의존성이 없다. 이는 ViewModel이 독립적인 존재라는 뜻이기 때문에 ViewModel과 View는 1:n의 관계를 가질 수 있다.
MVVM (Model, View, ViewModel)
Model
MVC, MVP에서의 Model과 같은 개념이다.
View
사용자가 보는 UI 부분이다. MVP처럼 레이아웃 파일(.xml)은 물론이고 Activity와 Fragment도 View로 분류한다. 보통 Command 패턴이나 DataBinding을 사용하여 ViewModel과의 의존성을 없앤다.
Command 패턴은 코드가 복잡해진다.
LiveData와 DataBinding을 사용하면 이 두 라이브러리가 유용하다는 것을 알 수 있다.
Activity를 통해 Binding하는 방식과 레이아웃 파일에 직접 Binding 하는 방식으로 나누어 살펴볼 수 있다.
ViewModel
View에 필요한 데이터를 Model로부터 가져와서 처리하고 해당 데이터를 View에 보여주기 위한 역할을 한다. 역할 자체는 Controller나 Presenter와 유사하지만 LiveData와 DataBinding을 사용하여 View와의 의존성을 제거할 수 있다.
안드로이드에서 ViewModel이라는 JetPack 라이브러리를 제공하여 더욱 편리하게 ViewModel을 구성할 수 있지만 ViewModel 라이브러리를 사용해야만 MVVM인 것은 아니다. 반대로 이 라이브러리를 사용했다고 해서 무조건 MVVM인 것은 아니다.
일반적인 MVVM에서 ViewModel은 앞서 말한 데이터 처리 및 View 표시를 위한 역할을 수행하면 된다. 다만 ViewModel 라이브러리를 사용하면 UI 관련 데이터의 생명주기를 관리하는데 용이하다.
MVVM 정리
위 그림과 같이 MVVM에서 View와 Model은 서로 분리되어 있다. View는 ViewModel에 의존하지만 ViewModel은 View에 의존하지 않는다.
점선은 다음과 같은 의미를 지닌다.
- LiveData를 이용하여 데이터를 전달하는 것.
- View에서 ViewModel을 참조하기 때문에 ViewModel의 LiveData의 Observer를 등록할 수 있다. 따라서 View에서는 LiveData의 값을 수신할 수 있다.
- DataBinding 라이브러리를 사용해서 데이터를 View와 동기화 하는 것을 의미.
이는 어떻게 구현하느냐에 따라 데이터 전달 방식이 다른 것이다. 다만 DataBinding 라이브러리를 사용하지 않더라도 LiveData를 통해서 데이터를 전달하여 View와 동기화 하는 작업을 하는 첫번째 방식도 결국 전통적인 의미에서 DataBinding을 사용중인 것이다.
결국 안드로이드의 LiveData, DataBinding, ViewModel 라이브러리는 MVVM의 지향점을 이해하고 그것을 실현하는 데 있어 편리함을 제공하는 도구에 불과하다. MVVM을 하기 위해서 ViewModel 라이브러리가 필수는 아니다.