MVC / MVP / MVVM

디자인 패턴

MVC / MVP / MVVM

MVC


MVC 디자인 패턴은 Model, View, Controller 의 줄임말이다.

ControllerView 로부터 이벤트가 발생하면 로직에 맞게 Model 을 변경하거나, Model 에서 데이터를 가져와 View 의 상태를 업데이트 하는 역할을 한다.

안드로이드에서 액티비티 혹은 프래그먼트는 View 의 역할을 하는 동시에 Controller 역할도 한다.

구조가 직관적이고 단순하지만 그만큼 코드가 편중되는 경향이 있어 앱의 규모가 커질수록 코드를 유지보수 하기 힘들다.



MVP


MVP 디자인 패턴은 Model, View, Presenter 의 줄임말이다.

PresenterViewModel 을 연결해주는 역할로, ViewPresenter 는 1:1 관계를 가지며, Presenter 를 도입함으로써 UI 로직과 비즈니스 로직을 분리할 수 있게 된다.

UI 로직과 비즈니스 로직을 분리하여 결합도를 낮추게 한 장점이 있지만, View 에서 Presenter 를 직접 생성하기에 의존성이 높고, 1:1 관계를 가지다보니 View 가 많아질수록 Presenter 도 많아지고, 기능이 추가될 때 마다 Presenter 에 코드가 많아짐에 따라 유지보수하기 어려워진다.



MVVM


MVVM 디자인 패턴은 Model, View, ViewModel 의 줄임말이다.

MVP 디자인 패턴의 PresenterView 를 참조할 수 있지만, MVVM 디자인 패턴의 ViewModelView 에 대한 참조가 불가능하다.

ViewModel 을 사용하면 화면 회전과 같이 액티비티가 재성성이 되는 경우에 소멸되지 않고, 액티비티 내에서 finish() 가 호출되는 경우에 onCleared() 가 호출되며 소멸된다.

액티비티 재성성시 데이터를 유지하기 위해서는 onSaveInstanceState() 에서 번들(Bundle)에 데이터를 저장하고, onCreate() 또는 onRestoreInstanceState() 에서 저장한 데이터를 전달 받을 수 있으나 번들은 저장하는 데이터의 자료형과 크기에 제한이 있다는 단점이 있기 때문에 ViewModel 에서 데이터를 관리하는 것이 권장된다.

즉, ViewModel 은 액티비티나 프래그먼트와 별개로 존재하며, 화면 회전 및 다른 구성 변경으로 인한 앱의 재시작에 영향을 받지 않아 데이터 손실을 방지할 수 있다.

또한 ViewModel 은 비즈니스 로직과 UI 로직을 분리시켜 코드 유지보수성이 향상되고, 여러 컴포넌트 간 데이터 공유가 용이해진다.

essential