수동적 인터페이스로 Model의 데이터를 보여주고, user commands에 대해서 routing한다.
3. Presenter
Presenter의 주요 역할은 다음과 같다.(Supervising Controller)
Model의 데이터를 적절한 포멧으로 View에 전달한다.
View에서 발생한 이벤트를 Model에 전달하여 Model을 업데이트 한다.
Presenter가 주요 비즈니스 로직을 갖게 된다.
Presenter는 UIKit에 의존적이지 않도록 구현한다.
Presenter 구현
View가 Presenter에 의존하도록 만들기 위해 View에 Presenter가 주입된다. 또한, Presenter는 View를 관리해야 하므로 View에 대해 알고 있어야 한다. 그래서 Presenter와 View는 서로 참조를 갖는 상황이 발생한다. 상호 참조 문제를 해결하기 위해 View에 주입되는 Presenter는 이를 약한 참조로 갖도록 한다.
class BooksPresenterImplementation: BooksPresenter {
fileprivate weak var view: BooksView?
}
class BooksTableViewController: UITableViewController, BooksView {
var presenter: BooksPresenter!
}
위와 같은 방식을 Presenter에 클로저를 주입하는 방식으로 처리할 수도 있다. 이 때는 View에 대한 처리를 View에서 Presenter쪽으로 주입하는 방식이므로, Presenter의 View에 대한 관리 개념이 약해질 수 있다.
class BooksPresenterImplementation: BooksPresenter {
var refreshTableView: (() -> Void)?
}
class BooksTableViewController: UITableViewController, BooksView {
var presenter: BooksPresenter!
func viewDidLoad() {
super.viewDidLoad()
presenter.refreshTableView = { [weak self] in
self?.tableView.reloadData()
}
}
}
4. 추가 Component - Router
ViewController 사이의 네비게이션, 화면 전환을 담당한다.
Router는 Presenter에 주입되어 presenter에서 Model 업데이트 혹은 user event 발생시 네비게이션 push/pop을 수행한다.
Router를 통해 ViewController의 네비게이션 수행을 없앨 수 있다.
Router는 Presenter와 1대1로 생성된다는 점에서 coordinator와 차이가 있다.
MVP의 장점
MVC 패턴에서 크게 벗어나지 않으면서 ViewController에 집중되는 역할을 분산할 수 있다.
Modern MVP
1. Model
2. View
3. Presenter
Presenter 구현
4. 추가 Component - Router
Router
를 통해 ViewController의 네비게이션 수행을 없앨 수 있다.Router
는Presenter
와 1대1로 생성된다는 점에서coordinator
와 차이가 있다.MVP의 장점
참고 자료