출처 : fastcampus - 30 개 프로젝트로 배우는 iOS 앱 개발
MVC 디자인 패턴의 장점과 한계
기본적으로 Model, View, Controller 로 이루어져 있는 디자인 패턴이다.
Apple 은 MVC 장점을 다음과 같이 정의한다.
- 재사용 가능성이 높다
- 인터페이스가 더욱 잘 정의된다.
- 쉽게 확장할 수 있다
- Cocoa framework architecture 가 MVC 를 기반으로 하고 있다.
물론 이는 순수한 MVC 패턴이 가지는 장점이다. 하지만 실제 개발에 있어 Cocoa Framework 에서의 MVC 디자인 패턴은 순수하지 못하다.
현실의 Cocoa MVC
Cocoa Framework 에서의 MVC 패턴은 UIView 와 UIViewController, 이 둘을 완전히 분리해서 개발하는 것이 사실상 어렵다. UIViewController 도 자신의 뷰를 가지고 있기 때문에 온전한 형태의 컨트롤 타워 역할을 하지 못한다.
이러한 문제점 때문에 Cocoa MVC 디자인 패턴에 한계가 생긴다. 순수한 MVC 패턴의 개발이 어렵기 때문에, 순수한 MVC 패턴의 장점 또한 살리지 못한다.
MVVM 디자인 패턴
그렇다면 MVVM 디자인 패턴은 무엇인가?
MVVM 패턴은 View, ViewModel, Model 로 구성되어 있다.
UIView, UIViewController 은 각자의 ViewModel 을 소유하고 있다.
View 가 소유한 View Model 은 View 와 바인딩 되어서, 데이터나 사용자 액션을 주고 받게 된다.
또한 ViewModel 은 자신의 Model 을 소유할 수 있다.
View 로터 받은 다양한 사용자 액션이나 데이터를 Model 을 통해 비즈니스 로직을 처리하게 된다.
ViewModel 과 ViewModel 에 의해 처리된 결과는 바인딩 된 View 에 특정 데이터의 형태로 전달될 것이며, 전달된 데이터는 특정 형태로 View 에 업데이트된다.
MVVM 디자인 패턴의 장점
MVVM 은 View 의 액션과 사용자 이벤트를 View Model 로 전달시키고, 다시 View Model 은 Model 이라는 비즈니스 로직을 통한 Output 을 다시 View 에게 전달하는 단방향 디자인 패턴이다.
결국 비교하자면 MVC 의 경우 View + Controller 의 혼합체인 View Controller 이기 때문에 두 가지의 개념이 혼합되기 쉽고, 곧 비즈니스 로직과 단순한 뷰의 역할 역시 혼합되기 쉽다는 단점이 있다.
반면에 MVVM 패턴의 View Model 은 View 의 상태와 동작을 추상화한 형태로, 하나의 View 는 해당 View 의 로직을 담당하는 View Model 이 대응하게 된다.
이로써 순수한 비즈니스 로직은 View Model 에게 넘기고, View 는 View Model 이 처리한 결과를 UI 로 반영하기만 하면 되는 순수한 View 의 역할을 할 수 있게 된다.
View 가 ViewModel 을 소유하는 형태이기 때문에 ViewModel 은 자기를 소유한 View 를 몰라도 된다. 하나의 View Model 은 결과적으로 나타내고자 하는 로직만 같다면 재사용이 가능하다.
MVVM 디자인 패턴과 RxSwift
MVVM 패턴은 Rx 코드 기반일 때, 즉, Rx 를 MVVM 패턴으로 디자인 된 앱 위에서 사용할 때 강력한데, View 와 View Model을 Binding 하는 접착제로써 RxSwift 를 사용할 수 있다.
View 를 통해 발생하는 사용자 입력에 의해 수행되는 일련의 과정들은 Observable 을 통해 구현을 하고, 해당 View 에 소유된 ViewModel 은 이러한 View 의 Observable 을 subscribe 하는 형태로 만들 수 있다.
ViewModel 에서의 스트림 연산을 Observable 의 Operator 를 통해 해결하여 많은 코드 양을 줄이고, Operator 을 통일하여 가독성을 높일 수 있다.
# 예시
View 의 UIButton 을 Tap 하면 문자열 데이터를 불러오는 View 를 생각해보자. View 는 자신의 View Model 을 소유하고 있다.
View 의 내부에는 View 를 통해 발생하는 사용자 활동, 여기서는 "UIButton 을 Tap 하는 이벤트" 와 "이러한 이벤트를 View Model 에 바인딩 해준다" 만 정의한다.
그리고 "View Model 에서 전달된 맛있는 버거 세트 라는 데이터를 어떻게 보여줄지만" 정의하고 있다.
UIButton 이 눌러서 데이터가 나오는 로직은 View 가 가지고 있지 않고 View Model 이 가지고 있다.
' iOS > UIKit' 카테고리의 다른 글
addArrangedSubview vs addSubview (Feat. SnapKit) (0) | 2022.10.02 |
---|---|
Swift Package Manager 을 통해 SnapKit 설치하기 (0) | 2022.10.01 |
JSON 데이터를 어떻게 사용자 타입으로 변환할 수 있을까? (0) | 2022.09.30 |
NSCache 를 활용한 이미지 캐싱 (1) | 2022.09.30 |
IBOutlet Collection 은 왜 weak 수식어를 붙일 수 없을까? (3) | 2022.09.30 |