[iOS]MVVM 디자인 패턴에 대해(MVC vs MVVM)
업데이트:
Design Pattern
디자인 패턴은 SW 설계에서 발생할 수 있는 공통적인 문제 혹은 문맥에 대한 재사용 가능한 해결책입니다. 소프트웨어의 개발 양상은 대부분 비슷한 과정을 거칩니다. 그 내용은 다르지만, 개발 과정에서 발생하는 문제도 큰 맥락에서는 비슷한 이유일 수 있습니다. 따라서 이런 공통적인 문제에 대한 선대(Previous) 개발자들의 해결책을 모아놓은 것을 디자인 패턴(Design Pattern) 이라고 합니다. 여기서 말하는 문제는 우리가 개발을 하며 마주하는 디버깅의 대상인 오류들이라기보다는, 다양한 소프트웨어 시스템을 개발하는 과정하는 큰 맥락에서의 문제점들을 이야기 하는 것입니다.
따라서 우리는 문제가 발생한 뒤 해결책을 찾는 것이 아니라, 발생할 것으로 예상되는 문제를 피해갈 수 있는 해결책들의 정형화된 패턴(Pattern)에 따라 소프트웨어 시스템을 설계할 수 있습니다. 지금까지 가장 유명하고 많이 사용되었던 디자인 패턴은 MVC 패턴입니다.
MVC(Model - View - Controller) Design Pattern
MVC Pattern은 전체 소프트웨어 시스템을 Model, View, Controller로 나누어 설계하는 디자인 패턴입니다. 각 부분으로 나뉜 후 서로 역할을 맡아 각자의 기능을 수행하는 구조를 가지고 있습니다.
출처 : https://www.e-consystems.com/Articles/iOS/MVC-Design-Pattern.asp
Model 은 어플리케이션에서 사용하는 데이터에 속합니다. 보통 Struct 나 Class의 형태입니다.
View는 화면에 보여지는 UI 요소입니다.
Controller는 중계자로, Model과 View 사이에서 소통을 도와줍니다.
MVC 모델에서 각 관계는 다음과 같습니다.
Model ↔ Controller
- Model은 자신의 데이터가 update 된 경우에 controller 에게 알려준다.
- Controller가 model에 접근해서 model의 데이터를 수정하는 경우도 존재한다.
Controller ↔ View
- Controller 는 데이터가 view를 통해 어떻게 보여질지 결정한다.
- view는 사용자들과의 interaction을 controller에게 넘겨준다.
Controller가 Model 과 View 사이의 모든 소통을 도맡아 하기 때문에, Controller에게 가해지는 부담이 너무 크게 됩니다. 실제 코드에서는 이런 경우 Controller의 코드 양이 증가하게 되고, 결국 수정사항이 생길 경우 전체 프로그램의 controller에 대한 dependency가 증가하기 때문에 유지 보수가 어려워지는 문제가 발생하게 됩니다.
이런 문제점을 해결하고자 새롭게 등장한 디자인 패턴이 MVVM 디자인 패턴입니다.
MVVM(Model-View-ViewModel)
MVVM 디자인 패턴은 기존 MVC 디자인 패턴에서 Controller에 너무 많은 부담이 가해지던 문제를 해결하기 위해 등장하였습니다. 따라서, Controller 대신 View와 Model의 소통을 중계해줄 대체자로 ViewModel을 사용하게 됩니다.
출처 : https://www.raywenderlich.com/34-design-patterns-by-tutorials-mvvm
Model은 어플리케이션에서 사용하는 데이터에 속합니다. 보통 Struct나 Class 형태입니다.
View는 실제로 화면에 보여지는 UI 요소들입니다.
ViewModel은 중계자로, Model(데이터)의 내용을 View에서 사용할 수 있게 해줍니다.
첨부된 이미지에는 View Controller가 존재합니다. MVVM 디자인 패턴에는 ViewController는 분명히 존재합니다. 그 기능은 MVC 디자인 패턴에서보다는 많이 축소되었지만, 분명히 존재합니다.
MVVM 모델에서 각 관계 및 특징은 다음과 같습니다.
- ViewController가 Model 에 직접 접근하지 못한다.
- ViewController가 View layer에 있다.
- ViewController의 역할이 많이 축소되었다.
- 많은 일들이 ViewModel로 위임되어 각자가 할 일이 명확해진다.
- 할 일이 명확해질 수록 유지보수가 명확하고 수정이 용이해진다.
View Controller는 Model에 직접 Access를 할 수 없습니다. 따라서 모든 것은 View Model을 가지고 소통하게 됩니다.
실제 코드에서 해당 디자인 패턴을 활용하기 위해서는 서로의 소유 관계에 주목해야 합니다. ViewController는 View 와 ViewModel을 가지고 있습니다. 또한 View Model은 Model을 가지고 있습니다. 따라서 MVVM 패턴을 적용할 때는, MVC 패턴과 별 다를 바는 없지만 ViewController가 View로부터 사용자와의 interaction을 전해받고 필요한 데이터 혹은 데이터의 수정사항을 Model로 직접 주는 것이 아닌 ViewModel를 거치게 된다는 사실을 명확히 해야 합니다.
보충
ViewController는 ViewModel을 가지고 있습니다.
ViewModel은 Model(App에서 사용하는 데이터)를 가지고 있으며 수정할 권한을 가지고 있습니다.
관계를 텍스트로 간단하게 표현했다면 Model - ViewModel - ViewController - View 와 비슷한 관계가 성립된다는 사실을 알 수 있습니다.
댓글남기기