🍎도메인 전용 언어, DSL
- 프로그래밍 언어도 결국 언어다. 의도가 정확하게 전달되어야 한다.
- DSL은 특정 비즈니스 도메인의 문제를 해결하기 위해 만든 언어이다.
- 장점 : API는 캡슐화, 반복 x, 간결한 코드, 가독성, 유지보수 추상화, 관심사분리
- 단점 : 설계의 어려움, 개발 비용 등
- 메서드 체인을 보통 플루언트 스타일이라고 부른다.
DSL 분류
- 내부 DSL
- 자바로 구현한 DSL.
- 자바는 엄격한 문법과,유연성이 떨어지는 문법 때문에 DSL를 만들기에 적합하지 않았지만, 람다와 메서드 참조의 등장으로 어느 정도의 문제는 해결되었다.
- 다중 DSL
- JVM을 사용하는 언어와 자바를 합쳐서 구현한 DSL.
- 스칼라는 커링, 임의 변환 등 DSL 개발에 필요한 여러 특성을 갖췄다. 문법적 잡음이 없고, 누구나 코드를 쉽게 이해할 수 있다.
- 다만 새로운 언어를 배워야 하는 어려움과 두 개 이상의 언어가 혼재하기 때문에 여러 컴파일러로 소스를 빌드하도록 개선해야 하는 문제가 있다. 또 자바와의 호환성 문제도 있겠다.
- 외부 DSL
- 자신만의 문법과 구문으로 아예 새로운 언어로 구현한 DSL.
- 새 언어를 파싱하고, 파서의 결과를 분석하고, 외부 DSL를 실행할 코드를 만드는 등 아주 어려운 작업을 요한다.
- 우리에게 필요한 특성을 완벽하게 제공하는 언어를 설계할 수 있다는 것이 장점이다.
최신 자바 API의 DSL
- Comparator 인터페이스의 정적 메서드와 디폴트 메서드
- 이들을 통해 코드의 잡음을 줄일 수 있다. 코드의 가독성, 재사용성, 결합성을 높인다.
Collections.sort(people, (p1, p2) -> p1.getAge()-p2.getAge());
- 이들을 통해 코드의 잡음을 줄일 수 있다. 코드의 가독성, 재사용성, 결합성을 높인다.
Collections.sort(persons, comparing(Person::getAge));
### 스트림 API는 컬렉션을 조작하는 DSL이다.
- 스트림은 작은 내부 DSL를 적용한 좋은 예다.
- 스트림은 데이터 리스트를 조작하는 DSL로 간주할 수 있다.
```java
// Files.lines는 Stream<String>을 반환한다.
// 확실히 스트림이 가독성이 좋은 것을 느낄 수 있다.
List<String> errors = Files.lines(Paths.get(fileName))
.filter(line -> line.startsWith("ERROR"))
.limit(40)
.collect(toList());
Collectors는 데이터를 수집하는 DSL이다.
- Collctor 인터페이스는 데이터 수집을 수행하는 DSL로 간주할 수 있다.
Map<String, Map<Color, List<Car>>>
🍎정리
- DSL는 개발자와 도메인 전문가의 사이를 좁힌다. 개발자가 아닌 사람도 이해할 수 있는 언어로 비즈니스 로직을 구현하여 원활한 소통을 할 수 있다.
- 내부적 DSL은 애플리케이션을 개발한 언어를 그대로 활용한 것으로 개발 노력이 적게 들지만, 호스팅 언어의 문법 제약을 받는다. 외부적 DSL은 직접 언어를 설계해 사용하는 것으로 높은 유연성을 제공하지만 구현하기 어렵다.
- JVM에서 이용할 수 있는 스칼라, 그루비 등 다른 언어로 다중 DSL을 개발할 수 있다. 하지만 자바와 이 언어들을 통합하려면 빌드 과정이 복잡해지고, 자바와의 상호 호환성 문제도 생길 수 있다.
- 자바의 장황함, 문법적 엄격함 때문에 자바가 DSL에 적합하진 않다. 하지만 람다와 메서드 참조 덕분에 많이 개선되긴 했다.
- 최신 자바는 DSL을 제공한다. Stream, Collectors 등에서 작은 DSL을 제공한다. 이는 특히 컬렉션 데이터를 정렬, 필터링, 매핑, 그룹화하는데에 유용하다.
- 자바로 DSL을 구현할 때 메서드 체인, 중첩 함수, 함수 시퀀싱 이 세 가지 방법이 사용된다. 각각의 장단점이 존재하며, 이들을 잘 조합하여 사용하면 장점만을 누릴 수 있다.
- jOOQ, 큐컴버, 스프링 통합
'스터디' 카테고리의 다른 글
[모던 자바 인 액션] 13장 디폴트 메서드 (0) | 2023.08.25 |
---|---|
[오브젝트] 5장. 책임 할당하기 (0) | 2023.08.12 |
[오브젝트] 04_설계 품질과 트레이드오프 (0) | 2023.08.05 |
[모던 자바 인 액션] 8장. 개선된 컬렉션 API (0) | 2023.07.28 |
[오브젝트] 3장. 역할, 책임, 협력 (0) | 2023.07.27 |
댓글