seong_hye, the developer

UIKit) MVP Architecture에 대해 알아보기 본문

IOS/UIKit

UIKit) MVP Architecture에 대해 알아보기

seong_hye 2025. 9. 1.

 

📘 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가 너무 커지는 경우

복잡한 비즈니스 로직을 가진 경우


 

Comments