공부

[안드로이드] 클린 아키텍쳐(Clean Architecture)

요빈 2023. 4. 28. 11:46

클린 아키텍쳐란?

클린 아키텍처는 위와 같이 4가지 계층으로 이루어져 있다.

이렇게 계층을 나누는 이유는 계층을 분리시켜 관심사를 분리시키기 위해서이다.

이렇게 분리된 계층에서 의존성 규칙을 지켜야 아키텍처가 올바르게 동작할 수 있다.

즉, 각 분리된 계층이 각자의 역할을 가지고 있으며 서로 의존을 어떻게 할지 규칙이 정해져 있다는 의미이다.

 

의존성은 반드시 외부에서 내부로 향해야 한다.

즉, 비즈니스 로직을 담당하는 코드들이 DB나 네트워크 같은 세부사항에 의존하지 않아야 한다는 의미이다.

이를 통해 비즈니스 로직(내부)은 세부사항(외부)의 변경에 영향을 받지 않도록 할 수 있다.

 

클린 아키텍처의 각 계층의 역할은 다음과 같다.

 

1. 엔티티(Entities): 핵심 업무 -> 가장 변하지 않고 영향을 받지 않는 곳이다.

2. 유스케이스(Use cases): 어플리케이션의 특화된 업무(비즈니스 규칙)를 맡는다.

3. 인터페이스 어댑터(Interface Adapters / Presenters): 인터페이스 어댑터는 데이터를 엔티티 및 유스케이스의 형식에서 DB 및 웹에서 적용할 수 있는 형식으로 변환. 이 계층에는 MVVM의 ViewModel 및 게이트웨이(Repository)가 포함되며 한 마디로 순수한 비즈니스 로직만 담당하는 역할이다.

4. 프라임워크와 드라이버(Framework & Driver): 프레임워크와 드라이버는 시스템의 핵심 업무와는 관련없는 세부사항으로 웹 프레임 워크, 데이터 베이스, HTTP 클라이언트로 구성된 가장 바깥 쪽 계층이다.

 

 

안드로이드에서의 클린 아키텍쳐

안드로이드에서의 클린 아키텍쳐와 데이터 흐름은 위 그림을 통해 쉽게 이해할 수 있다.

안드로이드에서 사용되는 클린 아키텍쳐 구조는 계층을 Presentation, Domain, Data 총 3개의 계층으로 나뉜다.

각 계층들이 명확하게 분리되어 있기 때문에, 서로 데이터를 주고 받기 위해서는 entity의 형태여야 하며, 데이터는 항상 안쪽 원에서 사용하는 데이터의 형태여야 한다.

 

1. 프레젠테이션 계층: UI(Activity, Fragment), Presenter 및 ViewModel을 포함한다. 즉, 화면과 입력에 대한 처리 등 UI와 직접적으로 관련된 부분을 담당한다. 또한 프레젠테이션 계층은 도메인과 데이터 계층을 포함한다.

 

   - UI: 화면 레이아웃과 사용자 입력 담당

 

   - Presenter: 사용자 입력이 왔을 때 어떤 반응을 해야 하는지에 대한 판단을 하는 영역, 무엇을 그려야 할지도 알고 있다.

 

   - 뷰 모델(프레젠터)에서 유즈 케이스를 참조해야 하기 때문에 프레젠테이션 계층은 도메인 계층에 의존성이 생긴다.

     UI와 사용자 입력에 따른 비즈니스 로직 하나 당 유즈 케이스가 존재한다고 생각하면 된다.

 

2. 도메인 계층: 애플리케이션의 비즈니스 로직을 포함하고 비즈니스 로직에서 필요한 모델(엔티티)과 유즈 케이스를 포함하고 있다. 도메인 계층은 프레젠테이션, 데이터 계층과 어떤 의존성도 맺지 않고 독립적이라는 특징이 있다.

 

   - 엔티티(모델): 어플리케이션의 실질적 데이터

   - 유즈 케이스(Use case): 각 개별 기능 또는 비즈니스 논리 단위

유즈 케이스는 보통 한 개의 행동을 담당하고 유즈 케이스의 이름만 봐도 이게 무슨 기능을 가졌을 지 구분 가능해야 한다.

   - 리포지토리 인터페이스: 유즈 케이스의 실질적인 구현 담당

 

 

3. 데이터 계층: Repository 구현체, 데이터 소스(Cache, Room DB, Dao, Model 서버API(Retrofit2)를 포함하고 있으며 로컬 또는 서버 API와 통신하여 데이터를 CRUD하는 역할을 한다. 또한 Mapper 클래스를 통해 데이터 소스로부터 받아온 데이터 모델과 UI에 맞는 데이터 모델간의 변환을 하는 역할을 한다.

 

   - 리포지터리: 유즈 케이스가 필요로 하는 데이터의 CRUD 역할

                         데이터 소스를 인터페이스로 참조해 로컬 DB와 네트워크 통신 가능

      --> 리포지터리에서는 의존성 역전이 이루어진다.

           단순하게 말하면, 리포지터리 인터페이스를 만들고 도메인 계층에서 인터페이스를 참조하면 된다.

* 의존성 역전이란?
의존 관계 역전 원칙은 소프트웨어 모듈을 분리하는 특정 형식을 지칭한다.
이 원칙을 따르면, 상위 계층이 하위 계층에 의존하는 전통적인 의존 관계를 역전시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다.

   

   - 데이터 소스: 실제 데이터의 입출력이 여기서 실행된다.

   - 도메인의 Model(엔티티)을 알아야할 Mapper와 도메인의 리포지터리 인터페이스 구현을 위해 도메인 계층에 의존성이 생긴다.

 

* Reference

https://meetup.nhncloud.com/posts/345

 

[Android] 요즘 핫한 Clean Architecture 왜 쓰는 거야? : NHN Cloud Meetup

[Android] 요즘 핫한 Clean Architecture 왜 쓰는 거야?

meetup.nhncloud.com

https://youngest-programming.tistory.com/484

 

[안드로이드] 클린 아키텍처(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