MVVM이란?
MVVM은 그래픽 사용자 인터페이스(view)의 개발을 비지니스 로직 또는 백엔드 로직(모델)로 부터 분리시켜서 뷰가 어느 특정한 모델 플랫폼에 종속되지 않도록 해주는 패턴이다.
MVVM 패턴의 구성 요소
1. Model
- 데이터, 네트워크 로직, 비즈니스 로직 등을 담으며 데이터를 캡슐화하는 역할
- View, ViewModel에 대한 신경은 쓰지 않는다. 데이터를 어떻게 가지고 있을지만 고려, 데이터가 어떻게 보여질 지에 대해서는 고려 X
2. View
- 사용자 화면에서 보는 것들에 대한 구조, 배치, 그리고 외관에 해당하는 내용을 다룬다.
- Model을 직접 알고 있어서는 안된다.
- View는 ViewModel로부터 데이터를 가져와서 표현한다.
- 사용자와 View의 상호 작용을 수신하고, 이에 대한 처리를 ViewModel에 부탁한다.
3. ViewModel
- View로부터 전달받는 요청을 처리할 로직을 담고 있으며, Model에 변화가 생기면 View에 notification을 보낸다.
(데이터의 변화를 View가 알아챌 수 있도록 한다고 생각하면 된다)
- ViewModel은 View와 Model 사이의 중재자 역할을 하며 Presentation Logic을 처리하는 역할을 한다.
Presentation Logic이란?
- 일반적으로 ViewModel은 Model 클래스의 메서드를 호출하여 Model과 상호 작용한다.
그런 다음 ViewModel은 Model의 데이터를 가져오고, View가 쉽게 사용할 수 있는 형태로 가공하여 제공한다.
View가 데이터를 더 쉽게 처리할 수 있도록(보여줄 수 있도록) 데이터 형식을 다시 지정한다(formatting)
동작 흐름
1. View에 들어온 event를 ViewModel에게 알려주면 ViewModel은 Model을 업데이트 시킨다.
2. Model이 변화하면 이는 ViewModel에 알려지고, ViewModel과 바인딩 되어있는 View가 업데이트 된다.
MVVM for UIKit
- ViewController는 View로써 취급된다.
- ViewController는 UIVIew의 라이프 사이클을 관리하면서 ViewModel을 소유한다.
- "MVVM View와 ViewModel간의 데이터 바인딩"은 ViewController와 ViewModel간의 바인딩으로 구현된다.
- 사용자 상호작용에 대한 처리는 ViewController에서 ViewModel의 특정 메서드를 호출하는 방식으로 구현이 가능하다. (반드시 이렇게 해야 되는 것은 아님)
MVVM의 장점
1. Distribution(책임의 분배)
- MVVM에서의 View는 바인딩을 통해 ViewModel로부터 보여줄 데이터를 가져온 뒤 직접 업데이트 한다.
2. Testability(테스트의 용이성)
- ViewModel은 View에 대해서 아무것도 모른다.(UIKit을 쓰는 경우 ViewController에 대해서도 모른다) 이것은 ViewModel을 쉽게 테스트할 수 있도록 만들어준다. View 또한 테스트가 가능하지만 UIKit에 종속적인 경우 건너뛸 수 있다.
3. Easy of use(사용 편의성)
- View를 수동으로 업데이트 하는 것 보다 바인딩을 사용하는 경우 MVVM이 훨씬 간편하다.
-> 그러나 바인딩을 구현하는 것이 간단하지 않기 때문에 바인딩이 구현되어 있는 라이브러리나 프레임워크를 사용하지 않는다면 상용구가 많아질 수 있다.
-> 작은 프로젝트의 경우 MVVM로 구현하는 것이 과할 수 있다.