클린 아키텍쳐 + MVVM
MVVM 패턴은 UI와 도메인의 관심사 분리를 깔끔하게 할 수 있게 도와준다.
클린 아키텍쳐와 같이 사용하면 Presentation과 UI Layer 사이의 관심사 분리를 돕는다.
ViewModel 에서는 UI 프레임워크를 포함시키지 않아 View에서 분리시켰고, 이 때문에 같은 ViewModel 을 사용하면서 다양한 View를 구현할 수 있다고 했다.
예를들어,
하나의 CarViewModel을 CarAroundListView와 CarAroundMapView에 모두 사용할 수 있다.
또한 한 뷰는 UIKit으로 만들고, 다른 뷰는 SwiftUI로 만들 수도 있다.
ViewModel에서 UIKit, WatchKit, SwiftUI를 import 하지 않는 것이 중요하다. 이 방법으로 필요할 때마다 다른 플랫폼에서 쉽게 재사용할 수 있다.
View와 ViewModel 사이의 데이터 바인딩은 클로저, delegate나 observables로 할 수 있다.
Combine과 SwiftUI도 사용할 수 있지만 지원하는 iOS가 13버전 이상이어야 한다.
View는 ViewModel에 직접적인 관계를 가지고 있으며, View에서 이벤트가 발생했을 때 ViewModel에 알린다. ViewModel에서는 View를 직접 참조하지 않는다.
🩷 요약!
Presentation Layer
•
UI와 관련된 부분
•
ViewController과 ViewModel을 포함한다.
•
ViewController는 화면에 보이는 요소들을 관리하고, 사용자의 액션을 viewModel로 전달한다.
•
ViewModel은 RxSwift와 같은 반응형 프로그래밍 라이브러리를 사용해 데이터 바인딩 및 상태 관리를 수행하며, Input과 Output을 통해 VIewController와 상호작용한다.
Domain Layer
•
애플리케이션의 비즈니스 로직을 처리한다.
•
useCase는 특정 사용 사례에 대한 비즈니스 로직을 포함하고, 필요한 데이터를 RepositoryProtocol을 통해 Data Layer로부터 요청한다.
•
Model은 비즈니스 엔티티를 나타내며, UseCase와 ViewModel 사이에서 데이터를 전달하는 역할을 한다.
Data Layer
•
데이터 관련 작업을 담당한다.
•
RepositoryProtocol은 데이터 소스로부터 데이터를 가져오는 방법을 정의한 인터페이스이며,
•
Repository는 이 인터페이스를 구현하여 실제 데이터 소스와의 통신을 담당한다.
•
DTO(Data Transfer Object)는 네트워크를 통해 데이터를 전송할 때 사용되는 객체로, Network Service는 네트워크 호출을 관리한다.
이 구조에서 중요한 점은 각 레이어가 서로의 구체적인 구현 대신 인터페이스를 통해 상호작용 한다는 것이다.
이를 통해 높은 수준의 모듈화와 유지보수성, 그리고 테스트 용이성을 달성할 수 있다.
Presentation Layer는 오직 ViewModel만을 알고 있으며,
Domain Layer는 비즈니스 로직에만 집중하고,
Data Layer는 데이터 저장과 검색에만 신경 쓴다.
이렇게 함으로써 각 레이어는 독립적으로 변경하고 테스트할 수 있다.
️ MVVMs Communication
Delegation
한 MVVM(Screen)의 ViewModel은 delegation 패턴을 사용해서 다른 MVVM(Screen)의 ViewModel과 소통한다.
Closure
소통하는 다른 방법은 할당되거나 FlowCoordinator에 의해 주입 받은 클로저를 사용하는 것이다.