클린 아키텍처는 총 4가지 계층으로 되어있습니다.
관심사를 분리시키기 위함.
아키텍처가 동작하기 위해서는 의존성 규칙을 지켜야 합니다. 즉, 각 분리된 클래스가 한가지 역할만 하고 서로 의존을 어떻게 할지 규칙이 정해져있고 지켜야한다는 것입니다.
엔터티는 가장 일반적인 비지니스 규칙을 캡슐화하고 DTO( Data Transfer Obeject ) 도 포함하는 전사적 비즈니스 규칙입니다. 외부가 변경되면 이러한 규칙이 변경 될 가능성이 가장 적습니다.
유즈케이스는 Intereactor라고도 하며 소프트웨어의 애플리케이션 별 비즈니스 규칙을 나타냅니다. 이 계층은 데이터베이스, 공통 프레임 워크 및 UI에 대한 변경으로부터 격리됩니다.
인터페이스 어뎁터는 데이터를 Entity 및 UseCase의 편리한 형식에서 데이터베이스 및 웹에 적용할 수 있는 형식으로 변환합니다. 이 계층에서는 MVP의 Presenter, MVVM의 ViewModel 및 게이트웨이(Repositories)가 포함됩니다. 즉 순수한 비즈니스 로직만을 담당하는 역할을 하게 됩니다.
프레임워크와 드라이버는 웹 프레임 워크, 데이터베이스, UI, HTTP 클라이언트 등으로 구성된 가장 바깥 쪽 계층입니다.
Entity 레이어를 따로 두지않고 일반적으로 Presentation, Domain, Data 총 3개의 계층으로 크게 나누어 집니다.
UI(Activity, Fragment), Presenter 및 ViewModel을 포함합니다. 즉 화면과 입력에 대한 처리 등 UI와 직접적으로 관련된 부분을 담당합니다. 또한 Presentation 레이어는 Domain과 Data레이어를 포함하고 있다는 특징이 있습니다.
애플리케이션의 비즈니스 로직을 포함하고 비즈니스 로직에서 필요한 Model과 UseCase를 포함하고 있습니다. UseCase는 보통 한 개의 행동을 담당하고 이름만 보고도 무슨 기능을 가졌을지 짐작하고 구분할 수 있어야합니다. 추가로 Domain 레이어는 Presentation, Data 레이어와 어떤 의존성도 맺지 않고 독립적이다는 특징이 있습니다.
Repositoy 구현체, Cache, Room DB, Dao, Model 서버API(Retrofit2)를 포함하고 있으며 로컬 또는 서버 API와 통신하여 데이터를 CRUD하는 역할을 합니다. 또한 Mapper 클래스도 포함하고 있는데 DB로 부터 받아온 데이터모델과 UI에 맞는 데이터모델간의 변환을 해주는 역할을 합니다. 추가로 Domain 레이어를 포함하고있다는 특징이 있습니다.