huequad / interview

1 stars 0 forks source link

iOS 아키텍처 훑어보기 - MVC, MVP, MVVM, VIPER, VIP #23

Open eeeesong opened 3 years ago

eeeesong commented 3 years ago

좋은 아키텍처의 기준

Balanced Distribution - 객체의 역할이 확실하며 독립적인가? 역할 분배가 균형잡혀 있는가?

Testability - 테스트 진행 가능?

Easy of Use - 사용하기 쉬운가?

Unidirectional Data Flow - 데이터 흐름이 단방향인가?


자주 등장하는 패턴들

MVC

http://labs.brandi.co.kr///assets/2018/20180227/02.png

Model - 앱의 데이터 관리

View - 유저 인터페이스 표현, 관리

Controller - Model과 View 사이 다리 역할

View와 Controller의 강한 연결성이 가장 큰 문제 → 오로지 Model만 테스트를 진행할 수 있으며, Controller가 View의 역할까지 일부 떠안고 있다고 할 수 있음 그러나 구현이 간단하다.


MVP

다이어그램

Model - 데이터 관련

View - 시각적인 요소들. VC도 여기에 포함됨

Presenter - Model로부터 갱신된 데이터를 받아와서 View를 업데이트하는 역할

참조에 의한 의존성은 존재하지만, MVC 보다는 역할이 적절하게 나뉘어 있음 → 단, Presenter를 구현하기 위한 추가 코드 필요 & 구현이 조금 더 어려워진다.


MVVM

http://labs.brandi.co.kr///assets/2018/20180227/03.png

Model - 앱의 데이터 관리

View - 유저 인터페이스 표현, 관리 (ViewController도 여기에 포함)

ViewModel - 중간 역할. Ready-To-Display 상태로 값을 가지고 있다.

역할 분리 뛰어남. 그러니 테스트도 수월. 사용성도 나쁘지 않음. Binding하기 때문에 코드가 많이 줄어들 것이다. ViewModel의 코드가 방대해질 수는 있음. → Builder나 Router를 도입하여 해결하기도 함


VIPER

"Lego building experience transferred into the iOS app design"

그 레고 블럭들을 얼마나 작게 만들 것인지는 당신의 손에 달려 있다.

Use Case 기반의 앱 디자인 → 복잡한 앱을 어떻게 작은 Use Case 단위로 나눌 것인가?

http://labs.brandi.co.kr///assets/2018/20180227/05.png

https://www.objc.io/images/issue-13/2014-06-07-viper-wireframe_76305b6.png

View - Presenter의 요청에 따라 데이터 디스플레이, 사용자 입력을 Presenter에 전달 (VC 여기)

Interactor - Entity를 조작. 비즈니스 로직 포함

Presenter - Interactor에서 데이터를 가져오고, View에 보여줄 타이밍 결정

Entity - 모델 객체. 속성만 있는 Dumb Model

Router - 화면 전환 담당. WireFrame이라고도 함

역할 분리라면 이 패턴을 따라갈 수 없다. 하지만 사용성 측면에서... 엄청난 양의 인터페이스를 작성해야 하기 때문에 고려가 필요함.


VIP (a.k.a. Clean Architecture)

VIPER와 객체 역할 분리 동일하나, 플로우를 다른 관점에서 본다.

Scene을 기준으로 구조가 생성되어 있는 것이 특징

Controller를 위해 일해줄 여러 컴포넌트들, 이들 사이의 소통은 Protocol을 통한다.

https://hackernoon.com/hn-images/1*QV4nxWPd_sbGhoWO-X7PfQ.png

Model - Entitiy의 역할을 하는. 단순 데이터 객체들

Router - Controller 사이의 화면 전환과 데이터 전달 담당

Worker - Core Data, Networking 등 구체적인 일을 하는 Worker

Interactor - Worker와 Presenter 사이의 연결 다리.

Presenter - 데이터가 사용자에게 표시될 모양새 결정

장단점은 VIPER와 동일하다.


특정 패턴이 확연하게 뛰어나지 않다. 한 앱에서 여러 아키텍쳐가 믹스되어 있는 모습은 아주 자연스러운 것이다.

참고

http://labs.brandi.co.kr/2018/02/21/kimjh.html

https://github.com/protocorn93/iOS-Architecture

https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52

https://hackernoon.com/introducing-clean-swift-architecture-vip-770a639ad7bf

https://www.objc.io/issues/13-architecture/viper/

https://zetal.tistory.com/entry/swift-Architecture-mvcmvpmvvmvipervip-비교