사실 DSL이 무엇인지 잘 모른다. 그런데 우리는 이미 DSL을 접하고 사용해왔다. 이러한 DSL은 자바의 컬렉션에서 제공되며 아주아주 작지만 유용한 기능으로 자리잡고 있다. 우리는 이러한 DSL을 배워볼 것이다. 실제로 DSL을 만드는 것 까진 무리라고 생각한다. 하지만 DSL의 패턴과 기법을 배운다면 우리의 코드가 좀 더 유연해질 수 있지 않을까? (주의 DSL은 필자도 정확한 이해가 아직 없습니다..)
1.
도메인 전용 언어(domain-specific-languages, DSL)란 무엇이며 어떤 형식으로 구성된 걸까?
2.
DSL을 API에 추가할 때의 장단점
3.
JVM에서 활용할 수 있는 자바 기반 DSL을 깔끔하게 만드는 대안
4.
최신 자바 인터페이스와 클래스에 적용된 DSL 에서 배움
5.
효과적인 자바 기반 DSL을 구현하는 패턴과 기법
도메인 전용 언어
우리는 프로그래밍 언어가 언어가 아니라고 생각하는 경우가 있다. 하지만 프로그래밍 언어도 언어이다. 언어의 목적은 명확하고 안정적으로 메시지를 전달하는게 목표이다. 특정한 사람들만이 이를 이해하고 사용하는 것이 아니라고 생각한다. 만약 도메인 전문가도 이해할 수 있는 언어로 애플리케이션을 만들 수 있다면 우리 개발자들이 만든 코드를 도메인 전문가가 보고 잘못 만들어진 부분에 의견을 주거나 수정의 기회를 얻을 수 있을 것이다. 도메인 전용 언어(DSL)은 이러한 관점으로 애플리케이션의 비즈니스 로직을 표현함으로 도메인 전문가가 이해할 수 있는 기회를 제공한다.
•
도메인을 대상으로 만들어진 특수한 언어이다.
•
메이븐, 엔트 등이 존재한다.
•
DSL은 외부적, 내부적으로 나눠볼 수 있다.
•
스트림의 메서드 체인을 보통 플루언트 스타일(fluent style)이라 부른다.
DSL을 API에 추가할 때의 장단점
최신 자바 API의 작은 DSL
자바의 새로운 기능의 장점을 적용한 첫 API는 네이티브 자바 API 자신이다. 자바 8 이전의 네이티브 자바 API는 이미 한개의 추상 메서드를 가진 인터페이스를 갖고 있었다. 하지만 무명 내부 클래스를 구현하려면 재정의, 생성자 선언 등 불필요한 잡음이 많이 발생했다. 하지만 람다의 추가와 메서드 참조가 등장하며 최신 자바에선 재사용성과 메서드 결합도를 높였다.
기본 보기
Search
결론
•
DSL 은 결국 도메인 전문가와 개발자의 간격을 좁히기 위해 탄생했다. 결국 개발자가 아닌 사람도 이해할 수 있는 언어로 이런 비즈니스로직을 구현할 수 있다고 해서 도메인전문가가 프로그래머가 되는 것은 아니다. 하지만 로직을 읽고 검증하는 역할은 수행할 수 있다.
•
DSL은 크게 내부적(애플리케이션을 개발한 언어를 그대로 활용한 것, 우리의 자바 API와 비슷함) DSL과 외부적(직접 언어를 설계함, 우리가 만든 것 같은 사용 코드) DSL로 분류할 수 있다.
•
자바와 같은 문법의 엄격함을 가진 언어는 DSL개발 언어로 적합하지 않다. 하지만 람다와 메서드 참조 덕분에 개발 환경이 많이 개선되었다.
•
최신 자바는 자체 API에 작은 DSL을 제공한다. 이들 Stream, Collectors 클래스 등에서 제공하는 작은 DSL은 특히 컬렉션 데이터의 정렬, 필터링, 그룹화, 변환에 유용하다.
여담
DSL이 끝났다. 근데 DSL이 무엇인지에 대해서 아직도 감이 잘 안온다. 어떻게 하면 DSL을 구현하는지, 왜 사용하는지(장점, 단점) 알겠지만 본질적으로 어디에 사용해야 하는지는 잘 모르겠다. 조금 시간이 지나면 알 수 있을 것 같다. 지금 나에게 DSL에 대한 힌트는 쿼리DSL과 같은 친구다. (좀 더 해봐야겠다.)