면접 질문 목록으로 가기
면접 질문실전 질문꼬리 질문

코틀린의 Domain Specific Languages (DSL)

skydovesJaewoong Eum (skydoves)||7분 소요

코틀린의 Domain Specific Languages (DSL)

코틀린에서 DSL(Domain Specific Language, 도메인 특화 언어)이란, 확장 함수와 수신자가 있는 람다(lambda with receiver) 등 코틀린 고유의 언어 기능을 활용하여 특정 문제 영역에 맞춤화된 미니 언어처럼 읽히는 API를 설계하는 프로그래밍 스타일입니다. 코틀린 DSL은 Gradle 빌드 스크립트, Jetpack Compose 레이아웃, Ktor 라우팅 등 다양한 프레임워크에서 폭넓게 활용되고 있습니다. DSL이 내부적으로 어떻게 동작하는지 이해하면 기존 DSL을 효과적으로 사용할 수 있을 뿐만 아니라, 직접 DSL을 설계하는 역량도 갖출 수 있습니다. 특히 면접에서 DSL 관련 질문이 나왔을 때 단순히 "사용해 봤다"가 아니라 원리 수준에서 답변할 수 있다면 큰 차별점이 됩니다.

이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.

  • 수신자가 있는 람다가 어떻게 DSL 문법을 가능하게 하는지 설명할 수 있습니다.
  • 확장 함수와 @DslMarker가 DSL 설계에서 어떤 역할을 하는지 서술할 수 있습니다.
  • 코틀린의 타입 안전 빌더(type-safe builder) 패턴을 활용하여 간단한 DSL을 직접 구현할 수 있습니다.
  • 안드로이드 및 코틀린 생태계에서 자주 사용되는 DSL 사례를 파악할 수 있습니다.

수신자가 있는 람다 (Lambda with Receiver)

모든 코틀린 DSL의 근간은 수신자가 있는 람다(lambda with receiver)입니다. 일반적인 람다의 시그니처는 (parameters) -> ReturnType인 반면, 수신자가 있는 람다는 ReceiverType.(parameters) -> ReturnType 형태를 가집니다. 이 람다 본문 내부에서 this는 수신 객체를 가리키므로, 별도의 한정자(qualifier) 없이도 수신 객체의 멤버를 직접 호출할 수 있습니다.

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

val result = buildString {
    append("Hello, ")  // this.append()와 동일
    append("World!")
}

위의 예제에서 append 호출은 StringBuilder 수신 객체를 대상으로 해석(resolve)됩니다. 호출자 입장에서는 명시적 객체에 메서드를 체이닝하는 것이 아니라, 마치 설정 블록(configuration block)처럼 코드를 작성할 수 있게 됩니다. 이러한 패턴이 DSL의 핵심적인 가독성을 만들어 내는 원리입니다.

DSL에서의 확장 함수 활용

확장 함수를 사용하면 기존 타입의 소스 코드를 수정하지 않고도 새로운 멤버를 추가할 수 있습니다. DSL 맥락에서 확장 함수는 빌더 블록 내부에서 사용 가능한 어휘(vocabulary)를 정의하는 역할을 합니다. 간단한 HTML 빌더 예제를 통해 살펴보겠습니다.

class Tag(val name: String) {
    val children = mutableListOf<Tag>()
    var text: String = ""

    fun tag(name: String, block: Tag.() -> Unit) {
        val child = Tag(name)
        child.block()
        children.add(child)
    }
}

fun html(block: Tag.() -> Unit): Tag {
    val root = Tag("html")
    root.block()
    return root
}

이 면접 질문은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 면접 질문의 전체 내용을 볼 수 있습니다.

구독하기
면접 질문 목록으로 가기