https://velog.io/@activedg/Jetpack-MVVM-및-ViewModel

MVVM 아키텍쳐에 대해 공부를 하면서 MVC, MVP와는 어떤 차이점이 있는지 정리해보고자 한다. 또한 MVVM에서의 ViewModel과 AAC(Android Architecture Components) ViewModel 과의 차이점에 대해서도 알아보고자 한다.

MVC

MVCModel-View-Controller의 약자로, 사용자에게 보여지는 UI와 데이터 및 로직 처리를 따로 분리한다.

안드로이드 프로젝트에 적용한다 하면, View는 XML 코드로 구성되고, Controller는 Activity 또는 Fragment 클래스가 담당합니다. 하지만 Controller 역할을 하는 클래스는 View를 보여주는 역할도 수행하고 있어, <span style="color: IndianRed"> View와 Controller가 매우 강하게 결합되어 있습니다.</span> 또한, View는 Model에 대한 의존성도 갖고 있습니다. 이러한 이유로 안드로이드에서는 일반적으로 Model-View-Controller (MVC) 패턴을 잘 사용하지 않습니다.


MVP

MVP는 Model-View-Presenter의 약자로, MVC의 Controller 대신 Presenter가 등장한다.

Presenter는 View에서 사용자로부터 액션을 받으면, 모델로 데이터 처리 요청을 보내고 결과를 수신하면 UI를 업데이트한다. Presenter와 View의 관계는 1:1 이다.

안드로이드에서 Presenter를 구현한다하면, View는 xml 코드로 구성되고 Presenter는 Activity/Fragment가 된다. MVC와 다르게 View가 Model에 대해 직접적인 의존성을 가지진 않지만,** 아직도 View와 Presenter 사이가 강하게 결합되어 있다.**


MVVM

MVVM은 Model-View-ViewModel의 약자로, MVP에서의 Presenter 대신 ViewModel이라는 요소가 등장한다. 기존 MVP에서는 View와 Presenter가 강하게 결합되어 있지만, MVVM에서 View와 ViewModel은 느슨하게 결합되어 있다.

ViewModel에서는 View를 조작하지 않는다. View에서 연결된 상태값을 업데이트 및 관리를 하거나 연결된 메서드를 구현한다. 즉, ViewModel은 View에 대한 참조를 가지지 않으며, View에게 변경 사항을 알려주는 역할을 한다. View는 ViewModel의 상태 변화를 **관찰(옵저빙)**한다. 정리하면 ViewModel은 View와 Model 사이에서 데이터를 관리하고 바인딩 해주는 요소이다.