ݺߣ

ݺߣShare a Scribd company logo
DSL로 만나는 Groovy
장시영
KGGUG
DSL
•DSLR? DSL?
A domain-specific language (DSL) is a computer language specialized to a
particular application domain.
http://en.wikipedia.org/wiki/Domain-specific_language
http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=8991268994

•DSL <-> GPL(General Purpose Language)
•DSL = Mini Languages
•DSL Example => XML, HTML, CSS, SQL
•Groovy로 해석되는 DSL
– 각종 Builder, GORM, gradle, Grails
Groovy?
•
•
•
•

Ruby?
Dynamic Language?
다양한 빌더
Grails, gradle, GORM 등
Groovy Builder DSL – XML
writer = new StringWriter()
builder = new groovy.xml.MarkupBuilder(writer)
builder.numbers {
description 'Squares and factors of 10..15'
for (i in 10..15) {
number (value: i, square: i*i) {
//#1
for ( j in 2..<i) {
if (i % j == 0) {
factor (value: j) //#2
}
}
}
}
}
println writer
http://groovyconsole.appspot.com/
Groovy Builder DSL - HTML
def writer = new StringWriter()
def html = new groovy.xml.MarkupBuilder(writer)
html.html {
head { title 'Constructed by MarkupBuilder' }
body {
h1 'What can I do with MarkupBuilder?'
form (action:'whatever') {
for (line in [
'Produce HTML',
'Produce XML',
'Have some fun'
]){
input(type:'checkbox',checked:'checked', id:line, '')
label(for:line, line)
br('')
}
}
}
}
println writer
GORM – DSL
• ORM DSL

– Mapping

• Table, Column mapping
• Relational mapping

– ORM관련 설정
•
•
•
•

Cache 전략
Custom ID 전략
Composite Primary Keys
Index 설정

– http://grails.org/doc/latest/guide/single.html#ormdsl

• Query DSL
–

Basic Query

• list, get, getAll

– Dynamic Finders
• findByXXX
–
–

Book.findByTitle(„정글만리‟), findByTitleLike(„%정글‟)
http://grails.org/doc/latest/ref/Domain%20Classes/findBy.html
Groovy로 만든 한글 DSL
Object.metaClass.을 =
Object.metaClass.를 =
Object.metaClass.의 =
{ clos -> clos(delegate) }
먼저 = { it }
표시하라 = { println it }
제곱근 = { Math.sqrt(it) }
먼저 100 의 제곱근 을 표시하라
먼저(100).의(제곱근).을(표시하라)
출처: http://it.gilbird.com/textyle/8318
Groovy는 왜 DSL에 강한가?
• Dynamic Language

– Dynamic Type
num = 10; str = “20”
assert num instanceof Integer
assert str instanceof String
– Closure
• Caller에게 양보하기
– MOP(Meta Class, Expando Class)
• 요술상자, 아메바
– Groovy‟s chain method calls (GEP 3)
• 괄호 빼기
먼저 100 의 제곱근 을 표시하라
먼저(100).의(제곱근).을(표시하라)

•

JVM 기반

– Groovy는 결국 Java Class로 컴파일
– 거의 95%이상 Java와 동일하게 코딩 가능
– Java와 Groovy의 혼용
Groovy MOP
• MOP(Meta Object Protocol)
– MetaObjectProtocol
• http://en.wikipedia.org/wiki/Metaobject
• MetaClass, ExpandoMetaClass
http://mrhaki.blogspot.kr/2009/10/groovy-goodness-expando-as-dynamic-bean.html

– 요술을 부리는 MOP Hooks
• invokeMethod, methodMissing, get/setProperty,
propertyMissing
Groovy MetaClass
MOP Hooks - invokeMethod
import org.codehaus.groovy.runtime.StringBufferWriter
import org.codehaus.groovy.runtime.InvokerHelper
class Traceable implements GroovyInterceptable {
Writer writer = new PrintWriter(System.out)
private int indent = 0
Object invokeMethod(String name, Object args){
writer.write("n" + ' '*indent + "before method '$name'")
writer.flush()
indent++
def metaClass = InvokerHelper.getMetaClass(this)
def result = metaClass.invokeMethod(this, name, args)
indent-writer.write("n" + ' '*indent + "after method '$name'")
writer.flush()
return result
}
}
class Whatever extends Traceable {
int outer(){
return inner()
}
int inner(){
return 1
}
}
def log = new StringBuffer()
def traceMe = new Whatever(writer: new StringBufferWriter(log))
assert 1 == traceMe.outer()
println log
Method 실행 순서
MOP Hooks – methodMissing
class GORM {

}

def dynamicMethods = [...] // an array of dynamic methods that use regex
def methodMissing(String name, args) {
def method = dynamicMethods.find { it.match(name) }
if(method) {
GORM.metaClass."$name" = { Object[] varArgs ->
method.invoke(delegate, name, varArgs)
}
return method.invoke(delegate,name, args)
}
else throw new MissingMethodException(name, delegate, args)
}

http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing
Groovy Closure
def lineFile = new File(getClass().getResource("numbers.txt").getPath())
def sumValue = 0, multiflyValue = 1, concateValue = ''
lineFile.eachLine {
sumValue += Integer.parseInt(it)
multiflyValue *= Integer.parseInt(it)
concateValue += it
}
assert sumValue == 10
assert multiflyValue == 24
assert concateValue == '1234'
한국어 DSL로 돌아와서
Object.metaClass.을 =
Object.metaClass.를 =
Object.metaClass.의 =
{ clos -> clos(delegate) }
먼저 = { it }
표시하라 = { println it }
제곱근 = { Math.sqrt(it) }
먼저 100 의 제곱근 을 표시하라
먼저(100).의(제곱근).을(표시하라)
100.제곱근 을 표시하라
출처: http://it.gilbird.com/textyle/8318
관련 자료
• http://notes.3kbo.com/groovy-dsls
• http://en.wikipedia.org/wiki/Domainspecific_language
• DSL 번역본
• 프로그래밍 그루비
• 한국어 DSL
• Groovy for Domain-Specific Languages
• http://en.wikipedia.org/wiki/Metaobject
• http://groovy.codehaus.org/api/overviewsummary.html
• Groovy Grails 의 좋은 점
• ★ Groovy
Ad

Recommended

Groovy Finesse
Groovy Finesse
mzgubin
Groovy overview, DSLs and ecosystem - Mars JUG - 2010
Groovy overview, DSLs and ecosystem - Mars JUG - 2010
Guillaume Laforge
Understanding how concurrency work in os
Understanding how concurrency work in os
GenchiLu1
Why don't you Groovy?
Why don't you Groovy?
Orest Ivasiv
Venkat Subramaniam Blending Java With Dynamic Languages
Venkat Subramaniam Blending Java With Dynamic Languages
deimos
Buildr - build like you code
Buildr - build like you code
Izzet Mustafaiev
WeCode IL: Confessions of a java developer that fell in love with the groovy...
WeCode IL: Confessions of a java developer that fell in love with the groovy...
Victor Trakhtenberg
Groovy and noteworthy
Groovy and noteworthy
Izzet Mustafaiev
Venkat Subramaniam Building DSLs In Groovy
Venkat Subramaniam Building DSLs In Groovy
deimos
Golang
Golang
Michael Blake
JavaCro 2016 - From Java to Groovy: Adventure Time!
JavaCro 2016 - From Java to Groovy: Adventure Time!
Iván López Martín
Pluggable web app using Angular (Odessa JS conf)
Pluggable web app using Angular (Odessa JS conf)
Saif Jerbi
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
Barry Jones
Web Development: Making it the right way
Web Development: Making it the right way
Yagiz Nizipli
Quick Review of Desktop and Native Apps using Javascript
Quick Review of Desktop and Native Apps using Javascript
Robert Ellen
Introduction to TypeScript
Introduction to TypeScript
NexThoughts Technologies
Intro to Crystal Programming Language
Intro to Crystal Programming Language
Adler Hsieh
Introduction to go lang
Introduction to go lang
Amal Mohan N
Webpack & EcmaScript 6 (Webelement #32)
Webpack & EcmaScript 6 (Webelement #32)
srigi
Scala vs ruby
Scala vs ruby
Kamil Lelonek
Kotlin introduction
Kotlin introduction
Jedsada Tiwongvokul
Crystal
Crystal
Kamil Lelonek
Use groovy & grails in your spring boot projects
Use groovy & grails in your spring boot projects
Fátima Casaú Pérez
Gluecon 2014 - Bringing Node.js to the JVM
Gluecon 2014 - Bringing Node.js to the JVM
Jeremy Whitlock
The Saga of JavaScript and TypeScript: Part 1
The Saga of JavaScript and TypeScript: Part 1
Haci Murat Yaman
Php[tek] 2016 - BDD with Behat for Beginners
Php[tek] 2016 - BDD with Behat for Beginners
Adam Englander
There is something about JavaScript - Choose Forum 2014
There is something about JavaScript - Choose Forum 2014
jbandi
Desarrollo multiplataforma con kotlin | UPV 2018
Desarrollo multiplataforma con kotlin | UPV 2018
Víctor Bolinches
GKAC 2014 Nov. - 그루비로 안드로이드 앱 개발하기
GKAC 2014 Nov. - 그루비로 안드로이드 앱 개발하기
GDG Korea
무식하게 배우는 gradle
무식하게 배우는 gradle
Ji Heon Kim

More Related Content

What's hot (20)

Venkat Subramaniam Building DSLs In Groovy
Venkat Subramaniam Building DSLs In Groovy
deimos
Golang
Golang
Michael Blake
JavaCro 2016 - From Java to Groovy: Adventure Time!
JavaCro 2016 - From Java to Groovy: Adventure Time!
Iván López Martín
Pluggable web app using Angular (Odessa JS conf)
Pluggable web app using Angular (Odessa JS conf)
Saif Jerbi
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
Barry Jones
Web Development: Making it the right way
Web Development: Making it the right way
Yagiz Nizipli
Quick Review of Desktop and Native Apps using Javascript
Quick Review of Desktop and Native Apps using Javascript
Robert Ellen
Introduction to TypeScript
Introduction to TypeScript
NexThoughts Technologies
Intro to Crystal Programming Language
Intro to Crystal Programming Language
Adler Hsieh
Introduction to go lang
Introduction to go lang
Amal Mohan N
Webpack & EcmaScript 6 (Webelement #32)
Webpack & EcmaScript 6 (Webelement #32)
srigi
Scala vs ruby
Scala vs ruby
Kamil Lelonek
Kotlin introduction
Kotlin introduction
Jedsada Tiwongvokul
Crystal
Crystal
Kamil Lelonek
Use groovy & grails in your spring boot projects
Use groovy & grails in your spring boot projects
Fátima Casaú Pérez
Gluecon 2014 - Bringing Node.js to the JVM
Gluecon 2014 - Bringing Node.js to the JVM
Jeremy Whitlock
The Saga of JavaScript and TypeScript: Part 1
The Saga of JavaScript and TypeScript: Part 1
Haci Murat Yaman
Php[tek] 2016 - BDD with Behat for Beginners
Php[tek] 2016 - BDD with Behat for Beginners
Adam Englander
There is something about JavaScript - Choose Forum 2014
There is something about JavaScript - Choose Forum 2014
jbandi
Desarrollo multiplataforma con kotlin | UPV 2018
Desarrollo multiplataforma con kotlin | UPV 2018
Víctor Bolinches
Venkat Subramaniam Building DSLs In Groovy
Venkat Subramaniam Building DSLs In Groovy
deimos
JavaCro 2016 - From Java to Groovy: Adventure Time!
JavaCro 2016 - From Java to Groovy: Adventure Time!
Iván López Martín
Pluggable web app using Angular (Odessa JS conf)
Pluggable web app using Angular (Odessa JS conf)
Saif Jerbi
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
Barry Jones
Web Development: Making it the right way
Web Development: Making it the right way
Yagiz Nizipli
Quick Review of Desktop and Native Apps using Javascript
Quick Review of Desktop and Native Apps using Javascript
Robert Ellen
Intro to Crystal Programming Language
Intro to Crystal Programming Language
Adler Hsieh
Webpack & EcmaScript 6 (Webelement #32)
Webpack & EcmaScript 6 (Webelement #32)
srigi
Use groovy & grails in your spring boot projects
Use groovy & grails in your spring boot projects
Fátima Casaú Pérez
Gluecon 2014 - Bringing Node.js to the JVM
Gluecon 2014 - Bringing Node.js to the JVM
Jeremy Whitlock
The Saga of JavaScript and TypeScript: Part 1
The Saga of JavaScript and TypeScript: Part 1
Haci Murat Yaman
Php[tek] 2016 - BDD with Behat for Beginners
Php[tek] 2016 - BDD with Behat for Beginners
Adam Englander
There is something about JavaScript - Choose Forum 2014
There is something about JavaScript - Choose Forum 2014
jbandi
Desarrollo multiplataforma con kotlin | UPV 2018
Desarrollo multiplataforma con kotlin | UPV 2018
Víctor Bolinches

Viewers also liked (8)

GKAC 2014 Nov. - 그루비로 안드로이드 앱 개발하기
GKAC 2014 Nov. - 그루비로 안드로이드 앱 개발하기
GDG Korea
무식하게 배우는 gradle
무식하게 배우는 gradle
Ji Heon Kim
Creating Domain Specific Languages in Python
Creating Domain Specific Languages in Python
Siddhi
서유럽 여행기 0820
서유럽 여행기 0820
Seeyoung Chang
Apache 핵심 프로젝트 camel 엿보기
Apache 핵심 프로젝트 camel 엿보기
Hwang Sun Oh Kelly
gradle로 안드로이드 앱 빌드하기
gradle로 안드로이드 앱 빌드하기
Manjong Han
알파희 - PyPy/RPython으로 20배 빨라지는 아희 JIT 인터프리터
알파희 - PyPy/RPython으로 20배 빨라지는 아희 JIT 인터프리터
YunWon Jeong
AWS로 사용자 천만명 서비스 만들기 - 윤석찬 (AWS 테크에반젤리스트) :: AWS 웨비나 시리즈 2015
AWS로 사용자 천만명 서비스 만들기 - 윤석찬 (AWS 테크에반젤리스트) :: AWS 웨비나 시리즈 2015
Amazon Web Services Korea
GKAC 2014 Nov. - 그루비로 안드로이드 앱 개발하기
GKAC 2014 Nov. - 그루비로 안드로이드 앱 개발하기
GDG Korea
무식하게 배우는 gradle
무식하게 배우는 gradle
Ji Heon Kim
Creating Domain Specific Languages in Python
Creating Domain Specific Languages in Python
Siddhi
Apache 핵심 프로젝트 camel 엿보기
Apache 핵심 프로젝트 camel 엿보기
Hwang Sun Oh Kelly
gradle로 안드로이드 앱 빌드하기
gradle로 안드로이드 앱 빌드하기
Manjong Han
알파희 - PyPy/RPython으로 20배 빨라지는 아희 JIT 인터프리터
알파희 - PyPy/RPython으로 20배 빨라지는 아희 JIT 인터프리터
YunWon Jeong
AWS로 사용자 천만명 서비스 만들기 - 윤석찬 (AWS 테크에반젤리스트) :: AWS 웨비나 시리즈 2015
AWS로 사용자 천만명 서비스 만들기 - 윤석찬 (AWS 테크에반젤리스트) :: AWS 웨비나 시리즈 2015
Amazon Web Services Korea
Ad

Recently uploaded (20)

TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
Safe Software
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
Creating Inclusive Digital Learning with AI: A Smarter, Fairer Future
Creating Inclusive Digital Learning with AI: A Smarter, Fairer Future
Impelsys Inc.
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Alliance
Mastering AI Workflows with FME - Peak of Data & AI 2025
Mastering AI Workflows with FME - Peak of Data & AI 2025
Safe Software
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
Security Tips for Enterprise Azure Solutions
Security Tips for Enterprise Azure Solutions
Michele Leroux Bustamante
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
June Patch Tuesday
June Patch Tuesday
Ivanti
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Safe Software
The State of Web3 Industry- Industry Report
The State of Web3 Industry- Industry Report
Liveplex
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Alliance
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Safe Software
AI vs Human Writing: Can You Tell the Difference?
AI vs Human Writing: Can You Tell the Difference?
Shashi Sathyanarayana, Ph.D
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
Safe Software
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
Creating Inclusive Digital Learning with AI: A Smarter, Fairer Future
Creating Inclusive Digital Learning with AI: A Smarter, Fairer Future
Impelsys Inc.
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Alliance
Mastering AI Workflows with FME - Peak of Data & AI 2025
Mastering AI Workflows with FME - Peak of Data & AI 2025
Safe Software
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
June Patch Tuesday
June Patch Tuesday
Ivanti
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Safe Software
The State of Web3 Industry- Industry Report
The State of Web3 Industry- Industry Report
Liveplex
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Alliance
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Safe Software
Ad

Dsl로 만나는 groovy

  • 2. DSL •DSLR? DSL? A domain-specific language (DSL) is a computer language specialized to a particular application domain. http://en.wikipedia.org/wiki/Domain-specific_language http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=8991268994 •DSL <-> GPL(General Purpose Language) •DSL = Mini Languages •DSL Example => XML, HTML, CSS, SQL •Groovy로 해석되는 DSL – 각종 Builder, GORM, gradle, Grails
  • 4. Groovy Builder DSL – XML writer = new StringWriter() builder = new groovy.xml.MarkupBuilder(writer) builder.numbers { description 'Squares and factors of 10..15' for (i in 10..15) { number (value: i, square: i*i) { //#1 for ( j in 2..<i) { if (i % j == 0) { factor (value: j) //#2 } } } } } println writer http://groovyconsole.appspot.com/
  • 5. Groovy Builder DSL - HTML def writer = new StringWriter() def html = new groovy.xml.MarkupBuilder(writer) html.html { head { title 'Constructed by MarkupBuilder' } body { h1 'What can I do with MarkupBuilder?' form (action:'whatever') { for (line in [ 'Produce HTML', 'Produce XML', 'Have some fun' ]){ input(type:'checkbox',checked:'checked', id:line, '') label(for:line, line) br('') } } } } println writer
  • 6. GORM – DSL • ORM DSL – Mapping • Table, Column mapping • Relational mapping – ORM관련 설정 • • • • Cache 전략 Custom ID 전략 Composite Primary Keys Index 설정 – http://grails.org/doc/latest/guide/single.html#ormdsl • Query DSL – Basic Query • list, get, getAll – Dynamic Finders • findByXXX – – Book.findByTitle(„정글만리‟), findByTitleLike(„%정글‟) http://grails.org/doc/latest/ref/Domain%20Classes/findBy.html
  • 7. Groovy로 만든 한글 DSL Object.metaClass.을 = Object.metaClass.를 = Object.metaClass.의 = { clos -> clos(delegate) } 먼저 = { it } 표시하라 = { println it } 제곱근 = { Math.sqrt(it) } 먼저 100 의 제곱근 을 표시하라 먼저(100).의(제곱근).을(표시하라) 출처: http://it.gilbird.com/textyle/8318
  • 8. Groovy는 왜 DSL에 강한가? • Dynamic Language – Dynamic Type num = 10; str = “20” assert num instanceof Integer assert str instanceof String – Closure • Caller에게 양보하기 – MOP(Meta Class, Expando Class) • 요술상자, 아메바 – Groovy‟s chain method calls (GEP 3) • 괄호 빼기 먼저 100 의 제곱근 을 표시하라 먼저(100).의(제곱근).을(표시하라) • JVM 기반 – Groovy는 결국 Java Class로 컴파일 – 거의 95%이상 Java와 동일하게 코딩 가능 – Java와 Groovy의 혼용
  • 9. Groovy MOP • MOP(Meta Object Protocol) – MetaObjectProtocol • http://en.wikipedia.org/wiki/Metaobject • MetaClass, ExpandoMetaClass http://mrhaki.blogspot.kr/2009/10/groovy-goodness-expando-as-dynamic-bean.html – 요술을 부리는 MOP Hooks • invokeMethod, methodMissing, get/setProperty, propertyMissing
  • 11. MOP Hooks - invokeMethod import org.codehaus.groovy.runtime.StringBufferWriter import org.codehaus.groovy.runtime.InvokerHelper class Traceable implements GroovyInterceptable { Writer writer = new PrintWriter(System.out) private int indent = 0 Object invokeMethod(String name, Object args){ writer.write("n" + ' '*indent + "before method '$name'") writer.flush() indent++ def metaClass = InvokerHelper.getMetaClass(this) def result = metaClass.invokeMethod(this, name, args) indent-writer.write("n" + ' '*indent + "after method '$name'") writer.flush() return result } } class Whatever extends Traceable { int outer(){ return inner() } int inner(){ return 1 } } def log = new StringBuffer() def traceMe = new Whatever(writer: new StringBufferWriter(log)) assert 1 == traceMe.outer() println log
  • 13. MOP Hooks – methodMissing class GORM { } def dynamicMethods = [...] // an array of dynamic methods that use regex def methodMissing(String name, args) { def method = dynamicMethods.find { it.match(name) } if(method) { GORM.metaClass."$name" = { Object[] varArgs -> method.invoke(delegate, name, varArgs) } return method.invoke(delegate,name, args) } else throw new MissingMethodException(name, delegate, args) } http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing
  • 14. Groovy Closure def lineFile = new File(getClass().getResource("numbers.txt").getPath()) def sumValue = 0, multiflyValue = 1, concateValue = '' lineFile.eachLine { sumValue += Integer.parseInt(it) multiflyValue *= Integer.parseInt(it) concateValue += it } assert sumValue == 10 assert multiflyValue == 24 assert concateValue == '1234'
  • 15. 한국어 DSL로 돌아와서 Object.metaClass.을 = Object.metaClass.를 = Object.metaClass.의 = { clos -> clos(delegate) } 먼저 = { it } 표시하라 = { println it } 제곱근 = { Math.sqrt(it) } 먼저 100 의 제곱근 을 표시하라 먼저(100).의(제곱근).을(표시하라) 100.제곱근 을 표시하라 출처: http://it.gilbird.com/textyle/8318
  • 16. 관련 자료 • http://notes.3kbo.com/groovy-dsls • http://en.wikipedia.org/wiki/Domainspecific_language • DSL 번역본 • 프로그래밍 그루비 • 한국어 DSL • Groovy for Domain-Specific Languages • http://en.wikipedia.org/wiki/Metaobject • http://groovy.codehaus.org/api/overviewsummary.html • Groovy Grails 의 좋은 점 • ★ Groovy