나만의 안드로이드 앱 만들기/중급자

나만의 안드로이드 앱 만들기(중급자 편) - buildSrc 추가하기

Victorywskim 2023. 12. 22. 20:19
반응형

buildSrc 에 대한 설명은 다음과 같습니다.

  • Gradle 프로젝트의 빌드 스크립트를 작성하기 위한 별도의 디렉터리이며, 작성된 빌드 스크립트는 전체 프로젝트의 빌드 스크립트에서 사용할 수 있습니다.

buildSrc를 사용하면 다음과 같은 장점이 있습니다.

  • 중복 코드 제거
    • buildSrc를 사용하면 여러 모듈에서 공통으로 사용하는 빌드 스크립트를 하나의 디렉터리에 작성할 수 있습니다. 이렇게 하면 중복 코드를 제거하고 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
  • 빌드 속도 향상
    • buildSrc를 사용하면 빌드 스크립트를 한 번만 컴파일하면 되므로, 빌드 속도를 향상시킬 수 있습니다.

단점은 다음과 같습니다.

  • 작업량 증가
    • 별도 모듈에 버전 정보를 작성해야하기 때문에 작업량이 증가합니다.
  • 업데이트  피드백 사용 불가
    • 안드로이드 스튜디오에서는 build.gradle 에서 새로운 버전이 나오면 의존성 업데이트가 필요하다는 warning 을 노출하는데 buildSrc 를 사용하게 되면 이 기능이 제공되지 않습니다.
    • 단 별도 플러그인으로 대체 가능하긴 합니다.
 

안드로이드 스튜디오 플러그인 소개 - Gradle Dependency Updates

Gradle Dependency Updates 는 build.gradle 의 dependency 가 업데이트를 도와주는 플러그인 입니다. 플러그인 설치 후 Menu 에서 View -> Tool Windows -> Dependency Updates 를 누르면 됩니다. 위와 같이 업데이트가 가능

victorywskim.tistory.com

 

따라서 작은 프로젝트의 경우에는 굳이 buildSrc 를 굳이 적용할 필요는 없지만 멀티 모듈 프로젝트의 경우에는 유용하게 사용 가능합니다.

 

적용 방법은 다음과 같습니다.

 

1. buildSrc 모듈을 추가합니다.

 

 

menu 의 File -> New -> New Module... 를 클릭합니다.

 

라이브러리 명은 buildSrc 로 짓고 나머지는 상황에 맞게 작성하시면 됩니다.

 

Finish 를 누르시고 2가지를 고쳐주셔야 합니다.

 

  1. settings.gradle.kts 안에 include(":buildSrc") 줄은 지워주셔야 합니다.
  2. build.gradle.kts ("buildSrc") 내 정보를 모두 지우고 다음과 같이 수정해주세요.
plugins {
    `kotlin-dsl`
}

repositories {
    google()
    mavenCentral()
}

 

그 다음 sync 를 돌려주시면 모듈이 정상적으로 추가되게 됩니다.

 

 

2. 구조 잡기

 

 

저는 기본적으로 앱 설정, 일반 의존성, 테스트 의존성 등 3개 파일로 관리하고 있습니다.

위 3개 파일들을 만드시기 전에 기본 경로가 있다면 모두 제거해주시면 되겠습니다.

 

buildSrc -> src -> main -> kotlin 아래 바로 위치하게 되는 구조입니다.

 

AppConfig.kt

object AppConfig {

    const val versionCode = 1
    const val versionName = "1.0.0"

    const val sdkMin = 23
    const val targetSdk = 34
    const val buildToolsVersion = "34.0.0"

    const val jvmTarget = "17"
    val javaVersion = JavaVersion.VERSION_17

    const val sdkPreview = "UpsideDownCake"

    const val kotlin = "1.8.10"

    // https://developer.android.com/jetpack/androidx/releases/compose-kotlin?hl=ko
    const val kotlinCompilerExtensionVersion = "1.4.3" // 1.8.10
}

 

앱의 주요 정보들을 관리하는 역할을 수행합니다.

 

SdDependency.kt

object SdDependency {

    object Kotlin {
        // https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-bom
        const val bom = "org.jetbrains.kotlin:kotlin-bom:1.9.10"
        // https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-reflect
        const val reflect = "org.jetbrains.kotlin:kotlin-reflect:1.9.10"
    }
    
    object Androidx {
		...
    }
    
    ...
}

 

앱에서 사용하는 의존성 정보를 추가합니다.

 

SdTestDependency.kt

object SdTestDependency {
    object Tdd {
        // https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api
        const val junit5 = "org.junit.jupiter:junit-jupiter-api:5.10.0"
        // https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine
        const val junit5Engine = "org.junit.jupiter:junit-jupiter-engine:5.10.0"
        // https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params
        const val junit5Params = "org.junit.jupiter:junit-jupiter-params:5.10.0"
        // https://mvnrepository.com/artifact/org.junit.vintage/junit-vintage-engine
        const val junit5ParamsEngine = "org.junit.vintage:junit-vintage-engine:5.10.0"
        // https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-test
        const val coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3"
        // https://mvnrepository.com/artifact/io.mockk/mockk
        const val mockk = "io.mockk:mockk:1.13.7"
    }


    object Bdd {
        // https://mvnrepository.com/artifact/androidx.test.ext/junit
        const val junit = "androidx.test.ext:junit:1.1.5"

        // https://mvnrepository.com/artifact/androidx.compose/compose-bom
        const val composeBom = "androidx.compose:compose-bom:2023.10.00"
        const val composeJunit = "androidx.compose.ui:ui-test-junit4"


        const val debugComposeTooling = "androidx.compose.ui:ui-tooling"
        const val debugComposeManifest = "androidx.compose.ui:ui-test-manifest"
    }
}

 

테스트 코드를 작성하기 위한 의존성입니다. 

 

3. 적용하기

 

build.gradle.kts

import wskim.aos.buildSrc.AppConfig
import wskim.aos.buildSrc.SdDependency
import wskim.aos.buildSrc.SdTestDependency

...

dependencies {

    ...

    // tdd
    testImplementation(SdTestDependency.Tdd.junit5)
    testRuntimeOnly(SdTestDependency.Tdd.junit5Engine)
    testImplementation(SdTestDependency.Tdd.junit5Params)
    testRuntimeOnly(SdTestDependency.Tdd.junit5ParamsEngine)

    testImplementation(SdTestDependency.Tdd.mockk)

    testImplementation(SdTestDependency.Tdd.coroutines)

    // bdd1
    androidTestImplementation(SdTestDependency.Bdd.junit)
    androidTestImplementation(platform(SdTestDependency.Bdd.composeBom))
    androidTestImplementation(SdTestDependency.Bdd.composeJunit)

    // bdd2
    debugImplementation(SdTestDependency.Bdd.debugComposeTooling)
    debugImplementation(SdTestDependency.Bdd.debugComposeManifest)
}

...

android {
    namespace = "wskim.aos.simpledutch"
    compileSdk = AppConfig.targetSdk

    defaultConfig {
        applicationId = "wskim.aos.simpledutch"

        minSdk = AppConfig.sdkMin
        targetSdk = AppConfig.targetSdk
        versionCode = AppConfig.versionCode
        versionName = AppConfig.versionName
        buildToolsVersion = AppConfig.buildToolsVersion

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary = true
        }
    }
    
    ...

 

위와 같이 기존 build.gradle 을 수정해주시고 싱크를 맞춰주시면 되겠습니다.

 

이상으로 buildSrc 적용을 마칩니다.

 

감사합니다.

 

반응형