아직은 개린이

[iOS 아키텍처 패턴] MVC 본문

Swift + iOS/iOS

[iOS 아키텍처 패턴] MVC

jiyeonlab 2020. 2. 28. 18:00

iOS의 아키텍처 패턴에는 MVC, MVP, MVVM 등 여러 종류가 있다.

사실 그동안에는 MVC 패턴으로만 코드를 짰었다.

Apple이 기본적으로 적용한게 MVC 패턴이기도 하고, 단순하기 때문이었다.

 

하지만, Apple의 MVC 패턴을 Massive View Controller라고 하는 것처럼

ViewController의 몸집이 너무 커서 코드가 조금만 길어져도 정신을 똑바로 차려야(?) 하는 단점이 있었다.

또한, Unit Test를 프로젝트에 적용하는 연습을 시작했는데, MVC 패턴에는 적용하기 어렵다는 문제도 있었다.

 

그래서!

다른 패턴을 이용하여 코드 작성을 하는 연습을 하기 위해 

MVC 외의 MVP, MVVM 등에 대해 알아보고자 한다.!

 

오늘은 우선 아키텍처 패턴이 왜 중요한지 알아보고,

일반적인 MVC 패턴과 Apple의 MVC 패턴에 대해 정리해보고자 한다.

 

* 아래 글을 참고하며, 정리했습니다.

(https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52)

 


Why care about choosing the architecture?

아키텍처를 왜 선택해야하고, 그 선택이 신중해야하는 것일까?

 

우선, 아키텍처가 없다면 프로젝트 몸집이 커졌을 때 디버깅이 어려워진다.

경험적으로만 봤을 때도 코드 내의 모든 클래스와 속성을 구조적으로 정리해두지 않는 이상

버그가 발생한 부분을 거슬러 올라가서 찾아야하는 어려움이 있었다.

 

또한, 팀 작업 시에는 아키텍처가 명확해야 의사소통이 되고, 코드 수정도 원활할 것이다.

 

그렇다면, 좋은 아키텍처란 무엇일까?

좋은 아키텍처의 세가지 요소를 살펴보자.

 

   1. Balanced distribution of responsibilities among entities with strict roles.

 

  • 각 객체들의 역할이 분명한가?
  • SOLID 원칙에 포함된 Single Responsibility Principle(단일 책임 원칙)과 일맥상통한다.
  • 한 객체는 하나의 역할만 수행하도록 해서, 프로그램의 복잡도를 낮춰야한다는 의미이다.

   2. Testability usually comes from the first feature.

 

  • 테스트가 가능한가?
  • 런타임에서 문제를 발견할 수 있으려면 테스트 단계를 수행하는 것이 좋기 때문이다.

   3. Ease of use and a low maintenance cost.

 

  • 사용이 편리하고, 유지보수 비용이 적은가?
  • 여기서 사용이 편리한 코드란 길이가 짧은 코드, 설명이 필요하지 않은 코드를 말한다.

이 세가지 조건을 모두 만족하는 아키텍처는 없지만, 프로젝트 성격에 맞는 아키텍처를 선택하고 결과 구현에만 급급한 것이 아니라 좋은 코드가 무엇인지 항상 생각하는 것이 필요한 것 같다.

 


MV(X) essentials

기본적으로 많이 쓰이는 아키텍처는 MVC, MVP, MVVM, VIPER 가 있다.

그 중에서 MVC, MVP, MVVM은 아래 3가지 카테고리를 포함하고 있다.

  • Model - 데이터를 다루는 부분을 담당
  • View - 화면에 보여지는 시각적인 UI를 담당
  • Controller/Presenter/ViewModel - Model과 View를 연결하는 부분. View에 들어온 사용자의 입력을 토대로 Model을 변경하고, 변경된 Model로부터 View를 갱신하는 역할을 함. 

이렇게 3가지 카테고리로 나누게 되면,

이해하기가 더 쉬워지고, 재사용성이 높아지고, 독립적으로 테스트가 가능해진다!

 

그렇다면 이번 글에서는 일반적인 MVC와 Apple의 MVC 패턴에 대해 정리해보자.

 


MVC

Apple의 MVC 이전의 전통적인 MVC 패턴에 대해 먼저 알아보자.

Traditional MVC

이 구조는 다이어그램만 봐도 알 수 있는게 Model, View, Controller가 너무 밀접하게 연관되어있다.

앞서 살펴본 좋은 아키텍처의 특징 중 distribution에 완전 어긋나는 구조이다.

서로가 독립성이 없기 때문에, 재사용성 또한 떨어지는 문제가 있다.

 

이 때문에 전통적인 MVC 구조 iOS 개발에는 적합하지 않다.

 

Apple's MVC

따라서 애플에서는 CocoaMVC 구조를 제시했다.

Cocoa MVC

 

CocoaMVC는 ControllerViewModel의 중재자 역할을 함으로써 ViewModel독립성을 주었다. 

 

하지만, Controller의 역할을 수행하는 UIViewController의 이름에서도 알 수 있듯 ControllerView를 포함하는 것은 물론, ViewLife Cycle까지 관리하기 때문에 ViewController분리하기 어렵고, 재사용도 어렵고, 테스트도 불가능하다.

또한, ViewController가 너무 많은 역할을 하기 때문에 MVC가 Massive View Controller의 약자가 아니냐는 말도 많다.

 

그래서 실제로는 아래와 같은 구조가 된다고 볼 수 있다.

Reality Cocoa MVC

 

Cocoa MVC 패턴을 좋은 아키텍처의 3가지 요소에 하나씩 매칭해보면, 

 

  • Distribution - Model과 View가 독립되었지만, View와 Controller가 너무 밀접하게 연관되어있기 때문에 독립성을 확보하지 못함
  • Testability - View와 Controller가 너무 밀접해서, Model만 테스트가 가능함
  • Ease of use - 다른 패턴들에 비해 코드 길이가 적고, 친숙한 아키텍처이기 때문에 개발자들이 쉽게 유지보수 할 수 있음

Cocoa MVC 패턴은 개발 진행 속도에 있어서는 가장 빠르다고 할 수 있다.

따라서 아키텍처가 중요하지 않을 때는 선택할만한 패턴이지만, 나중에 유지보수가 어렵다는 문제가 있다.

 


 

지금까지 좋은 아키텍처 패턴은 무엇인지, 전통적인 MVC 패턴과 Cocoa MVC 패턴에 대해 정리해보았다.

다음 글에서는 MVP와 MVVM을 정리해보고, 직접 코드에 적용하는 연습도 해봐야겠다.

 


참고 : https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52