mvc패턴은 UIKit을 사용해 개발하는 ios 앱에 주로 적용되는 소프트웨어 설계 패턴입니다.
Model, View, Controller의 앞글자를 딴 이름으로 각 컴포넌트의 특징은 다음과 같습니다.
모델은 데이터와 비즈니스 로직을 담당합니다.
데이터를 직접 제공하고 사용자의 인터랙션을 컨트롤러가 알려주면 그에 맞게 데이터를 업데이트하기도 합니다.
사용자에게 보여지는 화면을 담당하는 컴포넌트입니다.
Swift에서는 UIView
나 UILabel
등을 사용해 구현합니다.
컨트롤러는 Model
과 View
의 중간에서 서로의 중개자 역할을 합니다.
때때로 비즈니스 로직을 컨트롤러에서 처리하기도 하는데 권장되지 않습니다. Model과 View는 서로 의존하지 않고 Controller를 통해 상호작용합니다.
사용자가 View를 통해 인터랙션을 발생시킵니다.
Controller는 해당 이벤트에 맞게 Model에게 필요한 데이터를 받거나 View를 업데이트합니다.
Controller는 Model을 조작하고 Model은 View에 반영됩니다. 다시 View를 통해 Controller가 사용자 입력을 받게 되는 순환 구조이지만 직접적인 양방향 상호작용이 없습니다.
이런 단방향 구조는 각 컴포넌트의 결합과 의존성을 줄여 유지보수와 확장성을 더욱 높이게 됩니다.
앞서 언급했듯 각 컴포넌트는 분리되어있고 독립적이기 때문에 한 요소의 수정이 다른 요소에 끼치는 영향이 작습니다.
동일한 모델을 여러 View에서 사용하는 등 재사용성도 좋습니다.
다만 View와 Controller의 결합이 강해지는 경우가 생길 수 있습니다.
예를 들어 UI업데이트를 위해 세부적인 로직을 작성하며 의존성이 강해질 수 있습니다. 또는 스토리보드의 IBOutlet연결이 많아져 ViewController가 View에 종속되기 쉬워지는 경우도 있습니다.
이를 해결하기 위해 Delegate
, Coordinator
등의 패턴을 사용하거나 데이터 바인딩을 하는 등 책임 분리와 이벤트 처리를 외부로 분리하는 등 Controller가 정말 UI와 Model의 중간 매개체 역할에 집중하도록 하는 것이 좋습니다.
단 데이터 바인딩을 사용한다면 순수한 MVC 패턴과는 약간의 차이가 있습니다. MVVM과 MVC의 중간쯤 될 거 같습니다.
퍼가요 하트 물결