[MVVM] 안드로이드 MVVM 패턴이란?
1. MVVM - Model View ViewModel
MVVM 은 소프트웨어 아키텍쳐 패턴의 하나이다.
* 아키텍처 패턴(architecture pattern) 이란, 주어진 문맥 안에서 소프트웨어 아키텍처의 공통적인 발생 문제에 대한 일반적인, 재사용 가능한 해결책을 의미한다. 아키텍처 패턴은 디자인 패턴과 비슷하지만 더 넓은 범위에 속한다.
MVVM 에 대해 이해하기 위해서는 MVP 패턴에 대해 알고 있는 것이 좋다. MVVM 패턴은 MVP 패턴에서 파생되어 나왔기 때문이다.
MVVM 패턴은 프로그램을 설계하기 위한 하나의 방법론이라고도 생각할 수 있다. 예를 들어서 메모장 안드로이드 앱을 만든다고 생각해보자. 패턴이나 아키텍처에 대해 전혀 몰랐을때, 나는 데이터를 가져오고 저장하는 코드, 데이터를 ui에 보여주는 코드, 이벤트에 따른 데이터 변경을 ui 에 갱신해주는 코드를 전부 Activity class 에 작성했었다. 간단한 앱을 만들때는 그런 방식이 그다지 문제가 되지 않았다. 하지만, 앱이 점차 커지고 코드의 양이 많아지면서 코드들이 뒤죽박죽 엉키고, 한가지 기능을 수정하면 거기에 따른 사이드 이펙트를 수정하는데 너무 오래 걸리는 등, 코드를 유지 보수하기가 너무 힘들었다. 이러한 문제를 해결하기 위해, Model, View, ViewModel 각각의 기능에 따라 분리하여 코드를 작성하는 것을 MVVM 패턴이라고 말할 수 있겠다.
<MVVM 의 Components>
- Model : 디자인 패턴에서는 데이터와 데이터에 관련된 행위를 모두 합쳐 Model 이라 부른다. 즉, 데이터와 데이터를 가져오는 로직자체를 Model 이라고 생각할 수 있겠다. 특히, MVVM 패턴에서의 Model 은 domain 모델을 나타낸다. domain 모델이란, 소프트웨어로 해결하고자 하는 문제 영역을 개념적으로 표현한 것이다.
- View : 사용자에게 화면으로 보여지는 모든 구조, 레이아웃을 View 라 부른다. View 는 model 을 시각적으로 표현하고, 사용자의 상호작용을 받는다. View 는 data binding 을 통해 이러한 입력을 View Model 에게 전달한다.
- ViewModel : ViewModel 은 View 의 추상화된 형태이다. View 에 보여져야하는 데이터와 명령들을 가지고 있다. ViewModel 이 MVC 패턴의 Controller 나 MVP 패턴의 Presenter 와 다른 점은, View 가 ViewModle 을 observe(관찰) 하는 형태로 binding 되어 있기 때문에, data 의 갱신을 View 가 자동으로 받을 수 있게 되어있다는 것이다.
<MVVM 의 구조>
각각의 컴포넌트는 서로 reference를 갖지 않고, (View->ViewModel->Model) 형태의 단방향 depedency 를 갖는다
위의 내용을 통해 MVVM 패턴의 대표적인 특징을 알 수 있다.
- 소프트웨어를 최대한 기능적으로 작은 단위로 나눈다
- 그에 따라 테스트가 쉬워지며 큰 프로젝트도 상대적으로 관리하기 좋아진다
2. 안드로이드에서의 MVVM 패턴
- ViewModel
- View 와 Model 사이의 매개체 역할을 한다.
(1) Model 에서 가져온 데이터를 UI 에 필요한 정보로 가공
(2) View 가 가져갈 수 있도록 해당 데이터 변경에 대한 "notify" 를 보냄
- ViewModel 과 View 는 MVP 패턴과 다르게 Many to One 관계를 가질 수 있다.
즉, 여러개의 Fragment 가 하나의 ViewModel 을 가질 수 있다.
- ViewModel 은 View 에 영햘을 끼칠 수 있는 Model 의 상태관리도 담당한다.
(로딩중, 네트워크 에러, 오프라인 visibility 등...)
- View 의 Context 에 대한 레퍼런스를 가지면 안된다.
View 는 ViewModel 의 레퍼런스를 가지지만, ViewModel 은 View 에 대한 정보가 전혀 없어야 한다.
만약 ViewModel 이 View 의 레퍼런스를 가진다면, lifecycle 에 메모리 누수가 발생할 수 있다.
ViewModel 이 destroy() 이외의 라이프사이클에서는 메모리에서 해제되지 않기 때문이다.
- View
- Activity, Fragment, CustomView, Dialog, Toast, Snackbar, Menu 등의 UI 컴포넌트
- View는 UI 업데이트를 위해 ViewModel과 바인딩하게 된다. 다른 표현으로는 View가 ViewModel에 구독을 하게되고, ViewModel의 상태가 변경되면 그 이벤트를 받아 UI를 갱신한다.
- permissiont 이나, startActivity 등의 네비게이션 역할도 한다.
- Model
- Network, DB, SharedPreferences 등 다양한 Data Source 로부터 필요한 데이터를 준비한다.
- ViewModel 에서 데이터를 가져갈 수 있게 데이터를 준비하고, 그에 대한 이벤트를 보낸다.
참고 사이트 >>