나만의 안드로이드 앱 만들기/중급자
나만의 안드로이드 앱 만들기(중급자 편) - buildSrc 추가하기
Victorywskim
2023. 12. 22. 20:19
반응형
buildSrc 에 대한 설명은 다음과 같습니다.
- Gradle 프로젝트의 빌드 스크립트를 작성하기 위한 별도의 디렉터리이며, 작성된 빌드 스크립트는 전체 프로젝트의 빌드 스크립트에서 사용할 수 있습니다.
buildSrc를 사용하면 다음과 같은 장점이 있습니다.
- 중복 코드 제거
- buildSrc를 사용하면 여러 모듈에서 공통으로 사용하는 빌드 스크립트를 하나의 디렉터리에 작성할 수 있습니다. 이렇게 하면 중복 코드를 제거하고 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
- 빌드 속도 향상
- buildSrc를 사용하면 빌드 스크립트를 한 번만 컴파일하면 되므로, 빌드 속도를 향상시킬 수 있습니다.
단점은 다음과 같습니다.
- 작업량 증가
- 별도 모듈에 버전 정보를 작성해야하기 때문에 작업량이 증가합니다.
- 업데이트 피드백 사용 불가
- 안드로이드 스튜디오에서는 build.gradle 에서 새로운 버전이 나오면 의존성 업데이트가 필요하다는 warning 을 노출하는데 buildSrc 를 사용하게 되면 이 기능이 제공되지 않습니다.
- 단 별도 플러그인으로 대체 가능하긴 합니다.
따라서 작은 프로젝트의 경우에는 굳이 buildSrc 를 굳이 적용할 필요는 없지만 멀티 모듈 프로젝트의 경우에는 유용하게 사용 가능합니다.
적용 방법은 다음과 같습니다.
1. buildSrc 모듈을 추가합니다.
menu 의 File -> New -> New Module... 를 클릭합니다.
라이브러리 명은 buildSrc 로 짓고 나머지는 상황에 맞게 작성하시면 됩니다.
Finish 를 누르시고 2가지를 고쳐주셔야 합니다.
- settings.gradle.kts 안에 include(":buildSrc") 줄은 지워주셔야 합니다.
- 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 적용을 마칩니다.
감사합니다.
반응형