모듈이라는 것은 소프트웨어를 개발할 때 특정 기능이나 역할을 수행하며, 별도로 컴파일, 테스트, 유지보수가 가능한 코드 집합을 의미한다.
그리고 현재 이 글을 보고있는 당신도 이러한 모듈 내의 코드를 개발하여 결과물을 만들어내고 있을 것이다.
이러한 모듈은 단일 모듈만이 아닌 Layer 별 관심사를 분리하여 여러가지 모듈로 분리한 "멀티 모듈" 로 작성할 수도 있는데, 안드로이드 스튜디오에서는 Clean Architecture 와 함께하여 멀티 모듈을 많이들 사용한다.
단 이러한 부분에서 한 가지 귀찮은 부분이 생긴다.
바로 모듈이 하나 추가될 때마다 각 모듈별 빌드 설정값을 지정하는 스크립트 파일 "Build.gradle.kts" 가 생성되는 것이다.
그리고 이러한 모듈 안에서는 분명 중복으로 사용되는 코드들이 있을텐데, 쉽게 아래 이미지와 같은 것들이 있을 것이다.
뭐, 비록 있어도 상관은 없겠지만 새로운 모듈이 생겨나면서 하나하나씩 일일이 설정하는 것과 동시에 추후에 JavaVersion 을 변경해줘야한다면 각각의 모듈에 존재하는 코드들을 변경시켜주는 것도 여간 귀찮은 일이 아닐 것이다.
이럴 때 우리가 사용할 수 있는 것이 subproject 기능이다.
RootProject 에서 이러한 subproject 를 사용하면 각 서브프로젝트 (모듈) 에 대한 설정을 한번에 처리할 수 있다.
다음은 내가 RootProject 의 Build.gradle.kts 에 설정한 subproject 코드이다
subprojects {
val javaVersion = JavaVersion.VERSION_17
val projectCompileSDK = 35
val projectMinSDK = 26
val targetSDK = 34
val jvmTarget = JvmTarget.JVM_17
fun setKotlinCompileJvmTarget() = tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
compilerOptions {
this.jvmTarget.set(jvmTarget)
}
}
plugins.withId("com.android.application") {
extensions.configure<ApplicationExtension> {
compileSdk = projectCompileSDK
defaultConfig {
minSdk = projectMinSDK
targetSdk = targetSDK
}
compileOptions {
sourceCompatibility = javaVersion
targetCompatibility = javaVersion
}
setKotlinCompileJvmTarget()
}
}
plugins.withId("com.android.library") {
extensions.configure<LibraryExtension> {
compileSdk = projectCompileSDK
defaultConfig {
minSdk = projectMinSDK
}
compileOptions {
sourceCompatibility = javaVersion
targetCompatibility = javaVersion
}
setKotlinCompileJvmTarget()
buildTypes {
release { isMinifyEnabled = false }
}
}
}
}
모든 모듈에서 중복되는 compileOptions 나 JvmTarget, BuildType 과 같은 기능을 이 subproject 에서 처리해주고 있다.
다만 이것을 설정할 때 유의해야하는 것은 plusgins.withId 로 대상 서브프로젝트의 Id 를 지정해줘야한다는 것이다.
App 모듈과 같이 앱을 통합하여 빌드하는 중심 모듈에는 com.android.Application으로, 그 외의 라이브러리 모듈인 경우 com.android.Library 로 ID 를 비교하여 내부 코드를 실행하게 한다.
또한 com.android.Application 의 extensions.configure 타입으로는 ApplicationExtension
com.android.Library 의 extensions.configure 타입으로는 LibraryExtension 을 사용해도록 한다.
-> 만약 RootProject 의 Build.gradle.kts 에서 subproject 에 대한 설정을 끝마쳤다면 아래처럼 간단해진 Build.gradle.kts 파일을 볼 수 있게 된다 !
기존 나의 경우 이러한 기능도 몰라 ext 로 확장변수를 하나 만들고 그것을 각 모듈별 build.gradle.kts 파일에서 가져다 쓰고는 했었는데, 이러한 방법을 늦게라도 알아서 다행이라고 생각한다 ..
'프로그래밍 > 안드로이드' 카테고리의 다른 글
[안드로이드] Intent 로 이메일 전송 기능 만들기 (0) | 2025.03.06 |
---|---|
[안드로이드] DI 를 하는 이유와 Hilt 와 Koin 의 차이에 대해 알아보자 (0) | 2025.02.22 |
[Android Studio] Kotlin 2.0.x 버전에서 Unresolved Reference 에러 발생 (1) | 2025.01.05 |
[Android Studio] Kotlin 버전을 2.0.x 으로 마이그레이션 하기 (0) | 2025.01.04 |
[Android] 깃허브 액션을 통해 자동으로 릴리즈 태그 생성하기 (커밋 기록 포함) (1) | 2024.12.07 |