-
디자인패턴 - MVC, MVP, MVVM🧑💻/Swift 2021. 5. 10. 15:39반응형
디자인 패턴은 3가지로 구분됩니다.
1. 구조 디자인 패턴 : 객체가 어떻게 결합되고 구성되는지 설명합니다. MVC, MVVM 등이 있습니다.
2. 행위 디자인 패턴 : 객체의 통신 방법을 설명합니다. Delegation, Strategy, Observer 등이 있습니다.
3. 생성 디자인 패턴 : 객체를 생성하거나 인스턴스화 하는 방법을 설명합니다. Builder, Singleton, Prototype 등이 있습니다.이 중 구조적 디자인 패턴(Structural Design Pattern)에 대해 알아보겠습니다.
MVC 패턴 : Model-View-Controller
- Model : 데이터를 구성하는 틀. struct, class 등
- View : 화면에 표시되는 요소나 제어. UIView의 subclass가 대부분
- Controller : Model과 View를 이어주는 매개체. UIVIewController의 subclass가 대부분
동작 순서
1. View에 사용자 입력이 들어오면 ViewController로 전달합니다.
2. ViewController는 변경 사항을 Model에 반영합니다.
3. Model은 변경 사항에 맞게 ViewController를 통해 View를 갱신합니다.
Model과 View가 직접 접근할 수 있도록 Controller 프로퍼티는 강한 참조 타입을 가집니다.
반면에 Model, View는 순환 참조가 발생하지 않도록 strong 타입을 사용할 수 없습니다.
Model은 property observing을 통해 Controller와 데이터 변화를 감지합니다.
View는 IBAction을 통해 이벤트를 감지하고 delegate를 사용하므로 약한 참조를 가집니다.장점
- 실제로는 ViewController가 View와 강하게 연결되어 있어 Model만 별도로 생성하여 쉽게 MVC 패턴을 적용할 수 있습니다.
단점
- 기능이 많을수록 ViewController가 무거워집니다.
- ViewController를 재사용하기 어렵습니다.
- 대규모 프로젝트에 부적합합니다.
MVP 패턴 : Model-View-Presenter
- Model : 데이터를 구성하는 틀. struct, class 등
- View : 화면에 표시되는 요소나 제어. UIView의 subclass가 대부분
- Presenter : View에서 요청한 정보를 Model로부터 가공하여 전달.
동작 순서
1. View에 사용자 입력이 들어오면 Presenter로 전달합니다.
2. Presenter는 Model로부터 필요한 데이터를 받아 View에 전달합니다.Model과 View의 의존성을 제거하기 위해 Presenter를 추가하였습니다. View와 Presenter가 1:1 관계를 가집니다.
장점
- 독립성을 유지하여 UnitTest를 관리하기 쉽습니다.
단점
- Presenter와 View이 1:1 관계이므로 의존성이 커집니다.
- View마다 Presenter를 생성하여 코드 양이 많아집니다.
MVVM 패턴 : Model-View-ViewModel
- Model : 데이터를 구성하는 틀. struct, class 등
- View : 화면에 표시되는 요소나 제어. UIView의 subclass가 대부분
- ViewModel : Model 정보를 View에 표시될 값으로 변환함. 대체로 class이므로 참조를 통해 전달함.
동작 순서
1. View에 사용자 입력이 들어오면 ViewModel로 전달합니다.
2. ViewModel은 필요한 데이터를 Model로부터 받아 가공하여 저장합니다.
3. View는 ViewModel과 데이터 바인딩으로 인해 자동 갱신됩니다.
물론 ViewController도 존재하지만 ViewModel에서 가공된 데이터를 보고 갱신하기 때문에 역할이 최소화됩니다.
MVP 패턴은 Presenter가 View를 갱신했다면, MVVM 패턴의 View는 ViewModel의 데이터가 변경되면 스스로 업데이트합니다.
didSet 같은 프로퍼티 옵저버를 사용하거나 RxSwift를 사용해 데이터를 바인딩하는 등 여러 방법을 채택할 수 있습니다.장점
- 독립성을 유지하여 UnitTest를 관리하기 쉽습니다.
- ViewController 코드가 간결해집니다.
- View와 ViewModel은 N:1 관계를 가지므로 ViewModel을 재사용 가능합니다.
단점
- 프로젝트 규모가 커질수록 MVC의 ViewController처럼 ViewModel이 무거워집니다.
- 간단한 프로젝트임에도 설계가 어려울 수 있습니다.
용어 정리
- 강한 참조, 약한 참조 : [🧑💻/Swift] - iOS의 메모리 관리 - strong / weak / unowned
- property observing : A 객체에서 B 객체 프로퍼티의 변화를 감지하는데 사용되는 Key-Value Observing 패턴
참고
반응형