디자인 패턴이란?
기술부채를 최소화하고 코드의 재사용 및 지속 가능성을 높인다. 쉽게 말해서 코드를 구조화시킬까에 대한 전략이다.
MVC
Model-View-Controller 로 이루어져 있다.
- Model : 데이터와 비즈니스 로직을 관리한다.
- View : 레이아웃과 화면을 처리한다.
- Controller : Model과 View사이를 이어주는 인터페이스 역할
모델(데이터), 뷰(UI), 컨트롤러(로직)

동작방식
- 사용자의 요청이 Controller에 들어온다.
- Controller는 요청에 맞게 Model을 업데이트한다.
- Controller에서 업데이트된 Model을 나타내줄 View를 선택한다.
- View는 업데이트된 Model을 사용자에게 보여주기 위해 UI데이터를 업데이트한다.
MVC패턴의 장점
- 서로 역할이 분리되어 각자의 역할에 집중할 수 있다.
-> 협업할 때 맡은 부분의 개발에만 집중할 수 있어 효율성증가(분업 가능)
- 동시다발적개발 : 백엔드 개발자와 프론트엔드 개발자 독립적으로 개발진행 가능
- 유지보수성, 애플리케이션의 확장성, 유연성 증가
- 중복 코딩의 문제점이 사라진다.
MVC패턴의 단점
- 복잡한 대규모 프로그램을 개발하게 되면 문제점이 발견됨
-> 다수의 View와 Model이 Controller를 통해 복잡하게 연결될 수 있기 때문에 Controller가 뚱뚱해지게 된다.
->이러한 현상을 Massive-View-Controller현상이라고 한다.
-> 수정시 테스트가힘들고, 파악이 어렵기 때문에 여러 Side-Effect를 불러오게 되는 문제점 발생
-> 그래서 MVC는 위 문제점을 보완하기 위해 다양한 패턴들을 파생시킴(MVP, MVVM, Flux, Redux 등)
MVP
Model - View - Presenter로 이루어져 있다
기존의 MVC패턴을 보안하기 위한 패턴이며 MVC의 Model View가 의존 관계였던걸 해결하기위해 고안된 패턴

동작방식
- 사용자의 입력이 view를 통해 들어온다.
- 데이터를 presenter에게 요청한다.
- presenter는 model에게 데이터를 요청한다.
- model은 presenter에게 데이터를 응답한다.
- presenter는 view에게 데이터를 응답한다.
- view는 응답한 데이터를 화면에 보여준다.
장/단점
- MVP패턴은 앱을 구성하는 코드를 기능단위로 분해(모듈화)하기 때문에 협업시 유리해진다.
- 모듈화를 했기 때문에 소스파일 관리,테스트가 용이 해진다 → 유지보수가 쉬워진다.
- view 와 model의 의존성은 해결되었으나 오히려 view와 presenter사이가 의존성이 강해졌다
- 프로젝트가 커졌을때 controller가 복잡했던 문제를 presenter가 복잡해져서 문제는 여전하다.
MVVM
Model - View - View Model로 이루어져 있다.현재 가장 많이 쓰이고 있는 디자인 패턴이다.
- Model : 앱 내에서 사용하는 데이터(struct)이다.
- View : 화면에 보여지는 UI요소(UIView, UIViewController)이다. MVC와는 다르게 UIViewController가 추가되었다.
- View Model : ViewModel: 이름 그대로 View와 Model 사이에 있는, 중계자이다.

동작방식
- 사용자의 요청이 View를 통해 들어온다.
- 사용자의 요청이 View에 들어오면 View Model에 요청을 전달한다
- View Model은 Model에 데이터를 요청한다.
- Model은 View Model에 요청받은 데이터를 응답한다.
- View Model은 응답받은 데이터를 가공하여 저장한다.
- Viwe는 View Model과 데이터 바인딩을하여 화면에 응답받은 데이터를 보여준다.
MVVM 패턴의 장점
- MVVM 아키텍처에서 각각의 모든 코드는 알갱이성(granular)을 유지하기 때문에
모든 내부적, 외부적 의존성을 코어 로직을 포함한 코드로부터 유지한다. (View와 Model 사이의 의존성이 없다.)
- 늘어나는 코드 알갱이 조각과 분리 경계로 인하여, 확장성이 높은 동시에 유지보수성을 얻게 된다.
→ 각각의 부분은 독립적이기 때뭉네 모듈화하여 개발할 수 있다.
- 뷰를 추상화해서 비즈니스 로직 뒤에 있는 코드가 줄어들게 한다.
- 로직과 프레젠테이션 계층은 느슨하게 결합된다.
- 어설픈 UI 자동화 도구 없이 테스트가 가능하다.
MVVM 패턴의 단점
- View Model의 설계가 쉽지 않다.
- 데이터 바인딩이 필수적으로 요구된다.
- 복잡해질수록 Controller처럼 ViewModel이 빠르게 비대해진다.
- 표준화된 틀이 존재하지 않아 사람마다 이해가 다르다.
+) Data Binding
데이터 바인딩 : Model과 UI 요소 간의 싱크를 맞춰주는 것
MVVM 참고 사이트
https://velog.io/@leeesangheee/Swift-MVVM-%ED%8C%A8%ED%84%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
MVC와는 다른 MVVM의 특징
- 뷰컨트롤러가 모델에 직접 접근하지 못한다.
- 뷰컨트롤러가 뷰 레이어에 포함된다.
