본문 바로가기
Android/아키텍쳐

클린아키텍쳐에 대해서 정리해보자~

by 안스 인민군 2022. 9. 8.

먼저 클린 아키텍쳐에 대해 한마디로 설명하면 소프트웨어의 관심사를 계층별로 분리하는 소프트웨어 디자인 철학이다.

나는 이것을 알기 위해 MVP , MVVM , MVI, 구글 아키텍쳐 가이드 등등... 정말 많은 것을 찾아 봤지만 수많은 자신들의 아키텍쳐가 널려 있었다...(진짜 너무 헷갈려....)

그래서 이번에 정리를 해보려고 한다.

먼저 로버트C 마틴 아저씨가 정리한 것을 그림으로 표현한것이다.

위의 그림처럼 Domain Layer, Data Layer, Presentaion Layer(난 UI Layer라고도 부른다.) 총 세가지의 레이어로 나뉘어 분리시킨다. 셋의 관계는 Domain레이어는 아무에게도 의존하지 않고 언어(Java,Kotlin)의 형태로 되어 있다.

Data레이어는 Domain레이어를 의존하고 Presentatation레이어는 Data레이어와 Domain레이어를 의존하며 셋은 의존성 주입으로 연결되어 있다.

1. Domain Layer

도메인 레이어는 data model, repository(행동 담고있음), usecase(행동의 최소단위)를 담고 있다.

  • usecase 
    • 사용자의 행동의 최소 단위를 나타내는 클래스 (비지니스 로직으로 클래스와 함수이름으로 짓는다.)
    • 클래스 양이 많아지는 단점이 있지만 전체적인 코드 파악 및 유지/보수 측면에서 이점이 많다.
    • 유스케이스에서는 domain 레이어에서 정의한 Repository 중 알맞은 것을 주입하여 구현하므로 코드의 흐름을 파악하기 용이하다.
  • repository(interface)
    • domain 레이어에서는 인터페이스 형태로 레포지토리를 나타낸다.
  • entity
    • 프레임워크와 의존성을 가지면 안된다. retrofit 등을 통해 얻은 데이터 객체(spec)를 entity로 매핑을 한다.
  • DataResult
    • 이건 선택사항인데 나는 데이터의 분기처리를 위해 sealData인 DataResult를 만들어 데이터를 받아오거나 전달할때의 분기처리를 처리해준다.(Success,Error,NoData 등)

2. Data Layer

  • repository(Impl)
    • Domain레이어에 있는 Repository의 추상화되어 있는 interface 받아와서 설계한다. DataLayer의 진입점과 방출점은 repository를 통해야만 한다.
  • remote
    • retorofit등을 통하여 외부에서 가져올때 사용될 여러가지 클래스(service,url)와 서버를 통해 데이터(spec) 등을 모아 두었다.
  • local
    • Room등을 사용하여 내부디바이스에 저장되는 클래스와 형태를 모아두었다. 예시로는 dao,spec,database(Room)등이 있다.
  • Mapper
    • Data레이어에서 remote나 local에서 데이터를 가져오거나 넘겨줄때 다른형태의 데이터 소스를 변경하는데 사용한다.
    • spec(DataSource) <-> entity 로 바꾼다고 생각하면 편하다.  

3. Presenter Layer(UI Layer)

  • UI레이어라고 불리며 사용자의 상호작용을 담당한다.
  • View(xml - Activity / Fragment)에서 사용자의 상호작용을 받아오고 표현한다.
  • ViewModel에서는 Domain레이어의 usecase를 주입받아 사용하게 된다.

자 위를 바탕으로 프로젝트를 처음 설계할때 레이어들의 역할과 나누는 방식에 대해 알게 되었다.

이제 패키지 형식으로 나누어야 할지 아니면 모듈 형식으로 나누어야 할지 선택하자.

둘을 선택할때 대부분 규모의 차이로 나누게 된다. 규모가 작다면 패키지의 구성을 선택하는것이 비교적 작은 프로젝트일 경우 사용하게 된다. 대신 모듈 형식으로 나누게 된다면 위에 말했던 DataLayer - DomainLayer - PresentationLayer 의 서로의 의존관계의 강제성을 부여하게 된다.(애초에 module에서 import하기때문에 불러올 수 가없다.)

 

나의 패키지구성으로 레이어를 나눌때의 모습은 다음과 같다. 아래 보이는 di 패키지나 wiget 패키지는 일단 무시하자!!

그러니 아래와 같은 구성으로 짠다면 아마 다 프로젝트를 수용할 것이다...!!

 

다음으로 모듈로 나뉘는 레이어 방식이다.

위의 사진에서 보면 domain 레이어와 data레이어를 모듈로 꺼내 나누었다. 이렇게 했을때의 장점은 의존성에 강제성을 줄 수 있다는 것이다. 아래 예시는 ui레이어에서 implement하는 모습이다. 이렇게 하면 data레이어와 domain레이어를 의존하는 모습을 볼 수 있다. (design 레이어는 커스텀 UI이니까 무시!)

 

 

이렇게 클린 아키텍쳐에 대해서 알아보았다!! 이글을 보고 이글을 본 사람들은 나처럼 뺑뺑이돌지말고 정리를 잘했으면 좋겠다는 마음이다~