Å×Å©´ÏÄà Ä÷³-ÀÚ¹Ù

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