[안드로이드 멀티 모듈] 3. build-logic 모듈 만들기

2024. 7. 31. 11:00·안드로이드/멀티 모듈
반응형

이전 포스팅에서 4개의 모듈을 만들었는데 각각 build.gradle.kts 파일이 생성되었고, 아래처럼 빌드와 관련된 중복 코드가 증가했습니다. 앱이 커질수록 모듈과 중복 코드는 계속 증가할 것입니다.

// build.gradle.kts (Module :home:data)
plugins {
    alias(libs.plugins.android.library)
    alias(libs.plugins.jetbrains.kotlin.android)
}

android {
    namespace = "com.multi.module.home.data"
    compileSdk = 34
    ...
}
...
// build.gradle.kts (Module :home:presentation)
plugins {
    alias(libs.plugins.android.library)
    alias(libs.plugins.jetbrains.kotlin.android)
}

android {
    namespace = "com.multi.module.home.presentation"
    compileSdk = 34
    ...
}
...


중복코드를 제거하고 한 곳에서 관리하기 위한 방법은 몇 가지가 존재하는데, 최근에는 build-logic 모듈을 만들어서 관리하고 있습니다. 먼저 build-logic을 세팅하겠습니다.

1. build-logic 모듈 생성하기

File -> New -> New Module을 선택한 후, Java or Kotlin Library로 아래처럼 build-logic 모듈을 만들어줍니다.
build-logic 모듈에는 Custom Plugin을 만들어야 하는데 Convention Plugin이라고 표현합니다.
그래서 모듈을 build-logic:convention로 생성했습니다.

build-logic 모듈을 생성하는 모습
build-logic 모듈을 생성하는 모습


build-logic 모듈을 생성했다면 settings.gradle.kts 파일에 includeBuild("build-logic")을 작성해야 합니다.
왜냐하면 안드로이드 스튜디오 또는 Gradle에서는 일반 Kotlin Module과 Build Module을 구별할 수 없기 때문입니다.

// settings.gradle.kts (Project Settings)
pluginManagement {

    includeBuild("build-logic")
    
    repositories {
        google {
            content {
                includeGroupByRegex("com\\.android.*")
                includeGroupByRegex("com\\.google.*")
                includeGroupByRegex("androidx.*")
            }
        }
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}


enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")

rootProject.name = "MultiModuleTemplate"
include(":app")
include(":home:presentation")
include(":home:data")
include(":core:presentation:designsystem")
include(":home:domain")

 

2. build-logic 모듈 설정하기

build-logic 빌드와 관련된 설정을 하겠습니다.

Gradle에게 빌드하는 방법을 제공해 주고, build-logic에서 추가하는 의존성을 다운로드할 원격 저장소 위치를 알려주어야 하므로 build-logic 모듈의 루트 경로에 gradle.properties 및 settings.gradle.kts 파일을 생성하고 아래와 같이 입력하겠습니다.

// build-logic의 gradle.properties
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configureondemand=true
// build-logic의 settings.gradle.kts  
dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
    }

    versionCatalogs {
        create("libs") {
            from(files("../gradle/libs.versions.toml"))
        }
    }
}

rootProject.name = "build-logic"
include(":convention")


build-logic 모듈에 생성한 settings.gradle.kts를 보면 rootProject 이름을 'build-logic'으로 지정해 주고 convention 모듈을 포함하도록 설정했습니다. 그리고 versionCatalogs 파일의 경로를 입력했습니다.

3. build-logic:convention 모듈 설정하기

이번에는 build-logic:convention 모듈에 대한 설정을 진행하겠습니다.

// build.gradle.kts (Module :build-logic:convention)
plugins {
   `kotlin-dsl`
}

group = "com.multi.module.buildlogic"


dependencies {
   // versionCatalogs에 관한 정보는 하단의 git 링크를 통해 확인해주세요.
   compileOnly(libs.android.gradlePlugin)
   compileOnly(libs.android.tools.common)
   compileOnly(libs.kotlin.gradlePlugin)
   compileOnly(libs.ksp.gradlePlugin)
   compileOnly(libs.room.gradlePlugin)
}


convention 모듈에서는 Kotlin DSL을 사용해서 Convention Plugin을 만들기 때문에 플러그인데 kotlin-dsl을 추가해야 합니다. 그리고 안드로이드, 코틀린, ksp, room 등과 같은 기능을 사용하기 위해 플러그인과 관련된 의존성을 추가했습니다.

build-logic 모듈에서 생성하는 모든 플러그인은 컴파일 중에만 관련이 있고 런타임 중에는 아무것도 하지 않기 때문에 implementation이 아닌 compileOnly를 사용했습니다.

4. 정리

이번 포스팅에서는 build-logic:convention 모듈을 만들어서 build-logic과 convention 모듈을 설정했습니다.

다음 포스팅에서는 모듈을 생성할 때마다 생기는 build.gradle.kts 파일의 중복코드를 제거하기 위해서 Custom Convention Plugin을 만들겠습니다.

다소 어렵고 난해한 부분이 있었는데 Gradle을 처음 접하는 분들이라면 혼란스러운 게 지극히 정상적인 일이라고 생각이 들고, Gradle 설정과 관련해서 시간을 많이 소요하지 않았으면 좋겠습니다. 나중에 자연스럽게 이해될 수 있기 때문입니다.

이번 포스팅의 결과물은 아래 Github Repository의 3-SettingUpBuildLogic 브랜치를 확인하시면 됩니다.

 

GitHub - taein8935/multi-module-template-aos

Contribute to taein8935/multi-module-template-aos development by creating an account on GitHub.

github.com

저작자표시 비영리 변경금지 (새창열림)

'안드로이드 > 멀티 모듈' 카테고리의 다른 글

[안드로이드 멀티 모듈] 6. AndroidApplicationComposeConventionPlugin 만들기  (1) 2024.08.07
[안드로이드 멀티 모듈] 5. BuildTypes 컨벤션 플러그인에 적용하기  (0) 2024.08.02
[안드로이드 멀티 모듈] 4. AndroidApplicationConventionPlugin 만들기  (0) 2024.08.01
[안드로이드 멀티 모듈] 2. 모듈 생성 후 관계 정의하기  (0) 2024.07.30
[안드로이드 멀티 모듈] 1. 멀티 모듈 개념과 장단점  (0) 2024.07.29
'안드로이드/멀티 모듈' 카테고리의 다른 글
  • [안드로이드 멀티 모듈] 5. BuildTypes 컨벤션 플러그인에 적용하기
  • [안드로이드 멀티 모듈] 4. AndroidApplicationConventionPlugin 만들기
  • [안드로이드 멀티 모듈] 2. 모듈 생성 후 관계 정의하기
  • [안드로이드 멀티 모듈] 1. 멀티 모듈 개념과 장단점
코딩덕
코딩덕
안드로이드, 리액트 등의 개발 노하우와 최신 AI 기술을 다루는 기술 블로그입니다. 실무 중심의 경험을 바탕으로 마주한 문제와 해결 과정을 체계적으로 기록하며, 개발자에게 실질적으로 도움 되는 프로그래밍 팁과 인사이트를 쉽고 명확하게 공유하고자 합니다.
  • 코딩덕
    개발자가 들려주는 IT 이야기
    코딩덕
  • 전체
    오늘
    어제
    • 분류 전체보기 (66)
      • 안드로이드 (62)
        • 멀티 모듈 (11)
        • 클린 아키텍처 (11)
        • 트러블 슈팅 (5)
        • 코틀린 (3)
        • 코루틴 (2)
        • Compose (1)
        • Compose UI (6)
        • Compose Dialog (8)
        • Compose Paging3 (11)
        • Compose State (2)
        • Util (1)
      • Github (3)
        • PR Template (2)
        • AI Code Review (1)
      • 리액트 (1)
        • NextJs (1)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    멀티 모듈
    Github
    recyclerview
    Jetpack Compose
    Dialog
    dynamic json
    sealed class
    데이터 레이어
    Usecase
    paging3
    ViewModel
    코틀린
    pager
    클린 아키텍처
    UI Layer
    Gradle
    multi module
    코루틴
    LazyRow
    ai code review
    ScrollView
    pr template
    enum class
    안드로이드
    트러블슈팅
    jsonadapter
    Clean Architecture
    flow
    MutableState
    OnBackPressedDispatcher
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩덕
[안드로이드 멀티 모듈] 3. build-logic 모듈 만들기
상단으로

티스토리툴바