CS

DSL

baek-dev 2025. 3. 25. 18:40

DSL(Domain Specific Language)이란?

 

DSL(Domain Specific Language)이란 특정한 문제나 도메인을 표현하거나 해결하기 위해 특별히 설계된 프로그래밍 언어를 의미함.

 

DSL은 Domain-Specific Language의 약자로, 우리말로는 ‘도메인 특화 언어’라고 번역할 수 있음. 여기서 도메인이란 특정한 영역이나 문제 범위를 의미함.

 

즉, 범용적인 프로그래밍 언어(예: Java, Python)가 모든 분야를 폭넓게 다룰 수 있는 언어라면,

DSL은 특정한 분야나 문제에 맞춰서 간결하고 명확한 표현을 하도록 만들어진 언어임.

 


DSL을 사용하는 목적

 

DSL을 사용하는 가장 큰 목적은 특정 분야에서 문제를 쉽고 직관적으로 표현하고 해결하기 위함임.

 

즉,

특정 도메인 문제를 해결하기 위해 간단히 작성할 수 있도록 함

복잡한 작업을 명료한 코드로 쉽게 표현함

코드의 가독성과 유지보수성을 높임

특정 분야 전문가(개발자가 아닌 사람들)도 쉽게 이해할 수 있도록 함

 


DSL의 종류

 

DSL은 크게 두 가지로 구분할 수 있음.

 

① 내부 DSL (Internal DSL, 내부 도메인 특화 언어)

기존 프로그래밍 언어를 기반으로 구축된 DSL

Java, Kotlin, Scala와 같은 기존 언어의 문법을 활용하여 표현함

 

내부 DSL 예시:

Kotlin의 DSL 문법(Gradle 스크립트, HTML DSL 등)

Java의 Stream API를 통한 함수형 프로그래밍

QueryDSL (Java/Kotlin에서 SQL을 직관적으로 표현)

 

내부 DSL 예시 코드 (Kotlin DSL 활용 예시):

html {
    head {
        title("Page Title")
    }
    body {
        h1("안녕하세요.")
        p {
            +"이것은 Kotlin의 내부 DSL 예제입니다."
        }
    }
}

Kotlin에서 DSL 문법은 기본 언어 문법을 그대로 사용하여, 자연스러운 형태의 코드 표현이 가능함.

 


② 외부 DSL (External DSL)

자체적인 문법과 구조를 가지고 독립적으로 설계된 언어

별도의 문법과 해석기가 필요함

특정한 문제 해결에 최적화된 문법을 가짐

 

외부 DSL 예시:

SQL (데이터베이스 조회를 위한 특화된 언어)

정규 표현식(Regex)

YAML이나 JSON (데이터 표현용 DSL)

 

외부 DSL은 자신만의 문법과 표현법을 가짐.

 

예시로 YAML은 다음과 같은 형태로 데이터를 표현함:

server:
  port: 8080
  contextPath: /api

이처럼 외부 DSL은 자체 문법 규칙을 가지고 데이터를 명료하게 표현할 수 있도록 설계됨.

 


DSL의 표현법 및 문법 설계 특징

 

DSL의 표현법과 문법은 크게 아래와 같은 특징을 갖추는 게 좋음.

 

(1) 직관적이고 간단한 표현

도메인 용어를 직접 사용해 코드가 자연스럽게 읽히도록 설계함.

// Kotlin 내부 DSL로 표현한 예제 (Gradle)
dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
}

코드 자체가 마치 문장을 읽는 것처럼 직관적임.

 

(2) 선언적(Declarative) 표현 중심

무엇을 하는지(‘What’)를 표현하는 데 중점을 둠.

명령형(imperative)이 아닌 선언적 방식을 사용함.

 

예) SQL의 간단한 쿼리문

SELECT name, age FROM users WHERE age > 25 ORDER BY age DESC;

명령형이 아니라, 원하는 결과를 선언적으로 표현한 형태임.

 


(2) 제한된 문법 구조

 

DSL은 명확성과 간결함을 유지하기 위해 의도적으로 문법을 제한함.

 

예) 정규 표현식 (Regex)의 문법

^\d{3}-\d{3,4}-\d{4}$

이 표현은 “전화번호 형식(숫자-숫자-숫자)“을 명확히 나타내는 특수화된 문법임.

 


DSL을 사용하는 대표적인 장점과 단점

 

장점

코드가 직관적이고 이해하기 쉬움

특정 문제를 매우 명확하게 해결할 수 있음

코드의 길이가 짧고 간결함

비개발자(기획자, 디자이너 등)도 쉽게 이해 가능

 

단점

별도의 문법 학습 필요(특히 외부 DSL의 경우)

문법이 제한적이라 복잡한 논리 구현은 어려울 수 있음

DSL을 새롭게 만들거나 유지보수하는 데 추가적 비용이 발생할 수 있음

 


DSL이 널리 활용되는 사례들

 

DSL은 현실적으로 여러 분야에서 널리 활용되고 있음. 대표적인 예시는:

Gradle이나 Maven (빌드 도구 스크립트)

Jenkins pipeline 스크립트

HTML, CSS (웹 페이지 레이아웃 정의)

SQL (데이터 조회 및 처리)

GraphQL (API 데이터 쿼리 정의)

Ansible의 YAML 기반의 설정

ElasticSearch의 Query DSL 등

 


정리하면:

DSL(Domain-Specific Language)은 특정 문제나 도메인에 특화된 언어임.

내부 DSL(기존 언어 기반)과 외부 DSL(독립된 문법)을 구분하여 사용함.

표현법은 일반적으로 직관적이고, 선언적인 문법을 사용함.

주로 특정 문제를 간단하고 직관적으로 해결하기 위해 설계하고 활용됨.

 

 

 

 

 

출처 : ChatGPT

'CS' 카테고리의 다른 글

퍼사드 패턴  (0) 2025.04.14
SOLID 원칙  (0) 2025.04.04
JIT(Just-In-Time) 컴파일러  (0) 2025.03.05
트러블 슈팅  (0) 2025.02.28
SSE (Server-Sent Events)  (0) 2025.02.19