-
챕터[10] 도메인 전용 언어 DSL모던자바인액션 2020. 10. 21. 16:01
서론
DSL 패턴 및 기법
스트림의 API의 특성인 메서드 체인을 보통 자바의 루프의 복잡합 제어와 비교해 유창함을 의미하는
*플루언트 스타일 이라고 한다.
* 플루언트 인터페이스
소프트웨어 공학에서 플루언트 인터페이스는 메소드 체이닝에 상당 부분 기반한 객체 지향 API 설계 메소드이며, 소스 코드의 가독성을 산문과 유사하게 만드는 것이 목적이다. 특히 인터페이스 안에 도메인 특화 언어를 작성한다. 에릭 에반스와 마틴 폴러가 처음 만든 용어이다.
DSL : 특정 비즈니스 도메인의 문제를 해결하려고 만든 언어이다. 자바에서는 도메인을 표현할 수 있는 클래스와 메서드 집합이 필요하다. DSL이란 특정 비즈니스 도메인을 인터페이스로 만든 API라고 할 수 있다.
- DSL은 범용 프로그래밍 언어가 아님 ( 도메인 한정 )
- DSL은 평문 언어가 아님
장점
간결함, 가독성, 유지보수, 높은 수준의 추상화, 집중, 관심사분리
높은 수준의 추상화 : DSL은 도메인과 같은 추상화 수준에서 동작하므로 도메인의 문제와 직접적으로 관련되지 않은 세부 사항을 숨긴다.
집중 : 비즈니스 도메인의 규칙을 표현할 목적으로 설계된 언어이기에 프로그래머가 특정 코드에 집중이 가능하다. (생산성 상승)
단점
DSL 설계의 어려움, 개발 비용, 추가 우회 계층, 새로 배워야 하는 언어, 호스팅 언어 한계
DSL 설계의 어려움 : 간결하게 제한적인 언어에 도메인 지식을 담는 것이 쉬운 작업이 아님
추가 우회 계층 : DSL은 추가적인 계층으로 도메인 모델을 감싸며 이 때 계층을 최대한 작게 만들어 성능 문제를 회피한다.
호스팅 언어 한계 : 일부 자바 같은 범용 프로그래밍 언어는 장황하고 엄격한 문법을 가지고 있다. 이런 언어로는 사용자 친화적 DSL을 만들기 어렵다. ( 자바8의 람다 표현식은 이 문제를 해결하는 도구이다 )
내부 DSL, 외부 DSL, 다중 DSL ( 내부와 외부의 반반 )
내부 DSL
- Java로 구현한 DSL 의미 ( 책 이 자바이므로? )
* 호스트 언어( 현재 사용할 프로그래밍 언어 )로 DSL을 구성한다는 의미
장점
1. 기존 자바 언어를 이용하면 외부 DSL에 비해 새로운 패턴과 기술을 배워 DSL을 구현하는 노력이 현저하게 줄어든다.
2. 순수 자바로 DSL을 구현하면 나머지 코드와 함께 DSL을 컴파일할 수 있다. 따라서 다른 언어의 컴파일러를 이용할 필요없음(비용절감)
3. 다른 언어가 필요없음
4. DSL 사용자는 기존의 자바 IDE를 이용해 자동완성 자동 리팩터링 같은 기능을 그대로 사용하며 사용할 수 있음.
5. 한개의 언어로 한개의 도메인 또는 여러 도메인을 대응하지 못할때 java를 이용하여 DSL 설계할 경우 DSL 합치기가 쉬움
다중 DSL
JVM 으로 실행 가능한 언어가 100개가 넘는다 -> 간결한데 호환성도 있는 언어 사용 -> DSL은 기반 프로그래밍 언어 영향 받기에 간결한 DSL 생성 가능 -> 와!!!
단점
새로운 언어를 배우거나 팀의 누군가가 이미 해당 기술을 가지고 있어야한다 -> ...?
두 개 이상의 언어가 혼재하므로 여러 컴파일러로 소스를 빌드하도록 빌드 과정을 개선 해야한다 -> 비용증가!
마지막으로 JVM에서 실행되는 모든 언어가 자바와 백 퍼센트 호환을 주장하고 있지만 자바와 호환성이 완벽하지 않을때가 많다 -> 호환안될경우 따로 변환이 필요하다...
외부 DSL
자신만의 문법과 구문으로 새 언어를 설계해야함 ( 구현하기 위해서 ) -> 어려움 ( 하지만 나 이거 만들고 싶어 제작해! 하면 어떤거든 만들 수 있음 ( 무한한 유연성 ) ---> 그렇기에 개발 하다가 처음 설계하기 위한 목적을 벗어날 가능성이 크다...
JOOQ는 SQL을 구현하는 내부적 DSL로 자바에 직접 내장된 형식 안전 언어이다.
아래 처럼 사용이 가능하다.
SELECT * FROM BOOK create.selectFrom(book)
WHERE BOOK.PUBLISHED_ID = 2016 -> .where(BOOK.PUBLISHED_IN.eq(2016)
ORDER BY BOOK.TITLE .orderBy(BOOK.TITLE)
'모던자바인액션' 카테고리의 다른 글
챕터[12] 새로운 날짜와 시간 API (0) 2020.10.21 챕터[11] null 대신 Optional 클래스 (0) 2020.10.21 챕터[9] 리팩터링, 테스팅, 디버깅 (0) 2020.10.21 챕터[8] 컬렉션 API 개선 (0) 2020.10.21 챕터[7] 스트림 병렬화 (0) 2020.10.21