본문 바로가기
개발자/Android

[Android] Kotlin DSL로 Gradle build script 변경하기

by Alex.K 2023. 1. 8.
반응형

 

안드로이드 프로젝트를 신규로 생성하면 build.gradle 파일이 포함되어 있습니다. 해당 파일은 Groovy DSL Gradle build script 인데요. 기존에 안드로이드 개발을 하셨던 분들이라면 굳이 Kotlin DSL 로 변경할 필요가 있을까? 라고 생각하실 수도 있겠지만 Kotlin DSL 이 가진 장점은 아래와 같습니다.

 

Kotlin DSL 사용시 장점

  • 빠른 문서보기 기능
  • 코드 자동완성
  • 구문강조 (Syntax Highlighting)
  • 리팩토링 (변수)

Kotlin DSL 사용시 단점

  • 빌드 캐시가 Invalidation 되거나 클린 빌드시 Groovy DSL 보다 느림
  • Java 8 이상에서 동작 (최근에는 Java 11 로 설정하고 사용하기 때문에 문제 없을거라 생각됩니다)
  • 라이브러리 최신버전 Inspection 기능 미지원

(IDE 별로 지원하는 범위가 다르니 참고바랍니다. 상세설명 링크)

  Build Import Syntax highlighting Semantic editor
IntelliJ IDEA O O O
Android Studio O O O
Eclipse IDE O O X
CLion O O X
Apache Netbeans O O X
Visual Studio Code O O X
Visual Studio O X X

 

예전에는 Java 언어로 안드로이드 코드를 구현했다면, 현재는 대부분 Kotlin 을 통해 코드를 구현하고 있을것입니다.

주로 사용하는 언어를 build script 에서 사용한다면 더욱 편하게 사용할 수 있다고 생각합니다.

 

그러면 Groovy DSL 에서 Kotlin DSL 로 변경하기 전에 DSL 이 어떤것인가를 집고 가야할것 같은데요. 

 

DSL 이란?

DSL 은 Domain Specific Language 의 약자로 "특정 도메인에 국한해 사용되는 언어"입니다. 반대 개념으로는 General Purpose Langage (GPL, 범용 언어)가 있으며 우리가 일반적으로 사용하고 있는 Kotlin, Swift 등과 같은 프로그래밍 언어들이 이에 해당합니다.

흠.. Kotlin, Swift 가 GPL 인데 DSL 도 있는것이라면 무슨 의미일까? 라고 생각하실 수 있기 때문에 조금 더 자세하게 들여다 보겠습니다.

 

도메인 (Domain) 이란?

도메인에 대한 정의를 나무위키에 작성된 부분을 가지고 와서 보겠습니다.

도메인(domain)이란 단어는 영토, 분야, 영역, 범위를 뜻하는 단어(예를 들어 소유지, 토지 소유권(법률) 등)였으나 인터넷 주소의 의미로 확장되었다. 어떤 전문 분야에 대해 얘기할 때 해당 도메인에 대한 지식이 필요하다와 같이 말하기도 한다. 수학에서, 영어로 정의역을 뜻하기도 한다. 인터넷 주소를 뜻하는 도메인도 본래 특정 분야(com, net, org 등)의 어떤 웹 사이트(영역)를 지칭하기 위해 의미를 확장한 단어이다.

요즘 도메인을 생각하면 인터넷 주소를 많이 생각하게 되는데, DSL 에서 사용되는 도메인은 영역,범위의 뜻이 더 적절한것 같습니다.

그렇다면 DSL -> 특정 영역(범위) 언어라고 생각하고 봤을때 어떤 형태일까요?

예를들어

fun buildString(action: (StringBuilder).() -> Unit): String {
    val stringBuilder = StringBuilder()
    action(stringBuilder)
    return stringBuilder.toString()
}

buildString 이라는 함수를 만들고 인자값으로 람다(Lambda) 함수를 선언했습니다. 위 함수를 실행한다면 다음과 같은 예가 됩니다.

val text = buildString {
    append("[")
    append("Good")
    append("]")
}

buildString 함수를 DSL 로 정의하여 사용해봤는데요. Kotlin 언어에서 제공하는 몇가지 기능들을 조합하여 간단하게 DSL을 정의하고 사용할 수 있습니다.

이제 DSL 에 대한 내용을 어느정도 이해했으니 본격적으로 Gradle build script 를 Kotlin DSL 로 변경하는 방법을 말씀드리겠습니다.

( 해당 내용은 gradle 홈페이지내 Groovy to Kotlin DSL Migration 을 참고했습니다)

 

  • Groovy 에서 사용한 String 의 따옴표(') 는 Kotlin 에서는 쌍따옴표(")로 변경해야합니다. (Groovy 는 둘다 가능)
[변경전 Groovy]
group 'com.acme'
dependencies {
    implementation 'com.acme:example:1.0'
}

[변경 후 Groovy]
group "com.acme"
dependencies {
    implementation "com.acme:example:1.0"
}
  • Groovy는 함수호출 시 괄호를 생략할 수 있지만, Kotlin은 항상 괄호를 사용해야합니다.
[변경전]
group "com.acme"
dependencies {
    implementation "com.acme:example:1.0"
}

[변경후]
group = "com.acme"                          
dependencies {
    implementation("com.acme:example:1.0")  
}
  • Groovy 는 = 연산자를 생략할 수 있지만 Kotlin은 사용해야합니다.
[변경전]
compileOptions {
    sourceCompatibility JavaVersion.VERSION_11
    targetCompatibility JavaVersion.VERSION_11
}

[변경후]
compileOptions {
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
}
  • build.gralde (module level) 에서 buildTypes 선언은 다음과 같이 변경되어야 합니다.
    또한, minifyEnabled 부분은 isMinifyEnabled 로 이름을 변경해야합니다.
[Groovy]
buildTypes {
	 debug {
	   ...
	 }
	 release {
	   ...
	 }
	 staging {
	   ...
 	}
 }
 
 [Kotlin]
 buildTypes {
	 getByName("debug") {
	   ...
	 }
	 getByName("release") {
	   ...
	 }
	 create("staging") {
	   ...
	 }
 }

위의 내용들을 수정했다면 build.gradle (module level) 의 파일명끝에 .kts 라는 확장자를 추가해줍니다.

build.gradle 파일 우클릭 -> Refactor -> Rename (Mac 단축키 Shift + F6)
파일명뒤 .kts 확장자 추가

파일명을 변경한 뒤 상단의 Sync Project with Gradle Files 버튼을 클릭하여 gradle sync 해줍니다.

그러면 아래와 같이 highlighting 되는것을 확인할 수 있습니다.

[Groovy DSL]

Groovy DSL

[Kotlin DSL]

Kotlin DSL

Groovy DSL 과 Kotlin DSL 파일이 섞여있어도 빌드는 정상적으로 됩니다. 하지만 바꾸는 김에 모두다 바꾸면 좋겠죠?

.gradle 파일들을 모두 *.gradle.kts 파일로 변경하고 grdle sync 해줍니다.

  • build.gradle (root 폴더)
  • settings.gradle

추후 신규 모듈 추가시에도 위 규칙대로 한다면 무난하게 Kotlin DSL 로 변경이 가능합니다.

 

그리고 BuildSrc 디렉토리를 생성하여 빌드 로직을 좀 더 효율적으로 관리할 수도 있습니다.

 

BuildSrc  생성하기

  • Project Dropdown 에서 Android -> Project 로 변경하기

  • Root Directory 에 buildSrc Directory 생성
  • buildSrc/build.gradle.kts 파일 생성 (파일 내용 추가)
  • buildSrc/src/main/kotlin 디렉토리 생성
  • buildSrc/src/main/kotlin 디렉토리 내 Libs, Versions 등의 파일 생성

Libs.kt 파일

  • module level 의 build.gradle.kts 파일에서 dependencies 부분을 아래 스샷처럼 변경

module level (app) build.gradle.kts 파일

buildSrc 내에서 여러 태스크나 라이브러리 정보들을 만들어서 관리할 수 있으며, 다중 모듈에 적용할때 좀 더 유용합니다.

반응형

댓글