MVVM 패턴은 MVC 패턴에서 Controller를 빼고 ViewModel을 추가한 패턴입니다.
MVVM 동작 과정
- 사용자의 Action들은 View를 통해 들어옵니다.
- View에 Action이 들어오면 ViewModel에 Action을 전달합니다.
- ViewModel은 Model에게 데이터를 요청합니다.
- Model은 ViewModel에게 요청받은 데이터를 응답합니다.
- ViewModel은 응답 받은 데이터를 가공하여 저장합니다.
- View는 Data Binding을 이용해 UI를 갱신시킵니다.
역할 및 동작 원리
View:레이아웃과 화면을 보여주는 역할
- 사용자 인터페이스를 담당하는 부분입니다.
- 사용자가 보는 화면을 표시하고, 사용자 입력을 처리합니다.
- 보통 XAML과 같은 마크업 언어를 사용하여 디자인됩니다.
ViewModel
- View와 Model 사이에서 중재자 역할을 수행합니다.
- View에서 발생하는 이벤트를 감지하고, 해당 이벤트에 맞는 비즈니스 로직을 수행합니다.
- Model과 상호작용하여 데이터를 가져오거나 업데이트하고, View에 데이터를 업데이트하는 역할을 합니다.
- View에 표시할 데이터를 가공하여 제공하는 역할을 합니다.
Model
데이터, 비즈니스 로직, 서비스 클라이언트 등으로 구성한다.
실제적 데이터
- View에 입력이 들어오면 ViewModel에게 명령을 합니다
- ViewModel은 필요한 데이터를 Model에게 요청합니다
- Model은 ViewModel에게 요청된 데이터를 응답합니다
- ViewModel은 응답 받은 데이터를 가공해서 저장합니다
- View는 ViewModel과의 Data Binding으로 인해 자동으로 갱신됩니다
MVVM 특징
언뜻 보기에는 MVP와 비슷한 부분이 많습니다. 그러나 MVP는 View와 Presenter 사이의 의존관계가 1:1로 형성되어있다면, MVVM은 View와 ViewModel사이의 관계가 1대n으로 되어있습니다. 또한 데이터 바인딩을 이용한다면 View와 ViewModel 사이의 의존성을 없앨 수 있습니다.
MVVM 패턴의 장단점
장점
- View와 Model이 서로 전혀 알지 못하기에 독립성을 유지할 수 있다
- 독립성을 유지하기 때문에 효율적인 유닛테스트가 가능하다
- View와 ViewModel을 바인딩하기 때문에 코드의 양이 줄어든다
- View와 ViewModel의 관계는 N:1 관계이다
- 유닛테스트를 하기가 좋습니다. 그 이유는 ViewModel에는 UIKit 관련 코드가 없고 Controller와의 의존성도 없기 때문이다
유닛테스트(Unit Test)는 하나의 메서드의 특정 루틴을 검사한다.
단점
- 간단한 UI에서 오히려 ViewModel을 설계하는 어려움이 있을 수 있다.
- 데이터 바인딩이 필수적으로 요구된다. 그래서 메모리 소모가 심하다.
- 복잡해질수록 Controller처럼 ViewModel이 빠르게 비대해진다. 표준화된 틀이 존재하지 않아 사람마다 이해가 다르다.(표준화 필요)
- View가 변수와 표현식 모두에 binding 될 수 있으므로 시간이 지남에 따라 관계없는 Presentation Logic이 늘어나고 이를 보완하기 위해 XML에 코드를 추가하게 된다. 이때 난해하게 코드가 증가된다면 유지보수 단계에서 어려움을 겪을 수 있다.
Data Binding
데이터 바인딩의 개념은 쉽게 말해 Model과 UI 요소 간의 싱크를 맞춰주는 것이라 할 수 있습니다. 이 패턴을 통해 View와 로직이 분리되어 있어도 한 쪽이 바뀌면 다른 쪽도 업데이트가 이루어져 데이터의 일관성을 유지할 수 있습니다. iOS에서 데이터 바인딩을 하는 방법은 다음과 같습니다.
- KVO
- Delegation
- Functional Reactive Programming
- Property Observer
728x90