Gradle KTS — 정의, Gradle용 Kotlin DSL 및 구문

저자: IT Sectr 게시일: 2026-06-05 읽는 시간: 8 분

Gradle KTS는 Groovy 대신 Kotlin으로 빌드 스크립트를 작성할 수 있는 Gradle 빌드 시스템용 Kotlin DSL입니다. .gradle.kts 확장자를 가진 파일은 정적 타이핑, IntelliJ IDEA 및 Android Studio에서의 자동 완성, Kotlin 구문을 통한 Gradle API 직접 액세스를 지원합니다. Google은 AGP 7.0부터 Android 프로젝트에 KTS를 권장하며, Kotlin Multiplatform은 KTS를 표준 구성 형식으로 사용합니다. Gradle, 2025에 따르면 60% 이상의 신규 프로젝트가 빌드 스크립트 작성에 Groovy 대신 KTS를 선택합니다.

핵심 요점

  • Gradle KTS — .gradle.kts 확장자의 Gradle 빌드 스크립트용 Kotlin DSL.
  • 정적 타이핑 — 런타임이 아닌 컴파일 시점에 구성 검증.
  • IDE 지원 — IntelliJ IDEA 및 Android Studio에서 자동 완성, 탐색, 리팩토링.
  • Google 권장 — AGP 7.0부터 Android 프로젝트에 KTS 권장.
  • 마이그레이션 — Groovy에서 KTS로의 전환은 각 모듈별로 점진적으로 수행 가능.

Gradle KTS란 무엇인가?

Gradle KTS는 Gradle 구성 파일 작성을 위해 Groovy에 대한 대안을 제공하는 Kotlin DSL(도메인 특화 언어)입니다. Groovy 구문 대신 개발자는 Kotlin을 사용합니다. Kotlin은 컴파일 시점에 구성의 정확성을 검증하는 엄격한 타입 언어입니다. KTS는 2018년 Gradle 5.0에서 실험적 기능으로 처음 도입되었으며 Gradle 6.0에서 안정화되었습니다.

KTS의 주요 목표는 빌드 스크립트에서 Groovy의 단점을 제거하는 것입니다. Groovy는 동적 타입 언어로, 구성 오류가 작업 실행 중 런타임에만 나타납니다. KTS는 Kotlin의 정적 타이핑 덕분에 코드 편집 단계에서 동일한 오류를 감지할 수 있습니다. 또한 KTS는 완전한 타입 문서와 함께 Gradle API에 대한 액세스를 제공하여 복잡한 구성 블록의 학습 및 사용을 크게 간소화합니다.

KTS 생태계는 모든 주요 도구에서 지원됩니다: Android Studio, IntelliJ IDEA, Kotlin 플러그인이 포함된 VS Code, Gradle Build Tool. 모든 최신 플러그인(Android Gradle Plugin, Kotlin Multiplatform, Protobuf, Compose)은 명시적 타입의 Kotlin 친화적 API를 제공하여 KTS를 신규 프로젝트의 선호 선택으로 만듭니다.

Gradle KTS 작동 방식

Gradle KTS는 Kotlin 컴파일러를 사용하여 .gradle.kts 파일을 처리합니다. Gradle이 확장자를 인식하고 스크립트를 Kotlin 스크립팅 엔진에 전달하여 클래스로 컴파일합니다. 이 클래스들은 프로젝트 모델을 구축하기 위해 Gradle에 의해 실행됩니다. Groovy와의 주요 차이점: KTS 스크립트는 사전 컴파일되며 동적으로 해석되지 않으므로 작업 실행이 시작되기 전에 오류를 감지할 수 있습니다.

KTS 아키텍처는 kotlin-scripting을 기반으로 합니다. 각 .gradle.kts 파일은 Gradle API의 암시적 가져오기가 포함된 Kotlin 스크립트입니다. 개발자는 확장 함수, 람다, 데이터 클래스 등 모든 Kotlin 구성을 사용할 수 있으며 빌드 스크립트 내에서 도우미 함수를 선언할 수도 있습니다. Gradle은 dependencies, android, kotlin 등의 블록에 대한 타입화된 구성을 위한 확장 함수 세트를 제공합니다.

kotlin
plugins {
    id("com.android.application") version "8.4.0"
    kotlin("android") version "2.0.21"
}

android {
    namespace = "com.itsectr.app"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.itsectr.app"
        minSdk = 26
        targetSdk = 34
        versionCode = 1
        versionName = "1.0.0"
    }
}

dependencies {
    implementation(platform("androidx.compose:compose-bom:2024.06.00"))
    implementation("androidx.compose.ui:ui")
    implementation("androidx.core:core-ktx:1.13.1")
}

KTS의 타입 변환

KTS와 Groovy의 주요 차이점 중 하나는 타입 처리입니다. Groovy에서는 모든 구성이 Object를 허용하는 반면, KTS에서는 특정 Kotlin 타입을 허용합니다. 예를 들어 compileSdk는 문자열이 아닌 Int를 허용합니다. 이는 잘못된 타입 관련 오류를 제거합니다: Groovy에서는 compileSdk 34와 compileSdk "34"가 동일하게 작동하지만 KTS에서는 첫 번째 변형만 유효합니다. 이러한 엄격함은 구성을 더 예측 가능하고 문서화되도록 만듭니다.

Gradle KTS vs Groovy: 비교

Groovy는 Gradle의 원래 DSL이었으며 계속 완전히 지원됩니다. 그러나 KTS는 신규 프로젝트에 권장되는 여러 이점을 제공합니다. 정적 타이핑, IDE에서의 더 나은 편집 성능, 더 엄격한 구문이 KTS로 전환하는 주요 이유입니다. 동시에 Groovy는 단순한 구성에 대한 간결성이라는 장점을 유지합니다.

스크립트 컴파일 후 KTS와 Groovy의 빌드 성능은 거의 동일합니다. KTS 스크립트는 첫 실행 또는 캐시 정리 후 컴파일 시간이 더 오래 걸리지만 이후 빌드는 Groovy 스크립트와 동일한 속도로 실행됩니다. Gradle은 컴파일된 KTS 스크립트를 빌드 디렉토리에 캐시하므로 스크립트가 변경된 경우에만 재컴파일이 발생합니다.

특성Gradle KTSGroovy DSL
타이핑정적, 컴파일 시점에 검사동적, 런타임에 검사
IDE 지원자동 완성 + 탐색 + 리팩토링제한적 (동적 타이핑)
블록 구문리시버가 있는 람다 (타입화됨)클로저 (타입화되지 않음)
속성 할당= 사용 (compileSdk = 34)= 기호 없음 (compileSdk 34)
첫 컴파일느림 (Kotlin 컴파일)빠름 (인터프리터)
이후 빌드동일 (스크립트 캐시)동일

2026년 KTS와 Groovy의 선택은 명확합니다: 신규 프로젝트에는 KTS. Google, JetBrains 및 Gradle은 모든 신규 프로젝트에 KTS를 권장합니다. Groovy는 구성 양이나 KTS와 호환되지 않는 특정 플러그인으로 인해 마이그레이션이 비실용적인 레거시 프로젝트 유지 관리에 계속 관련이 있습니다.

코드 예제: KTS 빌드 스크립트

Android, Kotlin Multiplatform 및 Compose Multiplatform용 KTS의 일반적인 구성 블록을 살펴보겠습니다. KTS를 사용하는 Android 프로젝트는 buildTypes 및 productFlavors 구성에서 명시적 타입 지정이 필요합니다. 아래 예제는 두 가지 flavor가 있는 애플리케이션 설정을 보여줍니다.

kotlin
android {
    buildTypes {
        val release = getByName("release") {
            isMinifyEnabled = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
        getByName("debug") {
            applicationIdSuffix = ".debug"
        }
    }

    flavorDimensions += "version"
    productFlavors {
        register("demo") {
            dimension = "version"
            versionNameSuffix = "-demo"
        }
        register("full") {
            dimension = "version"
        }
    }
}

Kotlin Multiplatform의 경우 KTS가 필수입니다. Groovy는 멀티플랫폼 모듈 구성을 올바르게 지원하지 않습니다. KMM 모듈 구성에는 대상 플랫폼 및 소스 세트 설정이 포함됩니다. 아래 예제는 iOS 및 Android가 포함된 공유 모듈 구성을 보여줍니다.

kotlin
kotlin {
    androidTarget {
        compilations.all {
            kotlinOptions {
                jvmTarget = "17"
            }
        }
    }

    listOf(
        iosX64(),
        iosArm64(),
        iosSimulatorArm64()
    ).forEach { iosTarget ->
        iosTarget.binaries.framework {
            baseName = "Shared"
            isStatic = true
        }
    }

    sourceSets {
        commonMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
        }
        androidMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0")
        }
    }
}

도우미 함수 및 사용자 정의 작업

KTS는 빌드 스크립트 내에서 Kotlin 도우미 함수를 선언할 수 있습니다. 이는 서명 구성이나 버전 관리와 같은 반복적인 구성에 특히 편리합니다. 정적 타이핑 덕분에 이러한 함수는 컴파일 시점에 매개변수 검증과 함께 호출되어 Google Play에 게시하기 전에 서명 구성의 오류를 제거할 수 있습니다.

kotlin
fun Project.configureSigning() {
    android {
        signingConfigs {
            register("release") {
                storeFile = file("release.keystore")
                storePassword = System.getenv("KEYSTORE_PASSWORD")
                keyAlias = System.getenv("KEY_ALIAS")
                keyPassword = System.getenv("KEY_PASSWORD")
            }
        }
    }
}

// build.gradle.kts에서 사용법
configureSigning()

Groovy에서 KTS로 마이그레이션

Groovy에서 KTS로의 마이그레이션은 점진적으로 수행할 수 있는 프로세스입니다. Gradle은 일부 모듈이 Groovy(build.gradle)를 사용하고 일부가 KTS(build.gradle.kts)를 사용하는 혼합 프로젝트를 지원합니다. settings.gradle과 루트 build.gradle은 모듈 플러그인에 의존하지 않으므로 먼저 마이그레이션할 수 있습니다. Google은 settings.gradle.kts, 그 다음 루트 build.gradle.kts, 마지막으로 모듈 순서로 마이그레이션을 시작할 것을 권장합니다.

마이그레이션의 주요 단계는 다음과 같습니다: 클로저 구문을 람다로 대체, 할당에 = 기호 추가, 문자열 키를 타입화된 상수로 대체, 명시적 변수 타이핑. Android Studio는 간단한 블록에 대해 자동 Groovy→KTS 변환을 제공하지만 중첩된 클로저가 있는 복잡한 구성은 수동 재작성이 필요합니다.

Groovy (이전)KTS (이후)
compileSdk 34compileSdk = 34
buildTypes { release { ... } }buildTypes { getByName("release") { ... } }
implementation 'com.android.x:y:1.0'implementation("com.android.x:y:1.0")
flavorDimensions "version"flavorDimensions += "version"
productFlavors { demo { ... } }productFlavors { register("demo") { ... } }
def vsn = "1.0"val vsn = "1.0"

일반적인 마이그레이션 문제에는 Kotlin에 해당하는 것이 없는 암시적 Groovy 메서드 호출과 Kotlin 친화적 API를 제공하지 않는 플러그인이 포함됩니다. 첫 번째 문제의 경우 Gradle은 withGroovyBuilder(KTS에서 Groovy 메서드를 호출할 수 있는 메커니즘)를 통해 호환성을 제공합니다. 두 번째 문제의 경우 플러그인 업데이트를 기다리거나 전체 마이그레이션까지 Groovy 모듈에서 사용해야 합니다.

Kotlin Multiplatform용 Gradle KTS

Kotlin Multiplatform은 KTS가 필수 요구 사항인 주요 프로젝트입니다. kotlin multiplatform 플러그인은 대상 플랫폼, 소스 세트 및 프레임워크 바이너리 구성을 위한 확장 기능을 제공하며, 이는 Kotlin DSL을 통해서만 사용할 수 있습니다. Groovy는 멀티플랫폼 구성을 올바르게 지원하지 않으므로 KMM 프로젝트는 독점적으로 KTS를 사용합니다.

KTS의 KMM 구성에는 비표준 블록이 포함됩니다: 플랫폼 지정을 위한 kotlin.target, 공통 및 플랫폼별 코드 구성을 위한 kotlin.sourceSets, CocoaPods 통합을 위한 kotlin.cocoapods 및 JDK 선택을 위한 kotlin.jvmToolchain. 각 블록은 Android Studio에서 자동 완성이 포함된 엄격하게 타입화된 API를 가지며, 이는 여러 플랫폼이 있는 복잡한 KMM 프로젝트 구성에 특히 가치가 있습니다.

kotlin
kotlin {
    iosArm64()
    iosSimulatorArm64()
    iosX64()

    cocoapods {
        summary = "Shared Kotlin module"
        homepage = "https://itsectr.com"
        framework {
            baseName = "Shared"
            isStatic = false
        }
        pod("Alamofire") {
            version = "5.9"
        }
    }
}

KTS 정적 타이핑 덕분에 KMM 개발자는 소스 세트 및 종속성에 대한 자동 완성, 프레임워크 구성의 타입 검사, 플랫폼 이름 리팩토링 기능을 얻을 수 있습니다. KTS는 디버깅도 간소화합니다: KMM 구성의 오류는 Gradle 작업이 실행될 때까지 오류가 숨겨질 수 있었던 Groovy와 달리 명확한 메시지와 함께 Kotlin 컴파일 오류로 나타납니다.

자주 묻는 질문

Groovy에서 KTS로 전환해야 하나요?

Kotlin Multiplatform 프로젝트의 경우 필수입니다. Android 및 서버 프로젝트의 경우 Groovy는 계속 지원되지만 Google과 Gradle은 정적 타이핑과 더 나은 IDE 지원 때문에 신규 프로젝트에 KTS를 권장합니다.

같은 프로젝트에서 Groovy와 KTS를 함께 사용할 수 있나요?

네, Gradle은 혼합 프로젝트를 지원합니다. 각 모듈은 자체 DSL을 사용할 수 있습니다. settings.gradle 또는 settings.gradle.kts가 루트 DSL을 정의하지만 모듈은 독립적입니다. 이를 통해 점진적인 마이그레이션이 가능합니다.

KTS가 Groovy보다 컴파일이 느린 이유는 무엇인가요?

KTS는 실행 전에 Kotlin 컴파일이 필요합니다. 첫 실행 또는 캐시 정리 후 추가 시간이 소요됩니다. 이후 모든 빌드는 Groovy와 비슷한 속도로 캐시된 클래스를 사용합니다.

어떤 플러그인이 KTS와 호환되지 않나요?

대부분의 최신 플러그인은 호환됩니다. Groovy 특화 API나 Kotlin에 해당하는 것이 없는 클로저를 사용하는 오래된 플러그인에서 문제가 발생합니다. 이러한 플러그인의 경우 withGroovyBuilder()를 사용하거나 모듈을 Groovy로 유지하세요.

KTS가 빌드 성능에 어떤 영향을 미치나요?

초기 스크립트 컴파일 후 빌드 성능은 Groovy와 동일합니다. Gradle은 컴파일된 KTS 스크립트를 캐시하며 재컴파일은 변경 시에만 발생합니다. 모듈 빌드 속도의 차이는 미미합니다.

요약

  • Gradle KTS — Gradle 빌드 스크립트용 Kotlin DSL로, 정적 타이핑 및 IDE 자동 완성 제공.
  • 정적 타이핑은 작업 실행 중이 아닌 컴파일 시점에 구성 오류를 감지할 수 있게 합니다.
  • 구문이 Groovy와 다름: 필수 = 기호, getByName 함수, flavor용 register.
  • Kotlin Multiplatform에는 KTS 필요 — Groovy는 멀티플랫폼 구성을 올바르게 지원하지 않음.
  • 마이그레이션은 혼합 프로젝트 지원 덕분에 단계적으로 수행 가능.
  • 빌드 성능은 초기 스크립트 컴파일 후 Groovy와 동일.
  • 모든 신규 프로젝트, 특히 KMM 및 AGP 7.0+ Android에 KTS 사용.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기