본문 바로가기
아키텍처+디자인패턴

MVVM + Clean Architecture

by 나리._. 2022. 10. 5.

안녕하세요. 이번 포스팅은 MVVM + Clean Architecture에 대해 정리해보겠습니다.

 

 

아래 링크의 프로젝트 기반으로 정리하였습니다.

https://github.com/kudoleh/iOS-Clean-Architecture-MVVM

 

GitHub - kudoleh/iOS-Clean-Architecture-MVVM: Template iOS app using Clean Architecture and MVVM. Includes DIContainer, FlowCoor

Template iOS app using Clean Architecture and MVVM. Includes DIContainer, FlowCoordinator, DTO, Response Caching and one of the views in SwiftUI - GitHub - kudoleh/iOS-Clean-Architecture-MVVM: Tem...

github.com

 

Clean Architecture

위 그림의 Clean Architecture 그래프에서 나타나듯이 서로 다른 계층들이 있으며

규칙은 내부 계층에서 외부 계층으로의 의존성(종속성)이 없어야 한다는 것입니다.

 

하지만 내부 계층에서 외부 계층의 무언가를 호출할 때, 그것을 알고 그것을 호출해야 하는 경우가 생깁니다. 따라서 이때, 의존성 역전 원칙 을 사용합니다.

 

* 의존성 역전 원칙 관련 포스팅은 아래를 참조해주세요 !

https://yesiamnahee.tistory.com/187

 

DIP (Dependency Inversion Principle)

의존성 관계 역전 원칙, DIP (Dependency Inversion Principle) DIP(의존 관계 역전 원칙)은 추상화된 것은 구체적인 것에 의존하면 안 되고 구체적인 것이 추상화된 것에 의존해야 한다는 개념입니다.

yesiamnahee.tistory.com

 

 

구성요소 (Presentaion, Domain, Data)

 

 

Domain Layer

- 가장 안쪽 계층으로 Entity(비지니스 모델), Usecase, Repository Interface를 포함하는 계층

- 도메인 계층은 모든 비지니스 로직을 담당하며 다른 계층에 의존하지 않음

- 재사용 가능 (다른 계층에 의존하지 않기 때문)

 

Presentation Layer

- 뷰를 그리는 모든 로직을 포함하는 계층

- View는 ViewModel에 의해 조정 (ViewModel은 View를 그려주는 로직만을 담당)

- Usecase가 비지니스 로직 담당 -> ViewModel이 하나 이상의 Usecase 사용

 

따라서, Presentation 계층은 Domain 계층에 의존합니다.

 

Data Layer

- 가장 바깥쪽 계층으로 Repository 구현체와 데이터 소스들을 포함하는 계층

- Repository는 데이터베이스나 API를 이용하여 관련 데이터를 request, response

- 받아온 데이터를 Domain 계층에서 활용할 수 있도록 Entity모델로 맵핑

 

마찬가지로 Data 계층 또한 Domain 계층에 의존하는 것을 알 수 있습니다.

 

 

Domain Layer의 Repository Interface는 Data Layer에 의존하지 않고 Repository 구현체들의 메서드들을 사용할 수 있게 만들어주는 Protocol입니다. 의존성 역전 원칙이 이렇게 쓰이는 것을 확인할 수 있습니다.

 

흐름 정리

  • View는 ViewModel의 함수를 부름 (Presentation Layer)
  • ViewModel은 Usecase를 실행 (Presentation Layer)
  • Usecase 유저와 Repository의 데이터를 결합 (Domain Layer) -> 이때 의존성 역전 사용
  • 각각의 Repository는 데이터를 리턴함 (by 네트워킹)  (Data Layer)