본문 바로가기

안드로이드/JetPack

[안드로이드] 1. MVVM 개요

MVVM

MVVM이란 Model, View, ViewModel로 표현하는 안드로이드 개발의 구현 패턴이다. 기존의 구현 방식의 경우 액티비티에 너무 많은 기능이 집중되어(종속성의 증가) 유지보수 및 테스트가 힘들어진다. 이러한 문제를 해결하기 위해 MVVM패턴을 주로 사용한다. 

 

MVC와 MVVM

기존의 MVC(Model-View-Controller)의 경우 액티비티가 컨트롤러의 역할을 맡고, xml 파일인 뷰와 연결되어 사용자와 상호작용을 하고, 그와 동시에 액티비티는 모델과도 연결되어 데이터 처리도 담당했다. 즉, 뷰와 모델 사이에서 이름 그대로 controller의 역할을 수행하였다.

 

MVVM의 경우 뷰에서 뷰모델, 뷰모델에서 모델로 작업을 단방향으로 처리하며, 뷰에서 뷰모델을 관찰하여 데이터의 변경 사항을 감지하여 뷰가 업데이트 된다.

 

두 구현 방식을 비교하기 위해 유저가 리스트에 데이터를 추가한 경우를 생각해보자.

 

MVC의 경우 컨트롤러인 메인 액티비티가 유저의 클릭을 리스너로 감지하고 모델에 데이터를 갱신하고 뷰에는 변경된 값으로 화면을 업데이트를 요청해야 한다. 이 경우 액티비티가 너무 무거워지고, 최악의 경우 DB(Model)만 갱신하고 화면은 갱신되지 않거나 그 반대의 경우도 발생할 수 있다.

 

MVVM의 경우 메인 액티비티는 뷰의 역할을 한다(화면의 갱신만을 담당). 뷰인 메인 액티비티는 유저의 클릭을 리스너로 감지하고 뷰모델을 참조한다. 뷰모델에서는 다시 모델에서 데이터를 참조한다. 그리고 뷰는 뷰모델을 관찰하며 데이터의 변화를 감지하여 자동으로 화면을 갱신한다. 이러한 관찰의 과정에 의해 DB에 데이터가 갱신되더라도 화면을 업데이트를 위한 특별한 명령이 요구되지 않는다. 단지, 뷰가 뷰모델을 바인딩하는 과정만 필요하다.

 

AAC(Android Architecture Component)

구글은 앱 구조를 더 견고하고 유지보수가 용이하게끔 특별한 라이브러리 집합인 AAC를 제공한다. Databinding, LiveData, ViewModel 등의 라이브러리를 활용하여 MVVM 패턴을 간단하게 구성할 수 있다.

View(녹색), ViewModel(청색), Model(황색)

  • View: UI를 담당하는 액티비티/프래그먼트로 사용자와 상호작용하며 데이터 변화를 감지하기 위한 Observer가 존재한다.
  • ViewModel: UI를 위한 데이터를 갖고 있으며 화면 회전, 언어 변경과 같은 구성 변화에도 데이터가 유지된다. AsyncTask는 액티비티/프래그먼트의 생명주기에서 자유로울 수 없지만, 뷰와 뷰모델은 분리되었다는 특징 때문에 액티비티가 destory 된 이후 다시 create 되어도 데이터가 유지된다.
  • LiveData: 관찰 가능한(Observeable) 데이터 홀더 클래스이다. 뷰에서 뷰모델에 존재하는 LiveData를 관찰하다가 데이터가 변경될 때 뷰에게 알려준다. LiveData는 액티비티/프래그먼트의 생명주기를 인지하기 때문에 destroy된 상태에서는 동작하지 않고 액티비티가 활성화된 경우에만 동작하므로 메모리 누수를 방지할 수 있다.
  • Repository: 뷰모델과 상호작용을 하기 위해 잘 정리된 데이터 API를 갖고 있는 클래스이다. 앱에 필요한 데이터를 가져온다(내부 DB나 외부 웹 서버의 데이터). 그렇기에 뷰모델은 DB나 서버에 직접 접근하지 않고 Repository에 접근하여 앱의 데이터를 관린한다.