개발 공부/Kotlin 코틀린

Kotlin DSL에 대해 알아보기 (2)

밍혁팟 2022. 9. 27. 10:30

저번 시간엔 Kotlin DSL을 공부해보기전 DSL의 대한 개념을 정리했었다.

이번 시간엔 Kotlin DSL이란 무엇인가에 대해 간단하게 정리하고 직접 실습해볼것이다.

 

Kotlin DSL?


DSL이 도메인 특화 언어라고 저번에 배웠었는데 그러면 Kotlin DSL이란 무엇일까?

Kotlin DSL이란 코틀린만의 언어직 특성을 살려서 스크립트(Gradle)를 작성하는 DSL이다.

 

장단점으론

장점

- 익숙한 Kotlin으로 작업할 수 있다.

- 제약을 가하는 표현방식이 좋은경우 Kotlin DSL이 더 적합할 수 있다.

-  코드 자동완성과 참조 / 문법 오류 코드 강조, 리펙토링이 가능하다

 

단점

- 빌드시간이 Groovy보다 느리다.

가 있다.

 

그럼 간단하게 알아봤으니 Kotlin DSL을 직접 사용해보자

 

Groovy -> Kotlin DSL로 변환 실습


먼저 root 경로에 buildSrc라는 이름으로 디렉토리를 생성한다.

그 다음 그 폴더안에 build.gradle.kts 라는 이름의 파일을 생성해준다. ('buildSrc' 폴더 마우스 오른쪽 클릭 -> New -> File)

plugins {
    `kotlin-dsl`
}

repositories {
    google()
    mavenCentral()
}

그 파일의 내용을 위와 같이 작성해 준다음 Gradle Sync를 해준다.

 

작업이 끝난다면 이렇게 세팅이 되어있을 것이다

그리고 src\main\kotlin 의 폴더를 만들고 Config.kt, Dependency.kt 오브젝트 파일을 생성한다.

 

object Config {
    const val compileSdk = 32
    const val applicationId = "com.example.kotlin_dsl"
    const val minSdk = 21
    const val targetSdk = 32
    const val versionCode = 1
    const val versionName = "1.0"
    const val testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    const val jvmTarget = "1.8"
}

Config.kt 내용

object Dependency {
    object Versions {
        const val core = "1.7.0"
        const val appCompat = "1.5.1"
        const val material = "1.6.1"
        const val constraint_layout = "2.1.4"
        const val legacy = "1.0.0"
        const val junit = "1.1.3"
        const val espresso = "3.4.0"

        const val navigation = "2.5.2"
        const val retrofit2 = "2.9.0"
        const val glide = "4.12.0"
        const val firebase = "20.0.2"
        const val jsoup = "1.13.1"
        const val room = "2.4.3"
        const val swipeRefreshLayout = "1.1.0"
        const val MPAndroidChart = "v3.1.0"
        const val coroutines = "1.6.3"
        const val lottie = "4.1.0"
    }

    object Library {
        object AndroidX {
            const val core = "androidx.core:core-ktx:${Versions.core}"
            const val appcompat = "androidx.appcompat:appcompat:${Versions.appCompat}"
            const val material = "com.google.android.material:material:${Versions.material}"
            const val constraint_layout = "androidx.constraintlayout:constraintlayout:${Versions.constraint_layout}"
            const val espresso = "androidx.test.espresso:espresso-core:${Versions.espresso}"
            const val legacy = "androidx.legacy:legacy-support-v4:${Versions.legacy}"
            const val swipeRefreshLayout = "androidx.swiperefreshlayout:swiperefreshlayout:${Versions.swipeRefreshLayout}"
        }

        object Test {
            const val junit = "androidx.test.ext:junit:${Versions.junit}"
        }

        object Navigation {
            const val navigation_fragment = "androidx.navigation:navigation-fragment-ktx:${Versions.navigation}"
            const val navigation_ui = "androidx.navigation:navigation-ui-ktx:2.5.2:${Versions.navigation}"
        }

        object Retrofit2 {
            const val retrofit2 = "com.squareup.retrofit2:retrofit:${Versions.retrofit2}"
            const val retrofit2_gson = "com.squareup.retrofit2:converter-gson:${Versions.retrofit2}"
        }

        object Glide {
            const val glide = "com.github.bumptech.glide:glide:${Versions.glide}"
        }

        object Firebase {
            const val firebase_storage = "com.google.firebase:firebase-storage:${Versions.firebase}"
            const val firebase_storage_ktx = "com.google.firebase:firebase-storage-ktx:${Versions.firebase}"
        }

        object Jsoup {
             const val jsoup = "org.jsoup:jsoup:${Versions.jsoup}"
        }
        
        object Room {
            const val room_runtime = "androidx.room:room-runtime:${Versions.room}"
            const val room_ktx = "androidx.room:room-ktx:${Versions.room}"
        }
        
        object MPAndroidChart {
            const val mpAndroidChart = "com.github.PhilJay:MPAndroidChart:${Versions.MPAndroidChart}"
        }
        
        object Coroutines {
            const val coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-android:${Versions.coroutines}"
        }
        
        object Lottie {
            const val lottie = "com.airbnb.android:lottie:${Versions.lottie}"
        }
    }
}

Dependency.kt 내용

라이브러리 추가를 할때 이런 방식으로 추가를 해주면 된다.

 

 

그리고 gradle 파일을 모두 gradle.kts로 변경후 내용을 다음과 같이 바꾸었다.

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}
rootProject.name = "Kotlin_DSL"
include (":app")

Setting.gradle.kts

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id ("com.android.application") version ("7.2.2") apply(false)
    id ("com.android.library") version ("7.2.2") apply (false)
    id ("org.jetbrains.kotlin.android") version ("1.6.10") apply (false)
}

task ("clean", Delete::class) {
    delete = setOf(rootProject.buildDir)
}

build.gradle.kts (:project)

plugins {
    id ("com.android.application")
    id ("org.jetbrains.kotlin.android")
}

android {
    compileSdk = Config.compileSdk

    defaultConfig {
        applicationId = Config.applicationId
        minSdk = Config.minSdk
        targetSdk = Config.targetSdk
        versionCode = Config.versionCode
        versionName = Config.versionName

        testInstrumentationRunner = Config.testInstrumentationRunner
    }

    buildTypes {
        getByName("release") {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = Config.jvmTarget
    }
}

dependencies {

    implementation (Dependency.Library.AndroidX.core)
    implementation (Dependency.Library.AndroidX.appcompat)
    implementation (Dependency.Library.AndroidX.material)
    implementation (Dependency.Library.AndroidX.constraint_layout)
    implementation (Dependency.Library.AndroidX.legacy)
    androidTestImplementation (Dependency.Library.Test.junit)
    androidTestImplementation (Dependency.Library.AndroidX.espresso)

    /* Navigation Component */
    implementation (Dependency.Library.Navigation.navigation_fragment)
    implementation (Dependency.Library.Navigation.navigation_ui)

    /* Retrofit2 */
    implementation (Dependency.Library.Retrofit2.retrofit2)
    implementation (Dependency.Library.Retrofit2.retrofit2_gson)

    /* Glide */
    implementation (Dependency.Library.Glide.glide)

    /* FireBase */
    implementation (Dependency.Library.Firebase.firebase_storage)
    implementation (Dependency.Library.Firebase.firebase_storage_ktx)

    /* Jsoup */
    implementation (Dependency.Library.Jsoup.jsoup)

    /* Room */
    implementation (Dependency.Library.Room.room_runtime)
    implementation (Dependency.Library.Room.room_ktx)

    /* SwipeRefreshLayout */
    implementation (Dependency.Library.AndroidX.swipeRefreshLayout)

    /* MPAndroidChart */
    implementation (Dependency.Library.MPAndroidChart.mpAndroidChart)

    /* Coroutines */
    implementation (Dependency.Library.Coroutines.coroutines)

    /* Lottie */
    implementation (Dependency.Library.Lottie.lottie)
}

build.gradle.kts (:app)

'개발 공부 > Kotlin 코틀린' 카테고리의 다른 글

Kotlin DSL에 대해 공부해보기 (1)  (0) 2022.09.21