SlideShare a Scribd company logo
1 of 57
Domain-Specific Languages With Groovy Chun-Kil Kang gilbird@naver.com, Twitter: @gilbirdk
Expressing Requirements...
해결책은? DSL ! 표현력이 월등more expressive 공통의 관심사common metaphore 전문가domain expert의 도움 비즈니스 로직과 애플리케이션 코드 분리 순환적 라이프사이클
DSL 이란? DSL: Domain-Specific Language “Little Language” Wikipedia DSL은 특정 작업의 사용 목적으로 설계한 프로그램 언어. DSL은 개념을 언어 구문으로 만들 수 있는 특정 범주의 지식에 한정된 언어이다.
DSL ... 온 세상이 DSL 기술어Technical Dialects 표기법 Notations 비즈니스 용어 Business Languages
^[-]+@([-]){2,4}$
DSL의 특징 DSL은 언어이다. 특정 지식의 범주를 다룬다. 형식을가지고 있다. (문자 or 그림) 결과를 산출한다. 객체 설정, 데이터 구조 표현 내부 혹은 외부에 존재 호스트 언어에 임베드(E-DSL) Standalone (custom parser) 어떤 질적 속성을 가짐 가독성 readability 가속성writability 유용성 usability 검증성 testability 확장성 extensibility
Why Groovy?!
HelloWorld.java importjava.util.*; publicclassHelloWorld{  publicstaticvoidmain( String[] args ) {     List langs = newArrayList();      langs.add( "Groovy" );     langs.add( "Grails" );     langs.add( "Griffon" );      Collections.sort(langs);      for( Iterator it = langs.iterator(); it.hasNext(); )        System.out.println( "Hello " + it.next() );  }}
HelloWorld.groovy ['Groovy', 'Grails', 'Griffon'].sort().each {    println"Hello $it"}
읽기 쉬운 코드? (Java)
읽기 쉬운 코드? (Groovy)
왜 Groovy인가? 왜 Groovy인가? 내부/임베드DSL 생성 가능 임베드DSL은 Java애플리케이션에 손쉽게 내장가능 DSL로 커버 못하는 영역은 Groovy사용 Custom parser는? lexer/parser는 구현, 유지보수및 사용이 복잡 추가 구현 힘듬 복잡한 구문 구현 어려움
실세계Groovy 적용 예 보험 정책 위험도 계산 엔진 은행 계좌 규칙 대출 승인 규칙 인력 자원 : 직원 스킬 표현 바이러스 백신 시뮬레이션 시나리오에 따른 마켓 데이터 생성 ...
GroovyDSLs
MarkupBuilder <invoices>     <invoice>         <line>product 1</line>         <line>product 2</line>     </invoice> </invoices> newgroovy.xml.MarkupBuilder().invoices {   invoice(id: "4") { line("product 1") line("product 2")   } }
Groovy DSLs XMLBuilder HTMLBuilder AntBuilder SwingBuilder Grails Griffon Gradle Grape
Groovy가 제공하는 것들
Java vs. Groovy Java Class  행동 컴파일러가 모든 규칙 인지 행동은 바이트코드로 고정 Groovy Class와 MetaClass 행동 동적 언어 컴파일러는 행동에 대하여 모름 행동은 완전히 실행시간에 동적임
Groovy MOP Meta Object Protocol 모든 것은 MOP을 통함 메소드호출, 속성 액세스, 연산자... 그래서 Groovy는 “동적언어” 완전하게 실행시간에Groovy 코드를 커스터마이즈가능함 1+1=1 ? 가능함! 어떻게?
런타임 시스템 후킹 GroovyObject invokeMethod() get/setProperty() Categories MetaClass invokeConstructor() / method() / staticMethod() invokeMissingMethod() / invokeMissingProperty() get/setProperty() ExpandoMetaClass Integer.metaClass.plus = { Integeri ->   1 }
연산자 오버로딩 ,[object Object]
30.won + 15.euro
거리
12.kilo.meters + 3.meters
병렬, 작업 흐름
taskA & taskB | taskC
계좌 기입
account << 10.won
account += 10.dollar+		a.plus(b) -		a.minus(b) *		a.multiply(b) /		a.divide(b) %		a.modulo(b) |		a.or(b) &		a.and(b) a[b]	a.getAt(b) a<<b	a.leftShift(b)
속성에 숫자 추가 category로 숫자에 메소드와 속성 추가 가능 classMyCategory {static Distance getMeters(Integer n) {new Distance(n, Distance.METER)  }} use (MyCategory) {println3.meters}
ExpandoMetaClass Grails에서 ExpandoMetaClass공헌 Integer.metaClass.getMeters = { ->new Distance(delegate, Distance.METER)} println3.meters
융통성 있는 문법 괄호 생략 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
트리 구조 빌더 트리 구조 데이터 생성 가능 클로저를 마지막 인자로 받는 메서드 체인 호출 구조 newMarkupBuilder().invoices {invoice( id: “4”) {line“product 1”line“product 2”  }} 손쉽게 자신만의 빌더 생성 가능!
BuilderSupport Implement BuilderSupport 구현 해야 하는 메서드 createNode(name) createNode(name, map) createNode(name, value) createNode(name, map, value) nodeCompleted(parent, node) postNodeCompletion(parent, node)
커스텀 제어 구조 클로저closure를 메서드파라메터로 전달 unless( account.balance<0, {account.debit10.dollars}) 단축 표기법 unless (account.balance < 0) {account.debit10.dollars} 무엇이든 만들어 보세요! withLock(aLock) { ... } transactional { ... } async { ... } execute(within: 50.seconds) { ... }
RobotBuilder defwallE = newRobotBuilder().robot('Wall E') { forward( dist: 20) left( rotation: 90) forward( speed: 10, duration: 5) } wallE.go()
Builder 최종 인스턴스 구조
FactoryBuilderSupport classRobotBuilderextendsFactoryBuilderSupport {     { registerFactory( 'robot', newRobotFactory()) registerFactory( 'forward', newForwardMoveFactory()) registerFactory( 'left', newLeftTurnFactory())     }; }
Robot class Robot {     String name def movements = [] void go() { println"$name 로봇 동작합니다..." movements.each { movement -> println movement         }     } }
ForwardMove, LeftTurn classForwardMove { def dist     String toString() { "이동! 거리... $dist" } } classLeftTurn { def rotation     String toString() { "좌회전! 이동각... $rotation 도" } }
AbstractFactory publicabstractclassAbstractFactoryimplementsFactory { publicbooleanisLeaf() { return false; } publicbooleanonHandleNodeAttributes( FactoryBuilderSupport builder,       Object node, Map attributes) { return true; } public void onNodeCompleted( FactoryBuilderSupport builder,       Object parent, Object node) { } public void setParent( FactoryBuilderSupport builder,       Object parent, Object child) { } public void setChild( FactoryBuilderSupport builder,        Object parent, Object child) { } }
RootFactory classRobotFactoryextendsAbstractFactory { defnewInstance( FactoryBuilderSupport builder, name, value,             Map attrs) { new Robot(name: value)     } voidsetChild( FactoryBuilderSupport builder, Object parent,             Object child) { parent.movements << child     } }
LeftTurnFactory classLeftTurnFactoryextendsAbstractFactory { booleanisLeaf() { true } defnewInstance( FactoryBuilderSupport builder, name,              value, Map attrs) { newLeftTurn()     } }
ForwardMoveFactory classForwardMoveFactoryextendsAbstractFactory { booleanisLeaf() { true } defnewInstance( FactoryBuilderSupport builder, name, value,              Map attrs) { newForwardMove()     } ...
ForwardMoveFactory    ... booleanonHandleNodeAttributes( FactoryBuilderSupport builder,                  Object node, Map attrs)      { if( attrs.speed && attrs.duration) { node.dist = attrs.speed + attrs.duration attrs.remove( 'speed') attrs.remove('duration')         }         true     } }
RobotBuilder Wall E 로봇 동작합니다... 이동! 거리 ... 20 좌회전! 거리 ... 90도 이동! 거리 ... 15
DSL 애플리케이션 통합
통합 매커니즘 Java 6 : JSR-223 / javax.script.* Groovy 자체 메커니즘 GroovyShell GroovyClassLoader Spring 2.0 dynamic language beans Lang namespace POGO customizer
Java 6 스크립팅API scripting.dev.java.net에서 Groovy 엔진 JAR 제공 CLASSPATH에 포함시킬 것! ScriptEngineManager manager = newScriptEngineManager();ScriptEnginegEngine = manager.getEngineByName(“groovy”);String result = (String)gEngine.eval(“’Foo’*2”);
GroovyShell expression과 스크립트를 evaluate 바인딩을 통하여 값 입/출력 evaluate한 스크립트는 global 함수나 변수를 포함한 베이스 클래스를 가짐

More Related Content

What's hot

0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
Sung-hoon Ma
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
Sang Don Kim
 
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
iamhjoo (송형주)
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11
흥배 최
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
흥배 최
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트
효준 강
 

What's hot (20)

[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
 
Protocol Oriented Programming in Swift
Protocol Oriented Programming in SwiftProtocol Oriented Programming in Swift
Protocol Oriented Programming in Swift
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features Summary
 
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
 
WTL 소개
WTL 소개WTL 소개
WTL 소개
 
Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 release
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트
 

Similar to Domain Specific Languages With Groovy

Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
knight1128
 
[A1]루비는 패셔니스타
[A1]루비는 패셔니스타[A1]루비는 패셔니스타
[A1]루비는 패셔니스타
NAVER D2
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장
tedypicker
 
그루비로 안드로이드 앱 개발하기
그루비로 안드로이드 앱 개발하기그루비로 안드로이드 앱 개발하기
그루비로 안드로이드 앱 개발하기
Sangkyoon Nam
 

Similar to Domain Specific Languages With Groovy (20)

반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
Scalability
ScalabilityScalability
Scalability
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, Scalability
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱
 
[A1]루비는 패셔니스타
[A1]루비는 패셔니스타[A1]루비는 패셔니스타
[A1]루비는 패셔니스타
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
Development AR App with C++ and Windows Holographic API
Development AR App with C++ and Windows Holographic APIDevelopment AR App with C++ and Windows Holographic API
Development AR App with C++ and Windows Holographic API
 
Java script
Java scriptJava script
Java script
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장
 
C++ 개발자와 함께 하는 visual studio 2013
C++ 개발자와 함께 하는 visual studio 2013C++ 개발자와 함께 하는 visual studio 2013
C++ 개발자와 함께 하는 visual studio 2013
 
javascript01
javascript01javascript01
javascript01
 
GKAC 2014 Nov. - 그루비로 안드로이드 앱 개발하기
GKAC 2014 Nov. - 그루비로 안드로이드 앱 개발하기GKAC 2014 Nov. - 그루비로 안드로이드 앱 개발하기
GKAC 2014 Nov. - 그루비로 안드로이드 앱 개발하기
 
그루비로 안드로이드 앱 개발하기
그루비로 안드로이드 앱 개발하기그루비로 안드로이드 앱 개발하기
그루비로 안드로이드 앱 개발하기
 
NDC11_슈퍼클래스
NDC11_슈퍼클래스NDC11_슈퍼클래스
NDC11_슈퍼클래스
 
[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 

Recently uploaded

Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
Wonjun Hwang
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
Wonjun Hwang
 

Recently uploaded (6)

A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 

Domain Specific Languages With Groovy

  • 1. Domain-Specific Languages With Groovy Chun-Kil Kang gilbird@naver.com, Twitter: @gilbirdk
  • 2.
  • 3.
  • 5. 해결책은? DSL ! 표현력이 월등more expressive 공통의 관심사common metaphore 전문가domain expert의 도움 비즈니스 로직과 애플리케이션 코드 분리 순환적 라이프사이클
  • 6. DSL 이란? DSL: Domain-Specific Language “Little Language” Wikipedia DSL은 특정 작업의 사용 목적으로 설계한 프로그램 언어. DSL은 개념을 언어 구문으로 만들 수 있는 특정 범주의 지식에 한정된 언어이다.
  • 7. DSL ... 온 세상이 DSL 기술어Technical Dialects 표기법 Notations 비즈니스 용어 Business Languages
  • 8.
  • 10.
  • 11.
  • 12.
  • 13. DSL의 특징 DSL은 언어이다. 특정 지식의 범주를 다룬다. 형식을가지고 있다. (문자 or 그림) 결과를 산출한다. 객체 설정, 데이터 구조 표현 내부 혹은 외부에 존재 호스트 언어에 임베드(E-DSL) Standalone (custom parser) 어떤 질적 속성을 가짐 가독성 readability 가속성writability 유용성 usability 검증성 testability 확장성 extensibility
  • 15. HelloWorld.java importjava.util.*; publicclassHelloWorld{  publicstaticvoidmain( String[] args ) {     List langs = newArrayList();     langs.add( "Groovy" );     langs.add( "Grails" );     langs.add( "Griffon" );      Collections.sort(langs);      for( Iterator it = langs.iterator(); it.hasNext(); )        System.out.println( "Hello " + it.next() );  }}
  • 16. HelloWorld.groovy ['Groovy', 'Grails', 'Griffon'].sort().each {    println"Hello $it"}
  • 19. 왜 Groovy인가? 왜 Groovy인가? 내부/임베드DSL 생성 가능 임베드DSL은 Java애플리케이션에 손쉽게 내장가능 DSL로 커버 못하는 영역은 Groovy사용 Custom parser는? lexer/parser는 구현, 유지보수및 사용이 복잡 추가 구현 힘듬 복잡한 구문 구현 어려움
  • 20. 실세계Groovy 적용 예 보험 정책 위험도 계산 엔진 은행 계좌 규칙 대출 승인 규칙 인력 자원 : 직원 스킬 표현 바이러스 백신 시뮬레이션 시나리오에 따른 마켓 데이터 생성 ...
  • 22. MarkupBuilder <invoices> <invoice> <line>product 1</line> <line>product 2</line> </invoice> </invoices> newgroovy.xml.MarkupBuilder().invoices { invoice(id: "4") { line("product 1") line("product 2") } }
  • 23. Groovy DSLs XMLBuilder HTMLBuilder AntBuilder SwingBuilder Grails Griffon Gradle Grape
  • 25. Java vs. Groovy Java Class  행동 컴파일러가 모든 규칙 인지 행동은 바이트코드로 고정 Groovy Class와 MetaClass 행동 동적 언어 컴파일러는 행동에 대하여 모름 행동은 완전히 실행시간에 동적임
  • 26. Groovy MOP Meta Object Protocol 모든 것은 MOP을 통함 메소드호출, 속성 액세스, 연산자... 그래서 Groovy는 “동적언어” 완전하게 실행시간에Groovy 코드를 커스터마이즈가능함 1+1=1 ? 가능함! 어떻게?
  • 27. 런타임 시스템 후킹 GroovyObject invokeMethod() get/setProperty() Categories MetaClass invokeConstructor() / method() / staticMethod() invokeMissingMethod() / invokeMissingProperty() get/setProperty() ExpandoMetaClass Integer.metaClass.plus = { Integeri -> 1 }
  • 28.
  • 33. taskA & taskB | taskC
  • 36. account += 10.dollar+ a.plus(b) - a.minus(b) * a.multiply(b) / a.divide(b) % a.modulo(b) | a.or(b) & a.and(b) a[b] a.getAt(b) a<<b a.leftShift(b)
  • 37. 속성에 숫자 추가 category로 숫자에 메소드와 속성 추가 가능 classMyCategory {static Distance getMeters(Integer n) {new Distance(n, Distance.METER) }} use (MyCategory) {println3.meters}
  • 38. ExpandoMetaClass Grails에서 ExpandoMetaClass공헌 Integer.metaClass.getMeters = { ->new Distance(delegate, Distance.METER)} 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) { ... }
  • 43. RobotBuilder defwallE = newRobotBuilder().robot('Wall E') { forward( dist: 20) left( rotation: 90) forward( speed: 10, duration: 5) } wallE.go()
  • 45. FactoryBuilderSupport classRobotBuilderextendsFactoryBuilderSupport { { registerFactory( 'robot', newRobotFactory()) registerFactory( 'forward', newForwardMoveFactory()) registerFactory( 'left', newLeftTurnFactory()) }; }
  • 46. Robot class Robot { String name def movements = [] void go() { println"$name 로봇 동작합니다..." movements.each { movement -> println movement } } }
  • 47. ForwardMove, LeftTurn classForwardMove { def dist String toString() { "이동! 거리... $dist" } } classLeftTurn { def rotation String toString() { "좌회전! 이동각... $rotation 도" } }
  • 48. AbstractFactory publicabstractclassAbstractFactoryimplementsFactory { publicbooleanisLeaf() { return false; } publicbooleanonHandleNodeAttributes( FactoryBuilderSupport builder, Object node, Map attributes) { return true; } public void onNodeCompleted( FactoryBuilderSupport builder, Object parent, Object node) { } public void setParent( FactoryBuilderSupport builder, Object parent, Object child) { } public void setChild( FactoryBuilderSupport builder, Object parent, Object child) { } }
  • 49. RootFactory classRobotFactoryextendsAbstractFactory { defnewInstance( FactoryBuilderSupport builder, name, value, Map attrs) { new Robot(name: value) } voidsetChild( FactoryBuilderSupport builder, Object parent, Object child) { parent.movements << child } }
  • 50. LeftTurnFactory classLeftTurnFactoryextendsAbstractFactory { booleanisLeaf() { true } defnewInstance( FactoryBuilderSupport builder, name, value, Map attrs) { newLeftTurn() } }
  • 51. ForwardMoveFactory classForwardMoveFactoryextendsAbstractFactory { booleanisLeaf() { true } defnewInstance( FactoryBuilderSupport builder, name, value, Map attrs) { newForwardMove() } ...
  • 52. ForwardMoveFactory ... booleanonHandleNodeAttributes( FactoryBuilderSupport builder, Object node, Map attrs) { if( attrs.speed && attrs.duration) { node.dist = attrs.speed + attrs.duration attrs.remove( 'speed') attrs.remove('duration') } true } }
  • 53. RobotBuilder Wall E 로봇 동작합니다... 이동! 거리 ... 20 좌회전! 거리 ... 90도 이동! 거리 ... 15
  • 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”);
  • 57. GroovyShell expression과 스크립트를 evaluate 바인딩을 통하여 값 입/출력 evaluate한 스크립트는 global 함수나 변수를 포함한 베이스 클래스를 가짐
  • 58. GroovyShell예 def binding = new Binding()binding.mass = 22.3binding.velocity = 10.6def shell = newGroovyShell(binding)defexpr = “mass * velocity ** 2 / 2”assertshell.evaluate(expr) == 1252.814
  • 59. GroovyClassLoader예 GroovyClassLoadergcl = newGroovyClassLoader();Class greetingClass = gcl.parseClass( new File( “DSL.groovy”));GroovyObjectdsl = (GroovyObject)greetingClass.newInstance();dsl.setMetaClass(myCustomDSLMetaClass);
  • 61. DSL 적용 강제로 적용하지 말 것! 대신... 사용자들이 자신들만의 DSL을 만들도록 할 것 정기적으로 최종 사용자를 포함시킬 것 어떻게 DSL을 사용하고 있는지 검토할 것 사용자들에게 어떤 것이 되고 안 되는지 알려줄 것
  • 62. 씻고, 닦고, 반복 반복 프로세스 간단하게 시작 처음에 원하는 것을 얻을 수 없음을 상기 관련 전문가와 브레인스토밍하며 지속적으로 개선 시켜야 함!
  • 63. 방어 프로그래밍 DSL은 샌드박스에서 실행해야 한다. 사용자들이 애플리케이션을 다운시켜서는 안됨 테스트, 테스트, 테스트! 우아하게 실패할 것 유효하지 않은 경우 : 에러 테스트! 의미 있는 에러 메시지를 출력할 것
  • 64. 요약 DLS은 해당 분야 전문가domain xpert와 개발자 사이에 공통의 상징metaphor으로서 공유할 수 있는 훌륭한 툴 DSL은 기존의 틀에 박힌 코드 없이 범주domain 개념을 표현 Groovy 문법과 동적 특성으로 DSL를 쉽게 만들고 Java 애플리케이션 통합 고품질 적용을 고려하여 반복적iterative이고 방어적인 프로그래밍.
  • 65.