DSL
업데이트:
DSL
특정 비지니스 도메인을 인터페이스로 만든 API라고 말할 수 있다. 통장 입출금 내역서, 계좌등의 데이터를 조회한다고 할때 지정된 언어의 비지니스 로직으로 표현한다.
DSL 장점
- 간결함 : 비즈니스 로직을 간편하게 캡슐화 하여 반복을 피하고 코드가 간결해진다.
- 가독성 : 도메인 영역의 언어르 ㄹ사용해 쉽게 코드릴 이해할 수 있다.
- 유지보수 : 잘 설계된 DSL은 쉽게 유지보수가 가능하다.
- 높은 수준의 추상화 : 도메인과 같은 추상화 수준에서 동작하여 직접적으로 관련되지 않은 세부사항을 숨긴다.
- 집중 : 비지니스 도메인 규칙으 ㄹ표현할 목적으로 설계된 언어로 프로그래머가 특정 코드에 집중할 수 있어 생산성이 올라간다.
- 관심사 분리 : 지정된 언어를 비지니스 로직을 표현함으로써 애플리케이션의 인프라구조와 관련된 문제와 독립적으로 비지니스 관련된 코드에 집중하기가 용이하다.
DSL 단점
- DSL 설계 어려움 : 언어에 도메인 지식을 담는게 쉽지 않다.
- 개발 비용 : 초기 프로젝트 생성에 많은 비용과 시간이 소요된다.
- 추가 우회 계층 : 추가적은 계층으로 도메인 모델을 감싸며 이때 계층을 최대한 작게 만들어 문제를 회피한다.
- 새로 배워야 하는 언어 : 한 프로젝트에서도 여러가지 언어를 사용하기도 하고 DSL 프로젝트에 추가하면 배워야 하는 언어가 한가 더 늘어난다고 봐야한다.
- 호스팅 언어 한계 : 장황하고 엄격한 문법을 가진 언어로는 만들기가 쉽지 않다.(람다를 통해 이는 해결 가능함)
내부 DSL
순수 자바 코드 같은 기존 호스팅 언어를 기반으로 구현이 되어 새로 언어를 배워야 하는 노력이 줄어들고 외부 DSL도구를 사용하지 않으며 기존의 IDE를 이용할 수도 있다.
외부 DSL
호스팅 언어와는 독립적으로 자체의 문법을 가진다. 그러려면 자신만의 문법과 구문으로 새 언어를 설계 해야 한다.
최신 자바 API의 작은 DSL
스트림은 네이티브 자바 API에 작은 내부 DSL을 적용한 예다.
일반 코드
List<String> errors = new ArrayList<>();
int errorCount = 0;
BufferedReader br = new BufferedReader(new FileReader(fileName));
String line = br.readLine();
while(errorCount < 40 && line != null) {
if(line.startWith("ERROR")){
errors.add(line);
errorCount++;
}
line = br.readLine();
}
스트림 사용
List<String> errors = File.lines(Paths.get(fileName)) //파일을 열어서 문자열 스트림을 만듦
.filter(line -> line.startWith("ERROR")) //ERROR로 시작하는 행을 필터링
.limit(40) // 결과를 첫 40행으로 제한
.collect(toList()); // 결과 문자열을 리스트로 수집
댓글남기기