본문 바로가기
🖥 Programming/📱 Android (Kotlin)

[Android][kotlin] MVVM 패턴공부

by MinChan-Youn 2021. 10. 30.

안드로이드 개발자라면 AAC(Android Architecture components) 즉 안드로이드 아키텍쳐 컴포넌트에 대해서 들어봤을 것이다.

- 앱 구조를 더 튼튼하게

- 테스트에 용이하게

- 유지 보수성이 뛰어나도록 하는데 목적

위와 같이 구성하기 위해서 DataBinding, LiveData, ViewModel 등의 유요한 라이브러리를 제공하고 이 라이브러리의 모음은 MVVM 패턴 구조 설계에 최적화되어있다.

 

 

Step 1. MVVM 패턴 구조

 

위의 사진을 구성하는 부분에 대해서 하나씩 알아보자.

 

1. View - 뷰

UI Controller를 담당하는 Activity, fragment이다.

어떻게 화면을 보여줄지를 결정하고, 사용자와 상호작용한다.

데이터의 변화를 감지하기 위한 Observer를 가지고 있다.

 

2. ViewModel - 뷰 모델

뷰 모델은 UI를 위한 데이터를 가지고 있다.

구성(configuration)이 변경되어도 살아남는다. (ex. 화면 회전, 언어 변경 등)

AsyncTask는 Activity, Fragment의 생명주기에 자유로울 수 있지만, ViewModel은 View와 분리되어 있기 때문에 Activity가 Destory() 되었다가 다시 Create()되어도 데이터를 가지고 있다.

 

3. LiveData - 라이브데이터

관찰 가능한(Observer) 데이터 홀더 클래스이다.

View에서  ViewModelLivewData를 관찰하게 되면, 데이터가 변경될 때 내부적으로 자동으로 알려주게 된다.

Activity, Fragment 등의 생명주기를 인지한다. 즉, Activity 화면 위에 활성화되어 있을 때에만 UI 변경 등의 기능을 동작, Destory 된 상태에서는 동작하지 않아 메모리 릭 발생을 줄여준다.

 

4. Repository - 리포지토리

ViewModel고 상호작용하기 위해 잘 정리된(Clean) 데이터 API를 들고 있는 클래스

Application에 필요한 데이터를 가져오기 위해서 내부적으로는(Room을 사용) 외부적으로는(Retrofit)을 API통신을 통해 가져온다.

ViewModel은 DB나 Server에 직접 접근하지 않고, 리포지토리에 접근하는 것으로 Application의 데이터를 관리한다.

 

4-1. Room - 룸

SQLite 데이터베이스를 편하게 사용하기 위해 지원되는 라이브러리

SQLite의 코드를 직접 작성하는 경우, 직접 테이블을 Create 하거나 Query문을 일일이 변수를 통해 작성해줘야 했지만, Room을 통해 직관적으로 편리하게 DB 사용 가능

 

4-2. Retofit - 레트로핏

Repository에서 외부 DB 데이터를 가져오기 위한 방법으로 API 호출을 통해 데이터를 가져오게 되는데, API통신을 하기 위해 지원되는 통신 라이브러리로 생각하면 편하다.

속도가 빠르다는 장점을 가지고 있음

 

MVVM의 장점

일반적으로 디자인 패턴을 사용하지 않고 Acitivty, Fragment에 기능을 추가하다보면 코드가 길어져 무거워지거나, 종속성이 강해 테스트 및 유지보수가 어려워진다.

하지만 MVVM(View - ViewModel - Model)을 이용해 각각의 역할을 분리, 가독성 및 재사용성을 높인 디자인패턴을 사용한다면 위의 어려움을 해결할 수 있다.

 

1. View가 데이터를 실시간으로 관찰

LiveData(= Observable 패턴)을 이용해 DB를 관찰하고 자동으로 UI갱신

직접 뷰를 바꾸어주는 번거로움을 없애고 데이터와 불일치할 확률을 낮출 수 있다.

 

2. LifeCycle로부터 안전하게 메모리 릭을 방지할 수 있다.

ViewModel을 통해 데이터를 참조하기 때문에 Activity, Fragment의 LifeCycle을 따르지 않는다.

View가 활성화되어 있을 때에만 작동하기 때문에 불필요 메모리 사용을 줄일 수 있음