Java + Spring Boot로 실무를 오래 하다 보면 build.gradle은 익숙하지만, Kotlin 프로젝트를 처음 시작할 때 build.gradle.kts를 보고 잠깐 멈추게 된다.
나 역시 Java + Spring Boot 기반으로 API, 정산, 이커머스 백엔드 서비스를 개발해오다가 Kotlin + Spring Boot 전환을 준비하면서 가장 먼저 마주친 변화가 바로 Kotlin DSL(Kotlin Domain Specific Language) 이었다.
처음에는 단순히 “Groovy 대신 Kotlin 문법으로 바뀐 설정 파일” 정도로 생각했지만, 실제로 사용해보니 Kotlin 프로젝트에서는 단순한 문법 변화 이상의 의미가 있었다. 특히 IntelliJ 기반 생산성과 코드 안정성 측면에서 체감 차이가 크다.
이번 글에서는 Java + Spring Boot 개발자 관점에서 Kotlin DSL이 무엇인지, 왜 사용하는지, 그리고 실무에서 어떤 장점이 있는지 정리해보려고 한다.
Kotlin DSL은 Gradle 설정 파일을 Groovy가 아닌 Kotlin 문법으로 작성하는 방식이다.
기존 Java 프로젝트에서는 아래처럼 많이 사용했다.
// build.gradle
plugins {
id 'org.springframework.boot' version '3.3.0'
}
Kotlin 프로젝트에서는 아래처럼 바뀐다.
// build.gradle.kts
plugins {
id("org.springframework.boot") version "3.3.0"
}
핵심 차이는 파일 확장자다.
build.gradlebuild.gradle.kts여기서 kts는 Kotlin Script를 의미한다.
즉, 빌드 설정 자체를 Kotlin 코드처럼 다루는 방식이다.
Kotlin + Spring Boot로 전환하려는 Java 개발자라면 사실상 Kotlin DSL은 필수에 가깝다.
애플리케이션 코드는 Kotlin인데 Gradle 설정만 Groovy로 유지하면 문맥 전환 비용이 생긴다.
예를 들어 서비스 코드는 Kotlin으로 이렇게 작성한다.
@Service
class ProductService(
private val productRepository: ProductRepository
)
그런데 빌드 설정은 다시 Groovy로 돌아가면 다음과 같은 불편함이 생긴다.
Kotlin DSL을 사용하면 프로젝트 전반이 Kotlin으로 통일되기 때문에 학습과 유지보수 흐름이 훨씬 자연스럽다.
Java + IntelliJ에 익숙한 개발자라면 이 장점이 가장 크게 체감된다.
Groovy는 동적 타입 기반이라 자동완성이 제한적일 때가 많다.
반면 Kotlin DSL은 타입 기반이라 IDE가 설정 옵션을 더 정확하게 제안한다.
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
}
오타나 잘못된 블록 위치도 IDE에서 빠르게 확인 가능하다.
Groovy DSL은 런타임에야 문제를 발견하는 경우가 종종 있다.
반면 Kotlin DSL은 설정 자체가 Kotlin 코드라서 컴파일 단계에서 오류를 더 빨리 잡아준다.
예를 들어 QueryDSL, kapt, sourceSets 같은 설정을 추가할 때 안정감 차이가 크다.
특히 실무에서 멀티모듈, code generation, annotation processor를 다룰 때 유지보수성이 좋아진다.
Kotlin을 배우는 입장에서는 Kotlin DSL이 단순 빌드 설정을 넘어 Kotlin 문법 연습장 역할도 한다.
예를 들어 함수 호출, 람다, named style 구조에 자연스럽게 익숙해진다.
tasks.withType<Test> {
useJUnitPlatform()
}
이런 DSL 스타일은 이후 Spring Kotlin 코드 작성 방식과도 연결된다.
백엔드 실무에서 중요한 부분은 결국 JPA + QueryDSL 설정이다.
특히 이커머스처럼 조회 조건이 복잡한 도메인에서는 QueryDSL 설정이 빈번하다.
Kotlin DSL에서는 아래처럼 명확하게 관리할 수 있다.
plugins {
kotlin("kapt")
}
dependencies {
implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta")
kapt("com.querydsl:querydsl-apt:5.0.0:jakarta")
}
Java 개발자 입장에서 이 부분은 매우 중요하다.
왜냐하면 Kotlin 전환 시 가장 먼저 부딪히는 실무 이슈가 QClass 생성과 kapt 설정이기 때문이다.
plugins {
kotlin("jvm") version "2.0.0"
}
문자열 기반 id()와 Kotlin 전용 kotlin() 함수가 함께 쓰인다.
처음에는 낯설지만 곧 익숙해진다.
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
Groovy의 작은따옴표 대신 함수 호출처럼 보이는 형태다.
val querydslVersion = "5.0.0"
상수를 코드처럼 선언할 수 있어 가독성이 좋다.
Java + Spring Boot 개발자가 Kotlin DSL에 익숙해지려면 아래 순서가 가장 효율적이다.
build.gradle과 build.gradle.kts 비교특히 현재 운영 중인 Java Spring 프로젝트를 작은 모듈 단위로 Kotlin DSL로 옮겨보면 학습 속도가 매우 빠르다.
Kotlin DSL은 단순히 “Gradle 문법이 바뀐 것”이 아니다.
Java + Spring Boot 개발자가 Kotlin 생태계로 넘어갈 때,
가장 먼저 프로젝트의 빌드, 설정, 코드 스타일을 Kotlin스럽게 통일하는 출발점이다.
특히 IntelliJ 기반 개발 생산성, QueryDSL 설정 안정성, 타입 안정성, Kotlin 문법 적응 측면에서 실무 효율이 매우 좋다.
Kotlin + Spring Boot 백엔드 전환을 목표로 한다면,
서비스 코드보다 먼저 build.gradle.kts를 읽고 직접 수정해보는 경험이 생각보다 큰 학습 효과를 준다.
다음 글에서는 Java 개발자 기준으로 Spring Boot + Kotlin + QueryDSL 프로젝트를 Kotlin DSL로 처음 세팅하는 방법을 실제 예제로 정리해볼 예정이다.