[Android] MVVM & Architecture Component

Dev.nuts·2021년 3월 24일
2

Android

목록 보기
1/5

MVVM 패턴이란?

액티비티에 기능을 붙이다보면, 액티비티가 무거워지거나 혹은 종속성이 너무 강해 테스트가 힘들고 유지보수가 어려워진다. 이런 고민 때문에 MVVM 패턴이 등장했다.
View - ViewModel - Model 을 이용해 각각의 역할을 분리하여 가독성과 재사용성을 높인 디자인 패턴이다.

MVC 와 MVVM 차이점?

기존 MVC (Model - View - Controller) 구조에서 액티비티가 컨트롤러의 역할을 했으며, 뷰와 연결되어 유저와 상호작용도 하고, 모델과 연결되어 데이터도 처리했다.
즉 뷰와 모델 사이에서 중재자 역할을 했다.
MVVM에서는 뷰에서 뷰모델로, 뷰모델에서 모델로 작업을 처리하며, 뷰에서 모델을 직접 참조하지 않는다. 대신 뷰에서 뷰 모델을 관찰하며 데이터의 변경 사항을 감지한다.

MVVM 장점

  • View가 Data를 실시간으로 관찰
    LiveData, 즉 Observable 패턴을 이용하기 때문에 데이터베이스를 관찰하고 자동으로 UI를 갱신한다
    직접 View를 바꾸어주는 번거러움도 없고, 데이터와 불일치할 확률이 줄어든다.

  • LifeCycle로 부터 안전, 메모리 릭 릭방지
    ViewModel을 통해 데이터를 참조하기 때문에 Activity / fragment의 LifeCycle을 따르지 않는다.
    화면전환과 같은 액티비티가 파괴된 후 재구성이 ViewModel이 Data를 홀드하고 있기 때문에 영향을 습니다

  • 모듈화
    UI, 비즈니스 로직, 데이터베이스가 기능별로 모듈화 되어있어서 역할 별로 유닛테스트가 용이해집니다.

Android Architecture Component


MVVM의 구성 요소로 역할을 나눠보면
초록색 : UI를 담당하는 뷰
파란색 : 뷰모델
주황색 : 리포지토리 와 룸 데이터베이스

View

UI를 담당하는 액티비티나 프래그먼트를 말한다. 화면에 무엇을 기릴지 결정하고 사용자와 상호작용한다. 보통 데이터의 변화를감지하기 위한 옵저버를 가지고있다.

ViewModel

뷰모델은 UI를 위한 데이터를 가지고 있으며, 구성(configuration)이 변경되어도 살아남는다. (예를 들어 화면 회전이라던가, 언어변경 등)
AsyncTask는 액티비티나 프래그먼트의 생명 주기에서 자유로울 수 없지만, 뷰모델은 뷰와 분리되어 있기 때문에 액티비티가 Destroy 되었다가 다시 Create 되어도 종료되지 않고 데이터를 여전히 가지고 있습니다.

LiveData

라이브데이터는 관찰이 가능한(Observable) 데이터 홀더 클래스이다. 뷰 에서 뷰모델의 라이브데이터를 관찰하게 되면 데이터가 변경할 때 내부적으로 자동으로 알려주게 된다.
또한 라이브데이터는 액티비티나 프래그먼트의 생명 주기를 인지한다.
즉, 액티비티가 화면 위에 활성화 되어있을 때에만 UI변경 등의 기능을 동작하게 되고, Destory된 상태에서는 동작하지 않기 때문에 메모리 릭의 발생을 줄여준다.

Repository

뷰모델과 상호작용하기 위해 잘 정리된(Clean) 데이터 API를 들고 있는 클래스이다. 앱에 필요한 데이터, 즉 내장 데이터베이스나 외부 웹 서버 등에서 데이터를 가져온다. 따라서 뷰모델은 DB나 서버에 직접 접근하지 않고 리포지토리에 접근하는 것으로 앱 데이터를 관리한다.

Room

SQLite 데이터베이스를 편하게 사용하게 해주는 라이브러리이다. SQLite의 코드를 직접 작성하는 경우, 직접 테이블을 Create 하거나 쿼리문을 일일이 변수를 통해 작성해주어야 했지만, Room을 스면 조금 더 직관적이고 편리하게 DB를 사용할 수 있다.


References

https://developer.android.com/topic/libraries/architecture
https://www.youtube.com/watch?v=BofWWZE1wts
https://www.youtube.com/watch?v=ARpn-1FPNE4&t=4s
https://academy.realm.io/kr/posts/eric-maxwell-mvc-mvp-and-mvvm-on-android/
https://medium.com/@ankit.sinhal/mvc-mvp-and-mvvm-design-pattern-6e169567bbad

profile
40대에 은퇴해, 제주살이를 꿈꾸는 Fire족

0개의 댓글