모델-뷰-컨트롤러(Model-View-Controller, MVC)는 애플리케이션의 구조를 명확하게 분리하여 개발과 유지 보수를 용이하게 하는 디자인 패턴입니다. MVC 패턴은 애플리케이션의 데이터(Model), 사용자 인터페이스(View), 그리고 데이터와 인터페이스 간 상호 작용을 관리하는 로직(Controller)을 분리합니다. 간단한 예제로 설명하겠습니다:
// Model
struct Person {
let firstName: String
let lastName: String
}
// View
protocol PersonView: AnyObject {
func setFirstName(_ firstName: String)
func setLastName(_ lastName: String)
}
// Controller
class PersonController {
private let person: Person
private weak var view: PersonView?
init(person: Person, view: PersonView) {
self.person = person
self.view = view
}
func viewDidLoad() {
view?.setFirstName(person.firstName)
view?.setLastName(person.lastName)
}
}
// 사용 예시
class PersonViewController: PersonView {
private let personController: PersonController
init(person: Person) {
personController = PersonController(person: person, view: self)
personController.viewDidLoad()
}
func setFirstName(_ firstName: String) {
print("First name: \(firstName)")
}
func setLastName(_ lastName: String) {
print("Last name: \(lastName)")
}
}
// 모델 인스턴스 생성
let person = Person(firstName: "John", lastName: "Doe")
// 뷰 및 컨트롤러 인스턴스 생성
let personViewController = PersonViewController(person: person)
// 출력: First name: John
// 출력: Last name: Doe
위 예제에서 Person
구조체는 Model 역할을 합니다. 이는 애플리케이션의 데이터를 저장하고 처리하는 역할을 담당합니다.
PersonView
프로토콜은 View 역할을 합니다. 이 프로토콜은 사용자 인터페이스를 업데이트하는 메서드를 정의하며, 실제 애플리케이션에서는 UI 구성 요소를 다루는 코드가 포함될 것입니다.
PersonController
클래스는 Controller 역할을 합니다. 이 클래스는 Model과 View 사이의 상호 작용을 관리하며, Model의 데이터를 가져와 View를 업데이트하는 로직을 포함합니다.
사용 예시에서 PersonViewController
클래스는 PersonView
프로토콜을 구현하며, PersonController
인스턴스를 생성하고 사용합니다. PersonController
의 viewDidLoad()
메서드를 호출하여 View를 업데이터로 업데이트합니다. 이 예제에서는 실제 UI 구성 요소를 사용하지 않고 콘솔에 출력하는 방식으로 구현되어 있지만, 실제 애플리케이션에서는 UIKit, SwiftUI 등을 사용하여 UI를 구성할 것입니다.
이 예제는 MVC 디자인 패턴을 사용하여 애플리케이션의 데이터, 사용자 인터페이스, 그리고 데이터와 인터페이스 간 상호 작용을 관리하는 로직을 분리하는 방법을 보여줍니다. 이 패턴은 애플리케이션의 구조를 명확하게 분리하여 개발과 유지 보수를 용이하게 하며, 코드의 가독성과 재사용성을 향상시킵니다.