
평소에 UIKit를 사용해서 UI를 구성하여 MVC패턴으로 개발을 하는데 최근에 너무 프로젝트의 특성을 무시한채 정형화된 틀에서만 개발을 한다고 생각이 들어서 공부를 해보았다
📌 디자인 패턴이란?
디자인 패턴은 소프트웨어 디자인에서 반복적으로 발생하는 문제에 대한 해결책을 제공하는 구조화된 접근 방식입니다.
이렇게 보면 정확하게 감이 안 온다.
내가 이해한대로 적어보면 프로젝트 성격에 따라 개발하는 다양한 설계원칙이라고 쓰면 더 잘 이해가 되지 않을까?
자세한건 여기를 보면 잘 설명되어 있다.
Model :
모델은 데이터와 비즈니스 로직을 담당하는 부분이고 데이터의 상태를 유지하고 조작하며, 비즈니스 규칙을 구현한다. ex) Class(클래스), Struct(구조체)
View :
뷰는 사용자에게 데이터를 표시하고 사용자와의 상호 작용을 처리하고 모델의 데이터를 표시하고 사용자 입력을 받아 컨트롤러에 전달한다
Controller :
컨트롤러는 모델과 뷰 간의 상호 작용을 관리하는 부분이고 컨트롤러는 뷰의 이벤트를 감지하고, 모델을 업데이트하며, 필요에 따라 뷰를 업데이트 한다 또한, 모델의 변경 사항을 감지하여 뷰에 반영함.

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

View가 Model에서 직접 데이터를 가져오는 것이 아니라 Controller가 관리한다
하지만 아직 View와 Controller 사이 독립성이 없기 때문에 Controller가 비대한거는 마찬가지이다.
📌 MVC 정리
뷰는 컨트롤러에 사용자 입력을 전달하고, 컨트롤러는 모델의 데이터를 업데이트하고 뷰를 갱신하는 컨트롤러가 많은 일을 하는 패턴이라고 정리한다
장점: 개발자들과 친숙하여 나중에 나오는 뷰모델 등등 추가할것이 별로 없어 개발하기 편하다
단점: 컨트롤러가 다 한다(비대하다) -> 큰 프로젝트 일수록 유지보수가 힘들다.
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