안드로이드 오픈 톡방을 보다 보면 주기적으로 올라오는 질문이 몇 가지 있습니다. 그중 하나가 MVVM 패턴에서의 ViewModel과 AAC(Android Architecture Components)에서 제공하는 ViewModel이 다른 것인가에 대한 질문입니다. 앱 개발 시에 MVVM 패턴을 많이 사용하고, AAC에서 ViewModel을 제공하니 두 ViewModel이 같은 개념일 거라고 생각합니다.
결론부터 말해보자면, 두 ViewModel은 전혀 상관이 없습니다. MVVM 패턴에서 ViewModel의 역할과 AAC에서 제공하는 ViewModel의 역할은 개념적으로 차이가 있습니다. 심지어 안드로이드 공식문서에서 ViewModel을 설명할 때 MVVM 패턴에 대한 언급은 전혀 없습니다. 만약 AAC의 ViewModel이 MVVM 패턴의 ViewModel이라면 이에 대한 언급이 있었을 법 한데 그렇지 않습니다.
이번 글에서는 MVVM 패턴에서의 ViewModel과 AAC의 ViewModel에 대해 알아보고 두 ViewModel이 어떤 차이를 가지는지에 대해 알아보겠습니다.
MVVM ViewModel이란?
MVVM 패턴(Model-View-ViewModel, MVVM)은 마틴 파울러에 의해 나온 MVP 패턴에서 파생된 패턴입니다. MVVM 패턴의 목표는 비즈니스 로직과 프레젠테이션 로직을 UI로부터 분리하는 것입니다. 비즈니스 로직과 프레젠테이션 로직을 UI로부터 분리하게 되면 테스트, 유지 보수 측면에서 용이합니다. MVVM 패턴은 Android에서만 사용되는 개념이 아닙니다. MVVM 패턴에 대한 자세한 내용은 이 글을 참고해주세요.
MVVM 패턴에서의 ViewModel은 View에 연결될 데이터와 메서드를 구현하고, 상태가 변화하게 되면 변경 알림 이벤트를 통해 View에게 상태 변화를 알려줍니다. View는 ViewModel의 상태 변화를 옵저빙 합니다. 옵저버 패턴을 사용하기 때문에 View에서는 ViewModel을 알고 있지만, ViewModel은 View를 알지 못합니다. ViewModel과 Model 사이의 관계도 마찬가지입니다.
일반적으로 ViewModel과 View는 1:n의 관계입니다. 따라서 View는 자신이 이용할 ViewModel을 선택하여 상태 변화 알림을 받게 됩니다. ViewModel은 View가 쉽게 사용할 수 있도록 Model의 데이터를 가공하여 View에게 제공합니다. 한마디로 요약하자면 ViewModel이란 View와 Model 사이에서 데이터를 관리하고 바인딩해주는 요소입니다.
AAC ViewModel이란?
AAC에서의 ViewModel은 Android의 수명 주기를 고려하여 UI 관련 데이터를 저장하고 관리하도록 설계되었습니다. AAC ViewModel을 사용하면 기존의 Activity가 생명 주기 때문에 데이터 관리 측면에서 겪던 어려움들을 간단하게 처리할 수 있습니다.
ViewModel의 생명 주기는 위의 그림과 같습니다. Activity가 생성되고 파괴되기 전까지 ViewModel은 파괴되지 않고 유지되게 됩니다. 이 때문에 화면 회전과 같은 View가 파괴되고 새로 그려지는 과정에서 데이터를 보존할 수 있습니다.
MVVM ViewModel vs AAC ViewModel
위에서 MVVM 패턴에서의 ViewModel과 AAC에서의 ViewModel의 특징에 대해 알아보았습니다. 간단하게 요약해보자면, MVVM ViewModel은 View에 필요한 데이터를 관리하여 바인딩 해주고, 비즈니스 로직을 담당해 데이터를 처리하는 요소, AAC의 ViewModel은 Android의 수명 주기를 고려하여 UI 관련 데이터를 저장하고 관리하는 요소로 요약할 수 있습니다.
두 ViewModel의 역할을 보면 다른 개념인 것을 알 수 있습니다. 실제로 AAC의 ViewModel을 사용하지 않고도 MVVM 패턴을 구현할 수 있습니다. 반대로 AAC ViewModel을 사용했다고 해서 MVVM 패턴이 되지는 않습니다. 두 ViewModel의 개념을 확실히 인지하고 사용할 필요가 있습니다.
앱 개발 입문자의 입장에서 보면 AAC ViewModel의 이름이 MVVM 패턴에서의 ViewModel과 같기 때문에 많이들 오해하는 것 같습니다. 또한 MVVM 패턴에 대한 예제 프로젝트를 찾아보면 대부분이 AAC의 ViewModel을 사용하고 있습니다. MVVM 패턴의 ViewModel과 AAC의 ViewModel은 전혀 다른 개념인데 왜 다들 AAC의 ViewModel을 사용하는 것일까요?
그 이유는 AAC의 ViewModel로 MVVM 패턴의 ViewModel을 구현할 수 있기 때문입니다. MVVM 패턴의 ViewModel의 역할은 위에서 보았듯이 View에 필요한 데이터를 관리하여 바인딩해주는 것입니다. AAC의 ViewModel을 위의 개념대로 구현해주면 됩니다. ViewModel 내에서 ObservableField나 LiveData 등을 사용하여 데이터 바인딩 해준다면 MVVM 패턴의 ViewModel로써 사용이 가능합니다.
결론
저 또한 처음 MVVM을 공부할 때 ViewModel의 역할에 대해서 혼란이 많았습니다. MVVM의 ViewModel과 AAC의 ViewModel을 명확히 구분하지 못했고, AAC의 ViewModel을 사용했으니 MVVM 패턴대로 구현했다고 생각했었습니다. 'MVVM 패턴은 Android에서만 사용하는 개념이 아닌데 그럼 수명 주기는 대체 뭐지?' 이런 의문도 생기면서 혼란이 더 가중됐습니다.
뒤늦게 생각해보면 구글에서 AAC ViewModel을 제공할 때 MVVM 패턴의 ViewModel이라고 언급했던 적이 없습니다. 이름만 보고 단순하게 당연히 MVVM 패턴의 ViewModel인 줄 알고 착각했던 것입니다. 구글에서 이름을 왜 ViewModel로 명명했는지 조금 원망스럽지만... 개념적으로 두 ViewModel이 어떤 차이를 가지는지 확실하게 공부할 필요가 있습니다.
참고
https://wooooooak.github.io/android/2019/05/07/aac_viewmodel/
https://velog.io/@k7120792/Model-View-ViewModel-Pattern
https://developer.android.com/topic/libraries/architecture/viewmodel
'Android' 카테고리의 다른 글
[Android] ViewModel에서 실행한 이벤트 기다리기 (6) | 2022.06.09 |
---|---|
[Android] Clean Architecture에서 Paging 라이브러리 사용하기 - 도메인 계층의 의존성 문제 (5) | 2022.06.01 |
[Android] Gson을 이용한 Room에 다양한 타입의 데이터 저장하기 (0) | 2021.09.24 |
[Android] 스켈레톤 로딩 화면 구현하기 - Facebook shimmer library (0) | 2021.09.13 |
[Android] viewModelScope.launch() 간단하게 바꿔보기 (0) | 2021.09.11 |