Android - AAC ViewModel vs. MVVM ViewModel

Park Suyong·2022년 6월 16일
4

Android Dev

목록 보기
7/7

도입부

많은 사람들이 AAC ViewModel과 MVVM ViewModel을 헷갈려 한다. 헷갈릴만 하다. 구글에서 이름을 ViewModel로 낸것도 너무하다.. 결론부터 얘기하자면, AAC ViewModel과 MVVM ViewModel은 전혀 연관성이 없다. AAC ViewModel을 이용하여 MVVM 패턴을 설명하고자 한다면, 분명히 확실히 잘못된 설명이다. 물론 나도 얼마전까진 제대로 알지 못했다.. 반성한다. 다만 그렇다고 해서 AAC ViewModel을 사용하여 MVVM을 구현할 수 없는 것은 아니다! AAC ViewModel을 사용해서 MVVM의 ViewModel로써 활용할 수 있다.

우리가 아는 MVVM의 ViewModel은 마이크로소프트에서 최초로 등장했다. 뷰와 모델 사이에서 데이터를 관리하고 바인딩하기 위한 요소라고 정의하며 등장했다.

AAC ViewModel?

우선적으로, MVVM ViewModel을 공부하는 과정에서 Google의 문서를 참고하지 않아야 한다. Google 공식 문서에서도 MVVM 패턴을 언급하지 않는다. Google 공식 문서는 AAC ViewModel 이다.

구글 Android Architecture Component(AAC)에서 ViewModel을 추상 클래스로 제공한다.

The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way. The ViewModel class allows data to survive configuration changes such as screen rotations. - Android ViewModel 공식 문서

구글의 AAC ViewModel에 대한 공식 문서 설명은 위와 같다. 화면 회전과 같은 상태 변화가 일어나는 환경에서 UI와 관련된 데이터를 라이프사이클에서 관리하고 유지하는 클래스라고 설명하고 있다. 실제 데이터가 변경되지 않았는데 화면 회전 등이 발생하여 Activity가 재생성되는 경우 데이터를 다시 받아와 로드시키는 것은 불필요한 작업이다. 이를 막기 위함인 것이다.

즉, 구글의 AAC ViewModel은 데이터를 관리하고 바인딩하라는 목적으로 만든 것이 아니다.이 설명은 MVVM ViewModel에서 뷰와 모델 사이에서 데이터를 관리하고 바인딩하기 위한 요소라는 정의와는 엄연히 다르다는 것을 알 수 있다. 즉, 이름만 ViewModel인 것이다.

MVVM ViewModel?

MVVM ViewModel은 뷰와 모델 사이에서 데이터를 관리하고 바인딩하기 위한 목적의 클래스다. 값 변경 이벤트가 발생했을 때 그 상태 변화를 뷰에 알리게 된다.

MVVM ViewModel에 대해서 충격적인 발표를 최근에서야 들었다. (2018년에 올라왔는데..) 바로 Activity, Fragment 에서 ViewModel에 의존성을 갖고 observe 하는 코드가 존재한다면, 그것은 MVVM 을 구현한 것이 아니라 ViewModel을 구현했다고 하는 것이다..!

MVVM 에서 View와 ViewModel의 관계는 기본적으로 연결 상태를 최소화 시켜야 한다. ViewModel은 데이터의 변화를 View에 전달해야 하며, View는 화면 정보의 변화를 ViewModel에 전달해야 한다.

여기서 명심해야 할 것은, 이 때 View는 Activity나 Fragment가 아니라 XML 이라는 것이다! 따라서, 바로 위에서 언급한, Activity나 Fragment에서 ViewModel에 접근하여 observe 하고 있는 것은 그 자체로 의존성을 갖기 때문에 잘못되었다고 하는 것이다.

그렇다면 이에 대한 어떤 해결책을 가질 수 있는가? 이를 위해서는 DataBinding을 사용한다. 이 부분에 대해서는 추후 게시글로 기술하도록 한다.

AAC ViewModel vs. MVVM ViewModel

AAC ViewModel을 통해 MVVM을 구현했다고 하는 프로젝트는 단순하게 값의 상태 변화가 일어나는 환경에서 불필요하게 값의 상태가 업데이트 되지 않도록 하는 역할만 맡은 것이지, MVVM의 ViewModel을 구현한 것이 아니다.

하지만 이미 많은 MVVM 샘플링 프로젝트에서 AAC ViewModel을 사용한다. 이는 모두 잘못된 구조인가? 그렇지 않다.

앞서 말했듯 AAC ViewModel을 사용한다고 하더라도 MVVM 패턴을 구현할 수 있다. 불필요하게 값의 상태 변화가 발생하는 상황에서 이를 막아줄 수 있으니 오히려 AAC ViewModel을 사용하여 뷰와 모델 사이에서 데이터를 관리하고 바인딩하기 위한 요소를 추가한다면 MVVM ViewModel을 더 좋게 구현했다고 볼 수 있다. 당연하게도, AAC ViewModel을 사용하지 않고도 ViewModel을 구현할 수 있다. (하지만, AAC ViewModel을 사용했다고 해서 MVVM 패턴을 구현한 것은 아니라는 것을 다시 짚고 넘어간다.)

추가적으로 알아야 할 정보가 있다. AAC ViewModel은 ViewModelProviders를 통해 ViewModel을 생성한다. 이렇게 생성된 ViewModel은 Activity 내에서 싱글톤으로 존재하게 된다. 즉, 이미 생성된 하나의 ViewModel 객체만 사용되게 된다.

그리고 구글 AAC 에서는 하나의 Activity에 하나의 ViewModel을 두고, 여러 Model과 LiveData를 사용하는 방법을 권장한다.

References

Pure MVVM vs AAC MVVM
[Android] MVVM ViewModel과 AAC ViewModel의 차이
AAC(Android Architecture Component) ViewModel에 대한 짧은 고찰
NAVER Engineering - MVVM with Grab Architecture

profile
Android Developer

0개의 댓글