좌: 오리지널 MVC, 우: Apple MVC
Presenter
의 역할: UIKit 독립적인 중재자
Presenter
는 View를 갱신하기 위해, View의 요소에 직접 관여합니다. 이러한 이유로 View를 소유하기 때문에 높은 의존성을 가지게 된다. 높은 의존성을 가지면 어떻게 될까? 테스터블하지 못하고, 재사용성이 떨어진다.
ViewModel
의 역할: UIKit 독립적인, 뷰 표현에 대한 책임을 가진 객체
의존성이 깨지기 때문에 테스트 용이성 향상, 재사용성 향상, 가독성 향상
MVVM에서 ViewModel이 무거워지는 문제를 해결하기 위해서, 뒤를 돌아보지 않는 단방향의 아키텍쳐인 MVI가 고안되었다. View에서 액션을 입력 받으면 Intent 에서 모델의 상태를 변환시키고, 그 변환된 상태의 모델을 뷰에 전달하여 유저에게 보여준다.
VIPER는 책임 분리의 원칙(SRP)
을 기반으로 한다.
View
: UI만을 담당. Presenter의 의지대로 UI를 update하기 때문에 Presenter 의존적이다.
Presenter
: UIKit 독립적인 중재자. View에게 받은 이벤트를 Interactor를 통해 처리, Router를 통해 화면 전환 처리를 하여 View에게 전달한다. View, Router, Interactor 의존적이다.
Interactor
: 비즈니스 로직을 담당, API 통신 등의 네트위킹이나 Entity(Data)에 대한 처리를 하고 결과를 Presenter에게 전달한다.
Router(WireFrame)
: 화면 전환과 각 구성 요소에 DI(의존성 주입)을 처리한다.
Entity
: 속성들을 가지고 있는 Data Model을 의미한다.
ViewController
: 화면 업데이트 담당
Interactor
: 비즈니스 로직 담당
Presenter
: Interactor의 비즈니스 로직을 통해 처리된 데이터를 받아 화면에 노출할 수 있도록 데이터 변경
Worker
: 네트워킹이 필요한 경우, Interactor에서 처리하지 않고 Worker에서 처리하도록 분리할 수 있다. Interactor와 Worker 모두 독립성이 보장된다.
Router
: 화면 전환 담당. 넘겨주어야 하는 데이터가 있다면 Router를 통해 함께 보내준다.
(VIP에 대한 추가적인 공부 후 업데이트)
Swift와 함께 사용되거나 자주 거론되는 아키텍처의 개요와 장단점을 정리하면서, 새로운 아키텍처가 계속해서 발생하는 이유는 표면적으로 책임을 분리하고 낮은 결합도를 가지기 위해서라는 생각이 들었다.
좋은 구조, 잘 짜여진 코드란 무엇일까? 개발자가 개발을 하는 이유는 문제를 해결하기 위해서라고 생각된다. 회사에 소속되어있다면 그 문제는 비즈니스 문제일 것이며, 많은 개발자들이 시간을 들여서라도 좋은 구조를 만들기 위해 노력하는 것은 결과적으로 비즈니스 문제에 대한 해결 방법이라는 (자신없는) 결론을 도출시켜 보았다.
책임을 분리하고 낮은 결합도를 가지는 것이 최종적인 장점이라고 볼 수는 없지 않을까? 이러한 장점들을 야기시켜서 개발자가 얻고자 하는 바가 무엇인지에 대해서 계속 고민해봐야겠다.
지금은... 모르겠다. 모르는 게 당연함.