본문 바로가기
Book/모던 자바 인 액션

[모던 자바 인 액션] Chapter 10.람다를 이용한 도메인 전용 언어 (1)

by ghan2 2024. 11. 14.

 

💡 이 장의 내용
- 도메인 전용 언어(DSL)란 무엇이며 어떤 형식으로 구성되는가?
- DSL을 API에 추가할 때의 장단점
- JVM에서 활용할 수 있는 자바 기반 DSL을 깔끔하게 만드는 대안
- 최신 자바 인터페이스와 클래스에 적용된 DSL에서 배움
- 효과적인 자바 기반 DSL을 구현하는 패턴과 기법
- 이들 패턴을 자바 라이브러리와 도구에서 얼마나 흔히 사용하는가?

 

10.1 도메인 전용 언어

DSL은 특정 비즈니스 도메인의 문제를 해결하려고 만든 언어다. 특정 비즈니스 도메인을 인터페이스로 만든 API 라고 생각할 수 있다. 다음의 두 가지 필요성을 생각하면서 DSL을 개발해야 한다. 
- 의사 소통의 왕 : 우리의 코드의 의도가 명확히 전달되며, 프로그래머가 아닌 사람도 이해할 수 있어야 한다.
- 한번 코드를 구현하지만 여러 번 읽는다.


10.1.1 DSL의 장점과 단점

- 장점
-간결함: API는 비즈니스 로직을 간편하게 캡슐화하므로 반복을 피할 수 있고 코드를 간결하게 할 수 있다.
-가독성: 도메인 영역의 용어를 사용하므로 비 도메인 전문가도 코드를 쉽게 이해할 수 있다.
-유지보수: 잘 설계된 DSL로 구현한 코드는 쉽게 유지보수하고 바꿀 수 있다.
-높은 수준의 추상화: DSL은 도메인과 같은 추상화 수준에서 동작하므로 도메인의 문제와 직접적으로 관련되지 않은 세부사항을 숨긴다.
-집중: 비즈니스 도메인의 규칙을 표현할 목적으로 설계된 언어이므로 프로그래머가 특정코드에 집중할 수 있다.
-관심사분리: 지정된 언어로 비즈니스 로직을 표현함으로 애플리케이션의 인프라구조와 관련된 문제와 독립적으로 비즈니스 관련된 코드에서 집중하기가 용이하다.

- 단점 
-DSL 설계의 어려움: 간결하게 제한적인 언어에 도메인 지식을 담는 것이 쉬운 작업은 아니다.
-개발 비용
-추가 우회 계층: DSL은 추가적인 계층으로 도메인 모델을 감싸며 이 때 계층을 최대한 작게 만들어 성능 문제를 회피한다.
-새로 배워야 하는 언어
-호스팅 언어 한계: 자바 같은 언어는 장황하고 엄격한 문제를 가지고 있어 언어 특성상 친화적인DSL을 만들기 어렵다. java8의 람다 표현식은 이 문제를 해결할 강력한 도구이다.

 

10.1.2 JVM에서 이용할 수 있는 다른 DSL 해결책

1) 내부 DSL

사용자가 기술적인 부분을 염두해 두고 있다면 자바를 이용해 DSL을 만들 수 있다. 자바 문법이 큰 문제가 아니라면 순수 자바로 DSL을 구현함으로 다음과 같은 장점을 얻을 수 있다. 

  • 기존 자바 언어를 이용하면 외부 DSL에 비해 새로운 패턴과 기술을 배워 구현하는 노력이 현저하게 줄어든다. 
  • 순수 자바로 구현하면 나머지 코드와 함께 컴파일할 수 있다.즉 추가비용이 안 든다.
  • 자바 IDE를 통해 자동완성, 자동 리팩터링 같은 기능을 그대로 쓸 수 있다. 

2) 다중 DSL

  • 새로운 프로그래밍 언어를 배우거나 또는 팀의 누군가가 이미 해당 기술을 가지고 있어야 한다.
  • 두 개 이상의 언어가 혼재하므로 여러 컴파일로 소스를 빌드하도록 빌드 과정을 개선해야 한다. 
  • JVM에서 실행되는 거의 모든 언어가 자바와 백 퍼센트 호환을 주장하고 있지만 자바와 호환성이 완벽하지 않을 때가 많다. 

3) 외부 DSL

자신만의 문법과 구문으로 새 언어를 설계해야 한다. 새 언어를 파싱하고, 파서의 결과를 분석하고, 외부 DSL을 실행할 코드를 만들어야 한다. 가장 큰 장점은 무한한 유연성.