자바로 백엔드개발을 해본 사람들은 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 |
댓글