본문 바로가기

Android

Part.1 - Clean Architecture

728x90

클린 아키텍처

클린 아키텍처는 4개의 계층으로 분류되며, 계층의 분리를 통해 소프트웨어의 관심사를 계층별로 분리하는 디자인에 대한 철학입니다.

 

위에서 설명하는 아키텍처가 동작하기 위해서 의존성 원칙을 지켜야 합니다.

 

클린 아키텍처의 주요 원칙은 코드 종속성이 외부로부터 내부로 의존한다는 것입니다. 즉 내부 계층의 코드는 외부 계층의 기능을 알 수 없고, 외부 계층의 변수, 함수, 클래스(모든 엔티티)는 내부 계층에서 다시 등장할 수 없습니다. 

또한 데이터의 형식도 계층 간에 별도로 유지하는 것이 좋습니다.

 

예로 비즈니스 로직을 담당하는 ViewModel, Presenter 등이 DB 또는 서버 API 같이 구체적인 세부 사항에 의존하지 않아야 한다는 것입니다. 

 

장점

계층 간의 의존성을 단방향으로 만들어 코드의 재사용성이 용이, 단위 테스트가 원활

개발 후 새로운 기능 개발 시 안정적인 구현

계층화되어 각각의 기능이 명확하므로 버그를 파악에 용이

 

Entities 

엔티티는 비즈니스 규칙을 캡슐화하고 데이터의 구조 또는 메서드를 포함하는 객체입니다. 

외부에서 변경 사항이 생겼을 시 가장 최소한의 변경 사항을 가져야하며, 화면의 이동, 보안 등의 내용이 변경되더라도 엔티티 계층은 영향을 받으면 안됩니다.

 

네트워크나 데이터베이스와 관련된 클래스를 작성할 때 POJO와 같은 데이터 클래스, DTO(Data Transfer Object) 등이 포함되는 계층이라고 볼 수 있습니다.

 

Use Cases

유스케이스는 애플리케이션과 관련된 비즈니스 규칙을 나타내며, Entities로부터 데이터 흐름들을 관리하고, 유스케이스의 목적을 달성하도록 Entities에 넓고 전체적인 비즈니스 규칙의 사용을 가르킵니다. 

이 계층은 Entities에 영향을 미치지 않고, UI 또는 Framework 같은 외부 게층에서도 영향을 받지 않습니다.

 

안드로이드에서는 Model, Repository, Executor 등과 관련된 내용이 이 계층에서 속할 수 있습니다.

 

Interface Adapters(Presenter)

유스케이스, 엔티티로부터 얻은 데이터를 가공하여 UI에 적용할 수 있는 형식으로 변환하며, 아키텍처 디자인 패턴에서 흔히 말하는 MVP의 Presenter, MVVM의 ViewModel 등이 속합니다.

 

반대로 UI로부터 얻은 데이터를 내부 DB, 원격 서버에 전송할 경우도 이 계층에서 데이터를 가공한 후 전달합니다.

즉, 비즈니스 로직과 프레임워크 코드를 연결하는 역할을 합니다.

 

Frameworks, Drivers(UI)

가장 바깥쪽 계층으로 안드로이드에서는 UI(액티비티, 프래그먼트, 인텐트 전달)과 DB, 콘텐츠 프로바이더가 포함되며, HTTP 클라이언트(Retrofit)과 같은 네트워크와 관련된 프레임워크 코드가 이곳에 속합니다.

 

안드로이드에서 보통 Entity 계층을 나누지 않고 Controller(Interface Adapter) 등 직접적으로 접하지 않는 용어들이 사용하고 Frameworks, Dirvers 계층에 DB, 서버, UI가 포함되고... 안드로이드에서 사용하던 아키텍처 구조와 다른 용어, 계층 구조에 대한 설명 때문인지... 솔직히 위의 글만 봐서는 Entities와 Use Cases가 정확히 무엇을 의미하는지 이해가 어려웠습니다.

 

안드로이드에 맞추어진 클린 아키텍처 구조

 

https://qiita.com/koutalou/items/07a4f9cf51a2d13e4cdc

PresenterLayer

Activity, Fragment, ViewModel 등과 같은 UI와 관련된 계층으로, 1개 이상의 Use Case를 사용해 데이터를 기준으로 UI를 조작하기 때문에 Use case가 있는 Domain Layer에 의존합니다.

 

DomainLayer

비즈니스 로직을 처리하는 계층으로, Usecase는 1개 이상의 Repository를 받아 비즈니스 로직을 처리합니다. Usecase는 비즈니스 로직을 갖는 논리적 단위 또는 객체로 볼 수 있습니다. 

UseCase는 하나의 기능을 담당하고 UseCase의 이름만으로 어떤 기능을 담당하는지 구분할 수 있어야 합니다.

Domain 계층은 어떤 계층과도 의존성을 맺지 않는 독립적입니다.

 

DataLayer

Repository, DataSource를 가지며 Domain Layer에 의해 노출된 Interface를 구현하고 App에 데이터를 분배합니다.

즉, Room, DB, HTTP Client(Retrofit), Model 등을 포함하고 있으며, local 또는 서버와 통신을 통해 데이터를 조작하는 역할을 한다고 볼 수 있습니다. 

 

Domain Layer에 의존합니다.