Android 에서 MVVM 으로 긴 여정을…
안드로이드 앱 아키텍쳐 패턴이 자리 잡은 것은 얼마 되지 않았습니다.
불과 5년전부터서야 어떻게 하면 좋은 개발인지가 구체화되었고
한국에도 4년 전쯤에서야 MVP 의 구현체 샘플 코드들이 나오기 시작하였습니다.
2017년 여름 io17 에서 구글은 Android Architecture Component (AAC) 를 출시하면서 여러가지 신규 라이브러리를 선보였습니다. 그중에서 ViewModel 이라는 것이 나왔으며 LiveData, LifecycleObserver 와 함께 쓰면 앱의 성능뿐만 아니라 유지보수 성을 매우 높일 수 있는 라이브러리 자리매김하였습니다.
그러면서 천천히 얘기 되던 것이 MVVM 아키텍쳐 패턴입니다. Android MVVM 은 작년 io17을 기점을 급부상하며 꾸준히 이야기 되던 것이지만 정작 이를 제대로 구현해서 공유되는 코드들이 있지 않고 있기에 제각각의 코드들만이 나오고 있습니다.
지금부터 얘기하는 MVVM 은 AAC 라이브러리를 배제하고 얘기할 것입니다. 앞으로 제가 얘기할 MVVM 은 AAC 없이 충분히 구현할 수 있으며 이는 AAC 의 ViewModel 은 MVVM 과 전혀 무관함을 밝히고 그동안 공유되어온 Android MVVM 예제들이 MVVM 그 본래의 의도를 잘못 해석한 것임을 지적하기 위함입니다. (구글의 일부 예제를 포함해서…)
MVVM 은 1990년대 마틴 파울러에 의해 나온 MVP 에서 파생된 패턴입니다. Microsoft 에 의해서 제안된 패턴이기에 MVVM 에 대해서 이해하기 위해선 MSDN 문서를 기반으로 하는 이해가 필요합니다.
MVVM 에서 View 와 ViewModel
View
View 는 화면에 표현되는 레이아웃에 대해 관여합니다. 기본적으로 비지니스 로직을 배제하지만 UI 와 관련된 로직을 수행할 수 있습니다.
ViewModel
View 에 연결 할 데이터와 명령으로 구성되어있으며 변경 알림을 통해서 View 에게 상태 변화를 전달합니다. 전달받은 상태변화를 화면에 반영할지는 View 가 선택하도록 합니다. 명령은 UI 통해서 동작하도록 합니다.
View 와 ViewModel 의 관계
ViewModel 은 Model 을 알지만 View 를 알지 못합니다. View 는 Model 을 알지 못하나 ViewModel 을 알 수 있습니다. View 는 ViewModel 을 옵저빙 하고 있다가 상태 변화가 전달되면 화면을 갱신해야 합니다.
View 와 ViewModel 의 연결
View 가 ViewModel 을 감지 후 화면에 갱신하도록 하는 코드를 작성하면 다음과 같이 나올 수 있습니다.
하지만 이런 코드는 서로간의 의존적 형태를 지속 시키기 때문에 유지보수성을 높이는데는 한계를 가져올 수 있습니다.
DataBinding : View 와 ViewModel 독립
닷넷유저들은 MVVM 을 구현하는데 있어서 Databinding 을 필수 기술로 간주하고 있습니다. Databinding 은 View 와 ViewModel 간의 데이터와 명령을 연결해주는 매개체가 되어 서로의 존재를 명확히 알지 않더라도 다양한 인터랙션을 할 수 있도록 도와줍니다.
(Model 에서 데이터 변경되면 ViewModel 을 거쳐서 View 로 전달되도록 하는데 Android 에서는 LiveData 나 RxJava 등을 통해 구현할 수 있습니다.)
Databinding 을 통해서 ViewModel 의 notify 와 View 가 ViewModel 로 명령을 전달하는 과정들을 UI 코드로 정의하기에 View 와 ViewModel 은 서로의 독립성을 더 높일 수 있습니다.
기존의 코드와 크게 달라진 점은 없으나 observe 와 클릭 이벤트를 전달하는 코드는 UI 코드에 데이터 바인딩으로 처리되어 있습니다.
동일한 MVVM 의 코드이지만 Databinding 을 통해 구현된 코드는 더욱 의존성이 낮아졌다는 것을 알 수 있습니다.
종합
위에서 말했듯이 MVVM 은 MVP 에서 파생된 모델이지만 MVP 가 기존에 가지는 문제점을 개선하고자 나온 모델입니다. 하지만 MVVM 을 아무런 도움 없이 구현한다면 기존의 문제점을 개선하는 과정에서 새로운 문제를 일으킬 수 있습니다. 때문에 Databinding 이라는 툴을 이용함으로써 서로간의 의존성을 낮춤으로써 유닛테스트를 더욱 쉽게 작성할 수 있고 UI 코드는 네이티브 코드에 관여하지 않아도 되게 하였습니다.
Android 에서 MVVM 을 구현함에 있어서 Databinding 을 제외하고 구현하시고 있다면 이미 문제를 잠재적으로 내재한 코드들이 쓰여지고 있다는 것입니다. 문제를 최소화 하기 위해 Databinding 을 함께 써야만 그 진가가 발휘됨을 꼭 명심하시길 바랍니다.
Next Posting
MVVM 은 안드로이드의 기존 구조와 몇가지 부분이 충돌 할 것입니다. 그 충돌들과 이를 해결하기 위한 과정을 기술하도록 하겠습니다.
References
MVVM 소개
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/enterprise-application-patterns/mvvm
Android Databinding
https://developer.android.com/topic/libraries/data-binding/