MVC
MVC 패턴은 Model-View-Controller의 구조를 가지는 디자인 패턴으로, UIKit 프레임워크에서 자주 사용되는 디자인 패턴입니다. UIKit 프레임워크는 MVC 패턴을 기반으로 구성되어 있습니다.
Model-View-Controller는 각자 다른 역할들을 가지고 있습니다.
Model
- 앱에서 사용되는 데이터와 비즈니스 로직을 담당합니다.
- UI와 독립적으로 이루어져 있으며, 데이터 저장 및 가공, 네트워크 요청 처리 등을 수행합니다.
- 값이 변경되는 데이터를 Model이 가지고 있는 경우에는 Notification과 KVO 등을 통해 Controller에 변경 사항을 전달합니다.
View
- 사용자에게 화면을 표시하는 역할을 담당합니다.
- 버튼, 레이블, 이미지 등의 **UI 요소들(UIView, UIButton, UILabel 등)**을 포함합니다.
- 사용자의 입력을 받아 Controller에 이벤트를 전달하지만, 비즈니스 로직은 포함하지 않습니다.
- Model과 View는 직접적으로 접근할 수 없습니다.
Controller
- Model과 View를 연결하는 역할을 수행합니다.
- View의 이벤트를 받아 Model을 업데이트하고, 변경된 Model 데이터를 View에 반영합니다.
- 서로 접근할 수 없는 Model과 View는 Controller를 통해 소통할 수 있게 되는 것입니다.
- 일반적으로 UIViewController가 Controller의 역할을 수행합니다.
MVC 패턴의 장점과 단점은 다음과 같다고 생각합니다.
장점
- 애플(UIKit)에서 기본적으로 지원하고 있는 패턴이라 쉽게 적용할 수 있으며, ViewController가 Controller의 역할을 수행하는 방식으로 동작합니다.
- 다른 패턴에 비해 코드량이 적어 효율적입니다.
- 개발속도가 빠르기 때문에 아키텍쳐가 크게 중요하지 않고, 규모가 작은 프로젝트에서 사용하기 편합니다.
단점
- Controller에 의존성이 너무 높습니다. → View와 Controller가 밀접하게 연결되어 있어 이 둘을 분리하기가 어렵습니다.
- ViewController에 너무 많은 코드가 작성되어 (Model 데이터 처리, @IBOutlet을 이용한 View와의 결합) 라고도 부릅니다.
- Massive View Controller
- (애플의 MVC 패턴은 기존의 MVC 패턴과 다르게 View와 Controller가 밀접하게 연결되어 있기 때문입니다.)
- 규모가 큰 프로젝트일수록 코드가 복잡해지기 때문에 유지보수하기 어려워집니다.
예시
저는 프로젝트를 진행할 때에 Model / Controller / View 폴더를 따로 구분하여 관리하였습니다. MVC 패턴을 기반으로 개발을 진행하니 코드의 역할이 명확하게 분리되어 가독성이 좋아짐을 느낄 수 있었습니다. 하지만 ViewController에 너무 많은 로직이 집중되는 경향을 발견할 수 있었습니다.
final class CinemaViewController: UIViewController {
private let cinemaView = CinemaView()
private let cinemaSection = ["최근검색어", "오늘의 영화"]
private var trendingDTO = TrendingDTO()
private var trendingMovie = TrendingResponse(page: 1, results: []) {
didSet {
DispatchQueue.main.async {
self.cinemaView.collectionView.reloadSections(IndexSet(integer: 1))
}
}
}
override func loadView() {
super.loadView()
view = cinemaView
}
override func viewDidLoad() {
super.viewDidLoad()
[configureNavigation(), configureProfileCard(),configureDelegate(), configureNotification()].forEach { $0 }
DispatchQueue.global().async {
self.fetchTrending()
}
}
}
위 코드는 ViewController의 일부인데, Model과 View를 선언하고, 로직을 정의하고, 이를 기반으로 다시 Model과 View에 데이터 및 결과가 전달되어 갱신되도록 구성되어 있습니다. ViewController가 데이터 요청과 UI 업데이트를 모두 담당하기 때문에 ViewController의 역할이 매우 비대해질 것임을 확인할 수 있었습니다.
728x90
'iOS > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴] MVVM (Model-View-ViewModel) (0) | 2025.02.09 |
---|