Viper패턴은 다른 MV(X)패턴들이랑 이름부터가 많이 다르다고 볼 수 있습니다.
Viper패턴은 어떤 점이 MV(X)패턴들이랑 다른지 알아봅시다.
우선 Viper패턴은 핵심은 데이터를 두 곳에서 관리한다.
기존 MV(X) 패턴 같은 경우는 Model에서 데이터를 관리하는게 대부분이었습니다.
하지만 Viper같은 경우에는 Interactor, Entity에서 데이터를 관리합니다.
우선 Viper패턴의 구조를 알아보겠습니다.

이렇게 Viper패턴이 동작하는데 하나씩 뜯어보겠습니다.
View
- ViewController를 포함하고 있습니다
- Presenter에 대한 참조를 보유하고 있습니다
- Presenter에서 호출해 자신을 변경할 수 있는 메서드를 내부에 보유합니다
Interactor
- 비즈니스 로직을 담고 있습니다 - API같은 데이터 관련 로직을 보유합니다
- Presnter에 대한 참조를 보유합니다
- Presenter에서 호출해 비즈니스 로직을 실행할 수 있는 메서드를 내부에 보유합니다
- 비즈니스 로직이 종료되고 필요할 경우 Presenter에 데이터를 전달합니다
Presenter
- View, Interactor 기반으로 데이터를 불러오고 화면에 적용하는 역할을 합니다
- View, Interactor, Router에 대한 참조를 보유하고 있습니다
- View한테 액션을 받아 Router에 화면 전환을 요청합니다
- View한테 액션을 받아 Interactor에 데이터를 요청합니다
Entity
- 단순한 데이터 모델입니다
- API기반으로 불러오는 데이터를 의미합니다
Router
- 화면을 언제 띄우는지 Navigation 로직을 가지고 있습니다
- Start()를 통해 생성, View, Interactor, Presenter를 생성하고 할당합니다
- 화면 전환을 수행할 수 있는 메서드를 내부에 보유합니다
Router에 의존성 주입, Application 모듈 간 데이터 전달, 연결을 진행하므로 VIPER패턴에서 굉장히 중요한 역할을 한다고 봐도 무방합니다.
VIPER의 장점
- 기존의 MVC 패턴의 Massive View Controller 문제를 일부 해결 가능합니다
- Router 존재로 기존 MVX패턴보다 확실한 책임분리가 가능합니다
- 단위가 독립적이라 테스트에 용이합니다
VIPER의 단점
- Presenter <-> View / Presenter <-> Interactor가 서로 보유하므로 양방향 통신을 합니다. 이로 인해 순환참조(데드락)에 걸릴 수 있습니다
- 기본 파일이 5개라 간단한 프로젝트를 진행해도 시간이 오래걸립니다
VIPER의 동작 방식
- Route에 DI를 하기 때문에 첫 View의 시작 페이지를 보여줍니다.
- View가 새로운 데이터가 필요하다고 Presenter에게 알립니다.
- Presenter가 Interactor에게 데이터를 요청합니다.
- Interactor는 Entity에게 데이터를 요청하고 비즈니스 로직을 구성합니다.
- Interactor는 Entity에게 받은 데이터를 가공 후 Presenter에게 전달합니다.
- Presenter는 Entity 데이터를 View에게 전달합니다
- View는 해당 Entity를 화면에 표시합니다.
결론: 세상에 많은 아키텍처들이 존재하지만 상황에 맞게 사용하는 것이 좋아 보인다!
참고자료 출처
이누의 개발성장기
동동이
night-Ohl
Vapor