[Áöµð³ÝÄÚ¸®¾Æ]¿¬Àç °¡ÀÌµå ¶óÀÎ ¿î¿µÃ¼Á¦ : À©µµ¿ì/À¯´Ð½º/¸®´ª½º/¸Æ OS X°³¹ßµµ±¸ : J2SE 1.4.2, ±×·çºñ 1.0 º£Å¸ 7±âÃÊÁö½Ä : ÀÚ¹Ù, ÆÄÀ̽ã, ·çºñ, ±âŸ ½ºÅ©¸³ÆÃ ¾ð¾îÀÀ¿ëºÐ¾ß : JVM ±â¹Ý ½ºÅ©¸³Æ® ÇÁ·Î±×·¡¹Ö
ÀÚ¹Ù°¡ ´å³Ýº¸´Ù °¼¼ÀÎ °÷Àº ¼¹öÃø ¾ÖÇø®ÄÉÀ̼ÇÀÌ´Ù. µ¿ÀûÀ̰í À¯¿¬ÇÑ ±×·çºñ(Groovy) ¾ð¾î·Î µ¥ÀÌÅͺ£À̽º ÀÔÃâ·Â Äڵ带 Â¥º¸°í, ¶Ç ÀÚ¹ÙÀÇ ¼¹öÃø ¼Ö·ç¼ÇÀ¸·Î ¸¹ÀÌ »ç¿ëµÇ´Â ¼ºí¸´°ú JSP¿¡ ÇØ´çÇÏ´Â ±×·çºê¸´(Groovlet)°ú GSP¸¦ ´õ °£°áÇÏ°Ô ÀÛ¼ºÇغ¸ÀÚ.
Áö³ ±Û¿¡¼´Â ±×·çºñ 1.0 º£Å¸ 6À» ±âÁØÀ¸·Î ¼³¸íÇÏ¿´Áö¸¸ ±× µ¿¾È ±×·çºñ 1.0 º£Å¸ 7ÀÌ ³ª¿Ô´Ù. º£Å¸ 7Àº º£Å¸ 6¿¡¼ ¾Ë·ÁÁø ¸î °¡Áö ¹ö±×°¡ ¼öÁ¤µÇ°í, »õ·Î¿î ±â´ÉÀÌ Ãß°¡µÈ ¹öÀüÀÌ´Ù. À̹ø ±Û¿¡¼´Â º£Å¸ 7À» ±âÁØÀ¸·Î ÇÏ¿© ±×·çºñ SQL, ±×·çºê¸´, GSP¸¦ ¼Ò°³Çϰí, BSF·Î ±×·çºñ¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸±â·Î ÇÑ´Ù.
| |
|
´ÙÀ½Àº www.elook.org/computing/closure.htm¿¡ ³ª¿À´Â Ŭ·ÎÀú(closure)ÀÇ Á¤ÀÇÀÌ´Ù.
Ç¥Çö½ÄÀ» °®°í ¶Ç ±× Ç¥Çö½ÄÀÇ Æò°¡¿¡ ¾²ÀÌ´Â º¯¼ö ¹ÙÀεù ȯ°æÀ» °®´Â µ¥ÀÌÅÍ ±¸Á¶(a data structure that holds an expression and an environment of variable bindings in which that expression is to be evaluated)
±×·çºñ¿¡¼ Ŭ·ÎÀú¸¦ ¸¹ÀÌ ¾´´Ù°í Çߴµ¥ Ŭ·ÎÀú¶ó´Â ¿ë¾î´Â ¡®ÇÔ¼ö¸¦ ÀÚÀ¯ º¯¼ö À§·Î Ŭ·ÎÁî¾÷(close up)ÇÑ´Ù¡¯´Â Àǹ̿¡¼ µû¿Â °ÍÀ̶ó°í ÇÑ´Ù. Ŭ·ÎÀú¶ó´Â °³³äÀÇ ¿ª»ç´Â C ¾ð¾î³ª Æ÷Æ®¶õ ¾ð¾îº¸´Ù ´õ ¿À·¡µÆ´Ù.
Ŭ·ÎÀú´Â ÇÔ¼ö ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼ ¶÷´Ù-Ķť·¯½º(¥ë-calculus)¶ó°í ÇÏ´Â °Í°ú ¹ÐÁ¢ÇÑ ¿¬°üÀÌ ÀÖ´Ù. 1924³â°æ ¼éÇÉÄÌÀÌ °£´ÜÇÑ ÇÔ¼ö ÀÌ·ÐÀ» °³¹ßÇÏ¿´°í, 1934³â¿¡´Â ¾Ë·ÐÁ¶ óġ°¡ ¶÷´Ù-Ķť·¯½º¸¦ ¼Ò°³ÇÏ¸é¼ À̸¦ Çü½Ä ÁýÇշп¡ ÀÌ¿ëÇÏ¿´´Ù.
1940³â°æ¿¡´Â ÇϽºÄÌ B. Ä¿¸®°¡ ÀÚÀ¯ º¯¼ö¸¦ °®´Â ÇÔ¼ö ÀÌ·ÐÀ» ¼Ò°³ÇÏ¿© ÇÔ¼ö ÇÁ·Î±×·¡¹ÖÀÇ ±âÃʸ¦ ¼¼¿ü´Ù(Âü°íÀÚ·á). LISP ¾ð¾î¿Í ½º¸ôÅå ¾ð¾î¿¡¼ Ŭ·ÎÀú¸¦ µµÀÔÇÏ¿´°í, ·çºñ(Ruby) ¾ð¾î¿¡ ÀÌ¾î ±×·çºñ ¾ð¾î¿¡ À̸¥´Ù.
| | | | | |
| |
±×·çºñ 1.0 º£Å¸ 7 ¼³Ä¡¿Í ±×·çºñ CVS ¼³Ä¡
±×·çºñ 1.0 º£Å¸ 7À» º£Å¸ 6 ¶§¿Í ¸¶Âù°¡Áö·Î ±×·çºñ ´Ù¿î·Îµå ÆäÀÌÁö(
dist.codehaus.org/groovy/distributions)¿¡¼ ´Ù¿î·ÎµåÇÏ¿© ´ÙÀ½ jar ¸í·ÉÀ¸·Î ¾ÐÃàÀ» ÇØÁ¦Çϰí, ȯ°æº¯¼ö °æ·Î(PATH)¸¸ Àâ¾ÆÁÖ¸é ¸ðµç °÷¿¡¼ groovy, groovyc, groovysh, groovyConsole ¸í·ÉµéÀ» ¾µ ¼ö ÀÖ´Ù. ÀÌµé ¸í·ÉÀÌ Ç¥ÁØ À§Ä¡(Áï, ±×·çºñ°¡ ¼³Ä¡µÈ °÷ÀÇ bin ¼ºêµð·ºÅ丮)¿¡ ÀÖ´Â °æ¿ì¿¡´Â ȯ°æº¯¼ö GROOVY_HOME°ú CLASSPATH´Â º°µµ·Î ÀâÁö ¾Ê¾Æµµ µÈ´Ù.
±×·¸Áö ¾ÊÀº °æ¿ì¿¡´Â ȯ°æº¯¼ö GROOVY_HOME¸¦ Á¤ÇØÁÖ¾î¾ß ÇÑ´Ù. ÀÚ¹Ù¿¡¼ ±×·çºñ¸¦ ÀÓº£µùÇÏ´Â °æ¿ì¿¡´Â %GROOVY_HOME%\lib µð·ºÅ丮 ¾Æ·¡¿¡ ÀÖ´Â groovy-1.0-beta-7.jar, asm-1.4.3.jar, commons-cli-1.0.jar ÆÄÀϵéÀ» CLASSPATH¿¡ Àâ¾ÆÁÖ¾î¾ß ÇÑ´Ù.
C:\> jar -xvf <´Ù¿î·ÎµåÀúÀå°æ·Î¸í>\groovy-1.0-beta-7.zip
C:\> jar -xvf <´Ù¿î·ÎµåÀúÀå°æ·Î¸í>\groovy-1.0-beta-7-src.zip
C:\> set PATH=C:\groovy-1.0-beta-7\bin;%PATH%
C:\> cd \Test
C:\Test> groovy Hello.groovy
À§¿Í °°ÀÌ ±×·çºñ ¼Ò½º±îÁö ¼³Ä¡ÇÏ°í ³ª¸é %GROOVY_HOME%\src\test µð·ºÅ丮¿¡´Â À¯´Ö Å×½ºÆ®¸¦ Åë°úÇÑ ¸¹Àº ¿¹Á¦µéÀÌ ÀÖ´Ù. ±×·çºñ ÇÁ·Î±×·¡¹Ö¿¡ ÀÌ ¿¹Á¦µéÀº ÁÁÀº ±æÀâÀ̰¡ µÈ´Ù.
¸ÞÀ̺ìÀ¸·Î ±×·çºñ CVS ¼³Ä¡Çϱâ À§ÇÑ Áغñ
±×·çºñ CVS·ÎºÎÅÍ Á÷Á¢ ¼³Ä¡ÇÒ ¼öµµ ÀÖ´Ù. ¸ÞÀ̺ì(Maven)À» ÀÌ¿ëÇϸé CVS üũ¾Æ¿ô°ú Ant ºôµå¸¦ ½±°Ô ÇÒ ¼ö ÀÖ´Ù. À©µµ¿ì °è¿ ȯ°æ¿¡¼ ¸ÞÀ̺ìÀ» ÀÌ¿ëÇÏ¿© ¼³Ä¡ÇÏ°í ºôµåÇÏ·Á¸é ´ÙÀ½ ÀÚ·áµéÀ» ÁغñÇÑ´Ù.
¡Þ cvs-1-12-9.zip ¸í·ÉÇà CVS 1.12.9
¡Þ apache-ant-1.5.x-bin.zip Apache-Ant 1.5.x(archive.apache.org/dist/ant/binaries)
¡Þ maven-1.0.exe Apache-Maven 1.0
¸í·ÉÇà CVS, Apache-Ant, Apache-MavenÀÌ ¼³Ä¡µÈ °÷À» PATH·Î Àâ´Â´Ù.
C:\> set PATH=c:\cvs-1.12.9;%PATH%
C:\> set PATH=c:\ant-1.5.1\bin;%PATH%
C:\> set PATH=c:\maven-1.0\bin;%PATH%
CVS ÀÛ¾÷À» À§ÇÑ µð·ºÅ丮 C:\MyCvs¸¦ ¸¸µé°í, ±×·çºñ CVS¸¦ ÀúÀåÇÒ ±âº» µð·ºÅ͸® C:\MyCvs\groovy¸¦ ¸¸µç´Ù. ¶Ç CVSHOME ȯ°æº¯¼ö¸¦ Á¤ÇÑ´Ù. CVSHOMEÀº ¸í·ÉÇà CVS°¡ ÀνÄÇϴ ȯ°æº¯¼öÀÌ´Ù. ÀÌ È¯°æº¯¼ö¿¡ ³Ö¾îÁÖ´Â °ªÀº CVS Ȩ¿¡¼ °¡Á®¿Â ÆÄÀϵéÀÌ ÀúÀåµÇ´Â ±âÁØ µð·ºÅ丮ÀÌ´Ù.
C:\> md \MyCvs
C:\> md \MyCvs\groovy
C:\> cd \MyCvs
C:\MyCvs> set CVSGOME=C:\MyCvs\groovy
¸ÞÀ̺ìÀ¸·Î ±×·çºñ CVS ÀÚ·á °¡Á®¿À±â
¸ÞÀ̺ìÀ¸·Î ±×·çºñ CVS¿¡¼ groovy-core ÆÄÀϵéÀ» °¡Á®¿À±â À§ÇØ ´ÙÀ½ ³»¿ëÀ» ¸ðµÎ ÇÑ ÁÙ·Î ÀÔ·ÂÇÏ¿© startMaven.bat¶ó´Â ÆÄÀϸíÀ¸·Î ÀúÀåÇÏ°í ½ÇÇàÇÑ´Ù.
maven scm:checkout-project
-Dmaven.scm.method=cvs
-
Dmaven.scm.cvs.module=groovy/groovy-core
-Dmaven.scm.cvs.root=:ext:username@cvs.groovy.codehaus.org:
/home/projects/groovy/scm
-Dmaven.scm.checkout.dir=.
C:\MyCvs> startMaven
¸ÞÀ̺ìÀ¸·Î ±×·çºñ ºôµåÇϱâ
ÀÌÁ¦ ±×·çºñ µð·ºÅ丮·Î °¡¼ ¸ÞÀ̺ìÀ» ½ÇÇàÇÑ´Ù.
C:\MyCvs> cd groovy
C:\MyCvs\groovy> maven
±×·¯¸é ¸ÞÀ̺ìÀÌ ºôµå¿¡ ÇÊ¿äÇÑ jar ÆÄÀϵéÀ» °¡Á®¿À°í, ant·Î ºôµåÇϰí, À¯´Ö Å×½ºÆ®ÇÏ´Â °úÁ¤±îÁö ¸ðµÎ ÀÚµ¿À¸·Î ¼öÇàÇÑ´Ù. ÀÌ Áß¿¡ À¯´Ö Å×½ºÆ® °úÁ¤ÀÌ °¡Àå ¿À·¡ °É¸°´Ù. ÀÌÁ¦ groovy-1.0-beta-8-SNAPSHOTÀÌ ºôµåµÈ µð·ºÅ丮 C:\MyCvs\groovy\groovy-core\target\installÀ» C:\groovy-1.0-beta-8-SNAPSHOTÀ¸·Î º¹»çÇÑ´Ù. ÀÌ·Î½á ¸ÞÀ̺ìÀ» ÀÌ¿ëÇÏ¿© ±×·çºñ CVSÀÇ ºôµå ¼³Ä¡ °úÁ¤ÀÌ ¸ðµÎ ³¡³´Ù.
±×·çºñ ºôµå ÈÄ Å×½ºÆ®Çϱâ
±×·çºñ¸¦ ½ÇÇàÇϱâ À§Çؼ´Â ±×·çºñÀÇ bin µð·ºÅ丮¸¦ ȯ°æº¯¼ö PATH¿¡ ÀνĽÃŲ´Ù.
C:\MyCvs\groovy> cd \Test
C:\Test> set PATH=C:\groovy-1.0-beta-8-SNAPSHOT\bin;%PATH%
C:\Test> groovy Hello.groovy
±×·çºñ SQL
±×·çºñ¿¡´Â ¸Þ¸ð¸® ±â¹Ý µ¥ÀÌÅͺ£À̽ºÀÎ ¾×½Ã¿Â(Axion) 1.0 M3°¡ Æ÷ÇԵǾî ÀÖ´Ù. %GROOVY_HOME%\lib µð·ºÅ丮¿¡ ÀÖ´Â axion-1.0-m3.jar ÆÄÀÏÀÌ ±×°ÍÀÌ´Ù. »ó¿ëÀÇ µ¥ÀÌÅͺ£À̽ºÃ³·³ °ÅâÇÏÁö´Â ¾ÊÁö¸¸ ±×·çºñ¿Í ±ÃÇÕÀÌ Àß ¸Â´Â Àڱ׸¶ÇÑ µ¥ÀÌÅͺ£À̽º°¡ ¾Æ´Ñ°¡ ÇÑ´Ù. ¾×½Ã¿ÂÀº ¸Þ¸ð¸® »ó¿¡¼¸¸ Á¸ÀçÇÏ´Â ¸Þ¸ð¸® ±â¹Ý µ¥ÀÌÅͺ£À̽º·Îµµ ¾µ ¼ö ÀÖ°í, µð½ºÅ© »ó¿¡ Á¸ÀçÇÏ´Â µð½ºÅ© ±â¹Ý µ¥ÀÌÅͺ£À̽º·Î ¾µ ¼ö ÀÖ´Â DBMS·Î¼ JDBC 2.0 ¹× 3.0À» ÃæÁ·ÇÑ´Ù. ¾×½Ã¿Â ȨÆäÀÌÁö´Â
axion.tigris.orgÀÌ´Ù.
¡ß ¸Þ¸ð¸® ±â¹Ý ¾×½Ã¿Â µ¥ÀÌÅͺ£À̽ºÀÇ µ¥ÀÌÅͼҽº »ý¼ºÇϱâ:
new AxionDataSource("jdbc:axiondb:µ¥ÀÌÅͺ£À̽º¸í")
¡ß µð½ºÅ© ±â¹Ý ¾×½Ã¿Â µ¥ÀÌÅͺ£À̽ºÀÇ µ¥ÀÌÅͼҽº »ý¼ºÇϱâ(°æ·Î¸íÀº DB°¡ Á¸ÀçÇÏ´Â À§Ä¡):
new AxionDataSource("jdbc:axiondb:µ¥ÀÌÅͺ£À̽º¸í:°æ·Î¸í")
°æ·Î¸íÀÇ À¯¹«·Î µð½ºÅ© µ¥ÀÌÅͺ£À̽ºÀÎÁö ¸Þ¸ð¸® µ¥ÀÌÅͺ£À̽ºÀÎÁö ±¸º°ÇÑ´Ù. <¸®½ºÆ® 1>ÀÇ ¿¹Á¦¿¡¼ µ¥ÀÌÅͼҽº¸¦ »ý¼ºÇÏ´Â ºÎºÐÀº ´ÙÀ½°ú °°´Ù.
new AxionDataSource("jdbc:axiondb:tempDB")
µ¥ÀÌÅͺ£À̽º À̸§Àº tempDBÀÌ´Ù. °æ·Î¸íÀÌ ¾øÀ¸¹Ç·Î ¸Þ¸ð¸® ±â¹Ý µ¥ÀÌÅͺ£À̽º·Î »ç¿ëÇÔÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌ ¿¹Á¦¿¡¼ createSql() ÇÔ¼ö´Â »ý¼ºµÈ µ¥ÀÌÅͼҽº¸¦ ¹ÝȯÇÑ´Ù.
sql = createSql() // groovy.sql.Sql »ý¼º
»ý¼ºµÈ µ¥ÀÌÅͼҽº´Â º¯¼ö sql¿¡ ÀúÀåµÇ¾î ÀÌÈÄ Àü¿ª º¯¼ö·Î °è¼Ó »ç¿ëµÈ´Ù.
¡ß SQL ½ºÅ©¸³Æ® ½ÇÇàÇϱâ
// <¸®½ºÆ® 1>ÀÇ ÇÔ¼ö createTables()¿¡¼ »ç¿ë
sql.execute(SQL_½ºÅ©¸³Æ®)
¡ß µ¥ÀÌÅÍ ÀÔ·Â, ¼öÁ¤, »èÁ¦Çϱâ
sql.executeUpdate(SQL_INSERT_±¸¹®)
sql.executeUpdate(SQL_DELETE_±¸¹®)
// <¸®½ºÆ® 1>ÀÇ ÇÔ¼ö testExecuteUpdate()¿¡¼ »ç¿ë
sql.executeUpdate(SQL_UPDATE_±¸¹®)
¡ß µ¥ÀÌÅÍ ÀÔ·ÂÇϱâ
table = sql.dataSet("Å×À̺í¸í")
// <¸®½ºÆ® 1>ÀÇ ÇÔ¼ö insertInitialData()¿¡¼ »ç¿ë
table.add(.....)
¡ß µ¥ÀÌÅÍ Á¶È¸Çϱâ
rs = sql.executeQuery(SQL_½ºÅ©¸³Æ®)
rs.getXXX("Ä÷³¸í¡°)
¶Ç´Â
// <¸®½ºÆ® 1>ÀÇ ÇÔ¼ö testQuery() µî¿¡¼ »ç¿ë
sql.eachRow(SQL½ºÅ©¸³Æ®) { ...Ŭ·ÎÀú ±¸Çö... }
¶Ç´Â
// <¸®½ºÆ® 1>ÀÇ ÇÔ¼ö testDataSet() µî¿¡¼ »ç¿ë
table = sql.dataSet("Å×À̺í¸í")
table.each { ...Ŭ·ÎÀú... }
| <¸®½ºÆ® 1> ¸Þ¸ð¸® ±â¹Ý Axion DB¸¦ ÀÌ¿ëÇÏ´Â Groovy SQL ¿¹Á¦ | | | |
# ÆÄÀϸí: AxionSQLTest1.groovy
import groovy.sql.Sql
import org.axiondb.jdbc.AxionDataSource
// ¸Þ¸ð¸® ±â¹Ý ¾×½Ã¿Â µ¥ÀÌÅͺ£À̽º tempDB¸¦ ¸¸µé°í,
// ÀÌ µ¥ÀÌÅͺ£À̽ºÀÇ µ¥ÀÌÅͼҽº¸¦ ¹ÝȯÇÑ´Ù.
def createSql() {
dataSource = new AxionDataSource("jdbc:axiondb:tempDB")
return new Sql(dataSource)
}
// µ¥ÀÌÅͺ£À̽º¿¡ Å×À̺íÀ» »ý¼ºÇϰí ÀڷḦ Ãß°¡ÇÑ´Ù.
// ÀÌ ÇÔ¼ö´Â ¸Þ¸ð¸® ±â¹Ý µ¥ÀÌÅͺ£À̽ºÀÎ °æ¿ì¿¡¸¸ È£ÃâµÇ¾î¾ß ÇÑ´Ù.
def createTables() {
sql.execute("create table ACTORS ( uid varchar, name varchar )")
sql.execute("create table ROLES ( uid varchar, role varchar)")
}
// µ¥ÀÌÅͺ£À̽ºÀÇ Å×ÀÌºí¿¡ Ãʱâ ÀÚ·á Ãß°¡Çϱâ
def insertInitialData() {
actors = sql.dataSet("ACTORS")
actors.add( uid:"kildong", name:"±è±æµ¿" )
actors.add( uid:"dooly", name:"µÑ¸®" )
actors.add( uid:"tochi", name:"¶ÇÄ¡" )
roles = sql.dataSet("ROLES")
roles.add( uid:"kildong", role:"Á¶¿¬" )
roles.add( uid:"dooly", role:"ÁÖÀΰø" )
roles.add( uid:"tochi", role:"Á¶¿¬" )
}
// ÀÚ·á Á¶È¸Çϱâ
def testQuery() {
println " [ACTORS Å×ÀÌºí ³»¿ë]"
println " ====================="
println " À̸§(¾ÆÀ̵ð)"
println " ---------------------"
sql.eachRow("select * from ACTORS") { println " ${it.name}(${it.uid})" }
println " ====================="
println ""
println " [ACTORS Å×ÀÌºí ³»¿ë]"
println " ====================="
println " ¾ÆÀ̵ð: ¿ªÇÒ"
println " ---------------------"
sql.eachRow("select * from ROLES") { println " ${it.uid}: ${it.role}" }
println " ====================="
}
// Ä÷³ À妽º·Î ÀÚ·á Á¶È¸Çϱâ
def testQueryUsingColumnIndex() {
answer = null
sql.eachRow("select count(*) from ACTORS") { answer = it[0] }
println "ACTORS ÀÇ ·¹ÄÚµå °³¼ö: ${answer}"
sql.eachRow("select count(*) from ROLES") { answer = it[0] }
println "ROLES ÀÇ ·¹ÄÚµå °³¼ö: ${answer}"
}
// À½¼ö Ä÷³ À妽º·Î ÀÚ·á Á¶È¸Çϱâ
def testQueryUsingNegativeColumnIndex() {
first = null; last = null
println "Á¶È¸ °á°ú: ------------------"
n = 0
sql.eachRow("select uid, role from ROLES where role='Á¶¿¬'") { | row |
uid = row[-2]
role = row[-1]
println " ${uid} ${role}"
n += 1
}
println "----------------------------"
println "${n}°Ç ÀÚ·á ãÀ½"
}
// where Á¶°ÇÀý·Î ÀÚ·á Á¶È¸Çϱâ
def testQueryWithWhereClause() {
foo = "kil"
sql.eachRow("select * from ACTORS where uid like '%${foo}%'".toString()) {
println "À̸§: ${it.name}"
}
}
// and ³í¸® ¿¬»êÀ» °®´Â where Á¶°ÇÀý·Î ÀÚ·á Á¶È¸Çϱâ
def testQueryWithWhereClauseWithTwoArgs() {
foo = "kil"; bar = "±è"
sql.eachRow("select * from ACTORS where uid like '%${foo}%' and name like '%${bar}%'".toString()) {
println "À̸§(¾ÆÀ̵ð): ${it.name}(${it.uid})"
}
}
// GStringÀ» »ç¿ëÇÏ¿© µ¿ÀûÀÎ where Á¶°ÇÀý·Î ÀÚ·á Á¶È¸Çϱâ
def testQueryWithIncorrectlyQuotedDynamicExpressions() {
foo = "kil"; bar = "Á¶"
sql.eachRow("select * from ROLES where not(uid like '%${foo}%') and role like '%${bar}%'".toString()) {
println("¾ÆÀ̵ð(¿ªÇÒ): ${it.uid}")
}
}
// Å×À̺íÀ» ÁöÁ¤ÇÏ¿© ÀÚ·á Á¶È¸Çϱâ
def testDataSet() {
table = sql.dataSet("ACTORS")
table.each { println "${it.name}(${it.uid})´Ô ¾È³ç?" }
}
// Å×À̺íÀ» ÁöÁ¤ÇÏ¿© Ŭ·ÎÀú¿¡¼ Á¤ÇÑ ³í¸®½Ä¿¡ ¸Â´Â ÀÚ·á Á¶È¸Çϱâ
def testDataSetWithClosurePredicate() {
table = sql.dataSet("ROLES")
dd = table.findAll { it.role == "Á¶¿¬" }
dd.each { println "${it.uid}¾¾" }
}
// Å×ÀÌºí¿¡ ÀÚ·á Ãß°¡Çϱ⠶Ǵ º¯°æÇϱâ
def testExecuteUpdate() {
foo = 'heedong'; bar = 'Èñµ¿ÀÌ'
nRows = sql.executeUpdate("update ACTORS set uid=? where name=?",[foo,bar]);
if (nRows == 0) {
sql.executeUpdate("insert into ACTORS (uid,name) values (${foo},${bar})");
}
foo = 'heedong'; bar = 'Á¶¿¬'
nRows = sql.executeUpdate("update ROLES set role=? where uid=?",[bar,foo]);
if (nRows == 0) {
sql.executeUpdate("insert into ROLES (uid,role) values (${foo},${bar})");
}
}
sql = createSql() // SQL »ý¼º
createTables() // µ¥ÀÌÅͺ£À̽º¿¡ Å×ÀÌºí »ý¼º
insertInitialData() // Å×ÀÌºí¿¡ Å×½ºÆ®¸¦ À§ÇÑ Ãʱâ ÀÚ·á Ãß°¡
println "1. Call testQuery():"
testQuery()
println "2. Call testQueryUsingColumnIndex():"
testQueryUsingColumnIndex()
println "3. Call testQueryUsingNegativeColumnIndex():"
testQueryUsingNegativeColumnIndex()
println "4. Call testQueryWithWhereClause():"
testQueryWithWhereClause()
println "5. Call testQueryWithWhereClauseWithTwoArgs():"
testQueryWithWhereClauseWithTwoArgs()
println "6. Call testQueryWithIncorrectlyQuotedDynamicExpressions():"
testQueryWithIncorrectlyQuotedDynamicExpressions()
println "7. Call testDataSet():"
testDataSet()
println "8. Call testDataSetWithClosurePredicate():"
testDataSetWithClosurePredicate()
println "9. Call testExecuteUpdate():"
testExecuteUpdate()
testQuery() | |
 |
¾×½Ã¿Â ´ë½Å MySQL, ¿À¶óŬ, MS SQL µîÀÇ °í±Þ DBMS¸¦ ¾µ ¼öµµ ÀÖ´Ù. <¸®½ºÆ® 2>´Â <¸®½ºÆ® 1>À» MySQL ¿ëÀ¸·Î ¼öÁ¤ÇÑ °ÍÀÌ´Ù. ´ÙÀ½°ú °°ÀÌ MySQL ¿ë µ¥ÀÌÅͺ£À̽º¿Í Å×À̺íÀ» ¹Ì¸® »ý¼ºÇØ µÐ´Ù.
C:\Test> %MYSQL_HOME%\bin\mysql -u root -p
Enter password: XXXXXXXX
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.46-nt
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database tempDB;
Query OK, 1 row affected (0.02 sec)
mysql> use tempDB;
Database changed
mysql> create table ACTORS ( uid varchar(20), name varchar(20) );
Query OK, 0 rows affected (0.04 sec)
mysql> create table ROLES ( uid varchar(20), role varchar(20) );
Query OK, 0 rows affected (0.01 sec)
mysql> quit
Bye
| <¸®½ºÆ® 2> MySQL µ¥ÀÌÅͺ£À̽º¸¦ ÀÌ¿ëÇÏ´Â Groovy SQL ¿¹Á¦ | | | |
// ÆÄÀϸí: MySQLTest.groovy
import groovy.sql.Sql
// MySQL µ¥ÀÌÅͺ£À̽º tempDB¿¡ Á¢±ÙÇÒ sql.mysql.Sql ÀνºÅϽº¸¦ ¹ÝȯÇÑ´Ù.
def createSql() {
return Sql.newInstance("jdbc:mysql://localhost/tempDB?useUnicode=true&characterEncoding=MS949",
"root", "password", "org.gjt.mm.mysql.Driver")
}
// µ¥ÀÌÅͺ£À̽ºÀÇ Å×ÀÌºí¿¡¼ Ãʱâ ÀÚ·á Á¦°ÅÇϱâ
def deleteInitialData() {
sql.executeUpdate("delete from ACTORS")
sql.executeUpdate("delete from ROLES")
}
// µ¥ÀÌÅͺ£À̽ºÀÇ Å×ÀÌºí¿¡ Ãʱâ ÀÚ·á Ãß°¡Çϱâ
def insertInitialData() {
...ÀÌÇÏ <¸®½ºÆ® 1>°ú µ¿ÀÏ...
sql = createSql() // sql.mysql.Sql ÀνºÅϽº¸¦ ±¸ÇÑ´Ù.
deleteInitialData() // Å×À̺íÀÇ Ãʱâ ÀڷḦ ¸ðµÎ Á¦°Å
insertInitialData() // Å×ÀÌºí¿¡ Ãʱâ ÀÚ·á Ãß°¡
println "1. Call testQuery():"
... ÀÌÇÏ <¸®½ºÆ® 1>°ú µ¿ÀÏ... | |
 |
ÀÌÁ¦ µð½ºÅ© ±â¹Ý ¾×½Ã¿Â µ¥ÀÌÅͺ£À̽º¸¦ ¸¸µé¾î »ç¿ëÇØ º¸ÀÚ. ¾×½Ã¿ÂÀ» µ¶¸³ÀûÀ¸·Î ½ÇÇàÇϱâ À§Çؼ ´ÙÀ½°ú °°ÀÌ CLASSPATH ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù.
C:\Test> set CLASSPATH=%GROOVY_HOME%\lib\axion-1.0-M3-dev.jar;%CLASSPATH%
C:\Test> set CLASSPATH=%GROOVY_HOME%\lib\commons-collections-3.0-dev2.jar;%CLASSPATH%
C:\Test> set CLASSPATH=%GROOVY_HOME%\lib\commons-logging-1.0.3.jar;%CLASSPATH%
C:\Test> set CLASSPATH=%GROOVY_HOME%\lib\regexp-1.2.jar;%CLASSPATH%
´ÙÀ½°ú °°ÀÌ ÀÚ¹Ù ¸í·ÉÀ¸·Î ¾×½Ã¿ÂÀ» µ¶¸³ÀûÀ¸·Î ½ÇÇàÇÏ¿© tempDB¶ó´Â µ¥ÀÌÅͺ£À̽º¿¡ µÎ Å×À̺í ACTORS¿Í ROLES¸¦ »ý¼ºÇÑ´Ù. ±×·¯¸é C:\AxionDB\tempDB ¾Æ·¡¿¡ ACTORS¿Í ROLES ¼ºêµð·ºÅ丮°¡ »ý°Ü ÀÖÀ» °ÍÀÌ´Ù.
C:\Test> java org.axiondb.tools.Console tempDB c:\AxionDB\tempDB
Type 'quit' to quit the program.
axion> create table ACTORS ( uid varchar(20), name varchar(20) )
Executed.
axion> create table ROLES ( uid varchar(20), role varchar(20) )
Executed.
axion> quit
| <¸®½ºÆ® 3> µð½ºÅ© ±â¹Ý ¾×½Ã¿Â µ¥ÀÌÅͺ£À̽º¸¦ ÀÌ¿ëÇÏ´Â ±×·çºñ SQL ¿¹Á¦<¸®½ºÆ® 1> ½ºÆäÀ̽ºÅ¥ºêÀÇ ¸ÞÀÎ ¿¹Á¦ | | | |
// ÆÄÀϸí: AxionSQLTest2.groovy
import groovy.sql.Sql
import org.axiondb.jdbc.AxionDataSource
// µð½ºÅ© ±â¹Ý ¾×½Ã¿Â µ¥ÀÌÅͺ£À̽º tempDBÀÇ µ¥ÀÌÅͼҽº¸¦ »ý¼ºÇÏ¿© ¹ÝȯÇÑ´Ù.
def createSql() {
DB = "tempDB"
dataSource = new AxionDataSource("jdbc:axiondb:tempDB:c:\\AxionDB\\${DB}".toString())
return new Sql(dataSource)
}
// µ¥ÀÌÅͺ£À̽ºÀÇ Å×ÀÌºí¿¡¼ Ãʱâ ÀÚ·á Á¦°ÅÇϱâ
def deleteInitialData() {
sql.executeUpdate("delete from ACTORS")
sql.executeUpdate("delete from ROLES")
}
// µ¥ÀÌÅͺ£À̽ºÀÇ Å×ÀÌºí¿¡ Ãʱâ ÀÚ·á Ãß°¡Çϱâ
def insertInitialData() {
... ÀÌÇÏ <¸®½ºÆ® 2>¿Í µ¿ÀÏ ... | |
 |
±×·çºê¸´
±×·çºê¸´À̶õ ±×·çºñ ¼ºí¸´(Groovy Servlet)À» ÁÙÀÎ ¿ë¾î·Î¼ ¡°±×·çºñ ¾ð¾î·Î ÀÛ¼ºÇÑ ÀÚ¹Ù ¼ºí¸´¡±À» ÀǹÌÇÑ´Ù. ±×·çºê¸´Àº ±×·çºñ-ÄÚ¾î ÆÐŰÁö¿¡ Æ÷ÇԵǾî ÀÖ´Ù. Âü°íÀÚ·á¿¡ °£´ÜÇÑ ±×·çºê¸´ ¿¹Á¦µµ ¼Ò°³µÇ¾î ÀÖ´Ù.
ÀÚ¹ÙÀÇ °æ¿ì¿¡´Â ¼ºí¸´ ¼Ò½º ÆÄÀÏÀÌ ÄÄÆÄÀÏµÈ Å¬·¡½º ÆÄÀÏÀÌ ¼ºí¸´ÀÌÁö¸¸, ±×·çºñÀÇ °æ¿ì ½ºÅ©¸³ÆÃ ¾ð¾îÀÎ °ü°è·Î *.groovy ÀÇ ÆÄÀϸíÀ» °®´Â ¼Ò½º ÆÄÀÏ ÀÚü°¡ ±×·çºê¸´ÀÌ´Ù. ÇöÀç ±×·çºê¸´Àº ÅèĹ(Tomcat) 4.x ¹× 5.x¿¡¼ Àß µ¿ÀÛÇÔÀÌ È®ÀεǾú´Ù. ´ÙÀ½Àº ÅèĹ¿¡¼ ±×·çºê¸´À» µ¿ÀÛ½Ã۱â À§ÇÑ ÀýÂ÷ÀÌ´Ù.
%GROOVY_HOME%\lib ¹Ø¿¡ ÀÖ´Â asm-1.0.3.jar¿Í commons-cli-1.0.jar ±×¸®°í ÀÌ´ÞÀÇ µð½ºÄÏÀ¸·Îµµ Á¦°øµÇ´Â ÆÐÄ¡ ¶óÀ̺귯¸® groovy-1.0-beta-7-p2.jar¸¦ ÅèĹÀÇ <ÄÁÅØ½ºÆ®>\WEB-INF\lib µð·ºÅ丮¿¡ º¹»çÇÑ´Ù. ¿©±â¼ groovy-1.0-beta-7-p2.jar´Â ÇÊÀÚ°¡ ±×·çºê¸´ °ü·Ã ºÎºÐÀ» ÆÐÄ¡ÇÑ °ÍÀ¸·Î¼ ¿ø·¡ÀÇ groovy-1.0-beta-7.jar ´ë½Å À̰ÍÀ» ¾²µµ·Ï ÇÑ´Ù. ÀÌ ÆÐÄ¡ ¶óÀ̺귯¸®´Â ÀÌ´ÞÀÇ µð½ºÄÏÀ¸·Î Á¦°øµÈ´Ù.
<¸®½ºÆ® 4>¸¦ ÀÛ¼ºÇÏ¿© <ÄÁÅØ½ºÆ®>/WEB-INF/web.xml ÆÄÀÏ·Î ÀúÀåÇÑ´Ù. web.xml ÆÄÀÏ¿¡¼ ±×·çºñ ±×·çºê¸´ ¼³Á¤ Áß¿¡ init-param ¿¤¸®¸ÕÆ®ÀÇ µð¹ö±×(debug) °ªÀº 0¿¡¼ 11±îÁö ÁÙ ¼ö Àִµ¥ ÀÌ ¼ö°¡ Ŭ¼ö·Ï Äֿܼ¡ µð¹ö±×¸¦ À§ÇÑ Ãâ·ÂÀÌ ¸¹¾ÆÁø´Ù. º¸ÅëÀº 0À¸·Î ÇØ µÎ°í, µð¹ö±ëÇÒ ¶§¸¸ ´õ Å« °ªÀ¸·Î ÇÑ´Ù.
| <¸®½ºÆ® 4> ÅèĹ 5¿¡¼ Groovlet ½ÇÇàÀ» À§ÇÑ web.xml ÆÄÀÏÀÇ ³»¿ë | | | |
<?xml version="1.0"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>Groovy</servlet-name>
<servlet-class>groovy.servlet.GroovyServlet</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>MS949</param-value>
</init-param>
<init-param>
<param-name>bindRequestParameters</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>STemplate</servlet-name>
<servlet-class>groovy.servlet.TemplateServlet</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>MS949</param-value>
</init-param>
<init-param>
<param-name>bindRequestParameters</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>templateEngine</param-name>
<param-value>groovy.text.SimpleTemplateEngine</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>GTemplate</servlet-name>
<servlet-class>groovy.servlet.TemplateServlet</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>MS949</param-value>
</init-param>
<init-param>
<param-name>bindRequestParameters</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>templateEngine</param-name>
<param-value>groovy.text.GStringTemplateEngine</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Groovy</servlet-name>
<url-pattern>*.groovy</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>STemplate</servlet-name>
<url-pattern>*.stemplate</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>GTemplate</servlet-name>
<url-pattern>*.gtemplate</url-pattern>
</servlet-mapping>
</web-app> | |
 |
±×·çºê¸´ ¼³Á¤ÀÌ Àß µÇ¾ú´ÂÁö Å×½ºÆ®ÇØ º¸ÀÚ. ´ÙÀ½ÀÇ Ã¹ ¹øÂ° ±×·çºê¸´ ¿¹Á¦¸¦ <ÄÁÅØ½ºÆ®>/greeting.groovy·Î ÀúÀåÇϰųª <ÄÁÅØ½ºÆ®>/WEB-INF/groovy/greeting.groovy·Î ÀúÀåÇÑ´Ù.
<ÄÁÅØ½ºÆ®>/WEB-INF/groovy µð·ºÅ丮´Â »ç¿ëÀº ÇÊÀÚ°¡ ÆÐÄ¡ÇÑ ¹öÀü¸¸ Áö¿øÇÑ´Ù. ÀÌ µð·ºÅ丮´Â ±×·çºñ ¼Ò½º·Î ÀÛ¼ºµÈ Ŭ·¡½º ÆÄÀÏÀ» ã´Â ±âÁØ µð·ºÅ丮À̱⵵ ÇÏ´Ù. Groovy Ŭ·¡½º¸¦ ·ÎµùÇÒ ¶§ À̰÷À» ±âÁØÀ¸·Î packageName.className ±ÔÄ¢ÀÌ Àû¿ëµÈ´Ù.
¡ß ù ¹øÂ° ±×·çºê¸´ ¿¹Á¦ : greeting.groovy
import java.util.Date
println "<b>${param.z}</b>´Ô, ȯ¿µÇÕ´Ï´Ù. <br />"
println "ÇöÀç ½Ã°¢Àº <font color='blue'>${new Date()}</font> <br />"
´ÙÀ½ ¿¹Á¦´Â ±¸±¸´Ü Ç¥¸¦ Ãâ·ÂÇÏ´Â ±×·çºê¸´ ¿¹Á¦ÀÌ´Ù. Ŭ·ÎÀú ³»¿¡¼ Ãâ·ÂÇÒ ¶§´Â println ¸Þ½îµå°¡ ¾Æ´Ï¶ó out.println ¸Þ½îµå·Î Ãâ·ÂÇØ¾ß ÇÑ´Ù. Ŭ·ÎÀú ³»¿¡¼ out¸¦ ½á¾ß ÇÏ´Â °ÍÀº ÇöÀç ±×·çºñÀÇ Å¬·ÎÀú °ü·Ã ¹®Á¦Á¡ Áß ÇϳªÀÎ °ÍÀ¸·Î º¸ÀδÙ.
¡ß ±¸±¸´Ü Ç¥ Ãâ·Â Groovet ¿¹Á¦ : gugu.groovy
println "<b>${dan}´Ü</b>: <br />"
for (x in 1..9) {
println "${dan} X ${x} = ${dan * x} <br />"
}
println "<hr />"
println "<b>${dan}´Ü</b>: <br />"
1.upto(9) { |x|
out.println "${dan} X ${x} = ${dan * x} <br />"
}
<¸®½ºÆ® 5>´Â 1³â Ä¡ ´Þ·ÂÀ» º¸¿©ÁÖ´Â ±×·çºê¸´ ¿¹Á¦ÀÌ´Ù. ÀÌ´Â ¼ºí¸´°ú ±×·çºê¸´À» ºñ±³Çϱâ À§ÇØ Âü°íÀÚ·á ¿¡ ¼Ò°³µÈ ´Þ·Â ¼ºí¸´ ¿¹Á¦¸¦ ±×·çºê¸´À¸·Î º¯È¯ÇÑ °ÍÀÌ´Ù.
| <¸®½ºÆ® 5> ´Þ·Â ±×·çºê¸´ ¿¹Á¦ : calendar.groovy | | | |
import java.util.*
import java.text.*
now = new GregorianCalendar()
cyr = now.get(Calendar.YEAR)
cmo = now.get(Calendar.MONTH)
cdate = now.get(Calendar.DATE)
cal = Calendar.getInstance()
yr = cyr
if (param.year != null) {
yr = Integer.parseInt(param.year)
}
cal.set(Calendar.YEAR, yr)
cal.set(Calendar.DATE, 1)
monthInfo = []
for (i in 0..11) {
cal.set(Calendar.MONTH, i)
n1 = cal.get(Calendar.DAY_OF_WEEK)
n2 = cal.getActualMaximum(Calendar.DATE)
n3 = 1 + (n2 + n1 - 2) \ 7 # / ´Â ½Ç¼ö ³ª´°¼À, \ ´Â Á¤¼ö ³ª´°¼À
monthInfo[i] = [ n1 , n2 , n3 ]
}
println """
<html>
<head>
<title>GroovletÀ» ÀÌ¿ëÇÑ ´Þ·Â</title>
<STYLE TYPE="text/css">
<!--
A:link { color:blue; text-decoration:none }
A:visited { color:purple; text-decoration:none }
A:active { color:red; text-decoration:none }
A:hover { color:red; text-decoration:none }
-->
</STYLE>
</head>
<body bgcolor="#FFFFFF">
<center>
<font size="5"><b>Groovlet</b></font> À» ÀÌ¿ëÇÑ <font size="6"><b>´Þ·Â</b></font>
<hr />
<b><font size="6"><A HREF="${request.requestURI}?year=${yr - 1}"><</A>
${yr}³â</b>
<A HREF="${request.requestURI}?year=${yr + 1}">></A></font></b>
</center>
<br /> <br />
<center>
<table border="0" cellspacing="0" cellpadding="10">
<tr>
"""
monthName = [ "1 ¿ù", "2 ¿ù", "3 ¿ù", "4 ¿ù", "5 ¿ù", "6 ¿ù",
"7 ¿ù", "8 ¿ù", "9 ¿ù", "10 ¿ù", "11 ¿ù", "12 ¿ù" ]
for (mo in 1..12) {
if (mo % 3 == 1)
print "<tr>"
println "<td valign='top'>"
println "<table border='1' cellspacing='0' cellpadding='5'>"
if (yr == cyr && mo - 1 == cmo) {
println "<thead bgcolor='lightseagreen'>
<tr><th colspan='7'>${monthName[mo-1]}</th></tr>
</thead>"
} else {
println "<thead bgcolor='lightblue'>
<tr><th colspan='7'>${monthName[mo-1]}</th></tr>
</thead>"
}
println "<tbody>
<tr bgcolor='silver'>
<th><font color='red'>ÀÏ</font></th>"
for (i in ["¿ù", "È", "¼ö", "¸ñ", "±Ý", "Åä"]) {
println "<th><font>${i}</font></th>"
}
println "</tr>"
for (n in 1..(7*monthInfo[mo-1][2])) {
m = n - monthInfo[mo-1][0] + 1
if (n % 7 == 1)
print "<tr>"
if (yr == cyr && mo - 1 == cmo && m == cdate) {
print "<td align='center' bgcolor='gold'>"
} else {
print "<td align='center'>"
}
if (n % 7 == 1) {
print "<font color='red'>"
if ((m > 0) && (m <= monthInfo[mo-1][1]))
print m
else
print " "
print "</font>"
} else {
if ((m > 0) && (m <= monthInfo[mo-1][1]))
print m
else
print " "
}
print "</td>"
if (n % 7 == 0)
println "</tr>"
}
println "</tbody>
</table>
</td>"
if (mo % 3 == 0)
println "</tr>"
}
println """
</tr>
</table>
</center>
</body>
</html>
""" | |
 |
GSP
ÀÚ¹Ù¼¹ö ÆäÀÌÁö(JavaServer Pages)¸¦ ÁÙ¿©¼ JSP¶ó°í ÇϵíÀÌ ±×·çºñ¼¹ö ÆäÀÌÁö(GroovyServer Pages)¸¦ ÁÙ¿©¼ GSP¶ó°í ÇÑ´Ù. GSP´Â ¿ø·¡ 2004³â 1¿ù¿¡ Æ®·ÎÀÌ Çì´×°Å¿¡ ÀÇÇØ ÀÛ¼ºµÇ¾ú´ø °ÍÀÌ´Ù.
GSP´Â groovy-core¿¡ Æ÷ÇԵǾî ÀÖÁö ¾ÊÁö ¾Ê°í º°µµÀÇ ¸ðµâ·Î µÇ¾î ÀÖ´Ù. GSP¸¦ ¾µ·Á¸é ±×·çºñ GSP ¸ðµâ CVS¿¡¼ ¼Ò½º¸¦ °¡Á®¿Í¾ß ÇÑ´Ù.
¡ß Groovy CVS¿¡ ·Î±×ÀÎÇϱâ
> cvs -d :pserver:anonymous@cvs.groovy.codehaus.org:/home/projects/groovy/scm login
password:
ÆÐ½º¿öµå¿¡ anonymous¸¦ ÀÔ·ÂÇÑ´Ù.
¡ß Groovy CVS¿¡¼ GSP ¸ðµâ °¡Á®¿À±â
> cvs -z3 -d :pserver:anonymous@cvs.groovy.codehaus.org:/home/projects/groovy/scm co groovy/modules/pages
±×·çºñ°¡ ±×µ¿¾È 1.0 º£Å¸ 6, º£Å¸ 7·Î ¾÷±×·¹À̵åµÇ¸é¼ 2004³â 1¿ù¿¡ ÀÛ¼ºµÇ¾ú´ø GSP°¡ »õ·Î¿î ±×·çºñ ¹öÀü°ú ¸ÂÁö ¾Ê°Ô µÇ¾ú´Ù. ±×·¡¼ ÇÊÀÚ°¡ GSP¸¦ »õ ¹öÀüÀÇ ±×·çºñ¿Í Àß µ¿ÀÛÇϵµ·Ï ¼öÁ¤ÇÏ¿´´Ù. ¼öÁ¤ÇÑ ¼Ò½º¿Í jar ¶óÀ̺귯¸® ÆÄÀÏÀ» ÀÌ´ÞÀÇ µð½ºÄÏÀ¸·Î Á¦°øÇÑ´Ù. ÀÌ´ÞÀÇ µð½ºÄÏ¿¡ gsp-1.2-e7.jar¶ó´Â À̸§À¸·Î µÇ¾î ÀÖ´Ù. À̸¦ <ÄÁÅØ½ºÆ®>/WEB-INF/lib µð·ºÅ丮¿¡ º¹»çÇÑ´Ù.
gsp-1.2-e7.jar
<¸®½ºÆ® 6>Àº <ÄÁÅØ½ºÆ®>/WEB-INF/web.xml ÆÄÀÏ¿¡ Ãß°¡µÇ¾î¾ß ÇÒ ³»¿ëÀÌ´Ù. GSP ¼³Á¤ Áß init-param ¿¤¸®¸ÕÆ®¿¡¼ debugÀÇ °ªÀº 0¿¡¼ 11±îÁö ÁÙ ¼ö Àִµ¥ ÀÌ ¼ö°¡ Ŭ¼ö·Ï ÅèĹ ½ÇÇà Äֿܼ¡ µð¹ö±×¿ë Ãâ·ÂÀÌ ¸¹¾ÆÁöµµ·Ï µÇ¾î ÀÖ´Ù.
| <¸®½ºÆ® 6> GSP¸¦ À§ÇØ web.xml ÆÄÀÏ¿¡ Ãß°¡µÉ ³»¿ë | | | |
....................................
<servlet>
<servlet-name>GSP</servlet-name>
<servlet-class>groovy.modules.pages.GroovyPages</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>MS949</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
</servlet>
....................................
<servlet-mapping>
<servlet-name>GSP</servlet-name>
<url-pattern>*.gsp</url-pattern>
</servlet-mapping>
.................................... | |
 |
GSP¿¡¼´Â ¹ÙÀεåµÈ 5°³ÀÇ °´Ã¼ out, request, response, application, sessionµéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
´ÙÀ½ ¿¹Á¦¸¦ <ÄÁÅØ½ºÆ®>/greeting.gsp·Î ÀúÀåÇϰí, URL ÁÖ¼Ò localhost:8080/<ÄÁÅØ½ºÆ®>/greeting.gsp?z=guest ¸¦ ¹æ¹®ÇÏ¿© Å×½ºÆ®ÇÑ´Ù. ¿¹Á¦¿¡¼ ${param.z}´Â ´õ °£´ÜÈ÷ ${z}·Î ÇØµµ µÈ´Ù.
¡ß ù ¹øÂ° GSP ¿¹Á¦ : greeting.gsp
<%@ page import="java.util.Date" %>
<b>${param.z}</b>´Ô, ȯ¿µÇÕ´Ï´Ù. <br />
ÇöÀç ½Ã°¢Àº <font color="blue">${new Date()}</font> <br />
´ÙÀ½ ¿¹Á¦´Â ¾Õ¿¡¼ ¼Ò°³µÈ ±¸±¸´Ü Ç¥ Ãâ·Â GroovletÀ» GSP·Î °íÄ£ °ÍÀÌ´Ù. ¿¹Á¦¿¡¼ º¯¼ö danÀº param.danÀ¸·Î ÇØµµ µÈ´Ù.
? ±¸±¸´Ü Ç¥ Ãâ·Â GSP ¿¹Á¦ : gugu.gsp
<b>${dan}´Ü</b>: <br />
<% for (x in 1..9) { %>
${dan} X ${x} = ${dan * x} <br />
<% } %>
<hr />
<b>${dan}´Ü</b>: <br />
<% 1.upto(9) { |x| %>
out.println "${dan} X ${x} = ${dan * x} <br />"
<% } %>
Groovy 1.0 º£Å¸ 6, º£Å¸ 7¿¡ ÀÖ´ø ¿ø·¡ÀÇ ±×·çºê¸´ ¶óÀ̺귯¸®´Â ÅØ½ºÆ®¸¸ Ãâ·ÂÇϵµ·Ï µÇ¾î ÀÖ´Ù. Çì´×°Å°¡ ¸¸µç ¿ø·¡ÀÇ GSPµµ ±×·¯ÇÏ¿´´Ù. ±×·¯³ª ÇÊÀÚ°¡ ¼öÁ¤ÇÑ ±×·çºê¸´ ¶óÀ̺귯¸®¿Í GSP ¸ðµâÀº À̹ÌÁö °°Àº ¹ÙÀ̳ʸ®µµ Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. À̹ÌÁö Ãâ·ÂÇÏ´Â Groovlet ¿¹Á¦´Â Áö¸é °ü°è»ó ÀÌ´ÞÀÇ µð½ºÄÏ¿¡ ³Ö±â·Î Çϰí, <¸®½ºÆ® 7>¿¡ À̹ÌÁö Ãâ·Â GSP ¿¹Á¦¸¦ ¼Ò°³ÇÑ´Ù.
ÀÌ ¿¹Á¦´Â ÀÚÀ̽ð¼ºí¸´(JythonServlet) ¿¹Á¦¸¦ GSP·Î ¼öÁ¤ÇÑ °ÍÀÌ´Ù. ½ÇÇà ³¡±îÁö Ãâ·ÂÇÒ ¹ÙÀ̳ʸ® µ¥ÀÌÅÍ ¿Ü¿¡ ¾î´À ¹®ÀÚµµ Àý´ë·Î Ãâ·ÂµÇÁö ¾Êµµ·Ï ½ºÅ©¸³Æ²¸´ ű׸¦ ÀÛ¼ºÇØ¾ß ÇÑ´Ù. Áï, <%@ ...... %><% ...... %> ½ÄÀ¸·Î ÇÑ ½ºÆ®¸³Æ²¸´ ű×ÀÇ ³¡°ú ±× ´ÙÀ½ ½ºÆ®¸³Æ²¸´ ű×ÀÇ ½ÃÀÛ »çÀÌ¿¡ ¾Æ¹« ±ÛÀÚµµ Ãâ·ÂµÇÁö ¾Êµµ·Ï ¿ÏÀüÈ÷ ºÙ¿©¼ ÀÛ¼ºÇØ¾ß ÇÑ´Ù(<¸®½ºÆ® 7>ÀÇ 8°ÁÙ ÂüÁ¶).
| <¸®½ºÆ® 7> Java2D À̹ÌÁö Ãâ·Â GSP ¿¹Á¦ : starImage.gsp | | | |
<%@
page import="java.awt.Color"
import="java.awt.Graphics2D"
import="java.awt.image.BufferedImage"
import="java.awt.image.DataBuffer"
import="java.awt.geom.GeneralPath"
import="javax.imageio.ImageIO"
import="java.util.Date" %><%
response.setContentType("image/png")
out1 = response.getOutputStream()
# width and height of image which will be generated
w = 250
h = 120
# bi : BufferedImage, g2 : Graphics2D, path : GeneralPath
bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB)
g2 = bi.createGraphics()
g2.setPaint(Color.gray)
g2.fillRect(0, 0, w, h)
g2.setPaint(Color.white)
path = new GeneralPath(GeneralPath.WIND_NON_ZERO)
path.moveTo((int)(-w/2.0), (int)(-h/8.0))
path.lineTo((int)(w/2.0), (int)(-h/8.0))
path.lineTo((int)(-w/4.0), (int)(h/2.0))
path.lineTo((int)(0.0), (int)(-h/2.0))
path.lineTo((int)(w/4.0), (int)(h/2.0))
path.closePath()
g2.translate(w/2, h/2)
g2.fill(path)
g2.setPaint(Color.blue)
g2.drawString("${new Date()}", -90, 0)
writer = ImageIO.getImageWritersByFormatName("png").next()
writer.setOutput(ImageIO.createImageOutputStream(out1))
writer.write(bi)
out1.flush()
out1.close()
return
%> | |
 |
±×·çºñ¸¦ BSF¿Í ÇÔ²²
¿©±â¼´Â BSF(Bean Sctript Framework)¸¦ ½á¼ JSP ÆÄÀÏ¿¡¼ ±×·çºñ¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇϰíÀÚ ÇÑ´Ù. BSF´Â ÀÚ¹Ù ¼Ò½º¿¡¼ ¿©·¯ °¡Áö ½ºÅ©¸³Æ® ¾ð¾î¸¦ ½±°Ô »ç¿ëÇϱâ À§ÇØ °³¹ßµÈ µµ±¸ÀÌ´Ù. BSF¸¦ ÀÌ¿ëÇϸé ÀÚ¹Ù ¼Ò½º ÆÄÀÏÀ̳ª JSP ÆÄÀÏ¿¡¼ ÀÚ¹Ù ¾ð¾î°¡ ¾Æ´Ñ ´Ù¸¥ ¾ð¾î·Îµµ ¼Ò½º¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ÇöÀç´Â ¸®³ë(Rhino), ÀÚÀ̽ð(Jython), ºó½©(BeanShell), Jacl, Tcl, ±×·çºñ µîÀ» ¾µ ¼ö ÀÖ´Ù. JSP¿¡¼ BSFÀ» ¾²±â À§Çؼ´Â ´ÙÀ½ jar ÆÄÀϵéÀ» ±¸ÇÏ¿© <ÄÁÅØ½ºÆ®>/WEB-INF/lib µð·ºÅ丮¿¡ °®´Ù ³õ´Â´Ù.
<ÄÁÅØ½ºÆ®>/WEB-INF/web.xml ÆÄÀÏ¿¡ ´ÙÀ½Ã³·³ taglib ¿¤¸®¸ÕÆ®¸¦ Ãß°¡ÇÑ´Ù. taglib-bsf.tld ÆÄÀÏÀº bsf-2.3.0-rc1¿¡ ÀÖ´Â ±×´ë·ÎÀÌ´Ù.
<web-app>
....................................
<taglib>
<taglib-uri>http://jakarta.apache.org/taglibs/bsf-2.0</taglib-uri>
<taglib-location>/WEB-INF/taglibs-bsf.tld</taglib-location>
</taglib>
</web-app>
BSF¿¡¼ ±×·çºñ¸¦ ¾²±â À§Çؼ´Â ´ÙÀ½°ú °°ÀÌ ±×·çºñ ½ºÅ©¸³Æ® ¿£Áø µî·Ï °úÁ¤ÀÌ ´õ ÇÊ¿äÇÏ´Ù. BSFÀÇ Â÷ÈÄ ¹öÀü¿¡¼´Â ÀÌ·± º°µµÀÇ °úÁ¤ÀÌ ¾ø¾îµµ µÉ °ÍÀ¸·Î º»´Ù.
org.apache.bsf.BSFManager.registerScriptingEngine(
"groovy",
"org.codehaus.groovy.bsf.GroovyEngine",
new String[] { "groovy", "gy" }
);
| <¸®½ºÆ® 7> BSF¸¦ ÀÌ¿ëÇÏ´Â JSP ¿¹Á¦ : bsfTest.jsp | | | |
<html>
<%@ taglib uri="http://jakarta.apache.org/taglibs/bsf-2.0" prefix="bsf" %>
<body>
<b>BSF with Javascript</b> <hr>
<bsf:scriptlet language="javascript">
for (i = 1; i <= 9; i++) {
out.println (i + " is squared to " + i*i + "<br>")
}
</bsf:scriptlet>
</table>
<bsf:expression language="javascript"> new java.util.Date() </bsf:expression>
<hr>
<b>BSF with JACL</b> <br>
<bsf:scriptlet language="jacl">
package require java
for {set i 1} {$i<=9} {incr i 1} {
$out println "$i"
$out println [concat " is squared to " [format %d [expr $i * $i]] "<br>"]
}
</bsf:scriptlet>
</table>
<bsf:expression language="jacl"> java::new java.util.Date </bsf:expression>
<hr>
<b>BSF with Jython</b> <br>
<bsf:scriptlet language="jython">
from java.util import Date;
for i in range(1,9,1):
out.println ("%d" % i);
out.println (" is squared to %d <br>" % (i*i));
</bsf:scriptlet>
</table>
<bsf:expression language="jython"> Date() </bsf:expression>
<hr>
<%
// BSF¿¡¼ ±×·çºñ¸¦ ¾²±â À§ÇØ ±×·çºñ ¿£ÁøÀ» µî·ÏÇÏ´Â °úÁ¤
org.apache.bsf.BSFManager.registerScriptingEngine(
"groovy",
"org.codehaus.groovy.bsf.GroovyEngine",
new String[] { "groovy", "gy" }
);
%>
<b>BSF with Groovy</b> <br>
<bsf:scriptlet language="groovy">
import java.util.Date;
for (i in 1..9) {
out.println ("${i}")
out.println (" is squared to ${i*i} <br>")
}
</bsf:scriptlet>
</table>
<bsf:expression language="groovy"> new Date() </bsf:expression>
<br><br>
<hr>
View source <a href="bsfTest_jsp.txt">bsfTest.jsp</a>
</body>
</html> | |
 |
±×·çºñ ¿ÀÇ ÇÁ·ÎÁ§Æ®
2005³â º½Âë¿¡´Â ±×·çºñ¿¡ °üÇÑ ¼ÀûÀÌ ¸î °¡Áö ³ª¿Ã °ÍÀ¸·Î ¿¹»óµÈ´Ù. ±×·çºñ°¡ ¾ÆÁ÷ º£Å¸ ¹öÀüÀ̶ó ¹ö±×°¡ Á¦¹ý ÀÖ°í, »õ ¹öÀüÀÌ ³ª¿Ã ¶§¸¶´Ù º¯°æµÇ´Â °Íµµ ÀÖÁö¸¸, ±×·çºñ À§Å° ÆäÀÌÁö¿Í ±×·çºñ ¸ÞÀϸµ ¸®½ºÆ®¸¦ ÅëÇØ ±×·çºñ ¿ÀÇ ÇÁ·ÎÁ§Æ®¸¦ ÁöÄѺ¸¸é¼ ±× ¹ßÀüÀ» Á÷Á¢ üÇèÇÏ´Â °ÍÀº À¯ÀÍÇϰí ÁÁÀº °æÇèÀÌ µÇ¸®¶ó º»´Ù. ÀÌ ±Û¿¡¼ ¾ð±ÞµÈ ÀÚ·á Áß ÀϺδ ÇÊÀÚÀÇ
±¹³» ±×·çºñ ¾ð¾î ȨÆäÀÌÁö¿¡¼µµ ±¸ÇÒ ¼ö ÀÖµµ·Ï ÇϰڴÙ.
´ÙÀ½ ±Û¿¡¼´Â ±×·çºñ¿¡¼ Á¦°øÇÏ´Â ¸î °¡Áö ºô´õµé¿¡ ´ëÇØ ¾Ë¾Æº¸°í, ±×·çºñ ¾ð¾î¸¦ ´Ù¸¥ ½ºÅ©¸³Æ® ¾ð¾î¿ÍÀÇ ºñ±³ÇØ º¸°íÀÚ ÇÑ´Ù. @
* ÀÌ ±â»ç´Â ZDNet KoreaÀÇ Á¦ÈÞ¸ÅüÀÎ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î¿¡ °ÔÀçµÈ ³»¿ëÀÔ´Ï´Ù.