11. feature 기반 멀티모듈 만들기

개요

이전에 Layer 기반 멀티 모듈 프로젝트를 진행한 적이 있다. 당시 클린 아키텍쳐를 기반으로 Data, Domain, Presentation Layer의 모듈을 만들어 잘 진행했던 경험이 있다.

최근 Kotlin In Action 2판을 사서 읽기도 하고, 리액트 프로젝트도 진행하고, 다른 안드로이드 프로젝트도 하고 있는데, Now In Android 공부를 시작했다.

원래 본 내용을 공부하기 위해 만든 프로젝트가 있었는데, 코드를 타고 가면서 들어가다 보니까 build-logic에 꽂혀서 커스텀 플러그인을 보면서 만들다보니 정신이 나갈 것 같다.

배보다 배꼽이 더 커져버려서 본 포스팅을 위한 프로젝트로 적합하지 않은 것 같아 다른 프로젝트를 다시 생성했고 이걸 바탕으로 기능 기반 멀티 모듈을 만들어볼 것이다.

여기서 추가적인 목적이 있는데 기본적으로 구글은 App Architecture를 바탕으로 프로젝트를 제작한다.

필자는 feature 기반 멀티 모듈을 제작하면서 Clean Architecture를 적용하여 만들어보고 싶어 시도해볼 것이다.

개념

  • 멀티 모듈

    멀티 모듈이란 하나의 프로젝트를 여러 모듈로 분리해서 만드는 방식이다.

  • 멀티 모듈 종류

    분리를 하는 방식은 다양하지만, 흔히 기능 기반과 레이어 기반으로 나뉘는 것 같다.
    레이어 기반은 아키텍쳐의 레이어를 기반으로 모듈을 나누는 것이다.
    필자의 첫 멀티 모듈 프로젝트가 이러하였는데, Clean Architecture 기준으로 Data, Domain, Presentaion 모듈로 나누어서 각 레이어에 맞는 코드를 작성하는 것이다.

    각 방법별 차이점이라 하면, 확실하진 않다
    우선 필자가 경험했었던 레이어 기반 멀티모듈은 특히 레이어에 위배되지 않는 코드를 작성하기 좋다는 것이다.
    Domain의 경우 Android등의 의존성이 없는 순수 Kotlin or 기타 언어로 구성된 추상화 수준이 높은 레이어로서
    의존성이 없어야 하는데, 모듈로 만들 때 Android Library가 아니라 Kotlin Library로 만들고 관리하면 되서 아키텍쳐를 준수한 코드를 작성하기가 좋다.
    기능 기반 멀티모듈의 경우 각 여러 기능들을 모듈로 나누다 보니 레이어 기반은 모듈 수가 한정되는데 반해 시스템 크기에 따라서 모듈이 많아진다.
    많아지면 불편하게 느낄 수 있겠지만, 단일 모듈의 경우 시스템이 커지면 빌드를 돌릴 때 오래 걸린다.
    하지만 기능 기반 멀티 모듈로 진행을 하게 되면, 수정하지 않은 나머지 모듈은 재빌드를 돌릴 필요가 없어져 빌드 시간이 향상된다.

실습 코드

목표

Start Feature 모듈과 Second Feature 모듈을 만들어볼 것이다.
그리고 그 둘을 Navigation 시키는 것까지 진행해보자

다른 모듈에 있는 걸 서로 내비게이션 시키는 건 레이어 기반 멀티모듈에서도 접할 수 없는 일이다.
레이어 기반 멀티모듈에서 내비게이션은 Presentation Layer에서 전부 일어나기 때문이다.
상당히 흥미로워 보인다

기능 기반 모듈 생성

Android Studio의 파일에서 New 안에 New Module이라는 버튼을 클릭하면 아래와 같은 메뉴가 보인다.

NewModule창 New Module을 누를 시 나오는 창

우리는 Android 관련 작업을 수행할 것이므로 Android Library를 누르고 Module 이름을 설정한다.
나중에 feature 관련 모듈이 많아지면 관리가 힘들기 때문에 feature 폴더 아래에 만들 것이다.
:feature:모듈이름 꼴로 모듈을 설정하면 바로 feature 내부에 해당 모듈 이름으로 모듈이 생긴다.

필자는 :feature:start 라는 이름으로 모듈을 생성했다.

Start 모듈 생성 한번에 Feature 안에 Start 모듈이 생성된 것을 볼 수 있다.

같은 방법으로 second모듈도 생성하자

Second 모듈 생성 Second 모듈까지 생성 완료!

  • 아쉬운 점

    현재 보면 build.gradle의 설정이 똑같은 것이 나열되어 있다.
    나중에 build.gradle에서 공통된 설정을 바꿀 필요가 있을 때 (ex: minSdk 등)
    feature모듈의 해당 설정을 일일이 바꾸는 것은 번거로운 일이 될 것이다.
    이를 해결하기 위해서 build-logic이라는 방법을 쓸 수 있는데, 본 프로젝트에선 우선 생략한다
    다만 내가 Now In Android를 공부하면서 개인적으로 적용했을 때 정리된 결과를 첨부하니 이렇게 된다고 감을 잡으면 될 듯 하다.

    Second 모듈 생성 빌드로직을 생성해서 관련 설정을 처리해 필요한 부분이 별로 없다!

라이브러리 설치 및 모듈 등록

멀티 모듈을 하기 위해서 무슨 라이브러리를 깔아야 하고 그런 것이 아니라 그저 Navigation등을 하기 위해 Navigation 라이브러리들을 설치한다.

또한 App모듈은 feature들을 알고 있어야 하므로 App모듈의 build.gradle에 두 모듈을 넣어준다.

본 예제에서는 feature 간 내비게이션을 위한 Navigation을 설치할 것이다.

toml 파일에서 아래와 같이 compose navigation 라이브러리를 추가하고,

startsecond 모듈에서 아래와 같이 implementation을 설정한다.

toml

라이브러리 등록 start 모듈과 second 모듈에서 작업한 내용

모듈 등록 App 모듈에서는 first와 second 모듈을 알아야 한다

원래 모듈을 가져오려면 implementation(project(":feature:first")) 꼴로 가져왔어야 했다.
하지만 Project 루트 경로의 setting.gradle 파일에서 enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")를 입력하면 Project. 꼴로 접근할 수 있다.

모듈별 화면 및 네비게이션 작업하기

자 이제부터 본 작업이다.
App모듈에는 Navigation을 추가해주지 않았지만, startsecond모듈에서 navigationapi로 등록했기 때문에, 전파되어 navigation을 쓸 수 있다.

우선 각 feature에서 화면과 내비게이션을 간단하게 만들자.

start 화면 start 모듈의 화면

start 내비게이션 start 모듈의 내비게이션

second 화면 second 모듈의 화면

second 내비게이션 second 모듈의 내비게이션

feature모듈 간 내비게이션을 동작시킬 수 있는 방법이 여러가지 있을 수 있지만, Now In Android의 방식대로 적용해보았다.

각 화면으로 navigate 시키는 확장함수를 만들어놓았고, App모듈에서는 각 feature모듈에 접근이 가능하므로 feature모듈에 정의되어 있는 확장함수를 사용하여 다른 모듈의 NavGraph를 만드는 확장함수의 인자로 넣어줄 것이다.

Main Activity 내비게이션 Main Activity NavHost 설정

이렇게 하면 모든 과정이 끝난다.

시연

내비게이션이 적용된 것을 확인할 수 있다!

결론

이번엔 feature를 기반으로 한 multi module을 작성해보았다.
데이터라던지 기타 다른 작업들을 위한 모듈 등은 전혀 만들지 않고 간단히 다른 모듈 간 내비게이션을 진행하는 것에 초점을 두고 진행해보았다.

아직 제대로 domain 등을 만들지는 못했는데, domaindatafeature에서 참조해야 하므로 core에 두고, 크게 feature, data, core(theme, domain 등)으로 나누어서 작업을 더 진행해 볼 것 같다.


© 2025. Na2te All rights reserved.