brunch

You can make anything
by writing

- C.S.Lewis -

by Wade Jul 12. 2018

MVVM-C 학습 정리

MVVM-C 란? 변형된 Runtastic 의 MVVMC 소개

#시작하기 전에

MVVM을 공부하고 있는 중이고, 글 내용에 부족한 부분이 많을 수 있다.
또한runtastic 의 글의 영향을 받아 MVVM-C 를 조금 변형해서 사용했기 때문에 예제는 테스트 과정에 대한샘플로서 참고삼아 봐주길 바란다.


브런치의 글은 카피가 안되고 소스코드를 첨부하기에 적절하지 않아 Medium 에 글을 같이 쓰려한다.

Medium의 글링크를 첨부한다.


MVVM-C 란?

먼저 아래 책에서 MVVM-C 의 중요점을 설명한 글을 인용해왔다.

구글 번역기를 통한것이라 정확히 전달되지 못할 수 있는 점에 대해 양해를 바란다.

https://www.objc.io/books/app-architecture/

MVVM은 iOS에서 가장 많이 사용되는 응용 프로그램 디자인 패턴으로 MVC의 직접적인 변형이 아닙니다. MVC의 직접적인 변형은 아니지만 극적으로 다르지 않습니다. 둘 다 View Controller 장면을 중심으로 구조화되어 있으며 대부분 동일한 machinery를 사용합니다.

가장 큰 차이점은 아마도 뷰 모델에서 일련의 변환 및 종속으로 논리를 표현하는 반응 형 프로그래밍을 사용하는 것입니다. 선언적 코드를 통한 논리적 프로그래밍 및 논리 표현 및 모델 객체와 표현 값 사이의 관계를 명확하게 설명하기 위해 뷰 모델을 구조화하는 방법을 이해하는 것은 응용 프로그램에서 더 일반적으로 종속성을 이해하는데 있어 중요하지 않은 교훈입니다.

Coordinators는 뷰 컨트롤러 계층을 관리하는 것이 중요한 개념이므로 ios에서 유용한 패턴입니다. Coordinators는 본질적으로 MVVM에 속하지 않으며 MVC또는 다른 패턴에도 사용할 수 있습니다.


MVVM-C 는 MVVM에 뷰컨트롤러 계층을 관리하는 Coordinator 를 두었다는 것이 특징임을 알 수 있다.


Coordinator 란?

위의 글은 여러 아키텍쳐의 내용들 에 대해 설명되어있다.
그중 Coordinator 관련 내용에 대해서 보면 좋을것 같다.

위의 글은 비교적 최근의 MVVM-C 에 대한 글이다 마찬가지로 Coordinator 에 대해 읽어두면 좋을것 같다.


최근의 오픈소스인 RxCoordinator 도 살펴보면 좋을것 같다.


Runtastic 의 MVVMC ( 위 MVVM-C 랑은 조금 다름 )

런타스틱의 기술블로그의 글이다. Coordinator 를 사용했지만 위에 언급된 MVVM-C의 구조와는 조금 다르다. Viper 를 학습하고 MVVM 디자인 패턴에 접목했다고 한다.


더 많은 글이나 발표 자료들을 봤지만, 개중에는 글 내용에 각 요소별로 잘못된 설명을 하는 부분도 있어서 링크는 여기까지만 정리했다. 런타스틱의 글을 정말 많이 읽어봤는데, Coordinator 를 활용한 부분이 인상 깊었다. 같은 이름이지만 활용이 내용이 조금 다르다. 내가 작업한 MVVM-C 도 약간 변형된 형태인데 런타스틱 블로그 글의 영향을 많이 받았다.


어떤 차이점이 있는지 알아보자

위의 샘플처럼 기존의 MVVM-C 를 설명하는 글들에서는 Root 부터 child coordinator 를 array 혹은 Dictionary로 관리하는 형태들로 설명되어있다. 그리고 delegate 패턴으로 연결되어있다.

A Coordinator 가 A ViewController 의 presentation logic 을 가지고 있었다. (presented 될 viewController 를 받도록 되어있고)


런타스틱의 Coordinator는 ViewController 에서 파생될 뷰 컨트롤러의 프로젠테이션 로직을 가지고 있었다. 예를들어 그룹리스트 coordinator 에서 그룹 ViewController 를 띄우는등.


맨 처음 인용한 책의 글 내용처럼 Coordinator 의 가장 중요한 역활은 viewcontroller 에서 프리젠테이션 로직을 가져가는 것이다.

 이렇게 하면 ViewController 는 뷰모델과 UI바인딩, 그리고 UI액션을 처리하는 일부 기능이외에는 다른 책임을 가지지 않는 상태가 될수 있다. 프리젠테이션 로직이 분리되었기 때문에 관련 테스팅도 가능해진다. 나는 여기서 Coordinator 를 구현한 내용만 조금 바꿔서 작업을 진행했다.


Coordinator

입력한 물품 리스트를 보여주는 ViewController 의 Coordinator이다.

아래의 3가지 상황에 대한 파생될 뷰 컨트롤러의 프리젠테이션 로직을 가지고 있다.


1. 물품 입력 ViewController ( 신규 )

2. 물품 입력 ViewController ( 수정 )

3. 예상 세액 정보 ViewController


Coordinator 는 ViewController 가 가지며, UI Action 등에 바인딩 된다.


테스트 코드

처음에는 Coordinator 의 protocol 을 테스트 했는데, UI 테스팅을 병행해도 될것 같아서 snapshot 테스트로 coordinator 를 테스트 했다.

(protocol 을 테스트 하도록 해서 단위 테스트로 Coordinator 테스트를 하면 UI 테스트 보다 테스트에 걸리는 시간을 줄일수 있다.)




여기까지 MVVM-C 에서 Coordinator 가 어떤 역할을 해야 하는지, ViewController 의 계층을 관리하고 present logic 을 수행하는 방법들에 대해 공부한 내용과, 테스팅을 구현해본 내용을 정리했다.


다음 프로젝트를 진행할때에도 MVVM-C 의 구조로 짜도 좋겠다는 생각을 했다. ViewController 에서 present 로직을 분리하고 테스팅을 효율적으로 수행할수 있다는 점에서 이점이 많다고 생각한다.

( Viper 는 매우 잘 분리되어있지만 프로젝트 구성에는 엄두가 나지 않아서... )


마침.

Wade 소속카카오 직업개발자
구독자 170
매거진의 이전글 MVVM 학습 정리

매거진 선택

키워드 선택 0 / 3 0
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari
;