MVVM 패턴
MVVM(Model-View-ViewModel) 패턴은 1990년대 마틴 파울러에 의해 나온 MVP패턴에서 파생된 패턴이다.
비즈니스 로직과 사용자 인터페이스(UI)를 완전히 분리함으로써 쉬운 유지관리와 테스트를 진행할 수 있으며 기본적으로 모듈화를 진행하기 때문에 코드 재사용성도 뛰어나다.
기존의 액티비티(Activity)에 비즈니스 로직과 UI 로직과 같은 복잡한 기능을 넣게 되면 액티비티가 무거워지고 종속성이 너무 강하다.
이것은 테스트가 힘들고 유지보수의 어려움으로 이어진다.
따라서 MVVM 패턴을 사용하게되면 기본적으로 Model과 View 그리고 ViewModel과 같이 각자의 역할에 맡는 기능들을 모듈화하기때문에 유지관리 및 테스트가 용이해진다.
이제부터 Model, View, ViewModel이 무엇인지 각각 알아보자.
1. View
- View는 Activity나 Fragment같은 화면에 표현되는 레이아웃을 정의한다.
- View는 기본적으로 비즈니스 로직을 포함하지 않지만 UI 변경과 관련된 일부 로직은 포함될 수 있다.
- 화면에 무엇을 그릴지 결정하고, 사용자와 상호작용한다.
2. ViewModel
- 뷰모델(ViewModel)은 View에 연결된 데이터와 명령을 구현하고 변경 알림 이벤트를 통해 상태의 변경을 View에 알린다.
- 기본적으로 View는 ViewModel을 옵저빙하고 있다가 상태 변화가 전달되면 화면을 갱신해야 한다.
- 뷰모델은 뷰와 분리되어 있기 때문에 액티비티가 Destroy 되었다가 다시 create 되어도 종료되지 않고 데이터를 여전히 가지고 있다.
3. Model
- 모델(Model)은 데이터베이스와 같은 여러 데이터 소스로부터 ViewModel이 요청하는 데이터를 준비하는 역할을 한다.
- 일반족으로 데이터를 액세스하거나 캐싱이 필요한 서비스 또는 리포지토리와 함께 사용된다.
MVC와 MVVM 차이점
그렇다면 우리에게 익숙한 MVC와 MVVM의 차이점은 무엇일까?
MVC (Model-View-Controller)
1. Controller
- Activity 부분에서 View에게는 화면 업데이트, Model에게는 데이터 갱신을 알리는 역할을 한다.
- View와 Model을 연결해주며 비즈니스 로직을 처리하기 위해 많은 일을 해야한다.
2. View
- 화면 부분으로 UI 역할을 담당한다.
3. Model
- model class로 비즈니스 로직에서의 알고리즘, 데이터의 기능 처리한다.
MVVC (View-ViewModel-Model)
1. View
- Activity 역할을 담당하고 UI를 갱신하는 역할에만 충실하다.
- 뷰모델을 관찰(Observe)한다.
- 데이터의 변화를 알아차리고 자동으로 화면을 갱신할 수 있다.
2. ViewModel
- Model에게 데이터 갱신 처리를 요청하고 잘 정리된 데이터를 참조한다.
3. Model
- 데이터 처리 역할을 한다.
MVVM 장점
1. 뷰가 데이터를 실시간으로 관찰한다.
LiveData를 이용해 DB를 관찰하고 자동으로 UI를 갱신한다.
MVC패턴은 controller가 view에게 화면을 갱신해달라고 명령을 내리지만 MVVM에서는 뷰가 뷰모델을 관찰하기때문에 자동으로 갱신한다.
2. 생명주기로부터 안전하여 메모리 릭을 방지할 수 있다.
뷰모델을 통해 데이터를 참조하기 때문에 액티비티/프래그먼트의 생명주기를 따르지 않는다.
-> 화면전환과 같이 액티비티가 파괴된 후 재구성 되어도 뷰모델이 데이터를 홀드하고 있기 때문에 영향을 받지 않는다.
뷰가 활성화되어 있을 경우메나 작동하기 때문에 불필요한 메모리 사용을 줄일 수 있다.
3. 기능별로 모듈화되어 있어 역할 분리를 할 수 있고 유닛 테스트에 한결 용이해진다.
AAC(Android Architecture Component)
2017년 구글에서 AAC를 발표했다.
AAC(Android Architecture Component)는 모듈화된 코딩을 돕기 위해 DataBinding, LiveData 등과 같이 라이브러리를 제공하여 MVVM 패턴으로 앱의 성능과 유지보수를 높일 수 있도록 하였다.
물론 MVVM 자체가 디자인 패터이기 때문에 AAC 라이브러리를 사용하지 않고도 MVVM 패턴 설계가 가능하다. 다만 Activity나 Fragment의 여러 생명주기에 따라 데이터의 상태 관리를 하는 측면에서 AAC 라이브러리를 사용할 경우 이러한 생명주기를 신경쓰지 않고 ViewModel의 데이터를 처리할 수 있다.
과거의 안드로이드는 Activity에 모든 이벤트처리나 비즈니스 로직을 구현하였는데 최근에는 MVC, MVP 패턴 등 유지보수와 모듈화를 위해 여러 패턴이 적용이 되고 있고 MVVM 패턴도 그 중 하나라고 할 수 있다.
다음 시간에는 이러한 MVVM 패턴을 적용한 예제코드를 공부해볼 것이다.
참고
'개발 > Android' 카테고리의 다른 글
[안드로이드] MainThread vs WorkerThread (0) | 2021.05.26 |
---|---|
[안드로이드] 프래그먼트(Fragment) 사용하기 (0) | 2021.05.25 |
[안드로이드] This version of Android Studio cannot open this project 해결 (0) | 2021.05.18 |
[안드로이드] Volley API를 이용한 HTTP 통신 (0) | 2021.05.16 |
[안드로이드/Java] RecyclerView와 DB연동 (0) | 2021.05.12 |