13. DSL의 특징 DSL은 언어이다. 특정 지식의 범주를 다룬다. 형식을가지고 있다. (문자 or 그림) 결과를 산출한다. 객체 설정, 데이터 구조 표현 내부 혹은 외부에 존재 호스트 언어에 임베드(E-DSL) Standalone (custom parser) 어떤 질적 속성을 가짐 가독성 readability 가속성writability 유용성 usability 검증성 testability 확장성 extensibility
19. 왜 Groovy인가? 왜 Groovy인가? 내부/임베드DSL 생성 가능 임베드DSL은 Java애플리케이션에 손쉽게 내장가능 DSL로 커버 못하는 영역은 Groovy사용 Custom parser는? lexer/parser는 구현, 유지보수및 사용이 복잡 추가 구현 힘듬 복잡한 구문 구현 어려움
20. 실세계Groovy 적용 예 보험 정책 위험도 계산 엔진 은행 계좌 규칙 대출 승인 규칙 인력 자원 : 직원 스킬 표현 바이러스 백신 시뮬레이션 시나리오에 따른 마켓 데이터 생성 ...
37. 속성에 숫자 추가 category로 숫자에 메소드와 속성 추가 가능 classMyCategory {static Distance getMeters(Integer n) {new Distance(n, Distance.METER) }} use (MyCategory) {println3.meters}
39. 융통성 있는 문법 괄호 생략 move left monstor.move x: 3.meters, y: 4.meters compare indicator: ’NIKEI’, withFund: ’XYZ’ account.debit amount: 30.won, in: 3.days 리스트와 맵 문법 내장 List [1, 2, 3, 4] Map [a:1, b:2, c:3] Range Monday..Friday
40. 트리 구조 빌더 트리 구조 데이터 생성 가능 클로저를 마지막 인자로 받는 메서드 체인 호출 구조 newMarkupBuilder().invoices {invoice( id: “4”) {line“product 1”line“product 2” }} 손쉽게 자신만의 빌더 생성 가능!
41. BuilderSupport Implement BuilderSupport 구현 해야 하는 메서드 createNode(name) createNode(name, map) createNode(name, value) createNode(name, map, value) nodeCompleted(parent, node) postNodeCompletion(parent, node)
42. 커스텀 제어 구조 클로저closure를 메서드파라메터로 전달 unless( account.balance<0, {account.debit10.dollars}) 단축 표기법 unless (account.balance < 0) {account.debit10.dollars} 무엇이든 만들어 보세요! withLock(aLock) { ... } transactional { ... } async { ... } execute(within: 50.seconds) { ... }
55. 통합 매커니즘 Java 6 : JSR-223 / javax.script.* Groovy 자체 메커니즘 GroovyShell GroovyClassLoader Spring 2.0 dynamic language beans Lang namespace POGO customizer
56. Java 6 스크립팅API scripting.dev.java.net에서 Groovy 엔진 JAR 제공 CLASSPATH에 포함시킬 것! ScriptEngineManager manager = newScriptEngineManager();ScriptEnginegEngine = manager.getEngineByName(“groovy”);String result = (String)gEngine.eval(“’Foo’*2”);
61. DSL 적용 강제로 적용하지 말 것! 대신... 사용자들이 자신들만의 DSL을 만들도록 할 것 정기적으로 최종 사용자를 포함시킬 것 어떻게 DSL을 사용하고 있는지 검토할 것 사용자들에게 어떤 것이 되고 안 되는지 알려줄 것
62. 씻고, 닦고, 반복 반복 프로세스 간단하게 시작 처음에 원하는 것을 얻을 수 없음을 상기 관련 전문가와 브레인스토밍하며 지속적으로 개선 시켜야 함!
63. 방어 프로그래밍 DSL은 샌드박스에서 실행해야 한다. 사용자들이 애플리케이션을 다운시켜서는 안됨 테스트, 테스트, 테스트! 우아하게 실패할 것 유효하지 않은 경우 : 에러 테스트! 의미 있는 에러 메시지를 출력할 것
64. 요약 DLS은 해당 분야 전문가domain xpert와 개발자 사이에 공통의 상징metaphor으로서 공유할 수 있는 훌륭한 툴 DSL은 기존의 틀에 박힌 코드 없이 범주domain 개념을 표현 Groovy 문법과 동적 특성으로 DSL를 쉽게 만들고 Java 애플리케이션 통합 고품질 적용을 고려하여 반복적iterative이고 방어적인 프로그래밍.