Android/Architecture

안드로이드 MVVM 패턴

봄석 2019. 1. 26. 01:15

안드로이드 MVVM 패턴



MVVM의 기본 구조

MVVM의 기본 구조를 그림으로 표현한 것입니다. 

View는 ViewModel에게 클릭 이벤트, 필요한 데이터 요청등을 명시적으로 하고, viewModel이 

notify 할때까지 기다리게 됩니다. 그와 동일하게 ViewModle은 통해 데이터를 요청하고 기다리게 됩니다. 각각의 컴포넌트 간 레퍼런스를 갖지 않고 

단방향(View -> ViewModel -> Model)의 디펜던시만을 갖게 됩니다.



ViewModel

  • View와 Model 사이의 매개체 역할을 합니다. 즉 Model 에서 제공받은 데이터를 UI에서 필요한 정보로 가공한 뒤 View가 가져갈 수 있게 데이터 변경에 대한 "이벤트"를 보내게 됩니다

  • ViewModel과 View는 MVP패턴과 다르게 Many to One의 관계를 가질 수 있습니다. 즉, 여러개의 Fragment가 하나의 ViewModel을 가질 수 있습니다.

  • ViewModel은 View에 영향을 끼칠 수 있는 Model의 상태 관리도 담당합니다.

   (예: 로딩중 상태, 네트워크 에러 상태, 오프라인 visibility 등)

  • View 또는 액티비티 Context에 대한 레퍼런스를 가지면 안됩니다. View는 ViewModel의 reference를 가지지만 ViewModel은 View에 대한 정보가 전혀 없어야 합니다. (ViewModel이 View의 레퍼런스를 가진다면 lifecycle에 메모리누수가 발생할 수 있는데 , 그 이유는 ViewModel이 destroy외의 라이프사이클에서는 메모리에서 해제되지 않기 때문입니다.)
  • 앱이 백그라운드에서 죽는 경우에는 뷰모델도 함께 사라지기 때문에 이 경우에 한해서는 onSaveInstanceState를 통해 복구할 데이터를 저장해야 합니다.

View
  • Activity, Fragment, CustomView, Dialog, Toast, Snacbar, Menu 등의 UI 컴포넌트를 의미합니다.
  • View는 UI 업데이트를 위해 ViewModel과 바인딩하게 됩니다. 다른 표현으로는 View가 ViewModel에 구독을 하게되고, ViewModel의 상태가 변경되면 그 이벤트를 받아 UI를 갱신합니다.
  • 추가로 퍼미션관련된 처리, startActivity등의 네비게이션 역할도 합니다.

Model
  • DataModel 이라고도 하며 Network, DB, SharedPreference 등 다양한 데이터소스로 부터 필요한 데이터를 준비합니다.
  • ViewModel 에서 데이터를 가져갈 수 있게 데이터를 준비하고 그에 대한 "이벤트"를 보냅니다.