사실 나는 MVP MVC에 대해서 어떤 것이라는 것만 알고 있고, 실제로 그런 코드를 본 적도 구현해 본 적도 없다.
그래서 MVVM이 당연한 것처럼 느껴지고 내가 알고 구현하는 방식이 MVVM인지 확신하기도 어렵기도 하다..
내가 이해하고 있는 방향으로 MVVM이 무엇인가를 정리해 보도록 하겠다.
사실 ViewModel과 View(Activity, Fragment, Compose) 들은 UI Layer에 속한다.
UI Layer의 역할은
1)Data Model로부터 데이터를 요청하여 그 데이터를 사용자에게 보여주는 역할을 하는 것이며,
2) 사용자와의 상호작용을 하는 것이다.
다음으로 우리가 익히 아는 Activity를 생각해보자.
일단 생명주기가 존재한다. 생성되고 뷰가 그려지고, 멈추고, 다시 켜지고 등등 사용자와 OS에 의해서 현 Activity의 상태가 매번 변화하게 된다. 그런 Activity가 사용자에게 보여줄 데이터까지 관리한다고 생각해보자.
그럼 그 데이터는 어느 시점에 가져와야 할까?? 혹은 데이터를 로드하고 있는 도중에 다음 액티비티가 켜지게 되면, 그 로드 중인 데이터의 관리는 어떻게 해야 할까??
생성될 때 가져올까? 다시 재개될 때 가져와야 할까?? 그러면 화면이 회전되거나 하여 재구성될 때는 그 데이터를 다시 가져오는 비용을 감당해야 할까?? 고려할게 많아지고 상상만 해도 복잡한 거 같다.
우리는 이런 문제를 해결할 방법을 알고 있다.
그건 책임을 분할하는 것이다.
Activity, Fragment는 그냥 사용자에게 가진 데이터를 보여주고, 사용자의 이벤트를 받아들이기만 하자.
그럼 그 Actifity, Fragment가 보여줄 데이터는 다른 Class를 생성하여 책임을 나누어 주자!.
그게 ViewModel이다.
잠깐! 그러면 그 ViewModel은 언제 생성되고 언제 제거되어야 하나??....
싱글톤으로 만들어서 앱이 생존하는 동안 계속 있도록 해야 할까??...
그래서 Android ViewModel은 자신이 책임져야 하는 View의 생명주기를 인식하는 Library를 제공해 준다.
이전과 같은 Activity가 생성되면, 새로운 ViewModel이 생성되는 게 아니라 이미 존재하는 같은 ViewModel을 사용한다.
즉 위와 같이 Android ViewController의 데이터를 관리하기에 가장 최적화된 Library가 Android ViewModel이다!!
간단히 말해서 UI Layer은 다음과 같이 나뉘게 된다.
ViewModel
1) UI Layer에 필요한 데이터를 요청, 관리(Model을 통해서 가져옴)
2) ViewController의 요청에 의한 데이터 업데이트 및 리액션
View Controller (Activirty, Fragment)
1) 필요한 데이터를 ViewModel에서 가져와 표시해주기
2) 사용자의 이벤트 받기
우리는 책임을 분할하고 더욱 에러 관리가 쉽도록 서로의 의존성을 낮춰야 할 필요가 있다. 과거 데이터와 뷰의 동기화를 위해서 로더?를 사용했던 거 같은데, 다른 방식으로 뷰와 데이터의 동기화를 시킨다.
여기에 사용되는 방식이 Observe하는 방식을 사용하게 된다. (LiveData, DataBinding, Flow 등등)
그럼 전체적인 그림을 그려보자.
뷰모델의 데이터들을 LiveData 등의 Library를 통해서 관찰하고, DataBinding을 통해서 바로 XML 레이아웃과 연결해 주는 과정을 기치면 MVVM!
위와 같이 XML을 통해 뷰를 만들어 줄 때는 데이터 바인딩을 사용하였지만,
현재는 AndroidCompose를 통해서 뷰 컨트롤러의 Composable들이 바로 ViewModel의 관찰 가능한 객체를 관찰하므로 더욱 잘 어울리는 구조가 된 거 같다...
나의 의문은.... MVI가 많이 사용되고 있는데 이게 대체 위의 MVVM패턴과 뭐가 다른 건지 모르겠다는 것이다..
그냥 현재의 뷰는 하나의 유일한 상태를 가지를 State를 통해서 관리한다는 것 외에는 다른 게 별로 없는 것 같은데,
그 부분에 대해서는 고민이 더 필요한 것 같다.
'안드로이드 읽어보기 > 5. Android Architecture' 카테고리의 다른 글
4) Data Layer / Android Architecture 어떻게 해야하는가? (0) | 2022.04.19 |
---|---|
3) Data Layer 워밍업 / 안드로이드 아키텍쳐 (0) | 2022.04.19 |
Android Architecture은 어떻게 해야할까? (2) UI Layer (0) | 2022.03.16 |
MVI에 대해서. (0) | 2022.03.16 |
Android Architecture 어떻게 해야하는가?(1) (0) | 2022.03.15 |