본문 바로가기
Android Studio/Android

Android MVVM Architecture

by ksb0511 2020. 3. 27.

MVVM 아키텍처란

View(뷰), ViewModel(뷰모델), Model(모델)로 이루어진 구조를 말한다.

 

뷰에서는 뷰를 참조하고 뷰모델에서는 모델을 참조하는 방식으로 뷰에서 모델로의 직접 참조는 불가능한 구조다.

 

 

 

뷰에서는 일을 시키지 않고 뷰모델의 LiveData들을 관전만 한다. LiveData를 보면서 변화하는 부분들이 있으면 바로 캐치하여 자동으로 업데이트되게끔 하는 구조이다.

 

 

각각의 역할들을 완전히 분리시킨 패턴으로 가독성과 재사용성을 높인 디자인 패턴이다.

MVVM의 특징으로는 뷰에서 곧바로 DB에 접근하지 않는 다는 점이다.

MVVM에서의 뷰는 그저 UI 갱신에만 충실할 뿐. 그 외적으로는 뷰모델을 참조하는 것 말고는 없다.

그리고 뷰모델에서는 모델에서 잘 정리된 데이터를 참조한다.

 

좀 더 간단히 말하자면, 뷰는 뷰모델을 Observe(관찰)하고 있기때문에 DB에 새로운 아이템들이 추가된다고 해서 화면 업데이트를 직접 요청할 필요가 없다. 구현만 잘 해놓는다면 굉장히 효율적인 디자인 패턴이다.

 

MVC 디자인 패턴과 비교를 해보겠다.

MVC는 우선 Model - View - Controller 구성이다. 여기선 액티비티가 컨트롤러 역할을 하고 있다고 보면 된다. 액티비티가 컨트롤러 역할을 하면 안 좋은 점이 우선 일반적으로 우리가 안드로이드 스튜디오로 개발을 할 때, 액티비티는 뷰와 연결되어 유저와 상호작용하는 존재라는 것은 알고 있을 것이다. 이것과 더불어 모델과 연결되어 데이터 처리도 해야되는 존재가 되어버린다.

즉, 액티비티가 뷰와 모델 사이에서 중재자 역할을 하게되는 셈이다. 물론 MVVM 디자인 패턴에 비해선 구현이 많이 어렵지 않아 간단한 코드를 작성할 때에 훨씬 편하고, 시간, 인적 자원이 MVVM에 비해서 굉장히 단축될 수 있다라는 장점이 있다.

 하지만 MVC 패턴의 단점은 Controller (예를 들면 MainActivity)가 굉장히 바빠진다. 컨트롤러의 역할을 해야되다보니 뷰에게 "화면 업데이트를 해야해!"라고 명령을 해야되기도 하고 모델에게도 "데이터 갱신을 해야해!"하고 명령을 내려야 한다. 혼자서 여러 일들을 해야되다보니 당연히 바빠질 수 밖에 없다. 이렇게 되면,  액티비티가 무거워지게 된다.

 무조건 MVC 패턴이 안 좋고 MVVM 패턴이 더 재사용성이 높고 종속성이 덜해서 유지보수하기 쉽다고 생각하여 MVVM 패턴을 쓰는 것은 아니라고 생각한다. 그만큼 코드적으로 어려운 부분들이 많을 것이다. 그렇기 때문에 자신의 상황에 맞게 골라 쓰는 것이 좋은 방법이라고 생각한다.

 

MVVM의 장점에 대해 짧게 세 가지를 꼽자면

- 메모리 릭을 방지할 수 있다. : 뷰에서 바로 데이터를 참조하는 것이 아닌 뷰모델을 사이에 두고 있기 때문에 액티비티/프래그먼트의 생명주기를 굳이 따르지 않고, 불필요한 메모리 사용을 줄일 수가 있다.

- 역할이 확실히 분리되어 있다. : 위에서 말했다시피 뷰, 뷰모델, 모델 이렇게 세가지로 확실히 나누어져있고, MVC 처럼 컨트롤러가 모든 명령을 내리고 관리하는 것과는 다르게, 각자 할 일이 있고 분리되어 있다는 점이 장점이라고 할 수 있다. 참고로 내장 DB 변경시에 DB만 쏙 교체가 가능하다는 것도 큰 장점이라고 할 수 있다.

- Observable 패턴을 이용하여 데이터 베이스를 관찰하고 자동으로 UI를 갱신시켜 준다. : 직접 뷰를 건들지 않아도 됨. 데이터에 오류날 확률이 굉장히 낮아짐.

 

MVVM은 추가로 만들어야 하는 클래스가 많다. 그리고 이 클래스들을 서로 연결해줄 수 있는 능력이 필요하다. 위에서 말했듯이 시간도 많이 들고 인적 자원도 많이 들기 때문에 프로젝트 크기가 클 경우에 쓰는 것이 효율적인 방법일 것이라고 생각한다.

 

현재 MVVM 디자인 패턴은 구글에서 아키텍처를 제공하고 있다.

<Android Architecture Component> : 이것은 앱 구조를 더 튼튼하게, 테스트에 용이하게, 유지보수성이 뛰어나게 만들어주는 라이브러리 모음이다. Databinding, LiveData 등의 라이브러리를 제공한다.

 

구글에서 제공하고 있는 "Android Architecture Component"는 문서로 제공하고 있으므로 좀 더 읽어보고 사용해봐야지 알 수 있을 것 같다.

 

https://developer.android.com/topic/libraries/architecture/

 

Android 아키텍처 구성요소  |  Android 개발자  |  Android Developers

앱 작업

developer.android.com

 

'Android Studio > Android' 카테고리의 다른 글

Android Studio 팝업창 만들기  (0) 2020.07.22
Android Studio setClipToOutLine() in RecyclerView  (0) 2020.04.10
Android Studio Room Database  (0) 2020.04.02
Android Studio 그림자 생성  (0) 2020.03.24
Activity의 생명주기  (0) 2020.02.29

댓글