#1 안드로이드 앱의 '전통적인' 방식 vs MVVM 패턴
#1-1 도식도와 종속성
화살표는 클래스 간의 종속성을 나타낸다. 예를 들어, View는 ViewModel에 종속된다. 종속의 사전적 의미는 '자주성이 없이 주가 되는 것에 딸려 붙음'이다. 종속은 '알아야 한다'라는 말로도 표현할 수 있다. 따라서 View는 ViewModel에 대해 알아야 한다. 반면, ViewModel은 View를 몰라도 된다. ViewModel을 설계할 땐 View에서 뭘 어떻게 할지 전혀 신경쓰지 않아도 된다는 것이다 (대신, ViewModel은 Model에 대해 종속적이므로 Model를 참조하며 설계해야 한다). View를 설계할 땐 ViewModel을 알아야 한다. '알아야 하는 쪽'에서 '몰라도 되는 쪽'으로 화살표를 이은 것이 위 도식도다.
#1-2 모듈성과 결합도
전통적인 방식에서는 Activity가 UI 로직(화면 표시 및 사용자 상호작용 처리)과 비즈니스 로직(데이터 처리, 네트워크 호출 등)을 모두 담당했다. 따라서, Activity의 코드량이 방대했다. 모듈성이 낮고, 테스트와 유지보수가 힘들었다. MVVM 패턴은 Activity의 UI 로직을 View가, 비즈니스 로직을 ViewModel가 담당한다. Activity의 코드를 반씩 가져간다는 이야기다.
또, MVVM 패턴에서는 데이터 바인딩을 통해 암시적으로 수행되는 동작을 정의하고, LiveData의 양방향 바인딩까지 구현함으로써, View와 ViewModel 사이의 결합도를 더욱 낮춘다.
#1-3 구글의 권장 설계
위 도식도엔 Repository라는 모듈이 추가로 있다. Repository는 Model에의 접근을 한 층 더 캡슐화하기 위한 모듈이라고 보면 된다. Activity나 Fragment는 ViewModel을 알아야하고, ViewModel은 Repository를 알아야 한다. Repository는 Model을 알아야 한다. 반대로, Repository가 ViewModel을 알거나(= 내부 변수 등을 참조하거나), ViewModel이 Activity나 Fragment를 알아서는 (= 내부 변수 등을 참조해서는) 안 된다.
다음은 내가 지금까지 구현한 MVVM 패턴의 세부적인 내용이다.
#2 Data Binding
Activity에서 예를 들 DataBindingUtil.setContentView(this, R.layout.activity_main)와 같은 코드로 View와 연결한다. 이 자체로 findViewById()를 일일이 사용하지 않아도 되기에 벌써 코드량이 줄어든다.
View에서 Activity 또는 ViewModel의 객체를 직접 참조할 수 있게 만든다.
#3 ViewModel
ViewModel은 먼저, Activity의 생명주기와 독립적인 생명주기를 가지기에 Activity에 비해 View에 일관적인 데이터를 제공한다. 이것도 장점이지만, Activity에 있던 데이터(Model) 관련 코드를 ViewModel로 옮길 수 있기 때문에 Activity의 무게가 한결 줄어드는 효과도 있다.
Activity에서 ViewModel의 인스턴스를 만들 때, 인자를 전달하는 경우의 코드.
View에서 ViewModel 자체를 직접 참조할 수 있게 만든다.
#4 LiveData
LiveData는 '관찰(observe)'을 통해, 그 값이 표시되는 View를 자동으로 갱신할 수 있다.
LiveData의 '관찰'을 암시적으로 수행해 코드량을 줄인다.
ViewModel의 LiveData가 변경되어 View에 갱신할 때 그 변화의 흐름은 ViewModel → View다. 이와 반대로, 사용자가 View에서 LiveData의 값을 변경하면 이를 ViewModel의 LiveData에 갱신할수도 있다. (View → ViewModel)
#5 요약
MVVM 패턴은 안드로이드 앱 개발을 직관화한다.
'깨알 개념 > Android' 카테고리의 다른 글
[Android] Fragment의 생명주기 (0) | 2024.01.24 |
---|---|
[Android] Activity의 생명주기 (0) | 2024.01.23 |
[Android] LiveData - 양방향 데이터 바인딩의 3가지 방법 (0) | 2024.01.20 |
[Android] LiveData - 암시적으로 '관찰'하기 (0) | 2024.01.19 |
[Android] ViewModel - View에 객체(ViewModel) 전달 (0) | 2024.01.18 |