본문 바로가기

iOS 개발/App 개발 관련

[iOS] Stanford iOS Lecture - MVVM (cs193p)

MVVM Architecture

MVVM 의 핵심은 View (user-interface code) 와 Model (backend or logic) 의 분리이다. 이를 위해 Model 의 모든 변화를 View 가 파악하고 UI 를 Rebuild 할 수 있어야 한다.

Model

Model 은 UI 와 독립적이다. (Model 파일에는 "import SwiftUI" 구문이 없다.)

Model 은 앱이 '무엇인지, 무엇을 할지' 설명하는 모든 Data & Logic 을 담고 있다.

Model 은 앱의 Source of truth 로서 Model 의 데이터 혹은 정보를 UI 코드에 저장하거나 하는 일은 없다.

View

View 는 앱을 사용자에게 '어떻게 보여 줄지' 에 대한 것이다. View 는 Model 로부터 정보를 받고 이를 표현한다. 즉, View 는 항상 Model 의 현재 상태를 반영한 것 이다. 따라서, 대부분의 경우 View 는 상태(State) 라는 것이 없고, Model 의 현재 상태를 표현할 뿐이다.

 

View 는 immutable 하기 때문에 전체 body 를 rebuild 하는 것 외엔 View 를 수정하기 힘들다. 따라서, View 의 생김새는 전적으로

body 에 의해 결정(Declarative)된다.  그러므로 View 는 Model 의 변화에 대해 항상 효율적으로 반응(Reactive)한다.

ViewModel

View 를 Model 에 Bind 하여 Model 의 상태 변화에 대해서 반응하고 Rebuild 할 수 있도록 한다. Model 의 다양한 데이터 표현 방식을 View 에서 단순히 표현할 수 있도록 하는 Interpreter 역할이라 할 수 있다. (e.g. SQL Data Model 을 View 에서 배열로 표현.) 반대로 View 에서 파악한 사용자의 의도를 처리하기도 한다.

 

예를 들어, 항공 예약 사이트에서 표를 예매하는 과정을 View 에서 받으면 그 과정을 처리하고 Model 의 정보를 수정한다. Model 에 변화가 생겼으므로 다시 ViewModel 에게 변화가 알려지고 ViewModel 이 해당 변화를 Publish 하면 Subscribe 하는 View 들이 Rebuild 

된다.

MVVM 의 특성

MVVM 모델에서 View 는 항상 ViewModel 을 통해서만 Model 의 Data 를 얻어 올 수 있다. ViewModel 은 항상 Model 의 모든 변화를 주시하고 변화가 생기면 즉시 전체 시스템에 Publish. 이를 Subscribe 하는 View 들은 해당 변화를 받아들여 Rebuild 한다. 

 

ViewModel은 View 와 연결되지 않기를 원한다. 따라서, ViewModel 의 Publish 를 듣고 싶은 View는 스스로 Subscribe 해야 한다.

 

또한, MVVM 구조는 지역성이라는 특성을 가지는데 이는 View 를 그리는 모든 코드가 body 에 선언되어 있다는 Code 의 지역성과 View 가 단계적으로 그려지지 않고 한 번에 그려진다는 생성 시간의 지역성을 의미한다. 이러한 지역성은 MVVM 구조를 User Interface Programming 에 적합한 구조로 만든다.