클린 아키텍처의 등장
특정 수준 혹은 복잡도를 가진 애플리케이션을 위한 고품질 코드를 작성하려면 상당한 노력과 경험이 필요하다. 또한, 애플리케이션은 고객의 요구 사항을 충족 할 뿐만 아니라 유연하고 테스트 가능하며 유지 관리가 가능해야 한다.
이러한 문제에 대한 해결책으로 Robert C. Martin은 2012년에 Clean Architecture 개념을 제시 하였다.
클린 아키텍처의 개념
클린 아키텍처는 계층을 크게 나누어서 관심사를 분리, 각 분리된 클래스가 한가지 역할만 할 수 있도록 구현하는 방식이다.
모든 의존성 규칙은 반드시 외부에서 내부로 향해야 한다.
클린 아키텍처는 계층 구조에서 외부에서 내부로 의존성을 가지고 있기 때문에 내부로 갈 수록 의존성은 낮아지는 특징을 가진다. (위 그림에서는 원 안쪽으로 갈 수록 의존성이 낮아지는 것을 볼 수 있다.)
예를들어 위의 계층 이미지에서 가장 바깥의 DB와 가장 내부의 Entity를 보자.
DB의 기준으로 Entity가 변화(내부 계층이 변화) 하게 되면 DB 자체에서 저장할 데이터 타입이 변경될 가능성이 있는 등 내부의 변화로 동작을 행하는 계층에 영향을 미칠 수가 있게 된다. 하지만 Entity는 실제로 사용할 데이터 클래스이기 때문에 DB가 변경된다고 하더라도 Entity에는 아무런 영향이 없어야 하는 것이다.
반대로, Entity는 가장 내부에 있는 계층이기 때문에 다른 어떤 계층의 변화에도 영향을 받지 않으며, 오로지 자신의 변화만이 다른 계층에 영향을 끼칠 수 있게 된다.
이것이 DB(바깥 계층)가 의존성이 높고, Entity(내부 계층)이 의존성이 낮다는 의미이다.
클린아키텍처의 이점
- 쉽게 패키지 구조 탐색 가능
- 프로젝트의 유지 보수가 편리해진다.
- 새로운 기능을 추가 할 때 안정적으로 빠르게 적용이 가능하다.
안드로이드에서의 클린 아키텍처 구조
안드로이드에서의 클린아키텍처 구조는 Presentation, Domain, Data 총 3개의 계층으로 크게 나눠지 된다.
Presentation(UI) ->Domain , Data->Domain 방향으로 의존성이 있다.
Presentation 계층: Domain 계층에 의존성을 가지고 있는 계층, 화면과 입력에 대한 처리 등 UI와 직접적으로 관련된 부분을 담당한다.
- UI(Activity, Fragment)
- VM(각 화면에 사용될 ViewModel)
- DI
Data 계층: Domain 계층에 의존성을 가지고 있는 계층, 말 그대로 Data 들을 CRUD하는 계층이라고 생각하면 편하다.
- 서버나 DB 를 연결하는 역할을 하는 DataSource Interface와 구현부
- API 통신과 그 결과로 가져오는 Data Entity. 내부 DB (Room)과 DAO.
- 위의 데이터(서버, 로컬)를 사용하기 위한 Repository 구현부.
- Data 계층 데이터(받아오는 전체 데이터 형태)와 Domain 계층 데이터(실제로 사용하는 데이터 형태)로 변환해주는 Mapper 클래스
Domain 계층: 의존성을 가지고 있지 않은 계층. 비즈니스 로직에 필요한 Data Model과 UseCase가 포함되어 있는 계층이다. (Domain 계층은 독립적이다.)
- Usecase
- Reopository Interface
아래 사진은 구글에서 추천하는 Repository 패턴이다. UseCase 클래스의 매개변수는 Repository Interface 인 것이고, Data 계층의 Repository 구현체 클래스에서 Repository Interface 를 상속하고 있다. 당연히 Domain 계층은 독립적이고, Data 계층은 Domain 계층에 의존하고 있는 것입니다!
프로젝트 구조에 따라 계층을 나눠봤다.
Presentation Layer에는 화면의 표시, 애니메이션, 사용자 입력 처리 등 UI에 관련된 모든 처리를 갖는다.
Domain Layer에는 앱의 실질적인 데이터가 여기에 구현된다.
Data Layer에는 실제 데이터의 입출력이 여기서 실행된다.
각 계층별 의존성
Domain 계층은 의존성이 없다. 즉, 자기가 바뀌면 영향을 줄 뿐 다른 계층의 변화에 영향을 받지 않는다.
Data 계층은 Domain 계층의 변화에 영향을 받는다. 즉, Domain 계층의 무언가(클래스)를 가져와서 사용한다.
(Mapper클래스, Repository 구현부 구현을 위해 Domain 계층 참조)
Presentation 계층은 Domain계층의 변화에 영향을 받는다. Domain 계층에서 선언된 UseCase는 presentation계층의 ViewModel에서 직접사용하기 때문에 영향을 끼치게 된다.
출처
[Android] Clean Architecture 실전 압축 정리 - 개념 (tistory.com)
[Android] Clean Architecture 실전 압축 정리 - 개념
처음 학습하면서 작성한 글입니다. 필요시 추후 내용을 수정할 예정입니다. 틀린 부분이 있으면 언제든 지적해주면 감사하겠습니다 :) 클린 아키텍처를 공부하다 보면 모든 블로그에서 다음과
heegs.tistory.com
[안드로이드] 클린 아키텍처(Clean Architecture) 정리 및 구현 (tistory.com)
[안드로이드] 클린 아키텍처(Clean Architecture) 정리 및 구현
[2021-04-28 업데이트] [2022-02-01 업데이트] Hilt 사용한 프로젝트 링크 하단에 추가 [프로젝트] github.com/mtjin/mtjin-android-clean-architecture-movieapp mtjin/mtjin-android-clean-architecture-movieapp Clean Architecture 학습 및
youngest-programming.tistory.com
https://velog.io/@galaxy/Clean-Architecture
Clean Architecture
제 머릿속에 이해된 Android Clean Architecture 에 대해 정리한 내용입니다.
velog.io
https://class-programming.tistory.com/144
MVVM + Clean Architecture를 활용한 영화검색 앱
이 프로젝트는 약 1년전 쯤 했던 프로젝트였다. 그 때는 클린아키텍처는 적용하지 않았다. 이번에는 갓수아님 소스코드를 참고해 클린아키텍처까지 적용해봤다. 스플레시, 로그인, 검색화면 총
class-programming.tistory.com
'Android > Architecture' 카테고리의 다른 글
[Android] ViewModel 이란? (0) | 2023.09.19 |
---|---|
안드로이드 Clean Architecture - 예제 (Rxjava) (0) | 2023.05.27 |
[Android] 앱 아키텍처 가이드 (4) - Domain Layer (0) | 2023.05.15 |
[Android] 앱 아키텍처 가이드 (3) - Data Layer (0) | 2023.05.01 |
[Android] 앱 아키텍처 가이드 (2) - UI Layer (0) | 2023.04.29 |