Android

안드로이드 클린 아키텍쳐에 대해

최데브 2022. 2. 21. 13:53

개발에 관심을 가지고 있는 사람이라면 클린 아키텍쳐라는 말을 한번 쯤 들어 봤을거라고 생각한다.

나도 개념에 대해서는 어럼풋이 알고 있었지만 흉내만 낼뿐 원칙을 완벽하게 지킨다거나 하지는 못했던 것 같다.

 

이참에 개념에 대해서도 확실하게 정리 해볼까한다.

 

 

클린 아키텍쳐는 뭘까?

날이 갈수록 다양해지는 기능과 많은 일을 담당하게 되는 프로그램은 복잡도가 높아질 수 밖에 없는 운명을 타고났다.

만들려면 어떤 방법으로든지 만들수는 있지만 우리는 유지 보수하기 쉽고 고품질의 코드를 원한다.

기능이 추가된다거나 내부 로직이 변하는 일이 생겼을때 처음부터 다 뜯어고치면서 만드는건 예상치 못한 문제를 발생시키고 노력 또한 많이 든다.

 

이런 문제들을 해결하고자 등장한 개념이 클린 아키텍쳐다. 그렇다.

클린 아키텍쳐는 코드들의 계층을 분리하여 담당하는 영역을 나눠줘서 일관성있고 코드끼리의 결합도를 낮춰서

유연하게 프로그램을 작성 할 수 있게 돕는다.

사실 앱에서 먼저 나온 개념은 아닌데 안드로이드 진영에서도 도입하려는 움직임이 있었다.

 

Clean Architecture의 다이어그램

인터넷에 검색하면 흔하게 볼 수 있는 클린 아키텍쳐의 이미지다.

 


 

각 계층이 뭘 의미하는지부터 알아보자.

일단 총 4개의 계층으로 이루어져있는데

 

가장 내부에는 

 

1. Entities

 엔티티는 비즈니스 규칙을 캡슐화합니다. 엔티티는 메서드를 갖는 객체일 수도 있지만 데이터 구조와 함수의 집합일 수도 있습니다. 가장 일반적이면서 고수준의 규칙을 캡슐화하게 됩니다. 외부가 변경되더라도 이러한 규칙이 변경될 가능성이 적습니다.

2. Use cases

 유스케이스는 애플리케이션의 고유 규칙을 캡슐화하며 엔티티로부터의 데이터 흐름을 조합합니다. 유스케이스 계층의 변경이 엔티티에 영향을 줘서는 안 되며 데이터베이스, 공통 프레임워크 및 UI에 대한 변경으로부터 격리됩니다.

3. Interface Adapters (Presenters)

 인터페이스 어댑터는 Entity 및 UseCase의 편리한 형식에서 데이터베이스 및 웹에 적용할 수 있는 형식으로 변환합니다. 이 계층에는 MVP 패턴의 Presenter, MVVM 패턴의 ViewModel가 포함됩니다. 즉, 순수한 비즈니스 로직만을 담당하는 역할을 합니다.

4. Frameworks & Drivers (Web, DB)

 프레임워크와 드라이버는 상세한 정보들을 두게 됩니다. 웹 프레임워크, 데이터베이스, UI, HTTP client 등으로 구성된 가장 바깥쪽 계층입니다.

출처: https://leveloper.tistory.com/205 [꾸준하게]

 


 

세부적으로 보면 위의 내용과 같고 안드로이드에서는 이걸 크게 세가지로 다시 나눠서 보기도 한다.

 

안드로이드용으로 이해하기 쉽게 만들어진 클린아키텍처 구조는 Entity 레이어를 따로 두지않고 일반적으로 Presentation, Domain, Data 총 3개의 계층으로 크게 나눠서 본다.

 

Presentation : UI(Activity, Fragment), Presenter 및 ViewModel을 포함합니다. 즉 화면과 입력에 대한 처리 등 UI와 직접적으로 관련된 부분을 담당합니다. 또한 Presentation 레이어는 Domain과 Data 레이어를 포함하고 있다는 특징이 있습니다.

 

Domain : 애플리케이션의 비즈니스 로직을 포함하고 비즈니스 로직에서 필요한 Model 과 UseCase를 포함하고 있습니다. 기존 MVVM을 하고 클린아키텍처를 공부한다면 UseCase를 처음보실텐데 한번만 더 짚고 넘어가자면 각 개별 기능 또는 비즈니스 논리 단위라고 보시면 됩니다. 그래서 UseCase는 보통 한 개의 행동을 담당하고 UseCase의 이름만 보고 이게 무슨 기능을 가졌을지 짐작하고 구분할 수 있어야합니다.  추가로 Domain 레이어는 Presentation, Data 레이어와 어떤 의존성도 맺지 않고 독립적이다는 특징이 있습니다. 

 

Data : Repositoy 구현체, Cache, Room DB, Dao, Model 서버API(Retrofit2) 을 포함하고 있으며 로컬 또는 서버 API와 통신하여 데이터를 CRUD 하는 역할을 합니다. 또한 Mapper 클래스도 포함하고 있는데 DB로 부터 받아온 데이터모델과 UI에 맞는 데이터모델간의 변환을 해주는 역할을 합니다. 추가로 Domain 레이어를 포함하고있다는 특징이 있습니다.

 

각 계층에 대한 내용은 

https://leveloper.tistory.com/205

 

[Android] Clean Architecture in Android

Clean Architecture란?  고객들에게 제공하는 애플리케이션 같은 경우에는 수많은 기능들이 있기에 복잡도가 굉장히 높습니다. 복잡도가 높은 애플리케이션을 개발할 때 어떻게 하면 유지 보수하기

leveloper.tistory.com

를 참고했다. 좋은 포스팅에 감사드린다.

 

클린 아키텍쳐는 내가 전에 포스팅했던 멀티모듈과도 아주 잘어울린다.

계층별로 모듈을 만들어서 적용하면 클린 아키텍쳐의 계층을 원천적으로 지킬 수 있게 만들 수 있다.

A 모듈에서 B 모듈을 호출하면 안되는게 원칙이라면 모듈을 분리해서 애초부터 A에서 B를 import 하지 못하게 막아 줄 수 있기 떄문이다.

또한 코드 관리도 편해지고 A와 B가 하나의 파일에 있었다면 A가 오류가 나면 B까지 같이 테스트를 못하는 상황이 발생하기도 하는데 따로 분리해서 작업하기 때문에 개별적인 테스트가 가능해진다는 장점도 있다.

반응형