[iOS] MVVM Architecture

Emily·2024년 12월 26일

MVVM 패턴은 Model-View-ViewModel로 이루어져 있다. MVC 공부할 때도 느꼈지만 Model이랑 View는 서로 연결도 안되어있는데 이름엔 왜 붙어있는지 모르겠다. 하여튼, MVVMMVC에서 ControllerViewModel이 대체하는 모습이다. 그럼 이제 Controller는 무슨 역할을 하는 걸까? → View에 포함된다고 한다.

MVC 패턴에서 이미 ControllerView와 강하게 결합되어 있었다. 애플이 처음 UIKit을 설계할 때 MVC Architecture를 추구하며 설계했는데, 이때 애플이 추구한 MVC의 목표는 View와 Model의 완전한 분리였다. UI를 그리는 로직과 데이터를 다루는 로직을 분리하여 관리해야 좋기 때문이다.

하지만 UIViewController 가 View의 생명주기와 View의 레이아웃을 관리하기 때문에 ViewController로부터 독립적으로 존재할 수 없는 구조가 되었다. 게다가 데이터 조작이나 네트워크 요청 코드도 Controller 안에 작성하게 되어 Controller의 책임이 너무 비대해진다(massive)는 문제가 생기게 되었다. 이에 대한 대안으로 주목 받은 것이 MVVM이라고 한다.

강의자료 보고 직접 만든 다이어그램

우선 흐름을 보면, View의 이벤트 전달 → ViewModel이 데이터 업데이트를 명령 → Model이 데이터 변경을 알림 → ViewModelView와 바인딩 순이다.

View : 사용자에게 보이는 UI를 구성하고 사용자의 입력 처리
Model : 데이터를 담는 구조체
ViewModel : ViewModel의 중재자

여기서 중요한 것은, MVC에서도 마찬가지였지만 ViewModel의 완벽한 분리다. ViewModel을 통해 서로의 업데이트를 주고 받는다. 그리고 또 한가지, ViewModelUser Action을 받지 않는다. ViewViewModel을 관찰하며 UI를 업데이트(데이터 바인딩)한다. 특히 옵저버 패턴 적용을 통해 ViewModel이 갖고 있는 데이터에 변경이 발생하면 View가 업데이트 되도록 한다. 이 때, ViewModelView의 존재를 정확히 몰라도 된다.

View를 그리는 UI 로직Data를 처리하는 비즈니스 로직의 분리가 MVVM의 두드러지는 특징이며, 이는 테스트 코드를 작성하기 용이하다는 뜻이다. 그리고 네트워크 통신 코드 등을 더이상 Controller가 가질 필요가 없어 Controller가 많이 가벼워진다.

profile
iOS Junior Developer

4개의 댓글

comment-user-thumbnail
2024년 12월 28일

뷰컨과 뷰는 어떤 기준으로 분리하나여???
기존과 동일하나요??

1개의 답글
comment-user-thumbnail
2024년 12월 28일

View ,ViewModel 바인딩 하는 아이디어는 어떤게 있을까요 ?

1개의 답글