본문 바로가기
Program Language/Common

DSL이란?

by Dev Lighthouse 2024. 6. 6.
320x100
320x100

자바로 백엔드개발을 해본 사람들은 queryDSL이란 걸 들어봤을 것이고, Spring Data JPA를 사용하면서 타입세이프하게 쿼리를 동적으로 만들어주며 컴파일 시점에 오류를 미리 알 수 있게 도와주는 라이브러리라고 알고 있을 것이다.

또한 코틀린 안드로이드나 코틀린 스프링을 해본 사람들은 Kotlin DSL이란 말 또한 들어봤을 것이다.

그럼, 이제 질문을 던져볼 수 있다.

queryDSL/KotlinDSL을 사용하셨군요? 그럼 DSL에 대해서 설명해주실래요?

답: ㄱ..그게..뭐죠? DSLR은 아는데..헤헿

라고 답하면 망한거다ㅋ

나는 옛날사람이라서... 어떤 도구를 잘 사용하는것도 중요하다고 생각하면서 동시에 그 도구에 붙여진 이름의 뜻을 아는 것도 중요하다고 생각한다.

 

정의

DSL(Domain Specific Languague)은 도메인 특화 컴퓨터 언어이다.

DSL과는 반대로 GPL(General Purpose Language)라는 범용성 목적 언어라는 개념이 있다.

 

종류

  • 내부DSL(Internal DSL) - 기존의 프로그래밍 언어 내부에서 정의된 DSL로 그 언어의 문법을 따름
    • Kotlin DSL
    • Scala DSL
    • Ruby DSL
    • Groovy DSL
    • Java DSL
  • 외부DSL(External DSL) - 독립된 문법과 구문을 가지는 DSL로, 별도의 파서를 필요로 함
    • SQL(Structured Query Language)
    • Regex(ReGular EXpressions)
    • HTML(HyperText Markup Language)
    • CSS(Cascading Style Sheets)

 

장점 및 단점

장점

간결하고, 특정 도메인 문제를 해결하기 쉽다

 

단점

잘 설계가 되지 않는다면 읽기 어려운 코드가 될 수 있고, 하위 호환성을 유지해야 한다

 

실사용 예

코틀린으로 테스트코드를 작성할때 kotest라는 프레임워크를 쓰게 되면 Kotlin DSL를 사용해서 테스트코드를 작성할 수 있다.

class MyTests : BehaviorSpec({
    given("a broomstick") {
        and("a witch") {
            `when`("The witch sits on it") {
                and("she laughs hysterically") {
                    then("She should be able to fly") {
                        // test code
                    }
                }
            }
        }
    }
})

 

queryDSL을 사용해서 java/kotlin 언어 기반 프로젝트에서 query가 아닌 코드기반(Q Class)으로 쿼리문을 작성할 수 있게 도와준다.

NumberPath<Long> count = Expressions.numberPath(Long.class, "c");

List<Tuple> userTitleCounts = queryFactory.select(
  blogPost.title, blogPost.id.count().as(count))
  .from(blogPost)
  .groupBy(blogPost.title)
  .orderBy(count.desc())
  .fetch();

 

regex을 사용해서 주민번호를 마스킹처리할 수 있다

function maskIdNumber(idNumber) {
    const pattern = /(\d{6}-\d)\d{6}/;
    const masked = idNumber.replace(pattern, '$1******');
    return masked;
}

const idNumber = "920530-1444222";
const maskedIdNumber = maskIdNumber(idNumber);
console.log(maskedIdNumber);  // 920530-1******

 

 

 

출처

https://martinfowler.com/bliki/DomainSpecificLanguage.html

https://ko.wikipedia.org/wiki/%EB%8F%84%EB%A9%94%EC%9D%B8_%ED%8A%B9%ED%99%94_%EC%96%B8%EC%96%B4

https://javieracero.com/blog/internal-vs-external-dsl/

https://en.wikipedia.org/wiki/Domain-specific_language

https://philcalcado.com/old-material/research-on-dsls/domain-specific-languages-dsls/internal-dsls/

https://blog.imqa.io/kotlin-dsl/

https://kotest.io/docs/framework/testing-styles.html

https://www.jetbrains.com/ko-kr/mps/concepts/domain-specific-languages/

'Program Language > Common' 카테고리의 다른 글

Programming Study Honey Tips (feat. JetBrains/Rust)  (2) 2024.03.12
프로그래밍 언어별 특징들  (1) 2024.02.13

댓글