본문 바로가기
스터디

[모던 자바 인 액션] 10장. 도메인 전용 언어

by eunoo 2023. 8. 12.

🍎도메인 전용 언어, 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, 큐컴버, 스프링 통합

댓글