기존 제가 사용하던 DSL 방법이 빌드를 해보니 오류가 났던 기억이 있어 글을 작성하게 되었습니다
강의에서 사용했던 Gradle를 아래 소개해 드리는 방법으로 변경해 주세요!
Gradle 파일 이름 변경
기존 build.gradle 파일을 모두 우클릭 후 Refactor -> Rename을 눌러 기존 파일 이름 뒤에. kts를 붙여줍니다. 그리고 REFACTOR -> DO REFACTOR를 눌러줍니다. (app, presentation, domain, data 모든 모듈의 gradle 파일을 같은 방법으로 바꿔줍니다)
모두 바꾸셨다면 위 그림처럼 gradle 코끼리 그림에 kotlin 문양이 생기게 됩니다!
이렇게 바꾸기 빌드를 해보면 오류가 나게 됩니다, 파일 자체가 Kotlin DSL 전용 파일로 바뀌어 기존 그루비 DSL 문법이 있다면 오류가 나게 됩니다. 이제 그 부분들을 모두 변경해 주겠습니다!
그루비 DSL 문법을 모두 코틀린 DSL로 변경
우선 app 모듈 gradle 먼저 보겠습니다
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
id 'com.google.gms.google-services'
}
android {
compileSdk 31
defaultConfig {
applicationId "com.pss.check_percentage"
minSdk 21
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
dataBinding true
}
}
dependencies {
implementation project(":data")
implementation project(':domain')
implementation project(":presentation")
implementation (KTX.CORE)
implementation (AndroidX.APP_COMPAT)
implementation (Google.MATERIAL)
implementation (AndroidX.CONSTRAINT_LAYOUT)
implementation 'com.google.firebase:firebase-database-ktx:20.0.3'
implementation 'com.google.firebase:firebase-firestore-ktx:24.0.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
// dager hilt
implementation (DaggerHilt.DAGGER_HILT)
kapt (DaggerHilt.DAGGER_HILT_COMPILER)
implementation (DaggerHilt.DAGGER_HILT_VIEW_MODEL)
kapt (DaggerHilt.DAGGER_HILT_ANDROIDX_COMPILER)
// Retrofit
implementation (Retrofit.RETROFIT)
implementation (Retrofit.CONVERTER_GSON)
implementation (Retrofit.CONVERTER_JAXB)
//okHttp
implementation (OkHttp.OKHTTP)
implementation (OkHttp.LOGGING_INTERCEPTOR)
//datastore
implementation (AndroidX.DATASTORE)
}
이렇게 있는 부분들을 아래와 같이 변경해 줍니다, '?'와 "?"를 잘 구분해 주셔야 합니다
plugins {
id("com.android.application")
id("kotlin-android")
id("kotlin-kapt")
id("dagger.hilt.android.plugin")
id("com.google.gms.google-services")
}
android {
compileSdk = 31
defaultConfig {
applicationId = "com.pss.check_percentage"
minSdk = 21
targetSdk = 31
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
isTestCoverageEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
dataBinding = true
}
}
dependencies {
implementation (project (":data"))
implementation (project (":domain"))
implementation (project (":presentation"))
implementation (KTX.CORE)
implementation (AndroidX.APP_COMPAT)
implementation (Google.MATERIAL)
implementation (AndroidX.CONSTRAINT_LAYOUT)
implementation (Firebase.FIREBASE_DATABASE_KTX)
implementation (Firebase.FIREBASE_FIRESTORE_KTX)
testImplementation (TestTool.JUNIT)
androidTestImplementation (TestTool.ANDROID_X_JUNIT)
androidTestImplementation (TestTool.ANDROID_X_ESPRESSO)
// dager hilt
implementation (DaggerHilt.DAGGER_HILT)
kapt (DaggerHilt.DAGGER_HILT_COMPILER)
implementation (DaggerHilt.DAGGER_HILT_VIEW_MODEL)
kapt (DaggerHilt.DAGGER_HILT_ANDROIDX_COMPILER)
// Retrofit
implementation (Retrofit.RETROFIT)
implementation (Retrofit.CONVERTER_GSON)
implementation (Retrofit.CONVERTER_JAXB)
//okHttp
implementation (OkHttp.OKHTTP)
implementation (OkHttp.LOGGING_INTERCEPTOR)
//datastore
implementation (AndroidX.DATASTORE)
}
기존에 buildSrc 모듈의 Dependency 파일에서 관리가 안되던 종속성도 가능해지게 되기 때문에 Dependency 파일에 Firebase와 Test 부분을 추가해 줍니다
object Firebase{
const val FIREBASE_DATABASE_KTX = "com.google.firebase:firebase-database-ktx:20.0.3"
const val FIREBASE_FIRESTORE_KTX = "com.google.firebase:firebase-firestore-ktx:24.0.0"
}
object TestTool {
const val JUNIT = "junit:junit:4.+"
const val ANDROID_X_JUNIT = "androidx.test.ext:junit:1.1.3"
const val ANDROID_X_ESPRESSO = "androidx.test.espresso:espresso-core:3.4.0"
}
이제 presentation 모듈 단위의 gradle를 변경해 줍니다
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
}
android {
compileSdk 31
defaultConfig {
minSdk 21
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
dataBinding true
}
}
dependencies {
implementation project(':domain')
implementation project(':data')
implementation (KTX.CORE)
implementation (AndroidX.APP_COMPAT)
implementation (Google.MATERIAL)
implementation (AndroidX.CONSTRAINT_LAYOUT)
implementation (AndroidX.LEGACY)
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.firebase:firebase-database-ktx:20.0.3'
implementation 'com.google.firebase:firebase-firestore-ktx:24.0.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
testImplementation 'junit:junit:4.+'
androidTestImplementation (AndroidTest.EXT_JUNIT)
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
// dagger hilt
implementation (DaggerHilt.DAGGER_HILT)
kapt (DaggerHilt.DAGGER_HILT_COMPILER)
implementation (DaggerHilt.DAGGER_HILT_VIEW_MODEL)
kapt (DaggerHilt.DAGGER_HILT_ANDROIDX_COMPILER)
// ViewModel
implementation (AndroidX.LIFECYCLE_VIEW_MODEL)
// LiveData
implementation (AndroidX.LIFECYCLE_LIVEDATA)
// Retrofit
implementation (Retrofit.RETROFIT)
implementation (Retrofit.CONVERTER_GSON)
implementation (Retrofit.CONVERTER_JAXB)
//okHttp
implementation (OkHttp.OKHTTP)
implementation (OkHttp.LOGGING_INTERCEPTOR)
//coroutines
implementation (Coroutines.COROUTINES)
//by viewModel
implementation (AndroidX.ACTIVITY)
implementation (AndroidX.FRAGMENT)
//nav component
implementation (NavComponent.NAVIGATION_FRAGMENT)
implementation (NavComponent.NAVIGATION_UI)
implementation (NavComponent.NAVIGATION_DYNAMIC_FEATURES_FRAGMENT)
androidTestImplementation (NavComponent.NAVIGATION_TESTING)
implementation (NavComponent.NAVIGATION_COMPOSE)
//datastore
implementation (AndroidX.DATASTORE)
implementation "com.github.ParkSangSun1:NotificationBarCustom:1.0.3"
implementation "com.github.ParkSangSun1:CountNumberEvent:1.0.4"
}
기존 이렇게 되어있던 부분을 아래와 같이 변경해 줍니다, 자동으로 추가된 중복되는 종속성 들은 제거 해 주겠습니다.
plugins {
id ("com.android.library")
id ("kotlin-android")
id ("kotlin-kapt")
id ("dagger.hilt.android.plugin")
}
android {
compileSdk = 31
defaultConfig {
minSdk = 21
targetSdk = 31
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
dataBinding = true
}
}
dependencies {
implementation (project (":domain"))
implementation (project (":data"))
implementation (KTX.CORE)
implementation (AndroidX.APP_COMPAT)
implementation (Google.MATERIAL)
implementation (AndroidX.CONSTRAINT_LAYOUT)
implementation (AndroidX.LEGACY)
implementation (Firebase.FIREBASE_DATABASE_KTX)
implementation (Firebase.FIREBASE_FIRESTORE_KTX)
testImplementation (TestTool.JUNIT)
androidTestImplementation (TestTool.ANDROID_X_JUNIT)
androidTestImplementation (TestTool.ANDROID_X_ESPRESSO)
// dagger hilt
implementation (DaggerHilt.DAGGER_HILT)
kapt (DaggerHilt.DAGGER_HILT_COMPILER)
implementation (DaggerHilt.DAGGER_HILT_VIEW_MODEL)
kapt (DaggerHilt.DAGGER_HILT_ANDROIDX_COMPILER)
// ViewModel
implementation (AndroidX.LIFECYCLE_VIEW_MODEL)
// LiveData
implementation (AndroidX.LIFECYCLE_LIVEDATA)
// Retrofit
implementation (Retrofit.RETROFIT)
implementation (Retrofit.CONVERTER_GSON)
implementation (Retrofit.CONVERTER_JAXB)
//okHttp
implementation (OkHttp.OKHTTP)
implementation (OkHttp.LOGGING_INTERCEPTOR)
//coroutines
implementation (Coroutines.COROUTINES)
//by viewModel
implementation (AndroidX.ACTIVITY)
implementation (AndroidX.FRAGMENT)
//nav component
implementation (NavComponent.NAVIGATION_FRAGMENT)
implementation (NavComponent.NAVIGATION_UI)
implementation (NavComponent.NAVIGATION_DYNAMIC_FEATURES_FRAGMENT)
androidTestImplementation (NavComponent.NAVIGATION_TESTING)
implementation (NavComponent.NAVIGATION_COMPOSE)
//datastore
implementation (AndroidX.DATASTORE)
implementation (Library.NOTIFICATION_BAR_CUSTOM)
implementation (Library.COUNT_NUMBER_EVENT)
}
가장 아래 라이브러리 부분 또한 디펜던시 파일에 추가해 줍니다
object Library{
const val NOTIFICATION_BAR_CUSTOM = "com.github.ParkSangSun1:NotificationBarCustom:1.0.3"
const val COUNT_NUMBER_EVENT = "com.github.ParkSangSun1:CountNumberEvent:1.0.4"
}
이제 domain 모듈로 가봅니다, 클린 아키텍처에서의 domain은 안드로이드의 의존성을 가지지 않고 Java나 Kotlin으로만 이루어져 있어야 하며 다른 애플리케이션에서 사용할 수 있어야 합니다. 때문에 라이브러리 종속성을 모두 삭제해 줍니다.
(하지만 아직 domain layer에는 라이브러리에 의존성을 가지는 코드들이 존재해 그냥 삭제하고 빌드하게 되면 오류가 가게 됩니다. 추후 다른 글에서 이 부분에 대해서 다루기 때문에 우선 그대로 두겠습니다)
2022.08.18 - [Android] - Android clean architecture에서 domain을 좀 더 domain 답게!
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
id 'com.google.gms.google-services'
}
android {
compileSdk = 31
defaultConfig {
minSdk = 21
targetSdk = 31
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation (KTX.CORE)
implementation (AndroidX.APP_COMPAT)
implementation (Google.MATERIAL)
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.google.firebase:firebase-database-ktx:20.0.3'
implementation 'com.google.firebase:firebase-firestore-ktx:24.0.1'
// Retrofit
implementation (Retrofit.RETROFIT)
implementation (Retrofit.CONVERTER_GSON)
implementation (Retrofit.CONVERTER_JAXB)
//okHttp
implementation (OkHttp.OKHTTP)
implementation (OkHttp.LOGGING_INTERCEPTOR)
// dager hilt
implementation (DaggerHilt.DAGGER_HILT)
kapt (DaggerHilt.DAGGER_HILT_COMPILER)
implementation (DaggerHilt.DAGGER_HILT_VIEW_MODEL)
kapt (DaggerHilt.DAGGER_HILT_ANDROIDX_COMPILER)
}
기존 코드를 아래와 같이 변경해 줍니다
plugins {
id ("com.android.library")
id ("kotlin-android")
id ("kotlin-kapt")
id ("dagger.hilt.android.plugin")
id ("com.google.gms.google-services")
}
android {
compileSdk = 31
defaultConfig {
minSdk = 21
targetSdk = 31
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation (KTX.CORE)
implementation (AndroidX.APP_COMPAT)
implementation (Google.MATERIAL)
testImplementation (TestTool.JUNIT)
androidTestImplementation (TestTool.ANDROID_X_JUNIT)
androidTestImplementation (TestTool.ANDROID_X_ESPRESSO)
implementation (Firebase.FIREBASE_DATABASE_KTX)
implementation (Firebase.FIREBASE_FIRESTORE_KTX)
// Retrofit
implementation (Retrofit.RETROFIT)
implementation (Retrofit.CONVERTER_GSON)
implementation (Retrofit.CONVERTER_JAXB)
//okHttp
implementation (OkHttp.OKHTTP)
implementation (OkHttp.LOGGING_INTERCEPTOR)
// dager hilt
implementation (DaggerHilt.DAGGER_HILT)
kapt (DaggerHilt.DAGGER_HILT_COMPILER)
implementation (DaggerHilt.DAGGER_HILT_VIEW_MODEL)
kapt (DaggerHilt.DAGGER_HILT_ANDROIDX_COMPILER)
}
마지막 data 모듈 부분을 보겠습니다
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
id 'com.google.gms.google-services'
}
android {
compileSdk 31
defaultConfig {
minSdk 21
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation project(':domain')
implementation (KTX.CORE)
implementation (AndroidX.APP_COMPAT)
implementation (Google.MATERIAL)
implementation 'com.google.firebase:firebase-database-ktx:20.0.3'
implementation 'com.google.firebase:firebase-firestore-ktx:24.0.1'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
// Retrofit
implementation (Retrofit.RETROFIT)
implementation (Retrofit.CONVERTER_GSON)
implementation (Retrofit.CONVERTER_JAXB)
//okHttp
implementation (OkHttp.OKHTTP)
implementation (OkHttp.LOGGING_INTERCEPTOR)
//coroutines
implementation (Coroutines.COROUTINES)
// dager hilt
implementation (DaggerHilt.DAGGER_HILT)
kapt (DaggerHilt.DAGGER_HILT_COMPILER)
implementation (DaggerHilt.DAGGER_HILT_VIEW_MODEL)
kapt (DaggerHilt.DAGGER_HILT_ANDROIDX_COMPILER)
}
기존 코드를 아래와 같이 변경해 줍니다
plugins {
id ("com.android.library")
id ("kotlin-android")
id ("kotlin-kapt")
id ("dagger.hilt.android.plugin")
id ("com.google.gms.google-services")
}
android {
compileSdk = 31
defaultConfig {
minSdk = 21
targetSdk = 31
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation (project (":domain"))
implementation (KTX.CORE)
implementation (AndroidX.APP_COMPAT)
implementation (Google.MATERIAL)
implementation (Firebase.FIREBASE_DATABASE_KTX)
implementation (Firebase.FIREBASE_FIRESTORE_KTX)
testImplementation (TestTool.JUNIT)
androidTestImplementation (TestTool.ANDROID_X_JUNIT)
androidTestImplementation (TestTool.ANDROID_X_ESPRESSO)
// Retrofit
implementation (Retrofit.RETROFIT)
implementation (Retrofit.CONVERTER_GSON)
implementation (Retrofit.CONVERTER_JAXB)
//okHttp
implementation (OkHttp.OKHTTP)
implementation (OkHttp.LOGGING_INTERCEPTOR)
//coroutines
implementation (Coroutines.COROUTINES)
// dager hilt
implementation (DaggerHilt.DAGGER_HILT)
kapt (DaggerHilt.DAGGER_HILT_COMPILER)
implementation (DaggerHilt.DAGGER_HILT_VIEW_MODEL)
kapt (DaggerHilt.DAGGER_HILT_ANDROIDX_COMPILER)
}
이제 sync now 해줍니다!
이제 gradle를 확인해 보면 Kotlin DSL의 장점인 구문 강조가 눈에 보일 것입니다, 또 자동완성 또한 가능합니다
이렇게 끝내기에는 다소 아쉽습니다..! 왜냐고요?! 버전 관리를 각각의 모듈에서 해줘야하기 때문입니다. 네, 정말 귀찮습니다. 그리니 귀찮지 않게 한번 바꿔봅니다
buildSrc 모듈을 이용한 쉬운 버전관리
buildSrc 모듈의 java 폴더에 Versions.kt File을 만들어 줍니다.
그리고 이 안에서 앱의 버전과 sdk 버전 관리를 위한 object를 만들어 줍니다.
object SdkVersions {
const val targetSdk = 31
const val compileSdk = 31
const val minSdk = 21
}
object AppVersions {
private const val versionMajor = 1
private const val versionMinor = 0
private const val versionPatch = 0
const val androidVersionCode = 1
const val androidVersionName = "$versionMajor.$versionMinor.$versionPatch"
}
업데이트를 하면서 androidVersionCode를 1씩 올리고 version Major, Minor, Patch를 유동적으로 올려?.?.? 버전이라는 이름이 나오게 합니다. 현재는 androidVersionName은 1.0.0입니다
이제 gradle로 가서 기존 숫자로 이루어진 버전 표시를 다음과 같이 모든 모듈의 gardle 파일을 바꿔줍니다(일부 모듈에서는 버전 코드와 네임이 필요하지 않습니다)
compileSdk = SdkVersions.compileSdk
defaultConfig {
applicationId = "com.pss.check_percentage"
minSdk = SdkVersions.minSdk
targetSdk = SdkVersions.targetSdk
versionCode = AppVersions.androidVersionCode
versionName = AppVersions.androidVersionName
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
이제 쉽게 버전 관리도 할 수 있게 되었습니다!
전체 코드와 강의는 아래 링크에서 확인 가능합니다.
https://github.com/ParkSangSun1/Check_Percentage
'Android' 카테고리의 다른 글
[Android] 의존성 주입에 대해 완벽히 이해하기 (Hilt, DIP, IoC) (0) | 2022.08.24 |
---|---|
Android clean architecture에서 domain을 좀 더 domain 답게! (0) | 2022.08.18 |
RecyclerView + DiffUtil를 이용해 보자! (feat.Kotlin) (0) | 2022.04.13 |
[Android] Firebase에서 코루틴을 사용해보자! (feat.Firestore) (0) | 2022.03.11 |
[Jetpack compose] Text를 사용해 보자! (0) | 2022.03.03 |