Android

[Android] MVVM / LiveData, ViewModel, Databinding / AAC - 개념

dev_zoe 2021. 10. 15. 04:15
반응형

MVVM 패턴이란?

Model - View - ViewModel 이 각각의 역할을 분리하여 가독성과 재사용성을 높인 디자인 패턴

 

MVC 패턴과 어떤 차이가 있는가?

안드로이드의 초기 프로젝트 디자인 패턴은 MVC 패턴(Model - View - Controller)이다.

MVC 패턴에서는 Controller가 짱이다. 거의 모든 역할을 다한다! 그리고 안드로이드에서 Controller는 Activity에 해당한다.

MVC 패턴에서의 Controller는 사용자의 액션과 요청을 가장 먼저 받아서 Model과 View에 작업 처리를 명령하는데,

Activity는 View이자 사용자의 요청을 처리하는 Controller이기 때문에 액티비티가 굉장히 무거워지는 현상이 발생한다.

 

MVVM 패턴은, 뷰와 컨트롤러가 분리가 되지않아 가독성이 떨어지고 재사용성이 떨어지는 것을 해결하고자 나온 디자인패턴이다.

뷰는 본인의 이름에 걸맞게 "UI, 뷰"의 역할을 할뿐, 뷰모델이 일을 잘하나 감시하는 역할을 한다.

즉, 사용자의 요청을 받으면 이 요청은 뷰에게 가고, 뷰는 뷰모델에게 전달해서 뷰모델이 일을 처리한다.

그리고 뷰는 뷰모델이 하는 일을 감시하면서 데이터의 내용이 갱신되면 그에 맞게 갱신된 내용을 사용자에게 보여준다.

 

MVVM의 장점은 그럼 어떤 것들이 있는가?

1. 뷰가 뷰모델을 실시간으로 관찰한다.

따라서 뷰를 제대로 갱신했는지 일일이 볼 필요가 없을 뿐더러 직접 바꿔줄 번거로움도 줄어든다.

실시간이라는 개념에서 LiveData가 나오고 이를 관찰한다는 개념에서 Observable, Observer 패턴이 나온 것

 

2. 데이터 갱신이 뷰모델을 통해 이루어지기때문에 데이터가 생명주기의 영향을 받지 않는다.

예를 들어 안드로이드에서는 화면 전환을 하면 액티비티가 완전히 파괴되어 onCreate에서부터 다시 실행되어 재생성된다. 즉, 이렇게되면 액티비티가 파괴되면서 액티비티가 컨트롤러도 같이 담당하기때문에 데이터도 같이 날아간다는 것인데

데이터는 뷰모델에 종속되어있기 때문에, 데이터는 뷰의 생명주기에 영향을 받지 않는다는 것이 장점이다.

https://todaycode.tistory.com/33 -> 굳예시!

 

3. 철저한 역할 분리가 용이 -> 모듈화가 용이

뷰, 비즈니스 로직, 데이터 라는 역할이 분리되어있기 때문에 모듈화가 용이하다. 또한 재사용성이 뛰어나다.

 

MVVM의 단점은 ?!

1. 간단한 UI에서 오히려 ViewModel을 설계하는 어려움이 있을 수 있음 (원래 뷰가 하던 역할을 ViewModel이 다 하는거기때문)

2. 데이터 바인딩이 필수적으로 요구됨

3. 복잡해질수록 액티비티가 비대해졌던 것처럼, ViewModel이 빠르게 비대해짐

 

이 트렌드에 맞게 구글에서 MVVM과 찰떡 궁합인 Android Architecture Component를 만들었다.

뭔가 AAC가 MVVM으로 흘러가는 트렌드에 맞게 나온 것이라는 말을 듣고 역시 트렌드를 따라가려면 MVVM을 꼭 공부하고 적용해봐야겠다는 생각이 계속 들었다. MVVM과 같이 쓰이는 AAC의 종류는 Databinding, LiveData, Repository, ViewModel 등이 있다. 뗄레야 뗄 수 없는 관계...! 부가적으로 Room이 있는데, Room은 앱 내부에 Database를 만들어 데이터를 관리하는 라이브러리다.

보통 API를 많이 엮어서 데이터 관리를 하니 지금 급하게 공부하지는 않으려고 한다.

 

View

- UI를 담당하는 액티비티나 프래그먼트에 해당하는 부분이다. 뷰모델을 감시하기 위한 Observer를 가지고있음

 

ViewModel

- UI를 위한 데이터를 가지고있으며, 액티비티가 파괴되어도 데이터가 살아남는다. 뷰모델이 모델과 상호작용하면서 모델의 내용이 갱신되면 뷰가 뷰모델을 관찰하면서 해당 내용을 갱신한다. 모델이 갱신이 되면, 해당 내용은 뷰에게 전달되어 뷰는 그 내용을 띄워주기만 하면 됨

 

Repository

- ViewModel은 Repository에 종속적이고, Repository는 API (Retrofit)로부터 획득하게 됨

1) ViewModel에 있는 함수를 호출합니다. (예: viewModel.getInfo())

2) ViewModel에 있는 getInfo 함수 안에서는 Repository에 있는 함수를 호출합니다. (예: repository.getInfo())

3) Repostiroy에 있는 getMemberInfo 함수 안에서는 Retrofit 서버 통신 관련 함수를 호출합니다. (예: retrofit.getInfo())

4) 서버로부터 값을 받아오면 repository에서는 그 값을 viewModel로 반환해주고 (예: return Info)

5) ViewModel에서는 livedata 변수에 그 값을 세팅해줍니다. (예: _liveData.value = Info)

6) livedata를 observing 하고 있는 뷰가 세팅

 

출처 : https://programmar.tistory.com/40

 

LiveData

- 라이브데이터는 말그대로 "살아있는 데이터", 즉 관찰가능한 데이터라고 할 수 있다. 뷰에서 뷰모델의 LiveData를 관찰할 수 있기 때문에 데이터가 갱신되면 뷰모델은 자동으로 관련 내용을 뷰에게 알려주게 되는 것이다. 뷰모델은 데이터의 변경사항을 알려주는 라이브 데이터를 가지고있음

 

DataBinding

- 레이아웃에 data를 결합하여, UI와 데이터를 programatically하게 연결하는게 아닌 선언적 형식으로 결합할 수 있도록 도와주는 라이브러리이다. 예를들어 TextView에 text를 셋팅할때 textView.text = "~~~" 이렇게 하는데, 이럴 필요가 없어서 매우 편리함!

 

https://github.com/android

 

Android

Android has 55 repositories available. Follow their code on GitHub.

github.com

구글에서 공식적으로 안드로이드 깃허브를 운영하면서 다양한 기술들을 소개해주고 있는데, 한번 살펴봐도 좋을것같다!

 

Reference

https://blog.yena.io/studynote/2019/03/16/Android-MVVM-AAC-1.html

 

[Android] MVVM & 안드로이드 아키텍쳐 컴포넌트 시작하기

(나를 포함한) 안드로이드 개발을 처음 시작하는 사람들은 대부분 액티비티에 거의 모든 코드를 직접 넣는다. 하지만 시간이 갈수록 액티비티는 점점 무거워지고, 수정이나 유지 보수 하기가 힘

blog.yena.io

https://developer.android.com/topic/libraries/architecture/viewmodel?hl=ko 

 

ViewModel 개요  |  Android 개발자  |  Android Developers

ViewModel을 사용하면 수명 주기를 인식하는 방식으로 UI 데이터를 관리할 수 있습니다.

developer.android.com

 

반응형