작년에 처음 Clean Swift(VIP 패턴)을 접했을 때 비즈니스 로직을 쉽게 분리해서 테스트 코드를 짜기가 용이하다는 점이 마음에 들었다. MVC 패턴을 사용할 때는 Model에 들어갈 로직도 ViewController에 넣게 되고, 그러다보면 정말로 Massive View Controller가 되기 쉬웠는데 VIP 패턴으로 코드를 짜보니까 확실히 로직 분리를 의식적으로 할 수 있었다.
Clean Swift (VIP Pattern)
1. VIP (ViewController, Interactor, Presenter)
Clean Swift는 VIP Component들을 활용하기 때문에 VIP Pattern으로도 불린다. VIP는 각각
- ViewController - 화면 업데이트 담당
- Interactor - 비즈니스 로직 담당
- Presenter - Interactor의 비즈니스 로직을 통해 처리된 데이터를 받아 화면에 노출할 수 있도록 데이터 변경
로 역할이 구분되며 데이터가 ViewController에서 Interactor, Interactor에서 Presenter, Presenter에서 다시 ViewController로 흐르기 때문에 아래 이미지 처럼 단방향 플로우가 된다. 이때 VIP는 각각의 다음 Component를 참조하는데 모든 곳이 Strong으로 연결되면 순환참조가 일어나기 때문에 Presenter에서는 ViewController를 Weak으로 가진다.
각 Component는 필요한 메서드 또는 프로퍼티를 프로토콜로 관리한다.
- ViewController는 Display Logic 프로토콜을 채택하여 구현
- Interactor는 Business Logic 프로토콜을 채택하여 구현
- Presenter는 Presentation Logic 프로토콜을 채택하여 구현
각 Component는 연결된 다음 Component에게 요청을 하게 되는데 (메서드 호출) 메서드 호출 시 필요한 파라미터를 넘겨준다.
위의 그림처럼 ViewController는 Interactor에 있는 비즈니스 로직 호출을 할 때 Request에 필요한 데이터를 담아 넘겨준다. Interactor에서는 필요한 로직을 처리한 뒤에 그 결과값을 Response에 담아 Presenter에 넘겨준다. 마지막으로 Presenter는 ViewController가 화면에 정상적으로 값을 표현할 수 있도록 Response의 데이터를 가공해 ViewModel에 담아 ViewController로 넘겨주면 ViewController에서 화면 갱신이 일어나게 된다.
2. Worker
코어데이터나 서버와 통신이 필요할 경우, Interactor에서 처리하는 것이 아닌 Worker에서 처리하도록 분리할 수 있다. Worker에서 필요한 값을 fetch한 후에 Interactor로 넘겨주게 된다. 외부 라이브러리를 사용해야 하는 경우 Worker로 빼두어야 한다. 실제로 API를 조회할 때 사용하는 코드를 Worker로 분리했었는데 이렇게 하면 API 코드에 대한 의존성이 Worker에만 잡혀서 Interactor를 테스트하기 용이했다.
3. Router
다른 화면으로 전환해야 하는 경우 사용한다. 넘겨주어야 하는 데이터가 있는 경우 Router를 통해 화면 전환할 때 함께 보내준다.
Clean Swift 홈페이지에서 Xcode Template을 신청할 수 있으니 신청해서 사용하면 좋을 것 같다. 예제 코드도 github에 올라온 게 있어서 코드를 보며 공부하면 이해가 빠를 것 같다. 더 쉬운 예제 코드를.. 만들어볼 수 있으면 다른 게시글로 올려봐야겠다....
'iOS' 카테고리의 다른 글
[iOS] UITableView 알아보기 (2) - UITableViewDelegate, UITableViewDataSource (0) | 2021.10.07 |
---|---|
Apple Developer Documentation에서 API Changes 확인하기 (0) | 2021.10.07 |
[iOS] UITableView 알아보기 (1) - UITableView, UITableViewCell이 뭐야? (0) | 2021.10.05 |
[iOS] UIView에 border 추가하기 / 모서리 둥글게 하기 - 코드, 스토리보드 (0) | 2021.09.09 |
[iOS] MVC Pattern + 예제코드 (0) | 2021.09.06 |