안녕하세요. 점냥입니다:)
이번 포스팅으로 MVP 패턴에 이어 MVVM 패턴에 대해 포스팅하려고 합니다!
MVVM 패턴은 저의 개인적인 생각으로는 가장 보편적으로 사용하는 안드로이드 아키텍처라고 생각됩니다.
만약 MVVM 패턴에 익숙하다면 Clean MVVM
을 공부해보시는 것을 추천드립니다!
MVVM Architecture
MVVM은 Model, View, ViewModel로 이루어져 있습니다.
Model은 MVP에서 사용되는 Model 개념과 동일하고 MVP에 비해 MVVM에서 달라진 점은
View와 ViewModel 간의 관계입니다.
ViewModel은 MVP 패턴에서 Presenter와 유사하게 Model의 Data를 요청하고 받아 비즈니스 로직을 처리하는 곳입니다. MVP에서 Presenter와 View는 1:1로 매치가 되어 서로 직접 함수 호출을 하여 동작하는 방식이었다면 MVVM 구조에는 ViewModel은 View를 모릅니다. 따라서 ViewModel은 View와의 의존성이 사라지게 됩니다.
MVVM의 View는 ViewModel의 비지니스 로직 처리로 인한 데이터 변화를 관찰(Observe)하며 해당 데이터에 맞는
UI를 사용자에게 보여줍니다.
여기서 잠깐, ViewModel은 AAC ViewModel과 다른 개념이지만 AAC의 ViewModel을 사용하여 MVVM을 구현하는 편입니다.
ViewModel을 Observe 하는 View
Android에서 ViewModel 비즈니스 로직 처리로 인한 Data를 관찰(Observe)하는 방법, 즉 옵서버(Observer) 패턴을 구현하는 방법으로 3가지 정도가 있습니다.
- RxJava, RxKotlin
- AAC LiveData
- Kotlin State Flow
Kotlin State Flow는 아직 공부해보지 않아 옵서버 패턴을 구현할 수 있는 방법 중에 하나이다라고만 설명드리고 넘어가겠습니다.
RxJava
RxJava는 넷플릭스 개발자가 개발한 Java 언어를 반응형 프로그래밍, 옵저버 패턴으로 구현할 수 있게 도와주는 비동기 라이브러리입니다.
RxJava를 간단하게 설명드리면 데이터 스트림을 형성하여 해당 스트림을 관찰하고 이 과정이 순수 함수로 인해 굉장히 멀티 스레드 환경에서 안정적으로 동작하고 게다가 코드도 간단합니다! 더 자세한 내용은 포스팅에서 다루는 있으니 관심이 있으신 분들은 해당 링크로 들어가셔서 한번 읽어주시면 감사하겠습니다.
class MainActivity : AppCompatActivity {
private val viewModel: SampleViewModel by viewModel()
fun sampleFunction() {
viewModel.sampleData
.observeOn(Scheduler.ui())
.subscribe { data ->
view.setSomething(data)
}
}
}
주의할 점으로 Android에서 앱의 상태는 변화가 굉장히 다양하죠.
시스템으로 인해 앱 프로세스가 강제적으로 종료되거나 새로운 Activity로 인해 현재 Activity사 Stop 상태가 되는 일이 종종 발생합니다. 그때마다 불필요한 리소스 낭비, 메모리 절약을 위해 RxJava 스트림을 생성, 취소 관리를 해줘야 하는데요!
이는 RxJava 스트림을 구독할 때 반환되는 객체인 Disposable
의 dispose() 함수를 호출해서 해결할 수 있습니다.
관련된 사항은 CompositeDisposable
찾아보시면 좋을 것 같아요
LiveData
LiveData는 AAC 라이브러리 중에 하나로 Android 생명주기에 따라 데이터의 수명이 관리되는 라이브러리 입니다.
즉 RxJava처럼 dispose() 함수를 호출해야 하는 번거로움 없이 LiveData 자체가 수명주기를 판단합니다.
class MainActivity : AppCompatActivity {
private val viewModel: SampleViewModel by viewModel()
fun sampleFunction() {
viewModel.sampleData.observe(this) { data ->
view.setSampleData(data)
}
}
}
RxJava와 코드가 유사하기도 하고 오히려 코드가 간결해 보이기도 합니다.
하지만 LiveData의 장점은 Activity/ Fragment가 아닌 XML에서 나오는데요. 바로 AAC의 DataBinding 라이브러리와 같이 사용하면 뷰에서 Observe 하는 코드 없이 XML에 선언해두기만 하면 자동으로 뷰가 Binding 됩니다. (굉장히 편해요)
일부 개발자들은 DataBinding을 사용해야 비로소 MVVM 구조가 완성된다고 합니다.
ViewModel
ViewModel은 사실 MVP의 Presenter와 크게 역할이 다르지 않고 View를 변수로 갖고 있거나, View를 직접 호출하지 않는다는 것이 큰 차이점입니다.
class SampleViewModel(
private val repository: SampleRepository
) : ViewModel() {
///RxJava의 Subject or LiveData
fun requestData() {
....
}
}
우연히 AAC 라이브러리로 동일한 이름의 ViewModel이 나오게 되었고 saveBundle로 온전히 저장하지 못했던 뷰의 데이터들을 안전하게 관리해줄 수 있는 기능, Fragment 간의 Data 공유를 쉽게 할 수 있다는 점 등
MVVM 패턴에 크게 안 좋은 영향을 주지 않아 대부분의 개발자 분들은 AAC ViewModel을 사용하여 ViewModel을 구현하는 듯합니다.
'Android > Common' 카테고리의 다른 글
[Android] RecyclerView - ConcatAdapter (8) | 2021.04.04 |
---|---|
[Android] LiveData의 Data를 한번만 관찰 (0) | 2021.03.15 |
[Android] 상태바 투명으로 만드는 여러 방법에 대한 일지 (0) | 2021.03.08 |
[Android] Android Font 직접 적용 (0) | 2021.03.02 |
[Android] 딥 링크 - App Link (0) | 2021.02.16 |