Search
Duplicate

클린 아키텍쳐 + MVVM

Created
2023/09/22 01:05
Tags
태그

 클린 아키텍쳐 + 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에 의해 주입 받은 클로저를 사용하는 것이다.

 Reference