나만 보는 일기장

Kotlin DSL & BuildSrc 사용해보자 본문

개발/Android

Kotlin DSL & BuildSrc 사용해보자

Patrick0422 2022. 5. 11. 17:30

DSL(Domain Specific Language)이란 도메인 특화 언어로, 특정한 도메인에 사용하는데 특화된 컴퓨터 언어입니다.

기존의 Groovy 대신 Kotlin DSL을 사용하면 코드 하이라이팅, 자동완성, 문법 검사 등 IDE에서 제공하는 좋은 기능들을 사용할 수 있습니다. 하지만, 특정 경우에 Groovy보다 속도가 느리다는 단점이 있습니다.

 

Gradle 파일 변환

먼저 프로젝트의 루트 경로에 오른쪽 클릭 후 new->Directory를 눌러 buildSrc라는 이름으로 경로를 만들어줍니다. 그리고 buildSrc에서 오른쪽 클릭 후 new->File을 눌러 build.gradle.kts라는 이름으로 파일을 새로 생성해주고 내부에는 다음과 같이 적어줍니다.

plugins {
    `kotlin-dsl`
}

repositories {
    google()
    mavenCentral()
}

그리고 Gradle Sync를 해 Kotlin DSL을 활성화할 수 있습니다.

이렇게 뭔가 주르륵 생기면 성공입니다.

그 이후, buildSrc에 아까같이 오른쪽 클릭 후 new->Directory를 누르면

위와 같이 자동완성이 뜨는데, src\main\kotlin을 선택해 만들어주고, 그 안에 Dependency.kt라는 파일을 만들어줍니다.

Dependency 내부에 각종 의존성들을 넣어놓고 관리하는데, 싱글톤으로 관리하기 위해 object로 만들어주었습니다.

 

Dependency.kt

object Dependency {

    object Kotlin {
        const val SDK = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.21"
    }

    object AndroidX {
        const val MATERIAL = "com.google.android.material:material:1.5.0"
        const val CONSTRAINT_LAYOUT = "androidx.constraintlayout:constraintlayout:2.1.3"
        const val APP_COMPAT = "androidx.appcompat:appcompat:1.3.1"
    }

    object KTX {
        const val CORE = "androidx.core:core-ktx:1.7.0"
    }

    object Test {
        const val JUNIT = "junit:junit:4.13.2"
        const val ANDROID_JUNIT_RUNNER = "AndroidJUnitRunner"
    }

    object AndroidTest {
        const val TEST_RUNNER = "androidx.test.ext:junit:1.1.3"
        const val ESPRESSO_CORE = "androidx.test.espresso:espresso-core:3.4.0"
    }
}

 

 

이제 나머지 build.gradle도 Kotlin DSL로 바꾸어주겠습니다.



왼쪽에서 오른쪽과 같이 *.gradle 파일들을 *.gradle.kts 형식으로 변경해줍니다. 그러면 이제 gradle 파일들이

코틀린 문법을 따르게 되기 때문에 그에 맞게 수정을 해주어야 합니다.

기본 생성된 프로젝트를 기준으로 코틀린 문법에 맞게 수정한 버전은 다음과 같습니다.

 

app 단위 gradle

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

android {
    compileSdk = 32

    defaultConfig {
        applicationId = "com.patrick.dailypoem"
        minSdk = 21
        targetSdk = 32
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    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 = "1.8"
    }
    buildFeatures {
        dataBinding = true
    }
}

dependencies {

    implementation(Dependency.KTX.CORE)
    implementation(Dependency.AndroidX.APP_COMPAT)
    implementation(Dependency.AndroidX.MATERIAL)
    implementation(Dependency.AndroidX.CONSTRAINT_LAYOUT)
    testImplementation(Dependency.Test.JUNIT)
    androidTestImplementation(Dependency.AndroidTest.TEST_RUNNER)
    androidTestImplementation(Dependency.AndroidTest.ESPRESSO_CORE)
}

project 단위 gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id("com.android.application") version "7.1.3" apply false
    id("com.android.library") version "7.1.3" apply false
    id("org.jetbrains.kotlin.android") version "1.6.20" apply false
}
tasks.register("clean", Delete::class) {
    delete(rootProject.buildDir)
}

settings.gradle.kts

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

실행이 잘 되면 성공입니다.

안된다고요?

Comments