Android Architecture #1

MVC 부터 MVP / MVVM 그리고 DI / Rx 까지 Android 에 적용할 수 있는 아키텍쳐를 찾아보고, 장단점을 확인해보려 합니다.

MVC

Model / View / Controller 로 구분되는 이젠 좀 오래된 아키텍쳐로 n View : 1 Controller 형태를 가지고 있습니다.

MVC 가 나오기 전과 비교하면, Model 과 View 분리는 훌륭하게 이루어 집니다. 하지만 Controller 역할을 Android 에서는 Activity / Fragment 가 처리하게 되는데, 이벤트 처리를 비롯한 대부분의 로직이 Controller 에 집중되는 문제가 발생하여, View 와 Controller 분리가 어려워집니다.

MVVM

Model / View / ViewModel 로 구분되는 아키텍쳐로 n View : 1 ViewModel 형태를 가지고 있습니다.

MVC 에 비해 ViewModel 이 Activity / Fragment 와 분리되며, 이로인해 View 와 Controller 간 의존성이 대부분 사라집니다. 또한 Data Binding 을 포함하여 View 와 Model 간 분리를 좀더 명시적으로 처리합니다. (단, View binding 할 때 표현식이 비대해질 수 있기 때문에, 되도록 ViewModel 에서 직접 가져오는 걸 추천합니다.)

하지만, Controller 보다는 덜 하지만, ViewModel 에 로직이 집중되는 걸 피하기 힘든 부분은 여전히 존재합니다.

MVP

Model / View / Presenter 로 구분되는 아키텍쳐로 1 View : 1 Presenter 형태를 가지고 있습니다.

ViewModel 보다 Presenter 형태가 하나의 View 에 대해서 관리하기 때문에, 좀더 의존성은 줄어들 수 있습니다.

MVVM 보다 ViewModel 에 로직이 집중되는 현상을 줄일 수는 있지만, Presenter 가 너무 과하게 쪼개지는 현상이 있습니다.

DI

Dependency Injection 을 통해 new 를 제거하여 각 모듈간 의존성을 줄이는 아키텍쳐 입니다.

Spring 에서 만들어져 JSR 표준화까지 되었으며, Android 에서는 일반적으로 Dagger 2 를 통해 적용됩니다.

Rx

MS Volta 로부터 Reactive Framework 로 떨어져나와 .net Framework 에 Reactive Extension 으로 들어가게 된, 비동기 이벤트를 데이타 스트림들을 거치며 상태를 변경하고 전파하는 형태의 아키텍쳐 입니다.

node.js 의 Callback 을 없애기 위해 나왔지만, 대부분 Mobile event 가 비동기식으로 발생하기 때문에, Android / iOS 에서 쓰기에 상당히 최적화된 아키텍쳐라 할 수 있습니다.

RxAndroid 2.0 에서 Reactive-Stream 표준 (크기가 정해지지 않은 Data stream 에서 Data 가 많아져서 Stream 대상에 부하를 주는 현상을 줄이기 위해, 강제 버퍼링 없이 리소스 소비를 어떻게 제어하는지에 대한 표준을 정해놨습니다.) 에 맞게 많은 부분이 수정되었기 때문에 되도록 2.0 으로 작업하는게 좋습니다.

Android Architecture Components

Google I/O 2017 에서 발표된 아키텍쳐 관련 컴포넌트로, LiveData, ViewModel, LifecycleObserver 와 LifecycleOwner, Room 등이 있습니다.

LiveData 는 GPS 정보와 같이 Lifecycle 에 민감하면서 Observer 패턴을 사용해야 하는 데이타를 위한 Data holder Class 입니다.

Room 은 SQLite 를 Model 에 mapping 하는 Query 기반 ORM 입니다.

Lifecycle 은 Activity 및 Fragment 의 Lifecycle 을 다른 객체에 Annotation 을 통해 전파할 수 있는 Class 입니다.

ViewModel 은 LiveData 및 Lifecycle 과 같이 사용하면서, 여러 Fragment 에서 데이타를 공유할 때 사용하며, MVVM 의 ViewModel 과 거의 동일한 기능을 수행하는 Class 입니다.


아무래도 소스를 통해 설명을 하는게 개발자에겐 가장 좋을 듯 해서, 이후 각 아키텍쳐 별로 예제 소스를 통해 설명을 하도록 하겠습니다.