Å×Å©´ÏÄà Ä÷³-ÀÚ¹Ù
XML ±â¹Ý ÄÚµå »ý¼º±â ÀÛ¼º°ú È°¿ë
°´Ã¼ ÁöÇâ Á¢±Ù ¹æ¹ýÀÇ °¡Àå Áß¿äÇÑ ÀåÁ¡ ÁßÀÇ Çϳª´Â ÄÚµåÀÇ Àç»ç¿ëÀÌ´Ù. ÇÏÁö¸¸, °´Ã¼ ÁöÇâ ÇÁ·Î±×·¡¹Ö ¾ð¾îÀÎ ÀÚ¹Ù¸¦ »ç¿ëÇϸ鼵µ °¡²û¾¿Àº ÀÌ·¯ÇÑ ÄÚµåÀÇ Àç»ç¿ëÀÌ ¾î·Á¿î »óȲÀÌ ÀÖ´Ù. ÀÏÁ¤ÇÑ ÆÐÅÏÀÇ Äڵ尡 ¹Ýº¹µÇÁö¸¸, Ŭ·¡½º »ó¼ÓÀ» »ç¿ëÇϱ⠰ï¶õÇÑ °æ¿ì°¡ ÁÖ·Î ÀÌ·¯ÇÑ °æ¿ìÀε¥, ÀÌ·± °æ¿ì¿¡´Â ÄÚµå »ý¼º ¹æ¹ýÀ» »ç¿ëÇÏ¿© Àç»ç¿ëÀ» ³ôÀÌ´Â ¹æ¹ýÀ» »ý°¢Çغ¼ ¼ö ÀÖ´Ù.
À̹ø È£¿¡ ´Ù·ê ÄÚµå »ý¼º±â codegenÀº ÇÊÀÚ°¡ ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇÏ´Â µµÁß ÇÊ¿ä¿¡ µû¶ó ¸¸µç °ÍÀ¸·Î ÀÌ ±Û¿¡¼´Â XML, ZIP ¾ÐÃà ÆÄÀÏ, Á¤±Ô Ç¥Çö½Ä, µ¿Àû Ŭ·¡½º ÀûÀç, Æļ »ý¼º±â µî ±¸Çö¿¡ »ç¿ëµÈ ±â´ÉÀ» Áß½ÉÀ¸·Î »ìÆ캼 °ÍÀÌ´Ù.
À±°æ±¸ yoonforh at gmail dot com
Ƽ¸Æ½º¼ÒÇÁÆ® ±â¼ú¿¬±¸¼Ò¿¡¼ EAI ÆÀÀ» À̲ø°í ÀÖ´Ù. ÀÌÀü¿¡´Â ÀÚ¹Ù ¿öµå ÇÁ·Î¼¼½º °³¹ß, PCS HLR ½Ã½ºÅÛ °³¹ß µî¿¡ Âü¿©Çß´Ù. ±¹³» ÃÖÃÊ·Î ÀÚ¹Ù À¥ °Ô½ÃÆÇÀÎ ÀÚ¹Ù ¹¯°í ´äÇϱ⠰ԽÃÆÇÀ» ¿î¿µÇßÀ¸¸ç(1997), ÀÔ¹®¼ÀÎ Áö³ª¿Í ÇÔ²² ÇÏ´Â ÀÚ¹Ù 2(1999), º»°ÝÀûÀÎ ÀÚ¹Ù °³¹ßÀÚ¸¦ À§ÇÑ µÎ²¨¿î Ã¥ÀÎ ÀÚ¹Ù 2 SDK 1.4 ½ÃÀÛ ±×¸®°í ¿Ï¼º(2003) µîÀÇ Ã¥À» ÁýÇÊÇß´Ù. ÇÁ·Î±×·¥ ¼¼°è ƯÁý ¾ÖÇø´ÀÇ Çâ±â(1996), ¸¶¼Ò ÁִϾî ÀÚ¹Ù À̾߱â(1999) µî ¿©·¯ Â÷·Ê ÀÚ¹Ù °ü·Ã ±â»ç¸¦ ±â°íÇÏ¿´´Ù. ±¹³» ¼ÒÇÁÆ®¿þ¾î »ê¾÷ÀÇ ¾î·Á¿î Çö½Ç ¼Ó¿¡¼ ¿À·¡µµ·Ï ÄÚ´õ·Î ³²°í ½Í´Ù´Â ¼Ò¹ÚÇÑ Èñ¸ÁÀ» °¡Áö°í ÀÖ´Ù.
°¡À̵å
¿î¿µÃ¼Á¦ | ÀÚ¹Ù 2 1.4ÆÇ ½ÇÇà °¡´É ȯ°æ
°³¹ßµµ±¸ | ÀÚ¹Ù 2 SDK 1.4
±âº»Áö½Ä | ÀÚ¹Ù 2 1.4ÆÇ, XML ±âº» Áö½Ä
¿À·¡°£¸¸¿¡ ±ÛÀ» ¾²°Ô µÇ¾î ÇÑÆíÀ¸·Î´Â ºÎ´ã°¨À», ´Ù¸¥ ÇÑÆíÀ¸·Î´Â ¹Ý°¡¿òÀ» ´À³¤´Ù. ÀÚ¹Ù ¾ð¾î°¡ ¼¼»ó¿¡ óÀ½ ¸ð½ÀÀ» ³ªÅ¸³»¾ú´ø °ÍÀÌ 1995³âÀ̴ϱî, ÀÌÁ¦ ÇÞ¼ö·Î µûÁö¸é 10³â°¿¡ Á¢¾îµé¾ú´Ù. ÀÚ¹Ù ¾ð¾î°¡ ¼ÒÇÁÆ®¿þ¾î »ê¾÷¿¡¼ ÀÌ·¸°Ô Áß¿äÇÑ ¿ªÇÒÀ» ÇÏ°Ô µÉ ÁÙÀº ±× ´©±¸µµ ¿¹ÃøÇÒ ¼ö ¾ø¾úÀ» °ÍÀÌ´Ù.
¿ÃÇØ¿¡´Â ÀÚ¹Ù ¾ð¾î¿¡ ²Ï Å« º¯È¸¦ °¡Á®´Ù ÁÙ ÀÚ¹Ù 2 1.5 ÆÇÀÌ ¿©¸§¿¡ ¹ßÇ¥µÉ ¿¹Á¤ÀÌ´Ù. 8³â ³Ñ°Ô Å« º¯È°¡ ¾ø¾ú´ø ÀÚ¹Ù ¾ð¾î°¡ ÀÌÁ¦ º¯È¸¦ ÇÊ¿ä·Î ÇÏ´Â ½Ã±â°¡ µÈ °ÍÀº ¾î¼¸é ÀÚ¿¬½º·¯¿î ÀÏÀÏ °ÍÀÌ´Ù. °·ÂÇÑ °æÀï ¾ð¾îÀÎ C#ÀÇ µîÀåµµ ÀÌ¿Í ¹«°üÇÏÁö ¾ÊÀ» °ÍÀÌ°í, ¿©·¯ °¡Áö ½ÃÀå »óȲÀÇ Àý¹ÚÇÑ ¿ä±¸¸¦ ¹Þ¾ÆµéÀÎ °á°úÀÏ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ º¯È°¡ Á»´õ ½¬¿î ÀÚ¹Ù, Á»´õ ´Ù¾çÇÑ ÀÚ¹Ù¸¦ ¸¸µé ¼ö ÀÖ°Ô µÇ±æ ¹Ù¶õ´Ù.
ÄÚµå »ý¼ºÀÇ Çʿ伺
À̹ø Ä÷³Àº ÀÚ¹Ù 2 1.4 ÆÇ¿¡ ±â¹ÝÇÑ ÄÚµå »ý¼º±â¸¦ ¼³¸íÇÏ°íÀÚ ÇÑ´Ù. Ŭ·¡½º »ó¼ÓÀ» È¿°úÀûÀ¸·Î »ç¿ëÇÏ¸é ´ëºÎºÐÀÇ ÄÚµå ¹Ýº¹À» ÇÇÇÒ ¼ö ÀÖÁö¸¸, Ŭ·¡½º »ó¼ÓÀ» Àû¿ëÇϱ⠾î·Á¿î ¹Ýº¹À» °¡²û¾¿ ¸¸³ª°Ô µÈ´Ù. ÇÊÀÚ°¡ ÄÚµå »ý¼º±â¸¦ Á¦ÀÛÇÏ°Ô µÇ¾ú´ø Á÷Á¢Àû °è±â´Â µ¥ÀÌÅͺ£À̽º Å×À̺íÀÇ ±¸¼º¿¡ µû¶ó ¼¼¼Ç ºó, ¿£Æ¼Æ¼ ºó µîÀÌ ¼·Î ´Ù¸£°Ô ÀÛ¼ºµÇ¾î¾ß ÇÏÁö¸¸, ±× ÆÐÅÏÀº µ¿ÀÏÇÑ °æ¿ì¿´´Ù. Áï, µ¥ÀÌÅͺ£À̽º Å×À̺í À̸§°ú Çʵå À̸§ÀÌ °¢ EJB ºó À̸§°ú Çʵå, ¸Þ¼Òµå À̸§À» °áÁ¤ÇÏ°í, ±× ÆÐÅÏÀº ÀÏÁ¤ÇÏ°Ô ¹Ýº¹µÇ¾ú´Ù. ÇÏÁö¸¸, Ŭ·¡½º »ó¼Ó ±¸Á¶¸¦ »ç¿ëÇؼ´Â ÀûÀýÇÑ EJB ºóµéÀ» Ç¥ÇöÇÒ ¼ö ¾ø¾ú´Ù.
±× ¿Ü¿¡µµ ÄÚµå »ý¼ºÀº ´Ù¾çÇÑ °æ¿ì¿¡ »ç¿ëµÈ´Ù. EJB³ª RMI °°Àº °æ¿ì ÇØ´ç ÄÄÆÄÀÏ·¯°¡ ÀÎÅÍÆäÀ̽º ¹ÙÀÌÆ®Äڵ带 Àоîµé¿© ½ºÅÓ Å¬·¡½º Äڵ带 »ý¼ºÇØ¾ß ÇÑ´Ù. ¹°·Ð ÀÌ °úÁ¤Àº °³¹ßÀÚ°¡ Á÷Á¢ ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó EJB ÄÄÆÄÀÏ·¯³ª RMI ÄÄÆÄÀÏ·¯°¡ ¼öÇàÇϹǷΠEJB ÄÄÆÄÀÏ·¯³ª RMI ÄÄÆÄÀÏ·¯¸¦ ¸¸µå´Â »ç¶÷ÀÌ °í¹ÎÇÒ ¹®Á¦ÀÌ´Ù. ÀÌ¿Ü¿¡µµ UML »óÅ ´ÙÀ̾î±×·¥À̳ª ¾×ƼºñƼ ´ÙÀ̾î±×·¥¿¡¼ ÀÚ¹Ù Äڵ带 »ý¼ºÇÏ´Â µîÀÇ °æ¿ì¿¡µµ ÄÚµå »ý¼ºÀÌ ÇÊ¿äÇÏ´Ù.
ÄÚµå »ý¼ºÀÇ ÀåÁ¡°ú ´ÜÁ¡
ÇÁ·Î±×·¡¹ÖÀº ¹®Á¦ ÇØ°á °úÁ¤ÀÇ ¿¬¼ÓÀÌ´Ù. ¹®Á¦¿¡ ºÎ´ÚÃÆÀ» ¶§ ÇØ°á ¹æ¹ýÀº ¿©·¯ °¡Áö°¡ Á¸ÀçÇÑ´Ù. ±× Áß Çϳª¸¦ ¼±ÅÃÇÏ°Ô µÇ´Âµ¥, °³¹ßÀÚ´Â Ç×»ó °¢ ¹æ¹ýÀÇ ÀåÁ¡°ú ´ÜÁ¡À» µÎ°í ¡°¿Ö?¡± ¶ó´Â Àǹ®À» °¡Áú ÇÊ¿ä°¡ ÀÖ´Ù.
ÄÚµå »ý¼ºÀ» »ç¿ëÇÏ´Â Á¢±Ù¹ýÀ» ¼±ÅÃÇÏ´Â °æ¿ì´Â ´ëºÎºÐ ÄÚµåÀÇ ºÒÇÊ¿äÇÑ ¹Ýº¹À», Áï º¹»çÇÏ¿© ºÙ¿© ³Ö´Â ¹æ½ÄÀÇ ÄÚµùÀ» »ç¶÷ÀÌ ¾Æ´Ñ ±â°è°¡ ÇÏ´Â µ¥ ¸ñÀûÀ» µÎ°Ô µÈ´Ù.
ÄÚµåÀÇ ºÒÇÊ¿äÇÑ ¹Ýº¹À» ¸·À» ¼ö ÀÖ´Â ´Ù¸¥ Á¢±Ù ¹æ¹ýÀΠŬ·¡½º »ó¼Ó ±¸Á¶ÀÇ È°¿ë ¹æ¹ý°ú Àå´ÜÁ¡À» ºñ±³Çغ¸µµ·Ï ÇÏÀÚ.
<Ç¥ 1> ÄÚµå »ý¼º ¹æ¹ý°ú Ŭ·¡½º »ó¼Ó ¹æ¹ýÀÇ ºñ±³
|
ÄÚµå »ý¼º ¹æ¹ý |
Ŭ·¡½º »ó¼Ó ¹æ¹ý |
¼öÇà ¼º´É |
º¯È °¡´ÉÇÑ ºÎºÐÀÌ ÄÚµå »ý¼º ½Ã¿¡ °áÁ¤µÇ¹Ç·Î, ÄÄÆÄÀÏ ½Ã¿¡´Â ÀÌ¹Ì Äڵ忡 ¹Ý¿µµÇ¾î ÀÖ¾î ¼öÇà ¼º´ÉÀÌ ´õ ³ªÀ» ¼ö ÀÖ´Ù. |
º¯È °¡´ÉÇÑ ºÎºÐÀ» ½ÇÇà ½Ã¿¡ XML ¹®¼ µîÀÇ È¯°æ ¼³Á¤ ÆÄÀÏÀ̳ª ´Ù¸¥ Á¤º¸ Ŭ·¡½º¿¡¼ °¡Á®¿Í¼ ÆÇ´ÜÇÏ´Â °æ¿ì°¡ ¸¹À¸¹Ç·Î ¼³°è¿¡ µû¶ó ¾à°£ÀÇ ¿À¹öÇìµå°¡ ¹ß»ýÇÑ´Ù. |
À¯Áö º¸¼ö |
¸ðµç Äڵ忡 °øÅëÀûÀ¸·Î º¯°æ »çÇ×ÀÌ ¹ß»ýÇÒ °æ¿ì ´Ù½Ã Äڵ带 »ý¼ºÇØ¾ß Çϴµ¥ ÀÌÁß ÀϺΠÄڵ尡 °³º°ÀûÀ¸·Î ¼öÁ¤µÈ °æ¿ì °ü¸®°¡ º¹ÀâÇØÁø´Ù. |
ÄÚµå »ý¼º°ú ´Þ¸® Áß¾Ó ÁýÁßÀûÀÎ ÄÚµå º¯°æ ¹× °ü¸®°¡ °¡´ÉÇϹǷÎ, À¯Áö º¸¼ö°¡ Æí¸®ÇÏ´Ù. |
ÀϹÝÀûÀ¸·Î Ŭ·¡½º »ó¼Ó ±¸Á¶¸¦ »ç¿ëÇÏ¿© ÄÚµåÀÇ Àç»ç¿ëÀ» ³ôÀÏ ¼ö ÀÖ´Â »óȲÀ̶ó¸é ÄÚµå »ý¼ºÀ» »ç¿ëÇÑ Á¢±Ù¹ýÀ» ±»ÀÌ »ç¿ëÇÒ ÇÊ¿ä°¡ ¾øÀ» °ÍÀÌ´Ù. ÄÚµå »ý¼ºÀ» »ç¿ëÇÏ¿© °³¹ßÇÏ´Â °ÍÀº Á¤»óÀûÀÎ Á¢±Ù ¹æ¹ýÀº ¾Æ´Ï±â ¶§¹®ÀÌ´Ù. ƯÈ÷ ÄÚµå »ý¼ºÀº »ç¿ëµÇ´Â ºÎºÐ ÄÚµåµéÀÌ ¿Ïº®ÇÏ´Ù´Â °ÍÀ» °¡Á¤ÇÏ´Â Á¢±Ù ¹æ¹ýÀ̱⠶§¹®¿¡, °³¹ß °úÁ¤¿¡¼ ¹®Á¦Á¡À» ¹ß°ßÇÏ°í °è¼ÓÇؼ °³¼±ÇØ ³ª°¡´Â ÀϹÝÀûÀÎ °³¹ß °øÁ¤¿¡´Â ÀûÇÕÇÏÁö ¾Ê´Ù.
±×·³¿¡µµ ºÒ±¸ÇÏ°í, Ŭ·¡½º »ó¼Ó ±¸Á¶¸¦ »ç¿ëÇϱ⠰ï¶õÇÑ È¯°æ¿¡¼ ¼ö¾øÀÌ ¸¹Àº µ¿ÀÏÇÑ ÆÐÅÏÀÇ Äڵ带 ÀÛ¼ºÇØ¾ß ÇÏ´Â »óȲÀ̳ª Ưº°È÷ ÄÚµå »ý¼ºÀ» ÇÊ¿ä·Î Çϴ ȯ°æÀ» °¡²û ¸¸³¯ ¼ö ÀÖ´Ù. ÇÊÀÚ´Â ÀÌ·± ȯ°æ¿¡¼ º¸ÆíÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Â ÄÚµå ÅÛÇø´ ¹æ½ÄÀÇ ÄÚµå »ý¼º±â¸¦ °í¾ÈÇغ¸¾Ò´Ù.
ÄÚµå »ý¼º ÇÁ·Î±×·¥ codegenÀÇ ±â´É
¸ÕÀú ÄÚµå »ý¼º ÇÁ·Î±×·¥ÀÎ codegenÀÇ ±â´ÉÀ» »ìÆ캸µµ·Ï ÇÏÀÚ.
codegenÀÇ ±âº»ÀûÀÎ ¾ÆÀ̵ð¾î´Â »ý¼ºÇÒ ÄÚµåÀÇ ¿øÇüÀÌ µÉ ÅÛÇø´ ÄÚµåµéÀ» ¸ÕÀú ÀÛ¼ºÇÑ ´ÙÀ½, ÄÚµå ³»¿ë ȤÀº µð·ºÅ丮 À̸§ÀÇ ÀϺθ¦ º¯¼öȽÃÄÑ »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ °ªÀ¸·Î º¯°æÇϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù.
¹Ì¸® ÀÛ¼ºµÈ ÄÚµåµéÀº ÇϳªÀÇ ZIP ¾ÐÃà ÆÄÀÏ·Î ¸¸µé¾îÁö¸ç, º¯¼ö ġȯ ¹× ó¸® ¹æ¹ýÀ» ÇϳªÀÇ XML ¹®¼·Î ÀÛ¼ºÇÑ´Ù. Áï, ZIP ÆÄÀÏ Çü½ÄÀ¸·Î µÈ ÅÛÇø´ ÆÄÀÏ°ú ÅÛÇø´ ÆÄÀÏÀÇ Ã³¸® ¹æ¹ýÀ» ±â¼úÇÏ´Â XML ¹®¼°¡ ÇϳªÀÇ ÄÚµå »ý¼º ÅÛÇø´À» ±¸¼ºÇÑ´Ù. ÄÚµå »ý¼º ÇÁ·Î±×·¥Àº ZIP ÆÄÀÏÀÇ ¾ÐÃàÀ» Ǫ´Â °úÁ¤¿¡¼, XML ¹®¼ÀÇ Áö½Ã¿¡ µû¶ó º¯¼ö ºÎºÐÀ» ġȯÇϰųª, ÁöÁ¤µÈ Àڹ٠Ŭ·¡½º¸¦ ½ÇÇà½ÃÄÑ °¡°øÇÏ´Â ÀÏÀ» ÇÑ´Ù.
¸ÕÀú ÄÚµå »ý¼º ÇÁ·Î±×·¥À» Çѹø ½ÇÇà½ÃÄѺ¸µµ·Ï ÇÏÀÚ.
¸¶¼Ò µð½ºÄÏÀ¸·Î Á¦°øµÇ´Â Java_Codegen.zip ÆÄÀÏÀÇ ¾ÐÃàÀ» Ç®¸é codegen µð·ºÅ丮 ¾Æ·¡¿¡ ¿©·¯ °³ÀÇ µð·ºÅ丮°¡ Á¸ÀçÇÑ´Ù.
À©µµ¿ìÀÇ ¸í·É ÇÁ·ÒÇÁÆ®¿¡¼ codegen\bin µð·ºÅ丮·Î °¡¼ ´ÙÀ½°ú °°ÀÌ ½ÇÇà½ÃÄѺ¸ÀÚ.
C:\Works\codegen\bin> codegen.bat -d ..\samples\templates
¿©±â¿¡¼ -d ¿É¼ÇÀº ÅÛÇø´ ÆÄÀÏÀÌ À§Ä¡ÇÏ´Â µð·ºÅ丮¸¦ ³ªÅ¸³½´Ù.
<±×¸² 1> codegen ÇÁ·Î±×·¥ ½ÇÇà ¸ð½À
ÄÚµå ÅÛÇø´ ÀÛ¼º
codegenÀ» »ç¿ëÇÏ·Á¸é ¸ÕÀú ¿øÇÏ´Â ÄÚµåÀÇ ¿øÇüÀ» ÀÛ¼ºÇÏ¿© ÅÛÇø´À¸·Î µî·ÏÇØ¾ß ÇÑ´Ù. °£´ÜÇÑ ÄÚµå ÅÛÇø´À» ÀÛ¼ºÇغ¸´Â °ÍÀÌ ÀÌÇظ¦ µµ¿ï °ÍÀÌ´Ù. ÀÌ ±ÛÀÇ ¸ñÀûÀº codegenÀ» ¼Ò°³ÇÏ´Â µ¥ ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó, codegenÀ» ±¸ÇöÇÏ´Â µ¥ °ü·ÃµÈ ¸î °¡Áö ÀÚ¹Ù ±â¼úµéÀ» »ìÆ캸´Â °ÍÀ̹ǷΠ°£´ÜÇÏ°Ô ¼³¸íÇÑ´Ù.
codegen ÇÁ·Î±×·¥À» ½ÇÇàÇϸé codegenÀº -d ¿É¼ÇÀ¸·Î ÁöÁ¤µÈ ·çÆ® ÅÛÇø´ µð·ºÅ丮ÀÇ ÇÏÀ§ µð·ºÅ丮¸¦ °Ë»çÇÏ¿© ÀûÀýÇÑ ÅÛÇø´µéÀÌ µé¾îÀÖ´ÂÁö È®ÀÎÇÑ´Ù.
·çÆ® ÅÛÇø´ µð·ºÅ丮ÀÇ °¢ ÇÏÀ§ µð·ºÅ丮 À̸§Àº ÅÛÇø´ À̸§À¸·Î °£ÁֵǸç, codegenÀº ÇØ´ç µð·ºÅ丮 ¾Æ·¡¿¡ template.xml ÆÄÀÏ°ú ÅÛÇø´ À̸§.zip ÆÄÀÏÀ» ã´Â´Ù. ¿¹¸¦ µé¾î, ·çÆ® ÅÛÇø´ µð·ºÅ丮 ¾Æ·¡¿¡ easy¶ó´Â À̸§ÀÇ ÇÏÀ§ µð·ºÅ丮°¡ ÀÖÀ¸¸é, ÀÌ µð·ºÅ丮 ¾È¿¡ template.xml ÆÄÀÏ°ú easy.zip ÆÄÀÏÀÌ ÀÖ´ÂÁö °Ë»çÇÑ´Ù.
ÇØ´çÇÏ´Â ÆÄÀϵéÀÌ Á¸ÀçÇϸé template.xml ÆÄÀÏÀÇ ³»¿ëÀ» Àоî ÅÛÇø´À¸·Î µî·ÏÇÑ ´ÙÀ½ ȸ鿡 º¸¿©ÁÖ°Ô µÈ´Ù.
¿¹Á¦·Î ÀÛ¼ºÇÒ ÅÛÇø´Àº Hello, World¸¦ Ãâ·ÂÇÏ´Â °¡Àå ±âº»ÀûÀÎ ÀÚ¹Ù ¼Ò½º ÆÄÀÏ¿¡ º¯¼ö 󸮸¦ Ãß°¡ÇÏ°í, À̸¦ codegenÀÌ Ã³¸®ÇÒ ¹æ¹ýÀ» ±â¼úÇÏ´Â template.xml ÆÄÀÏÀ» ÀÛ¼ºÇغ»´Ù. ¸ÕÀú ´ÙÀ½°ú °°ÀÌ Hello.java¸¦ ÀÛ¼ºÇÑ´Ù.
<¸®½ºÆ® 1> Hello.java
/*
* $Id$
*
* Copyright (c) 2004 by %%company%%.
* All rights reserved.
*/
package %%package-name%%;
/**
* Hello World program
*
* @version $Revision$<br>
* created at %%timestamp%%
* @author Yoon Kyung Koo
*/
public class Hello {
public static void main(String[] args) {
System.out.println("%%message%%");
}
}
¼Ò½º ÆÄÀÏÀº ¾ÆÁÖ Æò¹üÇÏ°í ´Ü¼øÇÏÁö¸¸, ¸î °¡Áö %%·Î µÑ·¯½ÎÀÎ ºÎºÐÀÌ ´«¿¡ ¶è´Ù. ÀÌ ºÎºÐµéÀÌ º¯¼ö 󸮵Ǵ ºÎºÐÀ¸·Î ¿©±â¿¡¼´Â company, package-name, timestamp, message µîÀÌ ÀÖ´Ù. º¯¼ö·Î µî·ÏµÈ ºÎºÐÀº codegen ÅøÀÌ »ç¿ëÀڷκÎÅÍ Ä¡È¯ÇÒ °ªµéÀ» ÀÔ·Â¹Þ°Ô µÈ´Ù. ÇöÀç codegen ÅøÀº ¿¹¿ÜÀûÀ¸·Î »ç¿ëÀڷκÎÅÍ ÀÔ·ÂÀ» ¹ÞÁö ¾Ê´Â Ưº°ÇÑ º¯¼öÀÎ timestamp¸¦ Áö¿øÇÏ°í ÀÖ´Ù. ÀÌ º¯¼ö´Â Äڵ尡 »ý¼ºµÈ ½Ã°£À¸·Î ġȯÇØÁØ´Ù.
´ÙÀ½Àº ÀÌ ¼Ò½º Äڵ忡 µî·ÏµÈ º¯¼ö¿¡ ´ëÇÑ Ã³¸® ¹æ¹ýÀ» ±â¼úÇÏ´Â XML ¹®¼ÀÎ template.xmlÀÇ ³»¿ëÀÌ´Ù.
<¸®½ºÆ® 2> template.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE template-info PUBLIC
"-//Yoon Kyung Koo.//DTD Template Information 1.0//EN"
"http://www.javadom.com/dtd/template_info_1_0.dtd">
<template-info>
<name>easy</name>
<description>EASY Framework Template</description>
<variables>
<root-path-var id="root" default="true">Source Root</root-path-var>
<global-var id="package-directory">Package Directory</global-var>
<global-var id="package-name">Package Name</global-var>
<global-var id="company">Company Name (e.g, YoonForH Corp.)</global-var>
<global-var id="message">Message String</global-var>
</variables>
<doc-info>
<zip-path>easy/Hello.java</zip-path>
<description>Hello World source code</description>
<rel-path>%%package-directory%%/Hello.java</rel-path>
<var name="message">
<handler type="yoonforh.codegen.handler.LowerCase"/>
</var>
</doc-info>
</template-info>
ÀÌ XML ¹®¼ÀÇ ¹®¹ýÀº codegen\src\yoonforh\codegen\dtd\ µð·ºÅ丮¿¡ ÀÖ´Â template_info.dtd ÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖ´Ù.
°£´ÜÇÏ°Ô XML ±¸¼º ¿ä¼ÒµéÀ» »ìÆ캸¸é, ·çÆ® ¿ä¼ÒÀÎ template-info´Â ù ¹ø° ¿ä¼ÒÀÎ name¿¡¼ ÅÛÇø´ À̸§À» ÁöÁ¤ÇÑ´Ù. description ¿ä¼Ò´Â ÅÛÇø´¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸íÀ» Àû´Â ºÎºÐÀÌ´Ù.
variables ¿ä¼Ò´Â ÅÛÇø´ÀÇ ½ÇÇàÀ» À§ÇØ »ç¿ëÀڷκÎÅÍ ÀÔ·ÂÀ» ¹Þ¾Æ¾ß ÇÏ´Â º¯¼öµéÀ» ¼±¾ðÇÏ´Â ºÎºÐÀ¸·Î ÅÛÇø´ ¾È¿¡ Æ÷ÇÔµÈ ÆÄÀϵéÀ» »ý¼ºÇÒ ·çÆ® µð·ºÅ丮µéÀ» ÁöÁ¤ÇÏ´Â root-path-var ¿ä¼Ò¿Í ¹®¼ÀÇ ¹®ÀÚ¼ÂÀ» ÁöÁ¤ÇÏ´Â charset-var ¿ä¼Ò, ±×¸®°í ´Ù¸¥ ±× ¿Ü ÀÔ·ÂÀ» ¹Þ¾Æ¾ß ÇÒ Àü¿ª º¯¼öµéÀÎ gloabl-var ¿ä¼Òµé·Î ±¸¼ºµÈ´Ù.
global-var ¿ä¼ÒµéÀº »ç¿ëÀÚ ÀÔ·ÂÀÇ ³»¿ë¿¡ µû¶ó string, csv, empty, file, directory µîÀÇ À¯ÇüÀ» type ¼Ó¼ºÀ¸·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. codegen ÅøÀº ÀÌ type ¼Ó¼º¿¡ µû¶ó fileÀÇ °æ¿ì¿¡´Â ÆÄÀÏ ´ëÈ »óÀÚ¸¦ ¿©´Â µî, ÇØ´ç º¯¼ö¸¦ ÀԷ¹޴ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º¸¦ ÀûÀýÇÏ°Ô º¯°æÇÑ´Ù.
doc-info ¿ä¼ÒµéÀº ÅÛÇø´ ZIP ÆÄÀÏ¿¡ Æ÷ÇÔµÈ °¢ ¹®¼¸¦ Çؼ®ÇÏ´Â µ¥ ÇÊ¿äÇÑ Á¤º¸¸¦ ÁöÁ¤ÇÑ´Ù. doc-info ¿ä¼Ò´Â ÅÛÇø´ ZIP ÆÄÀÏ ³»¿¡¼ÀÇ ¹®¼ À§Ä¡¸¦ Ç¥½ÃÇÏ´Â zip-path, ÄÚµå »ý¼º ½Ã¿¡ À§Ä¡ÇÒ »ó´ë µð·ºÅ丮ÀÎ rel-path, ·çÆ® µð·ºÅ丮ÀÎ root-path, ±×¸®°í ¹®¼ÀÇ ¹®Àڼ Á¤º¸¸¦ ³ªÅ¸³»´Â charset, ±× ¿Ü °¢ º¯¼öº°·Î ºÎ°¡ÀûÀΠ󸮸¦ Áö½ÃÇÏ´Â var ¿ä¼Òµé·Î ±¸¼ºµÈ´Ù.
¿¹Á¦ÀÇ ÅÛÇø´ ZIP ÆÄÀÏÀÎ easy.zip ÆÄÀÏ¿¡´Â easy¶ó´Â ÇÏÀ§ µð·ºÅ丮¿¡ ¾Õ¿¡¼ ÀÛ¼ºÇÑ Hello.java ¹®¼°¡ Æ÷ÇԵǾî ÀÖ´Ù. ¿¹Á¦ template.xml ¹®¼¿¡¼ ÁÖÀDZí°Ô º¼ ºÎºÐÀº rel-pathÀÇ ³»¿ë¿¡ º¯¼ö¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ¾î¼ ½ÇÁ¦ ÇØ´ç ¹®¼°¡ »ý¼ºµÇ´Â »ó´ë °æ·Î¸¦ º¯¼ö¿¡ µû¶ó ¹Ù²Ü ¼ö ÀÖ´Ù´Â Á¡°ú, var ¿ä¼Ò¿¡¼ ºÎ°¡ÀûÀ¸·Î handler ¿ä¼Ò¸¦ ÁöÁ¤ÇÏ¿© Ưº°ÇÑ Ã³¸®¸¦ ÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù.
handler ¿ä¼Ò´Â type ¼Ó¼ºÀ¸·Î Àڹ٠Ŭ·¡½º À̸§À» ¹Þ´Âµ¥ ÀÌ Å¬·¡½º´Â ¹Ýµå½Ã yoonforh.codegen.handler.Handler ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÑ Å¬·¡½º¿©¾ß ÇÑ´Ù.
ÀÛ¼ºÇÑ ÅÛÇø´ÀÇ À̸§Àº easy·Î samples\templates\easy\ µð·ºÅ丮 ¾È¿¡ µé¾î ÀÖ´Â template.xml ÆÄÀÏ°ú easy.zip ÆÄÀÏÀ» ÂüÁ¶ÇÏÀÚ.
codegenÀ» ½ÇÇàÇÑ ´ÙÀ½ easy ÅÛÇø´À» ¼±ÅÃÇÏ¿© ½ÇÁ¦ Äڵ带 »ý¼ºÇغ¸±æ ¹Ù¶õ´Ù. °£´ÜÇÑ À§Àúµå ¹æ½ÄÀÇ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º´Â °¢ º¯¼öº°·Î ÀÔ·ÂÀ» ¹Þ´Â Å×À̺íÀ» Ç¥½ÃÇÑ´Ù.
À̶§ ÁÖÀÇÇؼ º¼ ºÎºÐÀº message º¯¼öÀε¥, ÀÌ º¯¼ö¿¡ ġȯÇÒ °ªÀ» ¿¹¸¦ µé¾î Hello, World¶ó°í ÀÔ·ÂÇÏ¸é ½ÇÁ¦ »ý¼ºµÇ´Â ÄÚµå´Â ¼Ò¹®ÀÚ·Î ¹Ù²ï hello, world°¡ µÈ´Ù. ÀÌ°ÍÀº º¯¼ö¿¡ ºÎ°¡ÀûÀΠ󸮸¦ ÇÏ´Â Çڵ鷯ÀÎ yoonforh.codegen.handler.LowerCase Ŭ·¡½º°¡ µî·ÏµÇ¾î ÀÖ¾î º¯¼ö ³»¿ëÀ» ¼Ò¹®ÀÚ·Î ¹Ù²Ù¾î ÁÖ´Â ¶§¹®ÀÌ´Ù.
ÇÔ²² Æ÷ÇԵǾî ÀÖ´Â ¿¹Á¦ ÅÛÇø´ÀÎ meta ÅÛÇø´ÀÇ template.xml ¹®¼¸¦ ¿¾îº¸¸é, Çڵ鷯ÀÇ ÈξÀ º¹ÀâÇÑ »ç¿ë¹ýÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
codegen ÇÁ·Î±×·¥ÀÇ ±¸Çö Å×Å©´Ð
À̹ø Ä÷³ÀÇ ÁÖÁ¦´Â codegen ÇÁ·Î±×·¥À» Àß »ç¿ëÇÏ´Â µ¥ ÀÖÁö ¾Ê°í, ÀÌ·¯ÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¶§ »ç¿ëµÇ´Â ¸î °¡Áö Àç¹ÌÀÖ´Â ±â¼úµéÀ» »ìÆ캸´Â °ÍÀÌ´Ù.
ZIP ¾ÐÃà ó¸®
codegen¿¡¼ °¡Àå À¯¿ëÇÏ°Ô »ç¿ëÇÏ°í ÀÖ´Â ÀÚ¹ÙÀÇ ±â´É Áß Çϳª´Â java.util.zip ÆÐÅ°Áö°¡ Á¦°øÇÏ´Â ZIP ÆÄÀÏ Ã³¸® ±â´ÉÀÌ´Ù. yoonforh.codegen.util.zip.ZipExtractor Ŭ·¡½ºÀÇ extract() ¸Þ¼Òµå´Â ÅÛÇø´ ZIP ÆÄÀÏÀ» ÀоîµéÀÎ ´ÙÀ½, ¾ÐÃàÀ» Ç®¸é¼ ÁöÁ¤µÈ ÀÏÀ» ó¸®ÇÑ´Ù.
<¸®½ºÆ® 3>¿¡¼ º¼ ¼ö ÀÖµíÀÌ extract() ¸Þ¼Òµå´Â ZipInputStreamÀ» »ç¿ëÇÏ¿© ZIP ÆÄÀÏÀ» ÀоîµéÀÎ ´ÙÀ½ °¢ ¿£Æ®¸®º°·Î ZIP ÆÄÀÏ¿¡ Æ÷ÇÔµÈ ³»¿ëÀ» ó¸®Çϵµ·Ï ±¸ÇöµÇ¾î ÀÖ´Ù.
<¸®½ºÆ® 3> ZipExtractor.java ºÎºÐ ÄÚµå
public void extract(File zipFile) throws IOException, ApplicationException {
if (zipFile == null) {
logger.warning("src zip file is null.");
throw new NullPointerException("src zip file is null");
}
ZipInputStream zis = null;
try {
zis = new ZipInputStream(new BufferedInputStream(
new FileInputStream(zipFile), BUFFER_SIZE));
byte[] buffer = new byte[BUFFER_SIZE];
while (true) {
// ZIP ÆÄÀÏÀÇ ´ÙÀ½ ¿£Æ®¸®¸¦ °¡Á®¿Â´Ù.
ZipEntry entry = zis.getNextEntry();
if (entry == null) {
break;
}
String entryName = entry.getName();
long entrySize = entry.getSize();
boolean isDirectory = entry.isDirectory();
// worker¿¡°Ô ¿£Æ®¸®¸¦ ÀúÀåÇϱâ À§ÇÑ Ãâ·Â ½ºÆ®¸²À» ¿µµ·Ï ¿äûÇÑ´Ù.
OutputStream output = worker.openEntry(entryName, entrySize, isDirectory);
// worker°¡ ½ºÆ®¸²À» Á¦´ë·Î ³Ñ°ÜÁÖ¾ú´ÂÁö °Ë»ç
if (output == null) {
worker.closeEntry(entryName, isDirectory, output);
continue;
}
int result = 0, nWrote = 0;
try {
// ZIP ¿£Æ®¸®¸¦ Ǭ´Ù
while ((result = zis.read(buffer, 0, BUFFER_SIZE)) > 0) {
output.write(buffer, 0, result);
nWrote += result;
}
logger.finest("wrote " + nWrote + " bytes");
} finally {
output.close();
}
// ZIP ¿£Æ®¸®°¡ ¸ðµÎ Ç®·ÈÀ¸¹Ç·Î, worker¿¡°Ô Àû´çÇÑ ÀÏÀ» Çϵµ·Ï ¿äûÇÑ´Ù.
worker.closeEntry(entryName, isDirectory, output);
}
} finally {
if (zis != null) {
zis.close();
}
}
}
½ÇÁ¦ ¿£Æ®¸®º°·Î ¾ÐÃàÀ» Ç® ¶§ ½ÇÇàµÇ´Â °ÍÀº °°Àº ÆÐÅ°Áö¿¡ Á¤ÀǵǾî ÀÖ´Â ZipWorker ÀÎÅÍÆäÀ̽ºÀÇ °¢ ¸Þ¼Òµåµé·Î ZIP ÆÄÀÏÀÇ ¾ÐÃàÀ» Ç®¾îÁÖ´Â ZipExtractor Ŭ·¡½º·ÎºÎÅÍ µ¶¸³µÇµµ·Ï ¼³°èÇÏ¿´´Ù. codegen¿¡¼ ZIP ÆÄÀÏÀÇ ¾ÐÃàÀ» Ç® ¶§ ¼öÇàÇÏ´Â ¸ðµç ÀϵéÀº yoonforh.codegen.util.CodeGenZipWorker Ŭ·¡½ºÀÇ closeEntry() ¸Þ¼Òµå¿¡¼ ÀϾÙ.
<¸®½ºÆ® 4> CodeGenZipWorker.java ºÎºÐ ÄÚµå
/**
* ZIP ¿£Æ®¸®°¡ ¸ðµÎ Ç®·ÈÀ» ¶§ È£ÃâµÈ´Ù. ¿©±â¿¡¼ ÃßÃâµÈ ½ºÆ®¸²À» ó¸®ÇÒ ¼ö ÀÖ´Ù.
*
* @param entryName ZIP ¿£Æ®¸® À̸§
* @param isDirectory ¿£Æ®¸®°¡ µð·ºÅ丮ÀÎÁö ¿©ºÎ
* @param output ´Ý±ä Ãâ·Â ½ºÆ®¸²
* @exception IOException Ãâ·Â ½ºÆ®¸²À» ¿ ¶§ ¹ß»ýÇÒ ¼ö ÀÖ´Â IO ¿¡·¯
* @exception ApplicationException ó¸® Áß ÀϾ ¼ö ÀÖ´Â ¿¡·¯
*/
public void closeEntry(String entryName, boolean isDirectory, OutputStream output)
throws IOException, ApplicationException {
// openEntry() ¸Þ¼Òµå¿¡¼ ³Ñ°ÜÁÖ¾ú´ø ¹ÙÀÌÆ® ¹è¿ Ãâ·Â ½ºÆ®¸² °´Ã¼
ByteArrayOutputStream bout = (ByteArrayOutputStream) output;
String zipPath = entryName.replace('\\', '/');
String rootPath = null;
String relPath = null;
String charset = null;
HashMap varInfos = null;
TextProcessor currentProcessor = processor;
DocInfo docInfo = (DocInfo) docInfos.get(zipPath);
// ¿£Æ®¸®°¡ µð·ºÅ丮ÀÎ °æ¿ì¿¡´Â ¿©±â¿¡¼ ¾Æ¹« Àϵµ ÇÏÁö ¾Ê´Â´Ù.
if (isDirectory) {
return;
}
if (docInfo == null) {
// docInfo°¡ ³ÎÀ̸é ÀÌ ¿£Æ®¸®´Â template.xml ÆÄÀÏ¿¡ µî·ÏµÇÁö ¾ÊÀº ¿£Æ®¸®ÀÌ´Ù.
// ¿©±â¿¡¼´Â ±âº» µ¿ÀÛÀ» ±âº» ·çÆ® °æ·Î·Î ¾ÐÃàÀ» Ç®µµ·Ï Çß´Ù.
rootPath = defaultRootPath;
relPath = zipPath;
} else {
// template.xml ÆÄÀÏÀÇ doc-info ¿ä¼Ò·ÎºÎÅÍ ·çÆ® °æ·Î º¯¼ö Á¤º¸¸¦ °¡Á®¿Â´Ù.
String var = docInfo.getRootPathVar();
if (var != null) {
rootPath = (String) rootPaths.get(var);
}
if (rootPath == null || rootPath.length() == 0) {
rootPath = defaultRootPath;
}
// template.xml ÆÄÀÏÀÇ doc-info ¿ä¼Ò·ÎºÎÅÍ processor Á¤º¸¸¦ °¡Á®¿Â´Ù.
// processor´Â º¯¼ö¿¡ Àû¿ëµÇ¾ú´ø Çڵ鷯¿Í ´Þ¸® ÆÄÀÏ¿¡
// ºÎ°¡ÀûÀ¸·Î Àû¿ëµÇ´Â Ưº°ÇÑ ÀÏÀ» ¼öÇàÇÑ´Ù
String processorType = null;
ProcessorInfo pInfo = docInfo.getProcessorInfo();
if (pInfo != null) {
processorType = pInfo.getType();
}
if (processorType != null && processorType.length() > 0) {
// ÇÁ·Î¼¼¼ À¯ÇüÀÌ ÁöÁ¤µÇ¾úÀ¸¸é ÇöÀç ÇÁ·Î¼¼¼¸¦ º¯°æÇÑ´Ù.
currentProcessor = getProcessorInstance(processorType);
}
// »ó´ë °æ·Î°¡ ÁöÁ¤µÇ¾î ÀÖÀ¸¸é ZIP ¿£Æ®¸® °æ·Î ´ë½Å »ó´ë °æ·Î¸¦ »ç¿ëÇÑ´Ù.
// »ó´ë °æ·Î¿¡´Â º¯¼ö°¡ Æ÷Ç﵃ ¼ö ÀÖ´Ù.
relPath = docInfo.getRelPath();
if (relPath == null || relPath.length() == 0) {
relPath = zipPath;
}
var = docInfo.getCharsetVar();
if (var != null) {
charset = (String) charsets.get(var);
}
}
// ÇöÀç µî·ÏµÈ ÇÁ·Î¼¼¼¿¡°Ô ÆÄÀÏÀ» »ý¼ºÇϵµ·Ï ¿äûÇÑ´Ù.
// ÇÁ·Î¼¼¼´Â ÇϳªÀÇ ¿£Æ®¸®¸¦ »ç¿ëÇؼ ¿©·¯ °³ÀÇ ÆÄÀÏÀ» »ý¼ºÇÒ ¼öµµ ÀÖ´Ù.
currentProcessor.generateFile(
(bout != null ? bout.toByteArray() : null), rootPath, relPath,
isDirectory, charset, docInfo);
}
º¯¼ö 󸮸¦ À§ÇÑ Á¤±Ô Ç¥Çö½Ä
codegen ÇÁ·Î±×·¥Àº º¯¼ö 󸮸¦ À§ÇØ ÀÚ¹Ù 2 1.4 ÆÇ¿¡ »õ·Ó°Ô Ãß°¡µÇ¾ú´ø java.util.regex ÆÐÅ°ÁöÀÇ Á¤±Ô Ç¥Çö½ÄÀ» »ç¿ëÇÑ´Ù.
codegenÀÇ º¯¼ö Ç¥±â ¹æ¹ýÀº ¡°%%¡± »çÀÌ¿¡ º¯¼ö À̸§À» µÎ´Â °ÍÀε¥, ¼±ÅÃÀûÀ¸·Î ºÎ°¡ÀûÀÎ ´ë¼Ò¹®ÀÚ Ã³¸®¸¦ À§ÇØ º¯¼ö À̸§ ´ÙÀ½¿¡ ¡°:¡±À» Ãß°¡ÇÏ°í ³»ºÎÀûÀ¸·Î ÀÌÇØÇÏ´Â ´ë¼Ò¹®ÀÚ Ã³¸® ¸í·ÉÀ» ÁÙ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î,
%%message:lower%%
¿Í °°Àº Ç¥ÇöÀº message¶ó´Â º¯¼ö¸¦ ó¸®ÇÑ ´ÙÀ½, ³»¿ëÀ» ¸ðµÎ ¼Ò¹®ÀÚ·Î º¯°æÇ϶ó´Â ¸í·ÉÀÌ´Ù.
Áö¿øÇÏ´Â ¸í·É¿¡´Â csu(´ë¹®ÀÚ·Î ½ÃÀÛÇÏ´Â ´ë¼Ò¹®ÀÚ ±ÔÄ¢), csl(¼Ò¹®ÀÚ·Î ½ÃÀÛÇÏ´Â ´ë¼Ò¹®ÀÚ ±ÔÄ¢), upper(´ë¹®ÀÚ·Î), lower(¼Ò¹®ÀÚ·Î) µîÀÌ ÀÖ´Ù. ÀÚÁÖ »ç¿ëµÇ´Â ¸í·ÉÀ» À§ÇØ º¯¼ö¿¡ Çڵ鷯¸¦ ÀÏÀÏÀÌ ÁöÁ¤ÇÏÁö ¾Ê¾Æµµ µÇµµ·Ï ÇÑ ¹è·Á¶ó°í »ý°¢ÇÒ ¼ö ÀÖ´Ù.
º¯¼ö À̸§¿¡´Â ¾ËÆĺª°ú ¼ýÀÚ, ±× ¿Ü¿¡ ¡°-¡±, ¡°_¡±°¡ ¿Ã ¼ö ÀÖÀ¸¸ç, ù ¹ø° ±ÛÀÚ´Â ¹Ýµå½Ã ¾ËÆĺªÀ̾î¾ß ÇÏ´Â ÀϹÝÀûÀÎ º¯¼ö ±ÔÄ¢À» µû¸¥´Ù. ÀÌ ±¸Á¶¸¦ Ç¥ÇöÇÏ´Â Á¤±ÔÇ¥Çö½ÄÀº ´ÙÀ½°ú °°´Ù.
String PATTER_EXPR = "%%([\\p{Alpha}][\\p{Alnum}-_]*?)(?:\\:([\\p{Alnum}-_]*?))?%%";
Á¤±Ô Ç¥Çö½Ä ÆÐÅÏÀÇ Àû¿ëÀº yoonforh.codegen.processor.TextProcessor Ŭ·¡½ºÀÇ apply() ¸Þ¼Òµå¿¡¼ ÀϾÙ.
<¸®½ºÆ® 5> TextProcessor.java ºÎºÐ ÄÚµå
/**
* Á¤±ÔÇ¥Çö½Ä°ú ÀÏÄ¡ÇÏ´Â ºÎºÐµéÀ» ã¾Æ¼, ÆÐÅÏÀ» Àû¿ëÇÑ ´ÙÀ½ Çڵ鷯¸¦ È£ÃâÇÑ´Ù.
*
* @param contents º¯¼ö ¼±¾ðºÎ¸¦ Æ÷ÇÔÇÏ´Â ³»¿ë ºÎºÐ
* @param varInfos º¯¼ö À̸§°ú º¯¼ö °ü·Ã Á¤º¸ °´Ã¼ ¸Ê
* @return ġȯµÈ ¹®ÀÚ¿
*/
public String apply(CharSequence contents, HashMap varInfos) {
// Pattern °´Ã¼´Â Matcher °´Ã¼¿Í ´Þ¸® reentrantÇϹǷΠij½ÃÇصдÙ.
Matcher matcher = getPattern().matcher(contents);
// ¿©±â¿¡¼ 50Àº Àǹ̾ø´Â ¼ýÀÚ·Î Àû´çÈ÷ Á¶±Ý ´õ Å« ¹öÆÛ¸¦ Àâ¾Ò´Ù.
StringBuffer buffer = new StringBuffer(contents.length() + 50);
int count = 0;
while (matcher.find()) {
count++;
// group() ȤÀº group(0)Àº ÀÏÄ¡µÈ ¹®ÀÚ¿ Àüü¸¦ ³ªÅ¸³½´Ù
// ù ¹ø° ±×·ìÀº ´ë¼Ò¹®ÀÚ Ã³¸® ¸í·ÉÀ» »« º¯¼ö À̸§
String variable = matcher.group(1);
// µÎ ¹ø° ±×·ìÀº ´ë¼Ò¹®ÀÚ Ã³¸® ¸í·É
String caseInst = matcher.group(2);
// value´Â »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ º¯¼öÀÇ Ä¡È¯ °ªÀÌ´Ù.
// template.xml ¹®¼¿¡¼ var À¯ÇüÀ» empty·Î ÁöÁ¤Çϸé value°¡ ³ÎÀÌ µÈ´Ù.
String value = (String) vars.get(variable);
// ´ë¼Ò¹®ÀÚ ¸í·É ó¸®
if (value != null) {
value = processCase(value, caseInst);
}
// ġȯµÈ º¯¼ö¿¡ ´ëÇØ µî·ÏµÈ Çڵ鷯¸¦ Â÷·Ê·Î ½ÇÇàÇÑ´Ù.
if (varInfos != null) {
Variable varInfo = (Variable) varInfos.get(variable);
List handlers = null;
if (varInfo != null) {
handlers = varInfo.getHandlerList();
}
if (handlers != null) {
Iterator iter = handlers.iterator();
while (iter.hasNext()) {
HandlerInfo handler = (HandlerInfo) iter.next();
String handlerClazz = handler.getType();
HashMap paramMap = handler.getParamMap();
if (handlerClazz != null) {
value = invokeHandler(handlerClazz, value, paramMap);
}
}
}
}
if (value != null) {
// ġȯ ¹× Çڵ鷯°¡ ½ÇÇàµÈ °á°ú¸¦ Àû¿ëÇÑ´Ù.
matcher.appendReplacement(buffer, value);
} else { // value°¡ nullÀÏ °æ¿ì¿¡´Â º¯¼ö¸¦ ±×³É ¾´´Ù.
logger.warning("cannot find value for variable - " + variable);
matcher.appendReplacement(buffer, variable);
}
} // while ¹® ³¡
if (count > 0) { // º¯°æÀÌ Çϳª¶óµµ ÀÖ¾ú´ø °æ¿ì
matcher.appendTail(buffer);
return buffer.toString();
}
// º¯°æÀÌ ¾øÀ» °æ¿ì ¿ø·¡ ³»¿ëÀ» ¹ÝȯÇÑ´Ù.
return contents.toString();
}
Çڵ鷯 Ãß°¡¸¦ À§ÇÑ µ¿Àû Ŭ·¡½º ÀûÀç
codegen ÇÁ·Î±×·¥ÀÇ Å« Ư¡À¸·Î´Â »ç¿ëÀÚ°¡ Á÷Á¢ Àڹ٠Ŭ·¡½º¸¦ ÄÚµùÇÏ¿© Çڵ鷯¸¦ Ãß°¡ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ÀÚ¹ÙÀÇ µ¿ÀûÀΠŬ·¡½º ÀûÀç Ư¼ºÀ» È°¿ëÇÏ´Â °ÍÀ¸·Î ´ëºÎºÐÀÇ ÀÚ¹Ù ÇÁ·Î±×·¥µéÀº Ç÷¯±×Àΰú °°Àº ºÎ°¡ ±â´É µîÀ» ¿ø·¡ÀÇ ÇÁ·Î±×·¥¿¡ Ãß°¡ÇÒ ¼ö ÀÖµµ·Ï Ç÷¯±×ÀÎÀ» À§ÇÑ º°µµÀÇ Å¬·¡½º ÀûÀç±â¸¦ Áö¿øÇÑ´Ù.
ÀÚ¹ÙÀÇ Å¬·¡½º ÀûÀç±â(class loader)´Â Å©°Ô ´ÙÀ½ ¼¼ °¡Áö·Î ±¸ºÐµÈ´Ù.
¡ß ½Ã½ºÅÛ Å¬·¡½º ÀûÀç±â : ºÎÆ®½ºÆ®·¦ Ŭ·¡½º ÀûÀç±â¶ó°íµµ ºÎ¸£¸ç, ÀÚ¹Ù°¡ ±âº»À¸·Î Á¦°øÇϴ Ŭ·¡½ºµéÀ» ÀûÀçÇÏ´Â µ¥ ÁÖ·Î »ç¿ëµÈ´Ù. ºÎÆ®½ºÆ®·¦ Ŭ·¡½º °æ·Î¿¡ Àִ Ŭ·¡½ºµé(java ȤÀº javax·Î ÆÐÅ°Áö À̸§ÀÌ ½ÃÀÛÇÏ´Â ´ëºÎºÐÀÇ Àڹ٠Ŭ·¡½ºµé)À» ÀûÀçÇÑ´Ù.
¡ß ÀÀ¿ë ÇÁ·Î±×·¥ Ŭ·¡½º ÀûÀç±â : »ç¿ëÀÚ°¡ ÀÛ¼ºÇÑ ÀÀ¿ë ÇÁ·Î±×·¥ Ŭ·¡½ºµéÀ» ÀûÀçÇÏ´Â µ¥ »ç¿ëµÇ´Â Ŭ·¡½º ÀûÀç±â. codegen ÇÁ·Î±×·¥ÀÇ Å¬·¡½ºµéÀº °ÅÀÇ ´ëºÎºÐ ÀÌ ÀÀ¿ë ÇÁ·Î±×·¥ Ŭ·¡½º ÀûÀç±â¿¡ ÀÇÇØ ÀûÀçµÈ´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ Ŭ·¡½º ÀûÀç±â´Â java.net.URLClassLoader Ŭ·¡½ºÀÇ ÀÚ½Ä Å¬·¡½ºÀ̸ç, URLClassLoader Ŭ·¡½º´Â java.security ÆÐÅ°ÁöÀÇ SecureClassLoaderÀÇ ÀÚ½Ä Å¬·¡½ºÀÌ´Ù. Áï, ÀÀ¿ë ÇÁ·Î±×·¥ Ŭ·¡½º ÀûÀç±â¿¡ ÀÇÇØ ÀûÀçµÇ´Â ¸ðµç Ŭ·¡½ºµéÀº SecureClassLoaderÀÇ ±â´É¿¡ ÀÇÇØ º¸¾È °Ë»ç¸¦ °ÅÄ¡°Ô µÊÀ» ÁÖ¸ñÇÏÀÚ. ½Ã½ºÅÛ Å¬·¡½º ÀûÀç±â¿¡ ÀÇÇØ ÀûÀçµÇ´Â Ŭ·¡½ºµéÀº º¸¾È °Ë»ç¸¦ °ÅÄ¡Áö ¾Ê´Â´Ù.
¡ß Ä¿½ºÅÒ Å¬·¡½º ÀûÀç±â : Ç÷¯±×ÀÎ µîÀÇ ¸ñÀûÀ¸·Î °³¹ßÀÚ°¡ Á÷Á¢ ÀÛ¼ºÇÑ Å¬·¡½º ÀûÀç±â. java.lang.ClassLoader Ŭ·¡½ºÀÇ ÀÚ½Ä Å¬·¡½º¿©¾ß ÇÑ´Ù.
ClassLoader Ŭ·¡½º¸¦ »ó¼ÓÇÏ´Â Ä¿½ºÅÒ Å¬·¡½º ÀûÀç±â¸¦ ÀÛ¼ºÇÒ ¶§¿¡´Â ´ëºÎºÐÀÇ °æ¿ì findClass() ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇÏ¿© ±¸ÇöÇÏ°Ô µÈ´Ù. ÇÊ¿ä¿¡ µû¶ó findResource(), findLibrary() ¸Þ¼Òµå µîµµ ¿À¹ö¶óÀ̵åÇÏ¿© ±¸ÇöÇÒ ¼ö ÀÖ´Ù. <¸®½ºÆ® 6>Àº °£´ÜÇÑ findClass() ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇÏ¿© »ç¿ëÇÏ´Â ¿¹ÀÌ´Ù.
<¸®½ºÆ® 6> ClassLoaderÀÇ findClass() ¿À¹ö¶óÀÌµå ¿¹Á¦
/*
* ÀÚ¹Ù 2 ¹öÀü 1.2 ÀÌÈĺÎÅÍ´Â ClassLoaderÀÇ ÀÚ½Ä Å¬·¡½ºµéÀº
* loadClass(String, boolean) ´ë½Å¿¡
* findClass(String) ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇÏ¿© ±¸ÇöÇÒ °ÍÀ» ±ÇÀåÇÑ´Ù.
* findLoadedClass(name)ÀÌ ¸ÕÀú È£ÃâµÇ¾î ¹ß°ßµÇ¸é ÀÌ ¸Þ¼Òµå´Â È£ÃâµÇÁö ¾Ê´Â´Ù.
*
* @param name Ŭ·¡½º À̸§
*/
protected Class findClass(String name) throws ClassNotFoundException {
// loadClassData() ¸Þ¼Òµå´Â Ŭ·¡½º À̸§¿¡ ÇØ´çÇÏ´Â ¹ÙÀÌÆ® ¹è¿À»
// °¡Á®¿À´Â Äڵ尡 µé¾î ÀÖ¾î¾ß ÇÑ´Ù.
byte[] b = loadClassData(name);
if (b != null) {
return defineClass(name, b, 0, b.length);
} else {
return null;
}
}
codegen¿¡¼ Çڵ鷯 Ŭ·¡½ºµéÀ» Ãß°¡·Î ÀоîµéÀÏ ¼ö ÀÖ±â À§ÇØ Áö¿øÇϴ Ŭ·¡½º ÀûÀç±â´Â java.net ÆÐÅ°ÁöÀÇ URLClassLoader Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿© ÀÛ¼ºÇÏ¿´´Ù.
URLClassLoader Ŭ·¡½º´Â »ý¼ºÀڷκÎÅÍ ³Ñ°Ü¹ÞÀº URLµéÀÌ zip ÆÄÀÏÀ̳ª jar ÆÄÀÏÀÏ °æ¿ì ÇØ´ç ÆÄÀÏ¿¡ Æ÷ÇÔµÈ Å¬·¡½ºµéÀ» ÀνÄÇϹǷÎ, ÀÌ ±â´ÉÀ» È°¿ëÇϸé ƯÁ¤ÇÑ µð·ºÅ丮¿¡ ÀÖ´Â ¸ðµç zip ÆÄÀÏÀ̳ª jar ÆÄÀÏÀ» Ŭ·¡½º °æ·Î¿¡ Æ÷ÇÔÇÏ¿© ÀоîµéÀΠŬ·¡½º ÀûÀç±â¸¦ ÀÛ¼ºÇÏ´Â °ÍÀÌ ¾ÆÁÖ °£´ÜÇØÁø´Ù.
Çڵ鷯 Ŭ·¡½º¸¦ ÀоîµéÀÏ ¼ö ÀÖ´Â yoonforh.codegen.util.DirectoryClassLoader Ŭ·¡½º´Â ´ÙÀ½°ú °°ÀÌ ¾ÆÁÖ °£´ÜÇÑ ÄÚµå·Î ±¸ÇöµÇ¾ú´Ù. ÇÑ °¡Áö °í·ÁÇÒ Á¡Àº Ŭ·¡½º ÀûÀç±â¿¡´Â ºÎ¸ð Ŭ·¡½º ÀûÀç±â °³³äÀÌ Á¸ÀçÇϴµ¥, ÇöÀçÀÇ Å¬·¡½º ÀûÀç±â°¡ ÁöÁ¤µÈ Ŭ·¡½º¸¦ ÀоîµéÀÌÁö ¸øÇÒ °æ¿ì, ºÎ¸ð Ŭ·¡½º ÀûÀç±â¿¡°Ô 󸮸¦ ¿äûÇϵµ·Ï ¼³°èÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. DirectoryClassLoaderÀÇ °æ¿ì, ºÎ¸ð Ŭ·¡½º ÀûÀç±â¸¦ DirectoryClassLoader Ŭ·¡½º¸¦ ÀоîµéÀΠŬ·¡½º ÀûÀç±â Áï, ÀÀ¿ë ÇÁ·Î±×·¥ Ŭ·¡½º ÀûÀç±â·Î ÁöÁ¤ÇÏ°Ô µÇ¾î ÀÖ´Ù.
<¸®½ºÆ® 7> DirectoryClassLoader.java ºÎºÐ ÄÚµå
/**
* ƯÁ¤ µð·ºÅ丮¿¡ ÀÖ´Â Jar ȤÀº Zip ÆÄÀϵé·ÎºÎÅÍ Á¤ÀÇµÈ Å¬·¡½º¸¦ ÀûÀçÇϴ Ŭ·¡½º ÀûÀç±â
* Jar³ª Zip ÆÄÀÏÀÌ ¾øÀ» °æ¿ì ÇØ´ç µð·ºÅ丮¸¦ Ŭ·¡½º °æ·Î·Î ÀνÄÇÑ´Ù
*/
public class DirectoryClassLoader extends URLClassLoader {
private static HashMap loaderMap = new HashMap();
/**
* @param urls jar, zip ÆÄÀϵéÀÇ URL Ç¥Çö
* @param parent ºÎ¸ð Ŭ·¡½º ÀûÀç±â
*/
private DirectoryClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
/**
* ÁöÁ¤µÈ µð·ºÅ丮¸¦ À§ÇÑ Å¬·¡½º ÀûÀç±â¸¦ ¹ÝȯÇÑ´Ù.
* @param directory ÀûÀçÇÒ jar ȤÀº zip ÆÄÀϵéÀÌ À§Ä¡ÇÑ µð·ºÅ丮
*/
public static DirectoryClassLoader getClassLoader(File directory) throws IOException {
String path = directory.getCanonicalPath();
DirectoryClassLoader loader = (DirectoryClassLoader) loaderMap.get(path);
if (loader == null) {
if (!directory.isDirectory()) {
throw new IOException("Given path is not a directory - " + path);
}
// ÇØ´ç µð·ºÅ丮ÀÇ zip ȤÀº jar ÆÄÀÏ ¸ñ·ÏÀ» °¡Á®¿Â´Ù.
File[] files = directory.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
if (name == null || name.length() == 0) {
return false;
}
String lowered = name.toLowerCase();
if (lowered.endsWith(".zip")
|| lowered.endsWith(".jar")) {
return true;
}
return false;
}
});
URL[] urls = null;
if (files.length == 0) {
urls = new URL[1];
urls[0] = directory.toURL();
// µð·ºÅ丮 URLÀº ¹Ýµå½Ã '/'·Î ³¡³ª¾ß ÇÑ´Ù.
// ±×·¸Áö ¾ÊÀ¸¸é URLClassLoader°¡ ZIP ÆÄÀÏ·Î °£ÁÖÇÑ´Ù.
} else {
urls = new URL[files.length];
for (int i = 0; i < files.length; i++) {
urls[i] = files[i].toURL();
}
}
// Ŭ·¡½º ÀûÀç±â ÀνºÅϽº »ý¼º
loader = new DirectoryClassLoader(urls,
// DirectoryClassLoaderÀÇ ºÎ¸ð Ŭ·¡½º ÀûÀç±â´Â ÀÀ¿ë ÇÁ·Î±×·¥ Ŭ·¡½º ÀûÀç±â°¡ µÈ´Ù.
DirectoryClassLoader.class.getClassLoader());
// ij½ÃÇÑ´Ù.
loaderMap.put(path, loader);
}
return loader;
}
}
Çڵ鷯¸¦ ½ÇÇàÇÏ´Â ºÎºÐÀº ¾Õ¿¡¼ Àá±ñ ¾ð±ÞÇÏ¿´´ø TextProcessor Ŭ·¡½º¿¡ Æ÷ÇԵǾî ÀÖ´Ù.
Ŭ·¡½º ÀûÀç±â ÀνºÅϽº¸¦ ±¸ÇÑ ´ÙÀ½ Class.forName() ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© Handler ±¸Çö Ŭ·¡½º¸¦ ÀûÀçÇÑ ´ÙÀ½, Handler ÀÎÅÍÆäÀ̽ºÀÇ handle() ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù.
ClassLoader loader = DirectoryClassLoader.getClassLoader(new File(handlerDirectory));
Handler handler = (Handler) Class.forName(clazz, true, loader).newInstance();
String result = handler.handle(value, paramMap, vars);
codegen¿¡¼ ±âº»À¸·Î Æ÷ÇÔµÈ Çڵ鷯 Ŭ·¡½ºµéÀº ¸ðµÎ ÀÀ¿ë ÇÁ·Î±×·¥ Ŭ·¡½º ÀûÀç±â¿¡¼ ÀоîµéÀÌ°Ô µÇ¹Ç·Î, º°µµÀÇ Çڵ鷯 µð·ºÅ丮 ÁöÁ¤ÀÌ ÇÊ¿ä¾øÁö¸¸, »ç¿ëÀÚ°¡ Ãß°¡ÇÏ°íÀÚ ÇÒ °æ¿ì¿¡´Â ´ÙÀ½°ú °°ÀÌ ½Ã½ºÅÛ ¼Ó¼ºÀ» ÁöÁ¤Çؼ codegenÀ» ½ÇÇàÇÏ¸é µÈ´Ù. ¿¹¸¦ µé¾î C:\tmp ¶ó´Â µð·ºÅ丮¿¡ myhandler.zipÀ̶ó´Â ÆÄÀÏ¿¡ Á¤ÀÇµÈ Çڵ鷯 Ŭ·¡½º¸¦ ³Ö¾îµÐ´Ù¸é ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇÒ ¼ö ÀÖ´Ù.
c:\works\codegen\bin> java -Dhandler.directory=C:\tmp -jar ..\dist\codegen.jar -d ..\samples\templates
JavaCC Æļ »ý¼º±â
¸¶Áö¸·À¸·Î codegen¿¡ ¼û¾îÀִ ƯÀÌÇÑ ±â´É Áß Çϳª´Â ¿À·¯Å¬ SQL ¹® ÆļÀÌ´Ù. yoonforh.codegen.parser ÆÐÅ°Áö¿¡ Á¤ÀǵǾî ÀÖ´Â Æļ Ŭ·¡½ºµéÀº JavaCC¶ó´Â À¯¸íÇÑ Æļ »ý¼º±â ÅøÀ» »ç¿ëÇÏ¿© »ý¼ºÇÑ ¼Ò½º ÄÚµåµéÀÌ´Ù.
±×·¯°í º¸¸é, codegenÀ̶ó´Â ÄÚµå »ý¼º±âÀÇ ÀϺΠÄÚµå´Â Æļ ÄÚµå »ý¼º±â°¡ »ý¼ºÇØÁÖ´Â Äڵ带 È°¿ëÇÏ°í ÀÖ´Â ¼ÀÀÌ´Ù.
JavaCC ÅøÀº ÇöÀç °ø°³ ¼Ò½º ÇÁ·ÎÁ§Æ®·Î ÀüȯµÇ¾î °è¼Ó À¯ÁöµÇ°í ÀÖÀ¸¸ç, ´ÙÀ½ URL¿¡¼ ´Ù¿î·ÎµåÇÒ ¼ö ÀÖ´Ù.
http://javacc.dev.java.net
JavaCC ÅøÀ» ¾ÆÁÖ °£´ÜÇÏ°Ô ¼Ò°³ÇÏÀÚ¸é, ÄÄÆÄÀÏ·¯¿¡¼ ¸»ÇÏ´Â ¹®¹ý¿¡ ±â¹ÝÇÏ¿© ÇØ´ç ¹®¹ýÀ» µû¸£´Â ½ºÆ®¸²À» ÆĽÌÇÏ°í ÆÄ½ÌµÈ °á°ú¿¡ µû¶ó ÁöÁ¤ÇÑ Äڵ带 ½ÇÇà½ÃÅ°´Â Äڵ带 »ý¼ºÇØÁÖ´Â ÅøÀÌ´Ù. C ¾ð¾î¶ó¸é lex³ª yacc °°Àº Åø¿¡ ÇØ´çÇÑ´Ù°í »ý°¢ÇÒ ¼ö ÀÖ´Ù. ÄÄÆÄÀÏ·¯¸¦ Àß ÀÌÇØÇÏ´Â µ¶ÀÚ¶ó¸é JavaCC´Â LL(1) ¹®¹ý¿¡ ±â¹ÝÇÏ¿© ·è¾îÇìµå¸¦ Áö¿øÇÏ´Â µ¶Æ¯ÇÑ Æļ »ý¼º±â¶ó°í »ý°¢ÇÏ¸é µÈ´Ù.
JavaCC´Â ¹®¹ý°ú °¢ ÇÁ·¯´ö¼Ç¿¡ ÇØ´çÇÏ´Â ½ÇÇà Äڵ带 ÁöÁ¤ÇÏ´Â ÀÔ·Â ÆÄÀÏÀÎ .jj ÆÄÀÏÀÇ ÀÛ¼ºÀ» ¿ä±¸ÇÑ´Ù.
src/yoonforh/codegen/parser/oracle-create-table.jj ÆÄÀÏ¿¡´Â CREATE TABLE SQL ¹®¿¡ °ü·ÃµÈ ¿À·¯Å¬ µ¥ÀÌÅͺ£À̽ºÀÇ ¹®¹ýÀÌ ÁöÁ¤µÇ¾î ÀÖÀ¸¸ç, ÆÄ½Ì °úÁ¤¿¡¼ °¢ Å×À̺í À̸§°ú Çʵå À̸§, ¼Ó¼º µîÀ» ÃßÃâÇس»´Â Äڵ尡 Æ÷ÇԵǾî ÀÖ´Ù.
.jj ÆÄÀÏÀº ´ÙÀ½°ú °°Àº ±¸Á¶·Î µÇ¾î ÀÖ´Ù.
<¸®½ºÆ® 8> JavaCC ÀÔ·Â ÆÄÀÏÀÇ ±¸Á¶
options {
// ¿©±â¿¡´Â JavaCC ¿É¼ÇÀÌ ÁöÁ¤µÈ´Ù.
// ¿¹¸¦ µé¸é
// DEBUG_PARSER = true;
}
PARSER_BEGIN(Æļ Ŭ·¡½º À̸§)
// ¿©±â¿¡´Â »ç¿ëÀÚ°¡ ÁöÁ¤ÇÏ´Â ÇØ´ç Ŭ·¡½ºÀÇ ÀÚ¹Ù ¼Ò½º Äڵ尡 µé¾î¿Â´Ù.
// ¿¹¸¦ µé¸é
// public class MyParser { ... }
PARSER_END(Æļ Ŭ·¡½º À̸§)
ÇÁ·¯´ö¼Ç ¹®¹ý
// ¿©±âºÎÅÍ´Â JavaCC°¡ ÀÌÇØÇÒ ¼ö ÀÖ´Â ÅäÅ« ¼±¾ð ȤÀº ÇÁ·¯´ö¼Ç ¼±¾ð µî ¹®¹ý »çÇ×ÀÌ ÁöÁ¤µÈ´Ù.
ÇÁ·¯´ö¼Ç ¹®¹ýÀº ¸î °¡Áö ÇüŸ¦ Áö´Ï´Âµ¥, ¿¹¸¦ µé¾î ´ÙÀ½°ú °°Àº BNF ÇÁ·¯´ö¼Ç ¹®¹ýÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.
String /* ÀÚ¹Ù ¹Ýȯ À¯Çü */
DayPrecision() /* ÇÁ·¯´ö¼Ç À̸§Àº ÀÚ¹Ù ¸Þ¼Òµå À̸§À¸·Î Çؼ®, ÀÎÀÚµµ ¿Ã ¼ö ÀÖ´Ù. */ :
{ // ù ¹ø° ºí·ÏÀº ÀÚ¹Ù º¯¼ö ¼±¾ðºÎ
String value = null;
}
{ // ½ÇÁ¦ ÇÁ·¯´ö¼ÇÀÇ È®Àå¿¡ ÇØ´çÇÏ´Â ºÎºÐ
value = Digit()
{ // ÀÏÄ¡ÇÏ´Â ÇÁ·¯´ö¼ÇÀ» ¸¸³¯ °æ¿ì ½ÇÇàµÉ ÀÚ¹Ù ÄÚµå ºí·Ï
return value;
}
}
JavaCC »çÀÌÆ®¿¡´Â Àß Á¤¸®µÈ FAQ ¹®¼¿Í ±âŸ ¹®¼µéÀÌ ¿¬°áµÇ¾î ÀÖÀ¸¹Ç·Î, ÀÚ¼¼ÇÑ ³»¿ëÀº »çÀÌÆ®¸¦ ÂüÁ¶ÇÏ±æ ¹Ù¶õ´Ù.
codegen ÇÁ·Î±×·¥Àº ÀÌ Æļ¸¦ »ç¿ëÇÏ¿© CREATE TABLE ¹®µéÀÌ Æ÷ÇÔµÈ SQL ¹®À» Àоîµé¿©, ÇØ´ç µ¥ÀÌÅͺ£À̽º Å×ÀÌºíº°·Î ¿£Æ¼Æ¼ ºóÀ» »ý¼ºÇÏ´Â ±â´ÉÀ» Áö¿øÇÒ ¼ö ÀÖ°Ô ¼³°èµÇ¾î ÀÖ´Ù. Æ÷ÇÔµÈ ¿¹Á¦ Áß meta ÅÛÇø´À» Âü°íÇϱ⠹ٶõ´Ù.
ÄÄÆÄÀÏ°ú ºôµå
codegen ÇÁ·Î±×·¥¿¡´Â Ant ºôµå ÅøÀ» À§ÇÑ build.xml ½ºÅ©¸³Æ®°¡ Æ÷ÇԵǾî ÀÖ´Ù.
ant dist
¸¦ ½ÇÇàÇÏ¸é ¼Ò½º Äڵ带 ÄÄÆÄÀÏÇÏ¿© dist µð·ºÅ丮¿¡ codegen.jar ÆÄÀÏÀ» »ý¼ºÇØÁÙ °ÍÀÌ´Ù.
±×¸®°í documents µð·ºÅ丮¿¡´Â codegen ÇÁ·Î±×·¥ÀÇ »ç¿ë¹ýÀÌ ´ã±ä PDF ¹®¼°¡ ÀÖ´Ù. Âü°íÇÏ±æ ¹Ù¶õ´Ù.
»õÇظ¦ ¸ÂÀÌÇϸç
IT »ê¾÷¿¡ Á¾»çÇÏ´Â ´ëºÎºÐÀÇ »ç¶÷µéÀº ¾î·Æ°í Èûµç ÅͳΠ¼Ó¿¡ ÀÖÀ½À» ´À³¥ °ÍÀÌ´Ù. 2004³â »õÇØ´Â ÀÌ ÅͳÎÀ» ¹þ¾î³ª È°·ÂÀÌ ³ÑÄ¡°í µµ¾àÇÏ´Â ½Ã±â°¡ µÇ¾úÀ¸¸é ÇÑ´Ù. ´Ù½Ã ´åÄÄ ½Ã´ë¿Í °°Àº °ÅÇ°À¸·Î Èïû´ë´Â °ÍÀ» ±â´ëÇÏÁø ¾ÊÁö¸¸, ³»½Ç ÀÖ´Â IT ±â¾÷µéÀÌ °¡Ä¡ ½ÇÇöÇÒ ¼ö ÀÖ´Â »óȲÀ» ±â´ëÇغ»´Ù.
ÀÚ¹Ù¸¦ »ç¶ûÇÏ´Â µ¶ÀÚµéÀº ÀÚ¹Ù 2 1.5 ÆÇÀÇ ±â´ÉµéÀ» ¸¹ÀÌ ±â´Ù¸± °Í °°´Ù. ¾ðÁ¦³ª »õ·Î¿î °ÍÀº ÀþÀ½À» ¼³·¹°Ô ÇÏÁö¸¸, »õ·Î¿òÀÌ ¹ß µó°í ÀÖ´Â ÅÍÀüÀ» Àß ´ÙÁöÁö ¾ÊÀ¸¸é ±â´Ù¸²Àº Çã¸ÁÇÒ ¼ö ÀÖ´Ù.
5³â¸¸¿¡ ¸¶¼Ò Áö¿¡ ±ÛÀ» ¾²°Ô µÇ´Ï, °¨È¸°¡ »õ·Ó´Ù. ÀÚ¹Ù ÃÊâ±â¿¡ ºÏÀû¿´´ø ÇÊÀÚÀÇ À¥ °Ô½ÃÆÇÀÌ ¿äÁòÀº ¾ÆÁÖ ÃʶóÇØÁú Á¤µµ·Î ´Ù¾çÇÑ °³¹ßÀÚ Ä¿¹Â´ÏƼ°¡ ±¹³»¿¡µµ Çü¼ºµÈ °Í °°¾Æ ¸¶³É ±â»Ú´Ù.
´ÙÀ½¿¡´Â Á»´õ ³ªÀº Äڵ带 ¼Ò°³ÇÏ°Ô µÇ±æ ¹Ù¶ó¸ç ¸ðµÎ °Ç½ÂÇϽñæ...
Âü°íÀÚ·á
1 À±°æ±¸ÀÇ ÀÚ¹Ù µµ¸ÞÀÎ
http://www.javadom.com
2 JavaCC - The Java Parser Generator
http://javacc.dev.java.net