안드로이드 MVVM 패턴 공부

dev_suhwan·2022년 10월 20일
0

MVVM 패턴 이해하기

MVVM을 공부하게된 계기

대학 졸업 후 취업을 하게되었고 생각한 업무는 자바로 생각하고 회사에 들어왔는데 안드로이드 개발자라는 이야기를 듣고 안드로이드 공부를 시작했는데 첫 패턴으로 MVC 패턴을 사용했는데 구글 지도 화면을 만들면서 코드가 길어지고 난잡해지면서 코드를 찾는 시간, 다른 사람이 보기에 직관성, 가독성이 부족하다는 것을 느끼고 패턴을 찾아보다가 MVVM 패턴을 공부하기 시작했습니다.

MVVM이란?

View가 ViewModel이라는 친구에게 부탁한다. "해줘 지켜보고 있을게" 라고하고 ViewModel이라는 친구가 View의 부탁을 수락해 행동으로 옮기는데 그것을 View의 Observe가 뒤에서 지켜보고 있는 중에 ViewModel이 Model에게 데이터 갱신을 요청하고 받아오면 Observe가 ViewModel이 값을 받아온 것을 보고 View가 화면을 갱신하는것이다.

View

  • Activity, Fragment를 View가 담당.
  • Observe를 통해서 사용자의 Action을 받는다.(텍스트 변화, 터치 등)
  • Observe를 통해 데이터가 변화된것을 알고 화면을 갱신.

ViewModel

  • View가 요청한 행동을 Model에게 갱신을 요청.
  • Model에게 요청한 데이터를 받아옴.

Model

  • ViewModel이 요청한 데이터를 반환.
  • Retrofit2 또는 API 호출이 대부분이다.

View가 필요로 하는 데이터는 Model이 가지고 있고, View에서 해당 데이터가 필요하다! 라고 하면 위 사진처럼 ViewModel이 Model에게 필요 데이터를 갱신시켜주고 그 갱신이 된것을 View의 관찰자(Observe)가 지켜본다.

View가 DB에 직접적으로 접근하는 형식이 아니라 UI 갱신에만 집중하고, ViewModel을 관찰하는 있는 만큼 데이터의 변화에 대해서 능동적이다.

LiveData(Observale 패턴, RxJava 등)을 이용해 DB를 관찰하고 자동으로 UI를 갱신해 직접 뷰를 바꾸는 번거로움이 없어지고 데이터와 불일치할 확률이 MVC에 비해 줄어든다.

생명주기로부터 안전하게 메모리 누수를 방지할 수 있다. ViewModel을 통해 데이터를 참조하기에 엑티비티/프래그먼트의 생명주기를 따르지 않는다. 화면 전환이나 언어 변경 등으로 생명주기가 finished를 하지 않는 이상 ViewModel이 데이터를 저장하고 있어 영향을 받지 않는다.

MVVM의 장점

  • View가 ViewModel의 Data를 관찰하고 있어 UI 업데이트가 간편.
  • ViewModel이 데이터를 홀드하고 있어 Memory Leak 발생 가능성 배제.
    (View가 직접 Model에 접근하지 않아 Activity/Fragment 생명주기에 의존하지 않음.)
  • 기능별 모듈화가 장되어 있어 유지 보수에 용이.

ACC(Android Architecture Componenet)

MVVM의 구성 요소를 Android Jetpack의 구성요소 AAC와 함께 구현한다고 해보자.
하나하나 구성요로를 살펴보면,

ViewModel

앞서 설명한대로, 화면이 변화해도 변하지 않는 데이터를 가지고 있다.

Live Data

View가 ViewModel을 관찰할 때, 그 관찰 대상이 되는 데이터 홀더 클래스이다. Live Data는 Activity와 Fragment의 생명주기가 변화하는 동안 ViewModel은 꿋꿋이 살아서, 할일을 하고 OnDestroy가 호출되고 나서, finished가 되면 clear를 한다.(마지막까지 한다는 표현이 맞는 것 같습니다.)

Repository

ViewModel과 데이터를 주고받기 위해, 데이터 API를 포함하는 클래스다. 사용자 동작에 따라 필요한 데이터나 외부 백엔드 서버 등에서 데이터를 가져오게 된다. Respository의 존재 덕분에
ViewModel이 데이터를 관리할 필요가 없게 된다.

RoomDatabase

Room은 SQLite를 사용함에 있어 별도의 Query문 작성없이 간편하게 Insert, Delete 등의 동작을 할 수 있게끔 도와주는 QRM 라이브러리다.

이글은 아래 블로그를 참고하여 작성하였습니다. 감사합니다.
(잘못된 정보가 있다면 알려주세요! 수정하고 또 공부하겠습니다!)
https://velog.io/@haero_kim/Android-%EA%B9%94%EC%8C%88%ED%95%98%EA%B2%8C-MVVM-%ED%8C%A8%ED%84%B4%EA%B3%BC-AAC-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

https://developer88.tistory.com/203

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

profile
자신의 부족함을 고민하는 개발자

0개의 댓글