143
3
장
기초를 튼튼히
3.4
도메인 특화 언어
도메인 특화 언어
domain
specific
language
, 즉
DSL
은 특정 문제 영역을 위해 만들어진 언어로, 해
당 영역의 개념을 간결하고 직관적으로 표현할 수 있게 돕는 것이 목적이다. 예를 들어
SQL
도
DSL
로 간주할 수 있다.
SQL
은 관계형 모델
Relational
Model
의 해석을 표현하기 위한 프로그래밍
언어이기 때문이다.
하지만
DSL
이라는 용어는 보통 호스트 언어에 내장
embedded
하거나, 전용 구문분석기를 사용해
서 임의로 만든 언어에만 국한해서 사용하고는 한다. 여기서 내장이라는 용어는
DSL
을 표현
하기 위해 호스트 언어에서 미리 정해진 관용구적 관습을 사용해서 코드를 작성한다는 뜻이다.
내장
DSL
을 전용 구문분석기를 활용하는 외부
DSL
과 구분해 내부
DSL
이라고도 부른다.
내부
DSL
을 사용하면 개발자가 호스트 언어의 기능을 전적으로 활용해서
DSL
이 잘 처리하지
못하는 기능도 처리할 수 있다 (이를 부정적인 관점에서 본다면,
DSL
에 ‘빠진 추상화’가 존재할
수 있다는 의미다 ). 또한 내부
DSL
를 사용하면 새로운 언어를 위한 어휘분석기, 구문분석기,
그리고 여러 도구를 작성하는 수고를 덜 수 있다.
스칼라는 두 유형의
DSL
을 모두 훌륭히 지원한다. 스칼라의 연산자 등에 대한 유연한 식별자
규칙, 메서드 호출 시 중위와 후위 호출을 지원하는 점 등은 내장
DSL
을 일반 스칼라 구문을
사용해서 작성할 수 있는 건축 블록을 제공한다.
스칼라테스트
ScalaTest
(
http
://
www
.
scalatest
.
org
/) 라이브러리를 사용해서 행동 주도 개발
Behavior
-
Driven
Development
(
BDD
) 방식의 테스트를 작성하는 예를 살펴보자. 스펙
2
Specs2
(
http
://
bit
.
ly
/
1tpceR3
) 라이브러리도 이와 유사하다.
//
src
/
main
/
scala
/
progscala2
/
rounding
/
scalatest
.
scX
//
스칼라테스트
예제.
단독
실행하지
마시오
.
import org
.
scalatest
.{
FunSpec
,
ShouldMatchers
}
class NerdFinderSpec extends FunSpec with ShouldMatchers
{
describe
("
nerd finder
")
{
it
("
identify nerds from a List
")
{
val actors
=
List
("
Rick Moranis
",
"
James Dean
",
"
Woody Allen
")
val finder
=
new NerdFinder
(
actors
)
Get 프로그래밍 스칼라: 실용적인 스칼라 활용법을 익히는 가장 확실한 실전 바이블 (2.11.x 버전 기반) now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.