MVVM

2019-11-09
Architecture

안녕하세요. 도미닉입니다.

오늘은 MVVM 에 대해서 알아보겠습니다.

아키텍처

iOS 에서 많이 사용되는 아키텍처에는 MVC, MVP, MVVM 이 있습니다.

아키텍처를 생각하지 않고 프로그램을 작성한다고 프로그램이 돌아가지 않는 것은 아닙니다.

하지만 이런 프로그램은 가독성은 떨어지며 유지 보수에 굉장히 많은 비용이 듭니다.

또한 테스팅 단계에서는 테스팅 자체가 거의 불가능하거나 효과를 볼 수 없는 난관에 봉착할 수 있습니다.

저는 개발을 할 때 MVC 를 주로 사용해 왔는데요.

MVC 를 사용하다보면 View 와 ViewController, Model 이 뒤죽박죽 되는 경우가 많습니다.

ViewController 가 너무 많은 소스를 가져가는 경우가 많아서 iOS 에서는 MVC 의 별명이 Massive ViewController 입니다.

이러한 배경으로 MVVM 에 관심을 가지게 되었고 어느 정도 이해한 내용을 정리하고 공유하고자 합니다.

MVVM

MVVM 은 Model 과 View 사이에 ViewModel 이 위치하는 아키텍처입니다.

ViewModel 은 한마디로 View 를 위한 Model 이라고 할 수 있습니다.

저희는 보통 모델을 있는 그대로 사용하지 않습니다.

어떤 로직에 따라 가공을 하기도 하고 뷰에 보여지기 위한 처리가 필요합니다.

이러한 부분을 ViewModel 이 갖고 있어서 View 와 ViewController (이하 View 에 포함)에는 로직과 데이터가 없고 뷰에 대한 처리에만 집중합니다.

MVVM 는 아래와 같은 특징을 가지고 있습니다.

  • View 는 최대한 멍청한(dumb) 상태를 유지해야한다.
  • View 는 View Model 과 바인딩 되어있다.
  • ViewModel 은 뷰가 어떻게 보여지든지 상관하지 않는다.
  • ViewModel 은 모델과 통신하여 값을 갖고 있고 로직만을 실행 한다.

Binding

위에서 바인딩이라는 이야기가 나왔는데요.

그렇다면 바인딩은 무엇일까요?

View의 UI 요소들과 ViewModel의 인터페이스를 연결시키는 작업을 “바인딩(Binding)” 이라고 합니다.

뷰 모델의 프로퍼티를 변경하면 이것이 바인딩된 뷰에 반영되는 형태입니다.

iOS 에서 바인딩 방법은 아래 4가지가 대표적입니다.

  • KVO (Key-Value Observing) 패턴
  • RxSwift나 ReactiveCocoa같은 FRP(Functional Reactive Programming) 라이브러를 활용
  • Combine
  • Property Observer

저는 RxSwift 를 공부하고 있기 때문에 2번째 방법은 RxSwift 를 활용해서 바인딩을 하고자 합니다.

RxSwift 를 이용해 바인딩하여 MVVM 아키텍처를 구성하는 것을 RxMVVM 이라고도 합니다.

정리

이론적으로는 위와 같이 정리가 되었으나 저 또한 예제를 작성해보고 여러번 활용해서 익숙해져야 하겠습니다.

같이 예제를 공유하고 함께 성장했으면 좋겠습니다.

글 읽어주셔서 감사합니다.