KOTLIN · 함수
DSL 만들기 (@DslMarker)
@DslMarker로 DSL 스코프를 제한하여 안전한 도메인 특화 언어를 구축합니다.
함수고급dsl-markerdslscope-controlbuilder
핵심 설명
@DslMarker로 DSL 스코프를 제한하여 안전한 도메인 특화 언어를 구축합니다.
Kotlin code
@DslMarker
annotation class ConfigDsl
@ConfigDsl
class ServerConfig {
var host = "localhost"
var port = 8080
private var dbConfig: DbConfig? = null
fun database(init: DbConfig.() -> Unit) {
dbConfig = DbConfig().apply(init)
}
override fun toString() = "Server($host:$port, db=$dbConfig)"
}
@ConfigDsl
class DbConfig {
var url = ""
var maxPool = 10
override fun toString() = "DB($url, pool=$maxPool)"
}
fun server(init: ServerConfig.() -> Unit): ServerConfig =
ServerConfig().apply(init)
fun main() {
val config = server {
host = "0.0.0.0"
port = 9090
database {
url = "jdbc:postgresql://localhost/mydb"
maxPool = 20
// host = "x" // 컴파일 오류! @DslMarker 덕분
}
}
println(config)
}학습 팁
@DslMarker가 적용되면 중첩 빌더에서 바깥 빌더의 멤버에 직접 접근할 수 없어 실수를 방지합니다.
주의할 점
@DslMarker 없이 DSL을 만들면 database { host = "x" }가 바깥 ServerConfig의 host를 변경하는 실수가 발생합니다.
자주 묻는 질문
DSL 만들기 (@DslMarker)란 무엇인가요?
@DslMarker 로 DSL 스코프를 제한하여 안전한 도메인 특화 언어를 구축합니다.
DSL 만들기 (@DslMarker) 학습 시 주의할 점은 무엇인가요?
@DslMarker 없이 DSL을 만들면 database { host = "x" } 가 바깥 ServerConfig 의 host를 변경하는 실수가 발생합니다.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.