swift - MVVM, MVC의 차이

PectoralisHeok·2023년 7월 6일
post-thumbnail

평소에 UIKit를 사용해서 UI를 구성하여 MVC패턴으로 개발을 하는데 최근에 너무 프로젝트의 특성을 무시한채 정형화된 틀에서만 개발을 한다고 생각이 들어서 공부를 해보았다

📌 디자인 패턴이란?

디자인 패턴은 소프트웨어 디자인에서 반복적으로 발생하는 문제에 대한 해결책을 제공하는 구조화된 접근 방식입니다.

이렇게 보면 정확하게 감이 안 온다.
내가 이해한대로 적어보면 프로젝트 성격에 따라 개발하는 다양한 설계원칙이라고 쓰면 더 잘 이해가 되지 않을까?

패턴의 종류로는 크게 생성패턴, 구조패턴, 행위패턴이 있다.

자세한건 여기를 보면 잘 설명되어 있다.


MVC (Model View Controller)

Model :
모델은 데이터와 비즈니스 로직을 담당하는 부분이고 데이터의 상태를 유지하고 조작하며, 비즈니스 규칙을 구현한다. ex) Class(클래스), Struct(구조체)

View :
뷰는 사용자에게 데이터를 표시하고 사용자와의 상호 작용을 처리하고 모델의 데이터를 표시하고 사용자 입력을 받아 컨트롤러에 전달한다

Controller :
컨트롤러는 모델과 뷰 간의 상호 작용을 관리하는 부분이고 컨트롤러는 뷰의 이벤트를 감지하고, 모델을 업데이트하며, 필요에 따라 뷰를 업데이트 한다 또한, 모델의 변경 사항을 감지하여 뷰에 반영함.

사진을 봤을때 딱 봐도 컨트롤러가 하는일이 많은게 보인다.
뷰와 모델의 상요작용을 할때 컨트롤러를 지나쳐야 되기 때문에 프로젝트가 커진다면 Controller의 코드 양 또한 방대해진다.
그리고 서로 독립성이 없기 때문에 테스트하기 어렵고 재사용성 또한 떨어진다.

그래서 모델만은 독립성을 가진 CocoaMVC가 나온다


View가 Model에서 직접 데이터를 가져오는 것이 아니라 Controller가 관리한다
하지만 아직 View와 Controller 사이 독립성이 없기 때문에 Controller가 비대한거는 마찬가지이다.

📌 MVC 정리

뷰는 컨트롤러에 사용자 입력을 전달하고, 컨트롤러는 모델의 데이터를 업데이트하고 뷰를 갱신하는 컨트롤러가 많은 일을 하는 패턴이라고 정리한다

장점: 개발자들과 친숙하여 나중에 나오는 뷰모델 등등 추가할것이 별로 없어 개발하기 편하다
단점: 컨트롤러가 다 한다(비대하다) -> 큰 프로젝트 일수록 유지보수가 힘들다.

MVVM (Model View ViewModel)

Model:
모델은 데이터와 비즈니스 로직을 담당하는 부분이고 데이터의 상태를 유지하고 조작하며, 비즈니스 규칙을 구현한다. ex) Class(클래스), Struct(구조체)

View:
뷰는 사용자에게 데이터를 표시하고 사용자와의 상호 작용을 처리하고 모델의 데이터를 표시하고 사용자 입력을 받아 뷰모델과 상요작용함

ViewModel:
뷰 모델은 뷰와 모델 사이에서 중개자 역할을 합니다. 뷰 모델은 뷰에 표시될 데이터를 가지고 있으며, 뷰에 대한 동작 및 상태를 제어한다.뷰 모델은 모델로부터 데이터를 가져와서 가공하고, 뷰에게 필요한 데이터를 제공한다. 뷰 모델은 뷰에게 데이터의 변화를 알리고, 사용자 입력을 처리하여 모델을 한다.

MVVM 패턴에서는 ViewController가 View라고 생각하면 된다.
MVVM 패턴에서 가장 큰 특징은 데이터 바인딩이다.

📌 데이터 바인딩이란?

간단하게 말하면 한쪽이 변하면 다른 한쪽도 변하는 제약관계라고 할 수 있다.

종류로는 크게 양방향, 단방향이 있는데 지금은 양방향이다.
그리고 데이터 바인딩을 하는 방법은 KVO, Delegation, Property Observer, RxSwift가 있다.

뷰와 뷰 모델 사이에 양방향 데이터 바인딩을 설정하여 뷰의 상태와 뷰 모델의 데이터를 동기화할 수 있고. 이를 통해 데이터의 변경이 자동으로 뷰에 반영되고, 사용자 입력이 뷰 모델에 전달되어 데이터의 업데이트가 이루어진다.
MVVM 패턴은 특히 SwiftUI와 같은 선언적인 UI 프레임워크에서 잘 작동하며, iOS 및 macOS 애플리케이션 개발에서 많이 사용된다. 이 패턴을 사용하면 코드의 재사용성과 유지보수성을 향상시키고, 개발자가 비즈니스 로직과 UI 로직을 분리하여 개발한다.

📌 MVVM 정리

뷰는 뷰모델에 전달하고, 뷰모델은 데이터를 동기화하는 뷰 모델이 모델을 소유하는 패턴이다.

장점: 뷰와 컨트롤러를 분리해놓아서 서로 테스트를 하기 용이하다 -> 유지보수가 쉽다
단점: 구조만 정의되어있지 규격화 된 것이 없기 때문에 배우기도 어렵고 개발자에 따라 설계 방식이 다 다르다.

참고

https://leemyungjic.tistory.com/24
https://github.com/jeonyeohun/Design-Patterns-In-Swift

profile
공부하고 소통하는 공간

0개의 댓글