PHpullh
학습 라이브러리/Kotlin/DSL 만들기 (@DslMarker)

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를 변경하는 실수가 발생합니다.