이번 포스팅에서는 안드로이드 스튜디오에서 클린 아키텍처 구조를 적용한 멀티모듈 프로젝트를 생성하는 예제를 설명하도록 하겠습니다.
계층별, 클래스별 세부적인 코드들은 들어있지 않으니 우선 전체적인 구조를 이해한다는 마음으로 읽어주시면 감사하겠습니다.
다음 포스팅에서는 간단한 실습 앱을 만들면서 각 클래스별 역할/세부 코드와 전체적인 플로우에 대해 알아보겠습니다.
프로젝트 설정
우선 전체적인 구조로 보면 기본으로 있는 app 모듈은 Application 클래스가 위치하며, 사용하는 DI에 따라 모든 Module들이 이곳에 존재할 수도, 또는 각 계층에 존재할 수도 있습니다.
✔️ 좌측 상단 File - New - New Module을 선택합니다.
✔️ 좌측 메뉴들 중에서 Android Library를 선택한 뒤, data / domain / presentation 을 모두 만들어 준다. 패키지 명은 일관성 있게 적당히 지어주면 됩니다.
-> 일반적으로 하나의 프로젝트에는 하나의 Application 클래스가 존재하기 때문에 Library 모듈로 만들어줍니다. 이를 통해 여러 모듈들은 Application 전체의 상태에 접근할 수 있게 됩니다.
✔️ 위 단계를 모두 완료했다면 아래와 같은 패키지 구조가 됩니다.
초기 설정은 모두 완료되었습니다. 이제 각 모듈별 컴포넌트를 생성하고 gradle 설정만 하면 모든 준비가 끝납니다.
App 모듈
✔️ App 모듈은 모든 모듈들에 대한 의존성을 가집니다. 따라서 모든 계층에서 쓰일 Module 클래스를 가질 수 있습니다.
클린 아키텍처의 설계 원칙을 생각해보면 각 계층의 의존성 주입을 위한 Module들은 각각의 계층에 존재하는 것이 더 클린하지만, Domain 계층은 DI 관련 의존성을 가지지 않기 때문에 UseCase Module들은 App 모듈에 존재하게 됩니다.
✔️ App 모듈의 gradle 파일 설정 및 의존성입니다.
✔️ App 모듈의 Manifest 파일입니다. MainActivity는 View를 가지고 있는 Presentation 계층에 존재하므로 Launcher Activity 설정을 따로 추가해줍니다.
만약 Application 태그 내에서 name 속성에 오류가 발생한다면, Application 클래스가 Application() 부모 클래스를 상속받는지 확인해보아야 합니다. 상속받지 않는다면 Application name으로 지정할 수 없기 때문입니다.
✔️ App 모듈은 plugins 태그에 application으로 지정되어 있으나, 이제부터 생성할 data/domain/presentation 계층은 아래와 같이 library로 설정되어 있습니다.
또한 Library는 ApplicationId를 가지지 못하므로 아래처럼 없는 것을 볼 수 있습니다.
Data 모듈
✔️ Data 모듈의 gradle 파일에 아래와 같은 domain 계층에 대한 의존성을 추가해줍니다.
dependencies {
implementation project(path: ':domain')
}
✔️ Data 모듈의 컴포넌트를 만들어줍니다.
Interface를 통해 DataSource를 추상화시켜 Repository와의 결합도를 낮췄습니다.
Mapper 클래스는 이전 포스팅에도 적었던 것처럼, Domain 계층의 데이터 클래스와 Data 계층의 데이터 클래스를 모두 알고 있어야하기 때문에 Data 계층에 위치하고 있습니다.
Domain 모듈
✔️ Domain 모듈은 타 계층에 대한 의존성을 가지지 않는 고수준의 계층이므로 의존성을 추가하지 않습니다. 또한 Domain 계층은 플랫폼/프레임워크에 구애받지 않아야 하므로 Java/Kotlin에 대한 의존성 외의 모든 것들을 제거해줍니다.
✔️ Domain 모듈의 컴포넌트를 만들어줍니다.
Presentation 모듈
✔️ Presentatioin 모듈의 gradle 파일에 아래와 같은 domain 계층에 대한 의존성을 추가해줍니다.
dependencies {
implementation project(path: ':domain')
}
✔️ Presentation 모듈의 컴포넌트를 만들어줍니다.
이로써 모든 모듈들의 설정이 완료되었습니다.
클린 아키텍처는 장기적인 유지보수와 확장에 대해서는 큰 장점을 가지지만, 위처럼 철저한 계층 분리와 SOLID 원칙의 엄격한 적용에 의해서 클래스가 기존보다 훨씬 많아지고 코드 또한 많아집니다.
클린 아키텍처와 SOLID에 대한 포스팅으로 이어집니다.
'개발 > Android' 카테고리의 다른 글
[안드로이드] RecyclerView는 어떻게 동작할까? (0) | 2024.06.24 |
---|---|
[안드로이드] EXTRA_PICK_IMAGES_MAX 사용 시 주의할 점 (0) | 2023.09.14 |
[안드로이드] 클린 아키텍처 - (2) 의존성 역전 (0) | 2023.05.16 |
[안드로이드] 클린 아키텍처 - (1) 개념 (0) | 2023.05.16 |
[안드로이드] 오픈소스 라이선스 고지 (0) | 2023.05.10 |