본문 바로가기

Android

Clean Architecture - Android에 적용하기

실제로 프로젝트에서 적용하면서 체감은 했지만 막상 깔끔하게 정리해보지 못했던 클린 아키텍처 개념을 정리해보려고 한다!

여러 아키텍처들이 있지만 공통의 목표는 계층을 분리하여 의존성을 없애는 것이 라고 한다.

클린아키텍처도 계층을 나누어 관심사를 분리하는 것에 목적이 있다 .

 

3 Layer

클린 아키텍처에서는 크게 3가지 레이어로 분리하는데 Domain / Data / Presentation layer이다

그리고 의존성 규칙(Dependency Rule)을 지켜 계층을 분리한다

Dependency Rule은 원 내부의 (inner) 계층은 외부(outer)의 계층을 알수없고 모든 소스코드 의존성은 반드시 외부에서 내부로 고수준 정책을 향해야 한다는 것이다 (즉 원 내부에서 외부 모르고 외부는 내부를 알수 있다. 다시말하면 ui는 비지니스 로직을 알 수 있지만 비지니스 로직은 ui 를 알수 없다)

 

DomainLayer (UseCase)

  • 비지니스 로직을 포함하는 계층
  • 가장 고수준 계층으로 외부에 의존성이 없이 독립적이다
  • use case - 비지니스 논리 단위
  • 앱에서 지칭하는 entity는 domain 계층의 entity 가 아닌 data 계층의 DTO 성격의 entity 일 가능성이 높다 따라서 일반적으로 clean architecture 이미지 가장 안쪽의 entity와 혼돈 주의

Presentation Layer

  • 화면조작, 사용자의 입력, UI를 포함하는 계층
  • View, Controller, Presenter, ViewModel 등을 포함
  • Domain, Data 계층에 의존성이 있는 가장 외부의 계층

DataLayer

  • Repository의 구현체, Mapper등을 포함하는 계층
  • DB, 서버 등으로 부터 받아온 데이터 모델과 UI에 맞는 데이터 모델간의 mapping 역할
  • Domain레이어에 의존성이 있다

클린 아키텍처 계층간 분리의 장점

  1. 비지니스 로직 (domain)이 독립적으로 보장되어 테스트 및 수정이 용이하다
  2. 비지니스 로직은 외부 계층에 대해 모르기 때문에 외부 요인을 고려할 필요가 없다
  3. UI / DATA 등 변경이 잦을 수 있는 저수준의 계층들을 독립적으로 변경할 수 있다

 

Android Project 에 module 로 layer 나누기

android project에 module을 clean architecture의 3 layer로 나눠보겠다.

3 layer를 나눌때 몇가지 장점이 있다

  1. package로 나누는것보다 의존성 분리를 강제적으로 할수 있다.
  2. 각 layer의 수정이 발생할때 빌드 시간이 단축된다 (예를들어 presentation 에서 view관련 수정이 있어도 다른계층의 모듈 빌드를 새로 하지 않아도 된다)
  3. 각 계층에 필요한 라이브러리, 혹은 모듈들의 dependency를 따로 줄수 있다

(사실 프로젝트를 나누는 효율적인 기준에 대한 의견은 분분하다고 한다. 기능 단위로 할지 계층단위로 할지 등.. 정답은 없고 각 프로젝트의 속성이나 특징에 따라 설계하면 된다고 생각한다)

 

전체 모듈 구조 (app 모듈을 presentation 모듈로 변경함)

 

presentation 모듈에 추가한 dependencies

  • presentation 모듈은 data, domain 모두를 알고있다

 

data 모듈에 추가한 dependencies

  • data 모듈은 domain 모듈을 알고잇다

 

domain 모듈은 dependency 가 없이 독립적이다

 

끝~~

'Android' 카테고리의 다른 글

Android 에서 MVC, MVP, MVVM 예제로 공부하기  (0) 2022.02.17
[Android] Room - Part of Android Jetpack  (0) 2022.02.13
Gson vs kotlinx-serialization  (0) 2022.01.17
[Android] detekt 적용하기  (0) 2021.08.01
[Android] ktlint 적용하기  (0) 2021.07.29