MVC, MVP, MVVM 디자인 패턴 정리

김상인·2024년 10월 24일

정말 오랜만의 포스팅이다. 이전 포스팅에서 나온 프로젝트를 끝낸 후, 이력서와 포트폴리오 정리도 하고, RxSwift에 대한 공부도 시작했었다. 파이어베이스와 연동하여 RxSwift를 적용해 각 SNS 로그인을 만들어보다가 바로 아이디어를 적용하면서 프로젝트 개발에 들어가 포스팅할 시간이 없었다. 그 전에 급하게 포스팅할 거리도 없었기도 하고,,
그러다가 오늘 새벽에 코드가 잘못되었는지 Firestore의 쓰기 작업이 갑자기 치솟으면서 하루 할당량을 다써버렸다. 그래서 진행이 멈춘겸 이거 나중에 정리하면 좋겠다 생각한 주제로 포스팅한다.

RxSwift를 공부했던 사람이라면 한번쯤 접하는 것 같은 곰튀김님의 "RxSwift 4시간에 끝내기"를 보면서 알아가던 중, 각 디자인 패턴에 대해 짧게 짚어주는 부분이 나왔었다. 그에 대한 설명을 정말 깔끔하게 잘해줘서 처음에 들었을 때 뭔가 깨달은 듯한 느낌을 줄정도였다. 그 쯤에 가끔씩 MVC와 MVVM에 대한 차이점을 느낌(?)으로만 알고 직접 설명하려니 말이 잘 나오지 않아서 혼자 곰곰히 생각해보던 시기라 그럴수도 있다. 암튼 각설하고 정리해보자.

MVC (Model-View-Controller)

UIKit을 활용할 때 많이 쓰이는 패턴이다. View는 화면을 담당하고, Model은 데이터를 담당하는데 그 외의 제어들은 Controller가 담당한다. 사용자의 어떠한 동작으로 Input이 들어오면 Controller가 받아서 그에 대한 처리, 로직에 대한 결과를 화면에 그려주기 위해 View에 전달하는 것도 Controller가 한다.
이런 모든 것들을 Controller가 담당하여 처리하니 볼륨이 있는 작업들은 Controller의 무게?가 무거워졌다.

이해하기 어렵다면 Model(Model)-Storyboard(View)-ViewController(Controller)로 작업했을 때 생각해보면 된다. 말그대로 스토리보드로 뷰를 그리고 모델에는 데이터 정의를 내려주고, 나머지 처리들은 ViewController에다가 코드를 짜서 ViewController만 코드 길이가 길이가 다른 담당에 비해 길었다. 그리고 ViewController에 기본적으로 view를 가지고 있어서 controller가 뷰에 다시 그려주는 역할까지 했었다.

MVP (Model-View-Presenter)

위와 같은 단점을 보완하기 위해 나온 것이 MVP라고 한다. 이 패턴은 직접 써보지 못해서 아 이런 형태인가? 하는 생각으로만 상상해봤다. 여기서는 Input, Output을 View에서 담당한다. 그래서 사용자에 의해 Input이 들어오면 Presenter에 알리게 되고, Presenter는 그와 관련된 로직들을 처리하게 된다. 처리 후의 결과를 View에 넘겨주어 Output으로 보여주게 된다.
나는 이 설명을 ViewController내의 view와 로직을 분리한 구조라고 이해했는데 직접 이 패턴을 겪어봐야 자세히 이해할 것 같다.

그런데 View와 그에 따른 로직처리 담당 Presenter가 필요하니, 매번 View를 생성할 때 마다 Presenter가 필요한 것이 단점이라고 한다.

MVVM (Model-View-ViewModel)

그래서 또 단점을 보완해준 것이 MVVM이라고 한다. 공통적인 부분은 ViewModel에서 처리해주면 되지!하는 것.
View에서 Input을 받아 ViewModel에 알려주게 되면 그와 관련된 로직을 처리한다. 여기서 또 다른 점은 ViewModel이 결과를 View에 넘겨주지 않는다는 것이다. View는 자기와 관련된 부분을 구독하여 지켜보고 변경되면 그 값을 View가 스스로 다시 그려내는 방식이다. 그래서 비슷한 결과값을 내는 것이 있으면 하나의 ViewModel을 공유하여 여러 View가 지켜보고 사용할 수 있는 것이다.

이게 SwiftUI를 활용할 때는 애매하게 이해했었는데 RxSwift를 공부하면서 구독 개념과 완전 비슷하니깐 이해도 되고 왜 MVVM과 RxSwift가 찰떡인지 알아가는 재미가 있었다.

지금 현재 진행하는 프로젝트에는 공부하면서 만들다보니 대부분 1:1의 View와 ViewModel 구조를 가지고 있는데 완성 후에 리펙토링이 필요해보인다. 사실 이런 공통적인 부분이 있어서 동일한 ViewModel에서 가져와도 되냐 고민하던 차에 챗지피티에 물어보니 구조상은 1:1이 좋다해서 반영한 것인데,,
n:1과 1:1의 각 장단점이 있는 것 같다.

위와 관련된 설명은 곰튀김님의 영상을 보는게 더 와닿을 것이니 무조건 추천한다.

profile
이것저것 해보기

0개의 댓글