Search
Duplicate

클린 아키텍쳐란?

Created
2023/09/15 06:01
Tags
태그

 클린 아키텍쳐란?

디자인 패턴 만큼 중요한 것이 구조적인 패턴을 사용하는 것이다. 모바일 SW 엔지니어링에서 가장 많이 사용되는 패턴들은 MVVM, Clean Architecture, Redux 패턴이 있다.
 Clean Architecture + MVVM 기본 개념 깃허브
iOS-Clean-Architecture-MVVM
kudoleh
이 그래프의 핵심은,
 안쪽 레이어에 있는 것들은 바깥 레이어에 있는 것들을 몰라야 한다. 즉, 안쪽 레이어에서 바깥쪽에 의존하지 말아야 한다.
DI와 DIP의 개념을 생각하면 안쪽 레이어에서 바깥쪽에 의존하지 말아야 한다는 말은 안쪽 레이어의 객체(클래스, 구조체 등등)가 바깥쪽 레이어의 객체를 내부에서 생성하면 안된다는 것이다.
그래서 위의 그래프에서도 dependency rule의 화살표가 안쪽으로 향하고 있다. 안쪽 레이어에 의존해야 한다는 의미이다.
이렇게 레이어를 나눴는데, 여기서 그룹을 지을 수 있다.
Domain Layer, Presentation Layer, Data Layer 가 있다.

 Domain Layer (Business Logic)

그래프의 가장 안쪽에 위치한 부분이다.
가장 안쪽에 있으므로 완전히 고립되어 있는 상태로, 바깥의 레이어들을 아무것도 모르는 레이어이다.
Entity(Business Model), UseCase, Repository Interface 를 포함한다.
이 레이어는 다른 프로젝트에서도 재사용 될 수 있다. 이렇게 레이어가 분리되서 다른 의존성이다 3rd Party가 필요하지 않기 때문에 앱을 테스트할 때 환경에 구애받지 않고, 따라서 도메인 UseCase 테스트를 몇 초 내에 할 수 있다.
→ 도메인 레이어의 핵심
다른 레이어(Presentation의 UIKit/SwiftUI나 Data 레이어의 Mapping Codable) 의 어떤 것도 포함시키면 안된다.

 Presentation Layer

UI (UIViewController / SwiftUI View) 를 포함한다.
각 View는 하나 이상의 UseCase를 실행시키는 ViewModel(Presenters)과 대응된다.
즉, 한 view에 대응되는 하나의 viewModel이 있다.
→ 위의 과녁 모양 그래프에서도 봤듯이, 도메인 레이어에만 의존하고 있다.

 Data Layer

Repository Implementation, 그리고 하나 이상의 Data Source를 포함한다. 위에서도 언급했듯이, Repository Interface는 도메인 레이어에 속했다.
Data Source는 원격이나 로컬일 수 있다.
원격일 경우는 API 호출을 통해 JSON 데이터를 내려 받는 경우가 되고,
로컬일 때는 데이터베이스일 것이다.
데이터 레이어는 오로지 도메인 레이어에만 의존하고 있다.
여기서 헷갈리지 말아야 하는 것은, 그래프에서는 안쪽의 Presenters, 바깥에 DB, API, UI 등등이 있었는데,
이 Presenters가 Presentation Layer에 대응 되고 가장 바깥의 영역이 Data 레이어에 대응되는 것은 아니다. 헷갈리면 위 그래프에서 빨간색으로 그린 원 참고
데이터 레이어에는 네트워크로 받은 JSON 데이터를 도메인 모델로 매핑하는 것을 포함시킬 수 있다.

 Data Flow

이 그림에서는 Dependency Direction과 Data Flow-Request/Response 로 각 레이어를 표현하고 있다.

 Data Flow

1.
View(UI)가 ViewModel(Presenter)의 메서드를 호출한다.
2.
ViewModel이 UseCase를 실행시킨다.
3.
UseCase가 User와 Repositories에서 데이터를 취합한다.
4.
각 Repository는 Remote Data(NW), Persistent DB 저장소나 메모리 데이터를 반환한다.
5.
반환된 데이터가 우리가 아이템들을 화면에 출력할 View에 전달된다.

 Dependency Direction

Presentation Layer → Domain Layer ← Data Repository Layer
Presentation Layer(MVVM)
ViewModels(Presenters) + Views(UI)
Domain Layer
Entities + UseCases + Repositories Interfaces
Data Repositories Layer
Repositories Implementations + API(NW) + Persistence DB
Ex)

 Reference