MVC, MVP 그리고 MVVM

MVC

mvc

MVC의 경우 모델은 데이터를 나타내는 역할을 말한다. 이때 모델은 UIKit에 종속되지 않기 때문에 테스트 가능한 모델이다.

그러나 컨트롤러와 뷰는 UIKit에 종속되기 때문에 로직부분만 테스트하기가 어렵다. 특히 컨트롤러에는 로직과 화면을 그리는 뷰 관련 코드들이 함께 있기 때문에 조금만 개발해도 매우 커져서 유지보수와 테스트가 어려워진다.

=> 컨트롤러의 역할을 제한하자. 입력받는 부분을 뷰로 넘기자. 해서 나온게 MVP

MVP

mvc

컨트롤러를 모두 뷰로 옮긴다. 프리젠터는 뷰에 표시해야할 요소를 계산해서 뷰에게 지시한다. 데이터 처리와 같은 로직은 모두 프리젠터에게 맡긴다. 그래서 프리젠터가 테스트하기 쉽게 만든다. 뷰는 여전히 UIKi에 종속되기 때문에 테스트가 어렵다.

예를 들어 어떤 사용자의 액션이 들어오면 뷰는 프리젠터에게 이 액션에 대해 무엇을 표시해야 할지 물어본다. 프리젠터는 계산을 해서 뷰에게 데이터를 넘겨준다.

문제는 이론상 뷰와 프리젠터가 1:1 관계이다. 즉 다수의 뷰에는 다수의 프리젠터가 필요하다. 또한 프리젠터가 일일이 뷰에게 무엇을 그릴지 알려줘야하는 것이 번거롭다.

=> 하나의 프리젠터가 다수의 뷰를 상대하게끔 만들자. 해서 나온게 MVVM

MVVM

mvvm

차이점은 뷰모델이 뷰에게 무엇을 그릴지 따로 지시하지 않는다. 뷰가 뷰모델의 변화에 맞춰 알아서 다시 그린다.

즉 뷰는 사용자의 상호작용을 받아 뷰모델에게 알리고, 뷰모델에서 데이터를 가져와 화면에 그리는 역할 뷰모델은 상호작용 이벤트에 맞게 데이터를 업데이트하거나 데이터를 뷰에게 넘긴다.

MVVM의 구현 방법에는 몇가지가 있으나 RxSwift, RxJs 등 reactive programming을 사용한 방법이 가장 많이 쓰인다.