깨알 개념/Android

[Android] MVVM 구조 한눈에 보기

interfacer_han 2024. 1. 22. 12:04

#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 구글의 권장 설계

https://developer.android.com/topic/architecture 에 '있었던' 도식도. 현재는 다른 것으로 대체되었으나 이 예전 도식도가 한 눈에 보기 좋아 첨부했다.

위 도식도엔 Repository라는 모듈이 추가로 있다. Repository는 Model에의 접근을 한 층 더 캡슐화하기 위한 모듈이라고 보면 된다. Activity나 Fragment는 ViewModel을 알아야하고, ViewModel은 Repository를 알아야 한다. Repository는 Model을 알아야 한다. 반대로, Repository가 ViewModel을 알거나(= 내부 변수 등을 참조하거나), ViewModel이 Activity나 Fragment를 알아서는 (= 내부 변수 등을 참조해서는) 안 된다.

 

다음은 내가 지금까지 구현한 MVVM 패턴의 세부적인 내용이다.

 

#2 Data Binding

 

[Android] Data Binding - 기초

#1 데이터 바인딩 사용 전 #1-1 예시 앱 위과 같은 간단한 앱이 있다. Button을 누르면, EditText의 text가 바로 위에 있는 TextView의 text에 대입된다. 이 앱의 코드는 다음과 같다. #1-2 activity_main.xml #1-3 Main

kenel.tistory.com

Activity에서 예를 들 DataBindingUtil.setContentView(this, R.layout.activity_main)와 같은 코드로 View와 연결한다. 이 자체로 findViewById()를 일일이 사용하지 않아도 되기에 벌써 코드량이 줄어든다.

 

 

[Android] Data Binding - View에 객체 전달

#1 객체 전달의 필요성 #1-1 이전 글 Data Binding - 기초 #1 데이터 바인딩 사용 전 #1-1 예시 앱 위과 같은 간단한 앱이 있다. Button을 누르면, EditText의 text가 바로 위에 있는 TextView의 text에 대입된다. 이

kenel.tistory.com

View에서 Activity 또는 ViewModel의 객체를 직접 참조할 수 있게 만든다.

 

#3 ViewModel

 

[Android] ViewModel - 기초

#1 View Model의 필요성 #1-1 예제 버튼을 누르면 TextView의 text가 1씩 증가하는 예시 앱이다. MainActivity.kt 코드는 다음과 같다. // package com.example.viewmodelbasics import androidx.appcompat.app.AppCompatActivity import and

kenel.tistory.com

ViewModel은 먼저, Activity의 생명주기와 독립적인 생명주기를 가지기에 Activity에 비해 View에 일관적인 데이터를 제공한다. 이것도 장점이지만, Activity에 있던 데이터(Model) 관련 코드를 ViewModel로 옮길 수 있기 때문에 Activity의 무게가 한결 줄어드는 효과도 있다.

 

 

[Android] ViewModel - 뷰 모델에 인자(Argument) 전달

#1 ViewModelProvider 클래스 분석 #1-1 이전 글의 예제 수정 [Android] View Model - 기초 #1 View Model의 필요성#1-1 예제버튼을 누르면 TextView의 text가 1씩 증가하는 예시 앱이다. MainActivity.kt 코드는 다음과 같다

kenel.tistory.com

Activity에서 ViewModel의 인스턴스를 만들 때, 인자를 전달하는 경우의 코드.

 

 

[Android] ViewModel - View에 객체(ViewModel) 전달

#1 개요 #1-1 Data Binding과 ViewModel [Android] Data Binding - View에 객체 전달 #1 객체 전달의 필요성 #1-1 이전 글 Data Binding - 기초 #1 데이터 바인딩 사용 전 #1-1 예시 앱 위과 같은 간단한 앱이 있다. Button을

kenel.tistory.com

View에서 ViewModel 자체를 직접 참조할 수 있게 만든다.

 

#4 LiveData

 

[Android] LiveData - 기초

#1 개요 #1-1 LiveData LiveData 개요 | Android 개발자 | Android Developers LiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다. developer.android.com LiveData. 문서적인 정의는 Data의 변경을 관

kenel.tistory.com

LiveData는 '관찰(observe)'을 통해, 그 값이 표시되는 View를 자동으로 갱신할 수 있다.

 

 

[Android] LiveData - 암시적으로 '관찰'하기

#1 ViewModel 속에 LiveData가 있는 샘플 앱 [Android] ViewModel - View에 객체(ViewModel) 전달 #1 개요 #1-1 Data Binding과 ViewModel [Android] Data Binding - View에 객체 전달 #1 객체 전달의 필요성 #1-1 이전 글 Data Binding -

kenel.tistory.com

LiveData의 '관찰'을 암시적으로 수행해 코드량을 줄인다.

 

 

[Android] LiveData - 양방향 데이터 바인딩의 3가지 방법

#1 단방향 데이터 바인딩 #1-1 단방향과 양방향 지금까지 해온 Data Binding은 단방향(One Way) 데이터 바인딩이었다. Model 또는 ViewModel에서 View로 가는 흐름으로만 데이터가 갱신된다. 역은 성립하지 않

kenel.tistory.com

ViewModel의 LiveData가 변경되어 View에 갱신할 때 그 변화의 흐름은 ViewModel → View다. 이와 반대로, 사용자가 View에서 LiveData의 값을 변경하면 이를 ViewModel의 LiveData에 갱신할수도 있다. (View → ViewModel)

 

#5 요약

MVVM 패턴은 안드로이드 앱 개발을 직관화한다.