Model, View, ViewModel로 구성되는 아키텍처 패턴 입니다.
MVP에서는 View와 Presenter가 서로를 알고 있는 것과는 다르게, MVVM은 ViewModel은 View에 대한 의존성을 전혀 갖지 않습니다.
각 구성요소의 역할은 다음과 같습니다.
ViewModel에서 View와의 의존성을 완벽하게 분리할 수 있습니다.
설계 난이도가 높습니다.
또한, 프로젝트의 규모가 커질수록 ViewModel이 로직이 집중되는 형태가 됩니다.
안드로이드에서는 MVVM 패턴을 보다 쉽게 구현할 수 있도록 AAC를 제공합니다.
AAC에는 DataBinding, LiveData, ViewModel 등이 포함되어 있습니다.
여기에서 AAC의 ViewModel은 MVVM의 ViewModel과는 다릅니다.
https://medium.com/kenneth-android/android-mvvm-viewmodel과-aac-viewmodel의-차이-8c0d54922e07
자세한 내용은 위 링크에서 참고하시면 좋을 것 같습니다.
ExampleViewModel: ViewModel() { }
AAC의 ViewModel은 액티비티가 생성되고, 파괴될 때까지 유지되어 화면이 회전되어도 데이터를 유지할 수 있도록 해줍니다.
ExampleViewModel: ViewModel() {
val _example = MutableLiveData<String>()
val example: LiveData<String> = _example
}
LiveData는 Lifecycle를 알고 있는 관측이 가능한 데이터 홀더 클래스 입니다.
변경이 가능한 MutableLiveData와 변경이 불가능한 LiveData가 있으며, ViewModel에서는 MutableLiveData를 통해 값을 관리하고, View에서는 LiveData를 observe만 가능하고 변경할 수 없도록 합니다.
LiveData는 스스로 Lifecycle을 알고 있기 때문에, onStart에서 observe를 시작하고, onStop에서 observe를 자동으로 취소합니다.
이를 통해 메모리릭을 방지할 수 있습니다.
https://github.com/Jong-han/Android_architect_study/tree/mvvm
제가 작성한 MVVM 샘플 프로젝트 입니다.
LiveData -> Flow로 모두 변환하였기 때문에, 이 점 참고하시면 좋을 것 같습니다.
flow에 대해서는 추후에 다뤄보도록 하겠습니다.