일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 글또
- Switch
- error
- uikit
- escaping
- calendar
- 화면전환
- apns
- PushNotification
- SWIFT
- NotificationCenter
- Observer
- viewlifecycle
- array
- http
- mvvm
- ScrollView
- segue
- self
- 고차함수
- SWIFTUI
- class
- CoreImage
- struct
- singleton
- Refresh
- IOS
- list
- Git
- Animation
- Today
- Total
seong_hye, the developer
UIKit) MVP Architecture에 대해 알아보기 본문
📘 MVP 아키텍쳐 (Model - View - Presenter)
사용자 인터페이스와 비즈니스 로직을 분리하기 위한 소프트웨어 설계 패턴
UI 로직 (View)과 비즈니스 로직 (Model)을 분리하고 중간에서 Presenter가 연결 역할을 맡는 구조
UIKit 기반 앱에서 많이 사용되고 MVC의 단점을 보완하는 데 적합함
테스트 용이성과 관심사 분리를 강조함
🔹 MVP 아키텍쳐 구성요소
Model
데이터, 비즈니스 로직, 네트워크 처리 등 앱의 핵심 기능 담당
데이터베이스, 네트워크 API, 로컬 저장소 등과의 상호작용을 처리하며 데이터 상태 변화를 관리
View
사용자 인터페이스(UI)로 UIView, ViewController, SwiftUI View를 의미
사용자의 입력을 받고 데이터를 표시함
가능한 단순하게 유지되어야 하며, 비즈니스 로직을 포함하지 않음
Presenter
View와 Model 사이의 중재자
View로부터 사용자 입력을 받아 Model을 업데이트하고 Model의 변화를 View에 반영함
View를 조작하지 않고, View에게 표시할 데이터만 전달
🔹 MVP 흐름 요약 및 특징
사용자 입력 -> View -> Presenter -> Model(비즈니스 처리) -> Presenter -> View 업데이트
➡️ Presenter는 View에 직접 접근하는 것이 아닌 프로토콜(인터페이스)을 통해 간접적으로 View를 갱신함
View와 Model이 직접 통신하지 않고 Presenter를 통해서만 상호작용함
View는 Presenter에 대한 참조를 가지고 있고 Presenter는 View 인터페이스를 통해 View를 조작함
각 컴포넌트의 책임이 명확하게 분리됨
🔹 MVP 예제
Model
struct User {
let name: String
}
Presenter
class GreetingPresenter {
private weak var view: GreetingViw?
private let user: User
init(view: GreetingView, user: User) {
self.view = view
self.user user
}
func didTapGreetButton() {
let greeting = "안녕하세요, \(user.name)님!"
view?.showGreeting(greeting)
}
}
View
protocol GreetingView: AnyObject {
func showGreeting(_ greeting: String)
}
class GreetingViewController: UIViewController, GreetingView {
private var presenter: GreetingPresenter!
private let nameLabel = UILabel()
private let greetButton = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
let user = User(name: "홍길동")
presenter = GreetingPresenter(view: self, user: user)
greetButton.setTitle("인사하기", for: .normal)
greetButton.addTarget(self, action: #selector(didTapGreet), for: .touchUpInside)
...
}
@objc private func didTapGreet() {
presenter.didTapGreetButton()
}
func showGreeting(_ greeting: String) {
nameLabel.text = greeting
}
}
🔹장점 & 단점
장점 | 단점 | ||
테스트 용이 | Presenter 로직은 View 없이 테스트 가능 | 구조가 복잡할 수 있음 | 간단한 화면에도 파일이 3개 이상 생김 |
View Controller 경량화 | UI 코드만 유지, 로직 분리 | SwiftUI와는 덜 어울림 | SwiftUI에는 MVVM을 활용 |
역할 분리 명확 | 유지보수 용이, 협업 효율 높임 | 의존성 순환 주의 | Presenter 순환 구조 주의 |
🔹 MVP와 다른 패턴과의 비교
vs MVC
MVC에서는 View가 Model을 직접 관찰할 수 있지만
MVP에서는 모든 통신이 Presenter를 통해 이루어짐
vs MVVM
MVVM은 데이터 바인딩을 사용해 View와 ViewModel이 자동으로 동기화되지만
MVP에서는 Presenter가 명시적으로 View를 업데이트함
🔹 MVP를 사용하는 상황
테스트 주도 개발(TDD)를 적용하고자 하는 경우
UIKit 기반 앱에서 ViewController가 너무 커지는 경우
복잡한 비즈니스 로직을 가진 경우
'IOS > UIKit' 카테고리의 다른 글
Swift) 책과 같이 페이지 넘기는 애니메이션에 대해 알아보기 (UIPageViewController) (0) | 2025.06.25 |
---|---|
UIKit) Calendar / Weekly Calendar 구현해보기 (2) | 2024.02.04 |
iOS) Calendar에 대해 알아보기 (0) | 2023.09.19 |
Swift) UISearchController에 대해 알아보기 (0) | 2022.11.08 |
Swift) UIActivityViewController에 대해 알아보기 (ShareSheet) (0) | 2022.11.06 |