iOS로 개발 공부를 시작한 많은 사람들은 MVC 패턴에 가장 익숙할 것입니다.
UIKit은 MVC 패턴을 염두하여 만들어졌으며, 우리가 Xcode에서 생성하는 프로젝트 템플릿에는 ViewController
가 만들어져 있지요.
이 ViewController
에 거의 모든 로직이 담겨있어 몇백 줄이 넘어가는 상황도 자주 겪어 보셨을거에요.
그래서 다른 패턴에 관심을 갖게 되고, MVVM을 사용하기 위해 RxSwift를 공부하게 됩니다.
하지만 다른 디자인 패턴으로 넘어가기 이전에, 우리는 MVC에 대해서는 확실히 알고 있을까요?
.
Apple 공식문서의 MVC에 대한 모식도입니다.
이 Cocoa MVC는 사실 최초의 MVC와는 다른 패턴입니다.
전통적인 MVC 패턴은 최초의 객체지향 언어 중 하나인 Smalltalk에서 제시된 디자인 패턴으로, Cocoa MVC와는 달리 Model이 Controller를 거치지 않고 View와 직접 소통합니다.
1. View에서 User action을 Controller로 전달하면,
2. 그에 따라 Controller는 (View와) Model을 변경하고,
3. Model은 자신의 변경을 View에 알립니다.
4. View는 Model과 직접 소통하여 Model의 변경을 반영하게 됩니다.
여기에서 모델과 뷰의 의존성을 끊고, 분산되었던 뷰의 변경 책임을 Controller에 집중시킨 패턴이 Cocoa MVC인 것이죠.
Cocoa MVC에서는,
1. 뷰에서 User action을 Controller로 전달하면,
2. 그에 따라 Controller는 Model을 변경하고,
3. Model은 자신의 변경을 Controller에 알립니다.
4. Controller는 Model의 변경에 따라 View에 적절한 변경을 적용합니다.
MVC의 문제점을 극복하여 발전시켰다고 볼 수 있지만, 문제는 이 용어가 현재 여러 진영에서 각기 다른 방식으로 쓰이고 있다는 것입니다.
서로 다른 도메인의 개발자끼리 "MVC 패턴" 에 대해 말하면, 모두가 조금씩 다른 그림을 머리속에 그리고 있을지도 모릅니다.
전통적인 MVC와 iOS, Android, 백엔드에서 사용하는 MVC가 각기 크고작은 차이가 있기 때문이죠.
역사적으로 MVC 패턴이 대세를 이루었지만, 그 이후에 MVC의 문제점을 해결하기 위해 각 진영에서 수정을 거친 결과 이런 용어의 난립이 일어났다고 해요.
.
익숙하게 들어 본 또 하나의 디자인 패턴, 바로 MVP입니다.
Cocoa MVC의 모식도와 몇몇 용어를 제외하고는 일치하는 모습을 볼 수 있습니다.
사실 그 동안 우리가 MVC라고 부르던 패턴(Cocoa MVC)는 MVP 패턴이었다고 봐도 무방할 것입니다.
디자인 패턴 및 아키텍쳐는 더 이해하기 쉽고, 테스터블 하며, 유지보수가 용이한 코드를 작성하기 위해 필수적으로 고민해야 하는 주제인 것 같습니다. iOS 개발 공부를 하더라도, 디자인 패턴과 아키텍쳐는 하나의 프로그래밍 언어에 한정되지 않는 소프트웨어 엔지니어링의 문제이기에, 다른 진영에서 이루어지는 논의도 눈여겨보는 것이 좋을 것 같아요.
이를 위해 MVC에 대한 기본적인 오해를 해소하는데 도움이 되는 글이었으면 좋겠네요 :)