Computer Science

[Design Pattern] iOS에서의 MVVM(MVVM in iOS) - 이준원 강사님

TDCIAN 2021. 1. 31. 22:54

* 이 내용은 제가 패스캠퍼스에서 이준원 강사(개발자이시기도 합니다!)님께서 진행하신 iOS 강의를 보고 공부하기 위해 만든 자료입니다.

이준원 강사님의 강의를 수강하고 싶으시다면 이 링크(www.fastcampus.co.kr/dev_online_iosapp)로 방문해 보세요!

(당연한 얘기이지만 절대 광고 아닙니다!)

 

 

 

이준원 강사님께서 설명해주시는 MVVM!

 

개발을 더 쉽게, 더 편하고 유지 가능하게 하고자 여러 디자인 패턴들이 등장하게 되는데, 그 중 MVVM 패턴에 대한 설명입니다.

 

 

본격적으로 MVVM을 설명하기 이전에 MVC에 대한 설명이 있어야겠지요?

이 글을 검색해서 보실 분들이라면 이미 MVC가 Model View Controller를 의미한다는 것을 알고 계실 것입니다.

MVC에서는 뷰 컨트롤러가 모델과 뷰를 모두 소유하고 있습니다.

모델이 변경되면 뷰 컨트롤러가 변경된 사항을 파악해서 뷰를 업데이트 합니다.

 

하지만...

 

정작 실무에서는 뷰와 뷰컨트롤러가 거의 분리되지 않는다는 것이지요...ㅜㅜ

 

그러다보니 실무에서는 이처럼 뷰와 뷰 컨트롤러가 한 몸처럼 움직이게 되고,

뷰 컨트롤러에 많은 로직이 생기게 됩니다.

 

이런 현상을 두고 MVC를 Massive View Controller라 부르기도 합니다.

 

주요 원인은 뷰에 연결된 수많은 비즈니스 로직들입니다.

 

더 나아가자면 다음과 같습니다.

 

 

그래서 뷰와 모델을 떨어뜨리고자 하는 목표를 세우게 되었고, MVVM이 등장하게 됩니다!

 

 

이렇게 뷰모델이 뷰와 모델 사이를 갈라놓게 됩니다.

 

뷰모델의 목표는 뷰 컨트롤러의 복잡도를 낮추고, 테스트를 용이하게 해줍니다.

 

 

 

첫째, MVVM은 기존 MVC 패턴과 호환이 가능합니다. 호환이 되지 않는다면 엄청난 개발 비용이 소모되겠지요?

 

다음으로, MVVM은 테스트를 하기에 용이해집니다. 

뷰 컨트롤러의 경우에는 내부의 메소드를 테스트 하기가 어렵게 되어 있습니다.

뷰 컨트롤러의 목표는 말 그대로 뷰를 관리하는 것인데,

데이터 가공 메소드를 테스트 하기 위해서 메소드를 들고 있는 뷰 컨트롤러를 테스트하는 것은 넌센스입니다.

따라서 MVVM을 통해 이를 분리하여 테스트의 용이성을 높일 수 있습니다.

 

바인딩 메커니즘은 모델이 변경될 때 뷰모델을 통해 뷰까지 표현되게 하는 과정을 의미합니다.

또는 사용자의 인터랙션이 모델까지 이어지는 관계 연결을 뷰모델이 해줍니다.

 

스위프트에서는 모델이 바뀔 때 이를 인지하기 위해 지원하는 키밸류옵저빙, 노티 등의 기본적 메커니즘이 있습니다.

이외에도 RxSwift나 애플에서 도입한 Combine 등이 있습니다.

 

 

MVVM 각 컴포넌트의 역할에 대해 알아봅시다.

 

MVVM은 다들 알고 계시겠지만 Model View ViewModel을 의미합니다.

 

모델은 모델 자체만으로는 뷰에 대해서 알 필요가 없기 때문에 UIKit을 import할 필요가 없습니다.

 

 

 

 

데이터를 가공해서 뷰에 넘겨야 하기 때문에 UIKit을 import하게 됩니다(100%의 경우는 아닙니다).