티스토리 뷰

반응형

개발 블로그 또는 Github 오픈소스를 살펴보면 AAC(Android Architecture Components) ViewModel을 활용하여 MVVM 을 구축한 것을 종종 봅니다. 구글에서 말하는 AAC ViewModel과 MVVM에서 말하는 ViewModel 의 차이가 무엇일까요? ViewModel이면 ViewModel이지 AAC ViewModel이라고 다르게 표현할까요?

AAC ViewModel과 ViewModel의 차이점에 대한 포스트를 작성하였습니다.

 

MVVM의 ViewModel이란?

MVVM의 View Model 은 공통 속성 및 명령을 표시하는 뷰의 추상화 입니다. 다르게 말하면 View와 Data Binder 사이의 통신을 조정합니다.

MVP 패턴과 차이점은 MVP 패턴은 Presenter 가 View 에 대한 참조를 갖고 있으나 MVVP 패턴의 View Model은 View 에 대한 참조를 갖고 있지 않습니다. View 가 View Model 에 대해서 직접적인 Bind 되어 있어 View Model의 변화에 대한 업데이트를 즉각적으로 받게 됩니다.

 

AAC(Android Architecture Components) ViewModel 이란?

Android 공식 사이트에서 ViewModel 클래스에 대해서 언급하는데 MVVM에 대한 이야기는 확인 할 수 없습니다. Android 공식 사이트 첫 줄을 보면 다음과 같습니다.

ViewModel 클래스는 수명 주기를 고려하여 UI 관련 데이터를 저장하고 관리하도록 설계되었습니다.
ViewModel 클래스를 사용하면 화면 회전과 같이 구성을 변경할 때도 데이터를 유지할 수 있습니다.

AAC ViewModel의 역할은 MVVM 의 ViewModel의 역할이 아닌 UI 관련 데이터를 저장을 LifeCycle 을 기반으로 관리하고 있다는 것을 확인할 수 있습니다.
다시 말하자면 MVVM 의 ViewModel의 역할하고 다르다라는 것을 확인할 수 있습니다.

 

AAC ViewModel Lifecycle

그렇다면, ViewModel의 수명주기는 어떻게 될까요?

안드로이드 공식 사이트에 명확하게 ViewModel의 수명주기를 제시해주고 있는데요.

ViewModel 객체의 범위는 ViewModel 을 가져올 때 ViewModelProvider 에 전달되는 LifeCycle 로 지정됩니다. ViewModel은 범위가 지정된 LifeCycle 이 Destory 될 때까지, 즉 활동에서는 활동이 끝날 때까지 그리고 프래그먼트에서는 프래그먼트가 분리될 때까지 메모리에 남아 있습니다.

 

AAC ViewModel과 코루틴

AAC ViwModel은 Kotlin 코루틴 지원이 포함됩니다.
ViewModel의 LifeCycle에 맞춰 ViewModel이 삭제 되었을 시 코루틴의 동작을 Cancel 할 수 있습니다.

 

AAC ViewModel 을 MVVM에 활용하기

그렇다면, AAC ViewModel을 MVVM의 ViewModel로 사용할 수는 없을까?

AAC ViewModel도 MVVM에서 말하는 ViewModel의 역할을 할 수도 있습니다. AAC ViewModel에 LiveData을 선언하고 그 LiveData을 View에서 Observe 을 하면 MVVM의 ViewModel이 구성이 됩니다.
다만, 앞써 말했듯이 AAC ViewModel은 MVVM을 위한 ViewModel이 아니라는 것을 인지하고 사용해야 합니다.

 

정리

AAC(Android 아키텍처 구성요소) View Model 과 MVVM의 ViewModel을 비교했습니다.
AAC ViewModel은 MVVM의 ViewModel이 아니라는 것을 알게 되었을 것입니다.

많은 예제 소스가 MVVM을 소개할 때 AAC ViewModel을 활용해서 소개하고 있습니다. 여기서 주의할 점은 AAC ViewModel에 대해서 정확히 인지하고 각 View의 역할에 맞추어 AAC ViewModel을 MVVM의 ViewModel로 사용해야합니다. 예를들어 ListAdapter에 bind된 RowView에 대한 ViewModel은 어떻게 구성할 것인가요?

MVVM의 ViewModel과 AAC ViewModel의 사용 목적에 맞춰서 사용하는 개발자의 고민이 필요해 보입니다.

 

참고

iOS MVVM 패턴 RxSwift로 적용해보자

Android ViewModel의 개요

MVVM Wikipedia

반응형
댓글