목차
1. MVC 패턴의 문제점
2. MVVM 패턴이란?
3. 안드로이드에서 MVVM 패턴의 활용
4. MVVM 활용을 도와주는 AAC 라이브러리
기존의 Android 앱 개발에서 자주 쓰이는 MVC 패턴에는 치명적인 문제점이 존재한다. 바로 Activity 클래스에 모든 앱 동작 코드를 집어 넣게 됨으로써 점점 스파게티 코드가 된다는 점이다.
특히 Android에서는 Activity
클래스가 Controller
역할을 함과 동시에 사실상 View
의 역할도 같이 수행하기 때문에 더욱 더 Activity
클래스에 쌓이는 코드의 양이 많아지게 된다.
물론 1인 개발이거나 소규모 프로젝트라면 크게 문제되지 않을 수 있지만 기업에서 여러명의 개발자가 협업하는 대규모 프로젝트에서 스파게티 코드는 굉장히 곤란한 문제다.
물론 매우 뛰어난 실력의 개발자라서 Activiy
클래스에 1000줄 가량의 코드를 쓰면서도 스파게티가 되지 않게 쓸 수 있다 하더라도, 이미 Activity
자체가 너무 무거워지는 시점에서 문제가 발생한다.
즉 Android에서 MVC 패턴은 아래와 같은 3가지 문제점을 가지게 된다.
View
와 Model
간의 의존성이 높아져 코드가 복잡해짐View
의 UI Refresh 를 위해 Model
을 참조하므로 앱 규모가 커질수록 코드가 복잡해짐 위와 같은 단점이 발생하는 이유는 View
와 Model
이 분리되지않고 View
가 Model
을 계속 참조하면서 UI를 업데이트하는 구조를 갖고 있기 때문이다.
또한 Controller(Activity)
도 Model
과 View
사이에서 이리저리 요청을 보내고 있기 때문에 당연히 많은 양의 코드를 가지게 된다.
따라서 MVC 패턴은 처음 구현하기에는 쉽지만 기능이 추가될 수록 점점 유지보수하기 어려운 구조인 셈이다.
Android 개발을 시작하는 개발자들 대부분 처음에는 MVC 패턴으로 입문했다가 갈수록 코드 유지 보수가 어려워짐을 느끼고 MVVM 패턴 공부의 필요성을 느끼게 될 것이다.
MVVM 패턴에서는 위에 쓴 MVC 패턴의 단점을 보완하기 위해 Model
과 View
를 분리하고 ViewModel
이라는 새로운 개념이 등장한다.
View
에 직접적으로 호출되거나 하지 않고 ViewModel
을 통해서만 데이터를 전달해준다는 점이다.ViewModel
을 관찰(observe)하며 데이터 변화를 감지하고 View
에서 요구하는 데이터의 변화가 있을 시 이에 맞춰 UI를 변경한다.Model
과 View
사이를 잇는 역할을 한다. Model
에 데이터를 요청하거나 변경이 있을시 변경 사항을 전달하고 Model
로부터 받은 데이터를 View
에 전달해준다. ViewModel
에 대해서는 이전 포스트에서 자세히 다뤄보았으니 살펴보도록 하자.
MVVM 패턴으로 구성할 경우
View
는 필요로 하는 데이터는 ViewModel
이 가지고 있고 View
는 필요한 데이터를 얻기 위해 ViewModel
의 데이터를 관찰(Observing) 한다.
따라서 View
가 직접 DB에 접근하지 않고 UI 업데이트에만 집중할 수 있다.
따라서 MVVM 패턴은 다음과 같은 장점을 지닌다.
View
가 ViewModel
의 데이터를 관찰(Observing) 하면서 쉽고 능동적으로 UI를 업데이트할 수 있음.ViewModel
이 Lifecycle에 의존하지않기 때문에 Memory Leak 발생 가능성 배제먼저 MVVM 패턴에서 Model
, View
, ViewModel
이 안드로이드에서 각각 어디에 해당되는지 알아보자.
MVC 패턴에서와 동일한 개념이며 Repository
클래스를 만들어 복잡한 데이터 처리 과정을 숨길 수 있다.
Repository
ViewModel과 데이터를 주고받기 위한 데이터 API를 포함하는 클래스. 사용자 동작에 따라 필요한 데이터나 외부 백엔드 서버 등에서 데이터를 가져온다. Repository의 존재 덕분에 ViewModel이 데이터를 관리할 필요가 없게 된다.
사용자가 보는 UI 부분. 레이아웃 파일(.xml)은 물론이고 Activity
와 Fragment
도 View로 분류한다. 보통은 Command 패턴이나 DataBinding을 사용해 ViewModel에 대한 의존성을 없앤다.
View에 필요한 데이터를 Model로부터 가져와서 처리하고 해당 데이터를 View에 보여준다. 안드로이드에서는 AAC ViewModel 라이브러리를 사용할 수 있지만 필수는 아니다. 다만 AAC ViewModel를 사용하면 UI 관련 데이터의 수명주기를 관리하는데 용이하다.
(이미지 출처: [Android] MVVM & 안드로이드 아키텍쳐 컴포넌트 시작하기)
AAC(Android Architecture Components)에는 개발자가 안드로이드 프로젝트에서 MVVM 패턴 적용을 돕는 다양한 라이브러리가 있다.
(이미지 출처: Guide to app architecture)
AAC ViewModel
: 데이터를 보유하고 이를 UI에 노출하여 로직을 처리하는 상태 홀더 이전 포스트 참고.LiveData
: 관찰이 가능한(Observable)한 데이터 홀더 클래스. 보통 ViewModel
내부에서 함께 사용되며 View가 ViewModel의 LiveData
를 관찰중일때 데이터가 변경되면 자동으로 알려준다. 또한, LiveData
는 Activity나 Fragment 의 생명주기를 인지하고 이들이 활성화 된 상태일 때만 UI 변경 기능을 동작하게 만들어 Memory Leak의 발생을 줄여준다.DataBinding
: XML에서 ViewModel의 LiveData를 바인딩하여 관찰하고 데이터 변화에 따른 UI 동작을 가능케한다.Room
: SQLite 데이터베이스를 편하게 사용하게 해주는 라이브러리이다. MVVM 패턴을 사용해야하는 이유와 이를 구현하는데 도움을 주는 여러 라이브러리들에 대해서도 살펴보았으니 이제 예제를 통해 활용해보아야 할 때이다.
다음 포스팅에서는 AAC 라이브러리를 활용한 MVVM 패턴 앱 만들어보기 예제를 올려보도록 하겠다.
레퍼런스)
1. [Android] 깔쌈하게 MVVM 패턴과 AAC 알아보기
2. 안드로이드 MVC
3. Android MVVM Design Pattern
4. [Android] MVVM & 안드로이드 아키텍쳐 컴포넌트 시작하기
5. Guide to app architecture
정보 감사합니다.