아요 개발 일기
[iOS] MVP패턴 본문
안녕하세용 :o
오늘은 MVP 패턴에 대해서 공부해보도록 하겠습니다!!!
MVC나 MVVM은 워낙 유명해서 알고 있었지만, MVP?! 저는 처음 들어보는.. 친구였어요,,
공부하다가 알게된 새로운 친구! 같이 알아봅시다 🤔
MVP란?
Apple's MVC는 저번 글에 설명한 것처럼 UIView의 lifecycle에 의해 Controller가 강하게 연관되어있었죠?
그래서 Controller가 하는 일이 많아진다는(크기가 방대해짐) 단점이 있었습니다!!!
iOS가 이 문제를 해결하기 위해 Controller대신 Presenter 개념을 도입하여, Model + View + Presenter로 구성된 MVP 패턴을 만들었습니다.
Passive View는 life cycle과 아무 연관이 없고, 어떠한 레이아웃 코드도 presenter에 안 담겨있습니다.
즉, Presenter는 View의 데이터와 상태를 업데이트 해주는 역할만 맡습니다.
사진과 함께 이해해볼까요~~
MVC와 구조는 비슷한 것 같은데?!
하지만! MVP의 Presenter는 아까 말한 것과 같이 Passive View의 life cycle과도 연관이 없고, 독립적이에요.
그래서 View는 쉽게 mocked될 수 있으므로, Presenter에는 어떠한 layout code도 담겨있지 않답니다.
mocking
: unit test에서 쓰이는 핵심 기술로, 실제와 똑같은 fake 버전을 만들어 테스트하는 기술
예를 들어, 인터넷 요청을 받아 처리하는 코드를 작성했을 때 실제로는 인터넷을 통해서 오고가야하는데, 테스트 단계에서는 굳이 할 필요가 없어집니다.
이럴 때 실제로 네트워크를 통해서는 어떠한 요청도 수행하지 않으면서도 네트워크 동작을 정확히 제어할 수 있도록 테스트 코드에서 가짜 세션을 사용하여 테스트 (https://www.swiftbysundell.com/articles/mocking-in-swift/)
Apple's MVC와 MVP의 차이점
- MVC에서는 Controller가 UIViewController와 관련된 기능을 수행하지만,
MVP에서는 UIViewController subclasses들은 presenter가 아닌 Views입니다.
이러한 차이가 아주 큰 testability를 제공합니다. 다만, maunal data나 event binding을 만들어야하므로 개발 속도 비용을 고려해봐야합니다.
- manual data나 eventbinding을 만들어야함으로 개발 속도 비용도 같이 따라 옵니다.
- MVP는 입력을 view를 통해 받고, Presenter와 소통하기 때문에 view-presenter 1:1 소통으로 view와 presenter가 서로 의존하게 됩니다.
좋은 아키텍처 3가지 특정 측면에서의 평가
1. Distribution : 대부분의 책임을 Presenter와 Model이 가지고 매우 멍청한 View를 갖습니다
2. Testability : 바보같은 view로 인해서 비즈니스 로직을 테스트가 가능합니다. View와 Model이 완전히 분리가 되기 때문에 독립적으로 테스트가 가능합니다. (이전 MVC는 독립적인 테스트가 불가했는데 MVP는 View가 멍청해서 가능함)
3. Easy of use : 코드의 양은 MVC에 비해 2배로 들어나지만, 동시에 MVP의 아이디어는 아주 명료해집니다.