본문 바로가기
Development/Android

[Android] Clean Architecture With Pokedex (feat. Jetpack Compose, Hilt) - 1

by du.it.ddu 2022. 5. 28.
반응형

이번 포스팅은 Clean Architecture의 구성요소와 개념에 대해 알아보고,
안드로이드 프로젝트를 생성하여 기반작업을 해 볼 것이다.

Clean Architecture에 대해 검색해본 사람이라면, 아래 그림을 정말 많이 접했을 것이다.

개인적으로, 위 다이어그램만 이해한다면 Clean architecture는 끝이라고 할 만큼 기본이고 핵심이라고 생각한다.
좌측 원형 다이어그램을 분석해보자.

가장 바깥쪽부터 안쪽으로 화살표가 있는데, 이것은 의존성을 의미한다.
즉, 바깥쪽에서 안쪽으로만 의존하며, 가장 안쪽인 Entities는 의존성을 갖지 않는다.
또한, 안쪽에서 바깥쪽으로의 의존성은 없다.
이것은 Clean architecture의 가장 핵심적인 룰이다.

우리가 알아야 할 요소는 Presenter, Use Cases, Entities이다.
하나씩 알아보자.

1. Entities

Entities는 가장 안쪽 레이어에 자리잡은 것으로, Enterprise Business Rules을 의미한다.
용어가 어렵다.
Pokedex 앱을 예시로 들자면, 포켓몬을 표현하기 위한 규칙을 말한다.
포켓몬의 도감 번호, 이름, 기술 등이 될 수 있다.
이해가 안된다면, 그렇구나 정도로 넘어가고 실제 코드를 작성하며 이해하도록 하자.

2. Use Cases

Use Case는 Entity를 얻기 위한 작업을 명시한다.
이를테면, 포켓몬을 가져오는 작업을 말할 수 있다.
이때 UseCase의 이름은 GetPokemonUseCase 와 같은 이름을 갖는다.
UseCase의 이름만 보고도 어떤 작업을 하는 것인지 알 수 있다.
UseCase는 Repository와 같은 Data 레이어를 통해 Entity를 얻는다.

3. Presenter

UseCase로부터 얻은 Entity를 실제로 나타낸다.
안드로이드에선 ViewModel, Activity, Fragment와 같은 것들을 포함한다.
실제 구현은 ViewModel에서 UseCase를 통해 Entity를 획득하고, 이를 View에서 나타내도록 구현될 것이다.

개념만을 두고 보았을 때 잘 와닿지 않을 수 있다.
하지만 실제로 코드로 구현하게 되면, MVVM의 레이어를 좀 더 분리하고 의존성을 낮춘 것이라는 생각이 들 것이다.
이제 이 내용들을 바탕으로 프로젝트를 구성해보자.


먼저 Android Studio를 실행해서 새로운 프로젝트를 만든다.
그리고 data, domain, presentation 세 개의 모듈을 만들 것이다.

presentation은 프로젝트 생성 시 자동으로 생성되는 "app" 모듈을 "presentation" 으로 이름을 변경하거나, 그대로 둔다.
File > New > New Module을 선택하고, 아래를 참고하여 "data", "domain"을 만들어준다.


정상적으로 Module을 생성했다면, 아래와 같은 모듈 구조를 확인할 수 있을 것이다.
이름은 다를 수 있으나, 동일한 형태를 띈다면 문제는 없다.

이제 Clean architecture의 의존성 규칙대로, 모듈간의 의존성을 설정해준다.

1. domain 모듈

domain 모듈은 entities를 의미한다. 그렇기 때문에, 어떠한 의존성도 갖지 않는다.

2. data 모듈

data 모듈은 API, 혹은 DB를 통해 Entity를 얻는 역할을 한다.
그렇기 때문에 domain 모듈에 의존성을 갖는다.
data 모듈의 build.gradle로 이동하여 아래와 같이 의존성을 추가한다.

dependencies {
    ...
    implementation project(':domain')
}


3. presentation 모듈

presentation 모듈은 UseCase로부터 Entity를 획득하여 나타내는 역할을 한다.
그렇기 때문에 domain과 data 모듈에 의존성을 갖는다.
presentation 모듈의 build.gradle로 이동하여 아래와 같이 의존성을 추가한다.

dependencies {
    ...
    implementation project(':data')
    implementation project(':domain')
}

이렇게 모듈간의 의존성 작업은 완료되었다.
어려운 것은 하나도 없었다.

다음은 가장 안쪽의 레이어인 domain 모듈부터 시작하여 가장 바깥쪽 레이어인 presentation 모듈을 구현하여,
이 과정에서 여러가지 기술을 활용 할 것이며, 어떻게 Clean architecture가 구현되는지 알 수 있게 될 것이다.

 

반응형