Open eeeesong opened 3 years ago
Model - 앱의 데이터 관리
Model
View - 유저 인터페이스 표현, 관리
View
Controller - Model과 View 사이 다리 역할
Controller
View와 Controller의 강한 연결성이 가장 큰 문제 → 오로지 Model만 테스트를 진행할 수 있으며, Controller가 View의 역할까지 일부 떠안고 있다고 할 수 있음 그러나 구현이 간단하다.
Model - 데이터 관련
View - 시각적인 요소들. VC도 여기에 포함됨
Presenter - Model로부터 갱신된 데이터를 받아와서 View를 업데이트하는 역할
Presenter
참조에 의한 의존성은 존재하지만, MVC 보다는 역할이 적절하게 나뉘어 있음 → 단, Presenter를 구현하기 위한 추가 코드 필요 & 구현이 조금 더 어려워진다.
View - 유저 인터페이스 표현, 관리 (ViewController도 여기에 포함)
ViewModel - 중간 역할. Ready-To-Display 상태로 값을 가지고 있다.
ViewModel
역할 분리 뛰어남. 그러니 테스트도 수월. 사용성도 나쁘지 않음. Binding하기 때문에 코드가 많이 줄어들 것이다. ViewModel의 코드가 방대해질 수는 있음. → Builder나 Router를 도입하여 해결하기도 함
"Lego building experience transferred into the iOS app design"
그 레고 블럭들을 얼마나 작게 만들 것인지는 당신의 손에 달려 있다.
Use Case 기반의 앱 디자인 → 복잡한 앱을 어떻게 작은 Use Case 단위로 나눌 것인가?
View - Presenter의 요청에 따라 데이터 디스플레이, 사용자 입력을 Presenter에 전달 (VC 여기)
Interactor - Entity를 조작. 비즈니스 로직 포함
Interactor
Presenter - Interactor에서 데이터를 가져오고, View에 보여줄 타이밍 결정
Entity - 모델 객체. 속성만 있는 Dumb Model
Entity
Router - 화면 전환 담당. WireFrame이라고도 함
Router
WireFrame
역할 분리라면 이 패턴을 따라갈 수 없다. 하지만 사용성 측면에서... 엄청난 양의 인터페이스를 작성해야 하기 때문에 고려가 필요함.
VIPER와 객체 역할 분리 동일하나, 플로우를 다른 관점에서 본다.
Scene을 기준으로 구조가 생성되어 있는 것이 특징
Controller를 위해 일해줄 여러 컴포넌트들, 이들 사이의 소통은 Protocol을 통한다.
Model - Entitiy의 역할을 하는. 단순 데이터 객체들
Router - Controller 사이의 화면 전환과 데이터 전달 담당
Worker - Core Data, Networking 등 구체적인 일을 하는 Worker
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-비교
좋은 아키텍처의 기준
Balanced Distribution - 객체의 역할이 확실하며 독립적인가? 역할 분배가 균형잡혀 있는가?
Testability - 테스트 진행 가능?
Easy of Use - 사용하기 쉬운가?
Unidirectional Data Flow - 데이터 흐름이 단방향인가?
자주 등장하는 패턴들
MVC
Model
- 앱의 데이터 관리View
- 유저 인터페이스 표현, 관리Controller
- Model과 View 사이 다리 역할MVP
Model
- 데이터 관련View
- 시각적인 요소들. VC도 여기에 포함됨Presenter
- Model로부터 갱신된 데이터를 받아와서 View를 업데이트하는 역할MVVM
Model
- 앱의 데이터 관리View
- 유저 인터페이스 표현, 관리 (ViewController도 여기에 포함)ViewModel
- 중간 역할. Ready-To-Display 상태로 값을 가지고 있다.VIPER
그 레고 블럭들을 얼마나 작게 만들 것인지는 당신의 손에 달려 있다.
Use Case 기반의 앱 디자인 → 복잡한 앱을 어떻게 작은 Use Case 단위로 나눌 것인가?
View
- Presenter의 요청에 따라 데이터 디스플레이, 사용자 입력을 Presenter에 전달 (VC 여기)Interactor
- Entity를 조작. 비즈니스 로직 포함Presenter
- Interactor에서 데이터를 가져오고, View에 보여줄 타이밍 결정Entity
- 모델 객체. 속성만 있는 Dumb ModelRouter
- 화면 전환 담당.WireFrame
이라고도 함VIP (a.k.a. Clean Architecture)
VIPER와 객체 역할 분리 동일하나, 플로우를 다른 관점에서 본다.
Scene을 기준으로 구조가 생성되어 있는 것이 특징
Controller를 위해 일해줄 여러 컴포넌트들, 이들 사이의 소통은 Protocol을 통한다.
Model
- Entitiy의 역할을 하는. 단순 데이터 객체들Router
- Controller 사이의 화면 전환과 데이터 전달 담당Worker
- Core Data, Networking 등 구체적인 일을 하는 WorkerInteractor
- Worker와 Presenter 사이의 연결 다리.Presenter
- 데이터가 사용자에게 표시될 모양새 결정특정 패턴이 확연하게 뛰어나지 않다. 한 앱에서 여러 아키텍쳐가 믹스되어 있는 모습은 아주 자연스러운 것이다.
참고
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-비교