.
.
Enterprise Java Technologies Technical Tips
.
2004³â 12¿ù 15ÀÏ    

Enterprise Java Technologies Tech Tips¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù. Java 2 Platform, Enterprise Edition (J2EE)¿¡ ±â¹ÝÇÑ enterprise Java technologies ¿Í APIsÀÇ »ç¿ë¿¡ °üÇÑ ÃֽŠÁ¤º¸¸¦ ¾ò¾î °¡½Ã±â ¹Ù¶ø´Ï´Ù. ÀÌ ±Û¿¡¼­´Â Java 2 Java 2, Enterprise Edition, v 1.4 ¸¦ »ç¿ëÇÕ´Ï´Ù. ´Ù¿î·Îµå

À̹ø È£¿¡¼­´Â,

.J2EE Ä¿³ØÅÍ ¾ÆÅ°ÅØÃ³ 1.5
.¿£ÅÍÇÁ¶óÀÌÁî ºóÀÇ Å¸ÀÌ¸Ó ÀÎÅÍÆäÀ̽º »ç¿ëÇϱâ

¸¦ ´Ù·ç°Ô µË´Ï´Ù.

ÀúÀÚ Robert Eckstein

.

J2EE Ä¿³ØÅÍ ¾ÆÅ°ÅØÃ³ 1.5

±âÁ¸ ½Ã½ºÅÛ°ú J2EE ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¸¦ ÅëÇÕÇÏ´Â ÀÛ¾÷À» ÇØº» °æÇèÀÌ ÀÖ´Ù¸é ±× ÀÛ¾÷ÀÌ °áÄÚ ½±Áö ¾Ê´Ù´Â °ÍÀ» ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. Ä¿³Ø¼ÇÀ» °ü¸®ÇÏ°í »óÀÌÇÑ µ¥ÀÌÅÍ Å¸ÀÔµéÀ» º¯È¯½ÃÄÑÁÖ´Â ÀÛ¾÷, ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿Í ±â¾÷ Á¤º¸ ½Ã½ºÅÛ(EIS) »çÀÌÀÇ ´Ü¼øÇÑ ¸Þ½ÃÁö Àü¼ÛÁ¶Â÷ ÀÚ¹Ù ÇÁ·Î±×·¡¸ÓÀÇ ¸Ó¸®¸¦ ¾ÆÇÁ°Ô ¸¸µé ¼ö ÀÖ´Ù. ÇÏÁö¸¸ °í¸¿°Ôµµ ÀÌÁ¦ J2EE Ä¿³ØÅÍ ¾ÆÅ°ÅØÃ³ 1.5°¡ J2EE 1.4 ¹öÀü¿¡ Æ÷ÇԵǾî J2EE Ç÷§ÆûÀ» ÀÌÁ¾ EISµé°ú Á¢¼Ó½Ã۱â À§ÇÑ Ç¥ÁØ ¾ÆÅ°ÅØÃ³¸¦ Á¦°øÇÑ´Ù.

J2EE Ä¿³ØÅÍ ¾ÆÅ°ÅØÃ³¸¦ »ç¿ëÇϸé EIS º¥´õµéÀÌ ¿©·¯ ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹öµéÀ» À§ÇÑ Ä¿³Ø¼Ç ¼ÒÇÁÆ®¿þ¾î¸¦ Á÷Á¢ Á¦ÀÛÇÒ Çʿ䰡 ¾ø´Ù. ¶ÇÇÑ ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö º¥´õµéµµ ´Ù¾çÇÑ EIS ÆÐŰÁöµéÀ» À§ÇØ ÀڽŵéÀÇ Äڵ带 ´Ù½Ã ÀÛ¼ºÇÒ Çʿ䰡 ¾ø´Ù. ÀÌÁ¦ º¥´õµéÀº ´Ü¼øÈ÷ J2EE Ä¿³ØÅÍ ¾ÆÅ°ÅØÃ³ ±âÁØ¿¡ ¸Â´Â "Áß°£" Äڵ常 ÆÐŰÁö ½ÃÄÑÁÖ¸é µÈ´Ù. ÀÌ ÄÚµå´Â ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿Í EIS ÀÚ¿ø °£ÀÇ Åë½Å¿¡ ÇÊ¿äÇÑ µ¥ÀÌÅÍ¿Í ¸Þ½ÃÁö¸¦ À§ÇØ Ç¥ÁØÈ­µÈ ÀÎÅÍÆäÀ̽º¿Í Ŭ·¡½º¸¦ ±¸ÇöÇϰųª È®Àå ½ÃÄÑ ÁØ´Ù. ÀÌ Áß°£ ÄÚµå´Â ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿¡ Á÷Á¢ ¿¬°áµÇ¸ç ÀÚ¿ø ¾î´ðÅͶó ºÒ¸°´Ù.

ÀÚ¿ø ¾î´ðÅÍ ¸ðµâÀº ÈçÈ÷ ÀÚ¿ø ¾î´ðÅÍ ¾ÆÄ«À̺ê (RAR)À̶ó´Â ¸íĪÀ» °¡Áö°í ÀÖÀ¸¸ç ´Ü¼øÇÑ JAR ÆÄÀÏÀÌ´Ù. º¸Åë RARÀº ´ÙÀ½°ú °°Àº »çÇ×µéÀ» Æ÷ÇÔÇϰí ÀÖ´Ù.

  • ÀÚ¿ø ¾î´ðÅÍ ÄÁÆ®·ºÆ®¿Í Ŭ¶óÀÌ¾ðÆ® API¸¦ ±¸ÇöÇÏ´Â Àڹ٠Ŭ·¡½º ¹× ÀÎÅÍÆäÀ̽º

  • EIS¿ÍÀÇ Åë½ÅÀ» À§ÇØ ÇÊ¿äÇÑ ¸ðµç °íÀ¯ ¶óÀ̺귯¸®

  • ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö°¡ ÀÚ¿ø ¾î´ðÅ͸¦ ¼³Á¤Çϱâ À§ÇØ ÇÊ¿äÇÑ ¼³Ä¡ Á¤ÀÇ ÆÄÀÏÀÎ ra.xml. ÀÌ ÆÄÀÏÀº META-INF µð·ºÅ丮¿¡ À§Ä¡

´ÙÀ½ ±×¸²Àº ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿Í EIS¿¡¼­ »ç¿ëµÇ´Â ÀÚ¿ø ¾î´ðÅ͸¦ µµÇ¥·Î ¼³¸íÇÑ °ÍÀÌ´Ù.

°¢°¢ÀÇ ±¸¼º¿øµéÀÌ ´Ù¸¥ ¿ä¼Òµé°ú Åë½ÅÇÏ´Â ¹æ½ÄÀ» »ìÆìº¸±â ¹Ù¶õ´Ù.

J2EE Ä¿³ØÅÍ ¾ÆÅ°ÅØÃ³¸¦ ±¸¼ºÇÏ´Â µ¥´Â ¼¼ °¡ÁöÀÇ Áß¿äÇÑ Åë½Å ºê¸´Áö°¡ ÀÖ´Ù. °¢°¢¿¡ ´ëÇØ »ìÆìº¸µµ·Ï ÇÏÀÚ.

Ŭ¶óÀÌ¾ðÆ® API¿Í °øÅë Ŭ¶óÀÌ¾ðÆ® ÀÎÅÍÆäÀ̽º

¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿¡ ¿¬°áµÇ´Â ¾ÖÇø®ÄÉÀÌ¼Ç ÄÄÆ÷³ÍÆ®µéÀº ¹Ýµå½Ã ÀÚ¿ø ¾î´ðÅÍ¿ÍÀÇ Åë½Å ¹æ½ÄÀ» °¡Áö°í ÀÖ¾î¾ß Çϸç, °øÅë Ŭ¶óÀÌ¾ðÆ® ÀÎÅÍÆäÀ̽º (CCI)´Â ÀÌ·± Åë½Å ¹æ½ÄÀ» À§ÇØ ±ÇÀåµÇ´Â APIÀÌ´Ù. CCI´Â javax.resource.cci ÆÐŰÁö¿¡ ±¸ÇöµÈ APIÀÌ´Ù. ÀÌ API¸¦ ±ÇÀåÇÏ´Â ÀÌÀ¯´Â »ç¿ëÇϱⰡ ½¬¿ì¸é¼­ ÇʼöÀûÀÌÁö´Â ¾Ê´Ù´Â Á¡ ¶§¹®ÀÌ´Ù. ¸¸¾à CCI°¡ Á¦°øÇÏ´Â ±â´ÉÀÌ ºÎÁ·ÇÏ´Ù¸é ÀÚ¿ø ¾î´ðÅÍ ±¸ÇöÀÚµéÀº ÀÚÀ¯·Ó°Ô ÀڽŸ¸ÀÇ Å¬¶óÀÌ¾ðÆ® API¸¦ Á¦ÀÛÇÏ¿© ¾ÖÇø®ÄÉÀÌ¼Ç ÄÄÆ÷³ÍÆ®¿Í Åë½ÅÀ» ÇÒ ¼öµµ ÀÖ´Ù.

ÄÁÅ×À̳Ê-ÄÄÆ÷³ÍÆ® ÄÁÆ®·ºÆ®

ÄÁÅ×À̳Ê-ÄÄÆ÷³ÍÆ® ÄÁÆ®·ºÆ®´Â ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿Í ¾ÖÇø®ÄÉÀÌ¼Ç ÄÄÆ÷³ÍÆ®µé °£ÀÇ Ç¥ÁØ Åë½Å ¹æ½ÄÀÌ´Ù. JCA¿¡ °ü·ÃµÈ ³»¿ëÀº °ÅÀÇ ¾ø´Âµ¥ ¿¹¸¦ µé¾î, ¸¸¾à À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÌ Enterprise JavaBeans(EJB) ÄÄÆ÷³ÍÆ®µéÀ» »ç¿ëÇÑ´Ù¸é EJB specificationÀº °ð °¢°¢ÀÇ EJB ÄÄÆ÷³ÍÆ®°¡ ¾ÖÇø®ÄÉÀ̼ǰú Åë½ÅÇÏ´Â ¹æ¹ýÀ» Á¤ÀÇÇÏ´Â ÄÁÅ×À̳Ê-ÄÄÆ÷³ÍÆ® ÄÁÆ®·ºÆ®°¡ µÈ´Ù.

½Ã½ºÅÛ ÄÁÆ®·ºÆ®

½Ã½ºÅÛ ÄÁÆ®·ºÆ®´Â J2EE Ä¿³ØÅÍ ¾ÆÅ°ÅØÃ³ÀÇ ÁÖ¿ä ºÎºÐÀÌ´Ù. ÀÌ ¾ÆÅ°ÅØÃ³´Â ÀÚ¿ø ¾î´ðÅͰ¡ ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿Í ÀûÀýÈ÷ Åë½ÅÇϱâ À§ÇØ µû¶ó¾ß ÇÏ´Â ¸î °¡ÁöÀÇ ½Ã½ºÅÛ ÄÁÆ®·ºÆ®¸¦ Á¤ÀÇÇϰí ÀÖ´Ù. ½Ã½ºÅÛ ÄÁÆ®·ºÆ®¸¦ À§ÇÑ API´Â javax.resource.spi ÆÐŰÁö¿¡ ±¸ÇöµÇ¾î ÀÖ´Ù. J2EE Ä¿³ØÅÍ ¾ÆÅ°ÅØÃ³ÀÇ 1.0 ¹öÀü¿¡¼­´Â ¼¼ °¡ÁöÀÇ ÄÁÆ®·ºÆ®¸¦ Á¦½ÃÇϰí ÀÖ´Ù.

  • Á¢¼Ó °ü¸® ÄÁÆ®·ºÆ®: EIS¿Í ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö °£ÀÇ Á¢¼ÓÀ» °¡´ÉÇÏ°Ô ÇÏ´Â ÀÎÅÍÆäÀ̽º¿Í Ŭ·¡½º Á¦°øÇÏ¸ç ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö°¡ Çʿ信 µû¶ó ÀÌ·¯ÇÑ Ä¿³Ø¼ÇµéÀ» Ç®¸µÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.

  • Æ®·£Á§¼Ç °ü¸® ÄÁÆ®·ºÆ®: EIS¿¡ Æ®·£Á§¼ÇÀÇ ¸ðµç ºÎºÐÀ» °ü¸®ÇÒ ¼ö ÀÖ´Â ±â´ÉÀ» Á¦°øÇÑ´Ù. ÀÌ ÄÁÆ®·ºÆ®¸¦ ÀÌ¿ëÇÏ¿© EIS¸¦ ÀÚ¿ø ¾î´ðÅÍ È¤Àº Æ®·£Á§¼Ç °ü¸®ÀÚ·Î °ü¸®ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª µÎ °¡Áö ¹æ¹ý Áß ÇÑ °¡Áö ¹æ¹ýÀ¸·Î¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Æ®·£Á§¼ÇÀº ¹Ýµå½Ã EIS ¿ÜºÎ¿¡¼­ ÀÌ·ç¾îÁ®¾ß Çϸç À̸¦ EIS·Î Àü´ÞÇØ¾ß ÇÑ´Ù. ±× ¹Ý´ë´Â ¼º¸³µÇÁö ¾Ê´Â´Ù.

  • º¸¾È ÄÁÆ®·ºÆ®: ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿Í EIS °£ÀÇ ÀûÀýÇÑ ÀÎÁõÀÌ ÀÌ·ç¾îÁ® ÀÖ´ÂÁö È®ÀÎÇÑ´Ù.

¾ÆÅ°ÅØÃ³ÀÇ 1.5 ¹öÀüÀº ÀÚ¿ø ¾î´ðÅÍÀÇ ±â´ÉÀ» È®Àå ½ÃÄÑ ÁÙ ¼ö ÀÖ´Â 4 °¡ÁöÀÇ »õ·Î¿î ÄÁÆ®·ºÆ®¸¦ Á¦°øÇÑ´Ù. ÀÌ »õ·Î¿î ÄÁÆ®·ºÆ®µéÀº ´ÙÀ½°ú °°´Ù.

  • »ý¸í Áֱ⠰ü¸® ÄÁÆ®·ºÆ®: ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö°¡ ±ú²ýÇÏ°Ô ÀÚ¿ø ¾î´ðÅ͸¦ ½ÃÀÛ È¤Àº Á¾·á ½Ãų ¼ö ÀÖ´Â ¹æ¹ý Á¦°ø

  • ÀÛ¾÷ °ü¸® ÄÁÆ®·ºÆ®: ÀÚ¿ø ¾î´ðÅͰ¡ ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿¡¼­ ÀÛ¾÷À» ½ÇÇà½Ãų ¼ö ÀÖµµ·Ï ÀÎÅÍÆäÀ̽º¿Í Ŭ·¡½º Á¦°ø

  • Æ®·£Á§¼Ç À¯ÀÔ ÄÁÆ®·ºÆ®: EIS¿¡¼­ ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö·Î Æ®·£Á§¼Ç Àü´Þ °¡´É (Æ®·£Á§¼Ç °ü¸® ÄÁÆ®·ºÆ®ÀÇ ¹Ý´ë ±â´É) ¶ÇÇÑ EIS°¡ ¿ÀÀÛµ¿ÇÒ °æ¿ì¸¦ ´ëºñÇÏ¿© Æ®·£Á§¼Ç º¹±¸ º¸Á¶

  • ¸Þ½ÃÁö À¯ÀÔ ÄÁÆ®·ºÆ®: ÀÚ¿ø ¾î´ðÅͰ¡ ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö ³»¿¡¼­ µ¿±â ȤÀº ºñµ¿±â ¸Þ½ÃÁö¸¦ ¿£µåÆ÷ÀÎÆ®·Î Àü´Þ °¡´É

ÀÌ 4 °¡ÁöÀÇ »õ·Î¿î ±â´ÉµéÀ» Á»´õ ÀÚ¼¼È÷ »ìÆìº¸µµ·Ï ÇÏÀÚ.

»ý¸í Áֱ⠰ü¸® ¹× ÀÛ¾÷ °ü¸® ÄÁÆ®·ºÆ®

javax.resource.spi ÆÐŰÁö ¾ÈÀÇ ResourceAdapter ÀÎÅÍÆäÀ̽º°¡ ¹Ù·Î ÀÚ¿ø ¾î´ðÅÍÀÌ´Ù. ResourceAdapter ÀÎÅÍÆäÀ̽º¿¡¼­ »ý¸í Áֱ⠰ü¸®¸¦ ÇÏ´Â ¸Þ¼Òµå´Â start(), stop()ÀÇ µÎ °¡Áö°¡ ÀÖ´Ù. start() ¸Þ¼Òµå´Â ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö°¡ ÀÚ¿ø ¾î´ðÅ͸¦ ½ÃÀÛÇÏ·Á ÇÒ ¶§(¿¹:ÀÚ¿ø ¾î´ðÅ͸¦ ¹èÄ¡ÇÒ ¶§) È£ÃâµÇ¸ç, stop() ¸Þ¼Òµå´Â ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö°¡ ÀÚ¿ø ¾î´ðÅ͸¦ ÇØÁ¦ÇÒ ¶§ (¿¹:ÀÚ¿ø ¾î´ðÅ͸¦ ¹èÄ¡ ÇØÁ¦ÇÒ ¶§) È£ÃâµÈ´Ù.

ÀÛ¾÷ °ü¸® ÄÁÆ®·ºÆ®´Â javax.resource.spi.work ÆÐŰÁöÀÇ Work ÀÎÅÍÆäÀ̽º¸¦ È®ÀåÇÏ´Â °´Ã¼¸¦ »ý¼ºÇÔÀ¸·Î½á ÀÚ¿ø ¾î´ðÅͰ¡ ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿¡ ÀÛ¾÷À» Àü´ÞÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. Work ÀÎÅÍÆäÀ̽º´Â Runnable ÀÎÅÍÆäÀ̽ºÀÇ È®ÀåÀÌ´Ù. Work ÀÎÅÍÆäÀ̽º¿¡´Â Runnable ÀÎÅÍÆäÀ̽º¿¡¼­ »ó¼Ó¹Þ°í ÀÚ½ÅÀÇ ¾²·¹µå¿¡¼­ ½ÇÇà½ÃŰ´Â run() ¸Þ¼Òµå»Ó¸¸ ¾Æ´Ï¶ó release() ¸Þ¼Òµåµµ Æ÷ÇԵǾî ÀÖ´Ù. ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö´Â release() ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© ¾²·¹µå°¡ ¿Ï·áµÇ¸é ±× ÀÚ¿øÀ» °¡´ÉÇÏ¸é »¡¸® ÇØÁ¦ÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.

´ÙÀ½Àº ResourceAdapter ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÏ¿© »ý¸í Áֱ⠰ü¸® ¹× ÀÛ¾÷ °ü¸® ÄÁÆ®·ºÆ®¸¦ »ç¿ëÇÏ´Â ¿¹½ÃÀÌ´Ù.

   public class NexesResourceAdapterImpl implements 
           ResourceAdapter {

      // Ten seconds
      public static final long WORK_START_TIMEOUT = 10000L;
      
      public NexesResourceAdapterImpl() {    }
      public void start(BootstrapContext ctx)
      throws ResourceAdapterInternalException
      {
 
          WorkManager workManager = ctx.getWorkManager();
          Work nexesWorkJob = new NexesWorkImpl();
          WorkListener workListener = 
                  new NexesWorkListenerImpl();

          try {

              // Unlike scheduleWork() or doWork(), this call 
              // blocks until the work has started. If it takes 
              // longer than 10 seconds for the work to start, 
              // the call throws a WorkRejectedException.

              workManager.startWork
                      (nexesWorkJob, WORK_START_TIMEOUT, 
                      new ExecutionContext(), workListener);

          } catch (WorkException e) {
              //  Handle the exception
          }
        }

       public void stop()
       {
          //  Do whatever you need to do here to close down the
          //  resource adapter.
       }  
       
          // Transaction Inflow contract methods omitted. 
          // See the section "Message Inflow and Transaction 
          // Inflow Contracts"

      }

BootstrapContext ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â start() ¸Þ¼Òµå·Î °´Ã¼°¡ Àü´ÞµÇ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù. ÀÌ °´Ã¼´Â EIS°¡ Æ®·£Á§¼Ç Á¤º¸¿Í ÀÛ¾÷À» ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿¡ Àü´ÞÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â ¸Å¿ì Áß¿äÇÑ °´Ã¼ÀÌ´Ù. BootstrapContext ÀÎÅÍÆäÀ̽º¿¡ °ü·ÃµÈ »ó¼¼ÇÑ Á¤º¸´Â "¸Þ½ÃÁö À¯ÀÔ ¹× Æ®·£Á§¼Ç À¯ÀÔ ÄÁÆ®·ºÆ®" ¼½¼ÇÀ» ÂüÁ¶ÇϽñ⠹ٶõ´Ù.

¶ÇÇÑ WorkListener ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ ÂüÁ¶µµ È®ÀÎÇϱ⠹ٶõ´Ù.

   WorkListener workListener = 
           new NexesWorkListenerImpl();

and the startWork method:

   workManager.startWork
           (nexesWorkJob, WORK_START_TIMEOUT, 
           new ExecutionContext(), workListener);

¸¸¾à ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö°¡ ó¸® ÁßÀÎ ÀÛ¾÷¿¡ ´ëÇÑ ÁøÇà »óȲÀ» º¸°í ¹Þ°í ½Í´Ù¸é javax.resource.spi.WorkListener ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â °´Ã¼¸¦ »ý¼ºÇÏ¸é µÈ´Ù. ±× ´ÙÀ½ ÀÌ °´Ã¼¸¦ ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö »óÀÇ WorkManager °´Ã¼ÀÇ startWork() ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© µî·ÏÇÏ¸é µÈ´Ù. WorkManager ÀÎÅÍÆäÀ̽º´Â Work ÀνºÅϽº¸¦ ½ÇÇà ½Ãų ¼ö ÀÖ´Â ±â´ÉÀ» Á¦°øÇÑ´Ù. °´Ã¼¸¦ µî·ÏÇÔÀ¸·Î½á ÀÛ¾÷ÀÌ °ÅÀý ȤÀº ¼ö¶ôµÇ¾ú´ÂÁö, ¼ö¶ôµÇ¾ú´Ù¸é ¾ðÁ¦ ÀÛ¾÷ÀÌ ½ÃÀ۵Ǿú°í Á¾·áµÇ¾ú´ÂÁö¸¦ ¼­¹ö°¡ ÀÚ¿ø ¾î´ðÅÍ¿¡°Ô ¾Ë·ÁÁÙ ¼ö ÀÖ´Ù. ¶ÇÇÑ WorkAdapter Ŭ·¡½º¸¦ È®Àå½Ãų ¼ö Àִµ¥, ÀÌ Å¬·¡½º´Â WorkListener ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ°í °¢°¢¿¡ ´ëÇØ ºó ¸Þ¼Òµå¸¦ Á¦°øÇÑ´Ù. ´ÙÀ½Àº WorkListener¸¦ ±¸ÇöÇÏ´Â °£·«ÇÑ ÄÚµåÀÌ´Ù.

   public class NexesWorkListenerImpl implements WorkListener {

      public void workAccepted(WorkEvent e) {
          //  myAppServerLog.log("Work instance " + e + 
          //      " has been accepted."); 
      }

      public void workRejected(WorkEvent e) {
          //  myAppServerLog.log("Work instance " + e + 
          //      " has been rejected."); 
      }

      public void workStarted(WorkEvent e) {
          //  myAppServerLog.log("Work instance " + e + 
          //      " has been started."); 
      }

      public void workCompleted(WorkEvent e) {
          //  myAppServerLog.log("Work instance " + e + 
          //      " has been completed."); 
      }

}

¸Þ½ÃÁö À¯ÀÔ ¹× Æ®·£Àè¼Ç À¯ÀÔ ÄÁÆ®·ºÆ®

¸Þ½ÃÁö À¯ÀÔ ÄÁÆ®·ºÆ®´Â ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö°¡ ¸Þ½ÃÁö ¿£µåÆ÷ÀÎÆ®¸¦ Ȱ¼ºÈ­/ºñȰ¼ºÈ­ ½ÃŰ´Â È£Ãâ¿¡ ´ëÇØ ÀÚ¿ø ¾î´ðÅͰ¡ ¹ÝÀÀÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ResourceAdapter ÀÎÅÍÆäÀ̽ºÀÇ endpointActivation() ¸Þ¼Òµå°¡ ¿£µåÆ÷ÀÎÆ® Ȱ¼ºÈ­½Ã È£ÃâµÇ¸ç, ÀÌ´Â ÀÚ¿ø ¾î´ðÅͰ¡ ¸Þ½ÃÁö ¿£µåÆ÷ÀÎÆ®¿¡ ¸Þ½ÃÁö¸¦ Àü´ÞÇÒ ¶§ ÇÊ¿äÇÑ ¼³Á¤À» Çϵµ·Ï ÇÑ´Ù. ResourceAdapterÀÇ endpointDeactivation() ¸Þ¼Òµå´Â ¸Þ½ÃÁö ¿£µåÆ÷ÀÎÆ®°¡ ºñȰ¼ºÈ­µÉ ¶§ È£ÃâµÇ¸ç, ÀÌ´Â ¸®¼Ò½º ¾î´ðÅͰ¡ ¸Þ½ÃÁö ¿£µåÆ÷ÀÎÆ®¿¡°Ô ¸Þ½ÃÁö¸¦ Àü´ÞÇÏ´Â °ÍÀ» ¸ØÃß°Ô ÇÑ´Ù. javax.resource.spi.endpoint ÆÐŰÁöÀÇ MessageEndpointFactory °´Ã¼°¡ endpointActivation ¸Þ¼Òµå¿¡ Àü´ÞµÈ´Ù. ÀÚ¿ø ¾î´ðÅÍ´Â ÀÌ °´Ã¼¸¦ »ç¿ëÇÏ¿© ¸Þ½ÃÁö ¿£µåÆ÷ÀÎÆ®¸¦ »ý¼ºÇÏ°Ô µÇ¸ç, ÀÌ·¯ÇÑ ¿£µåÆ÷ÀÎÆ®µé¿¡ ´ëÇÑ ¸ðµç Á¤º¸´Â endpointDeactivation() ¸Þ¼Òµå°¡ È£ÃâµÇ¸é ÀÚ¿ø ¾î´ðÅÍ¿¡¼­ Á¦°ÅµÇ¾ß ÇÑ´Ù. ¸¶Áö¸·À¸·Î ResourceAdapterÀÇ getXAResources() ¸Þ¼Òµå´Â ½Ã½ºÅÛ¿¡ ¿À·ù°¡ »ý±æ °æ¿ì¿¡ Æ®·£Àè¼Ç ÀÚ¿øÀ» º¹±¸Çϴµ¥ »ç¿ëµÈ´Ù. endpointActivation(), endpointDeactivation(), getXAResources()¸Þ¼ÒµåµéÀº ResourceAdapter ÀÎÅÍÆäÀ̽º¿¡ À§ÀӵȴÙ.

   public class NexesResourceAdapterImpl implements 
          ResourceAdapter {

      //  Lifecycle Contract methods from earlier omitted.

      public XAResource[] getXAResources(ActivationSpec[] specs)
      throws ResourceException
      {
          // This method should either return an array of 
          // XAResource objects that uniquely correspond to the 
          // resource manager given the ActivationSpecs passed 
          // in, or null if it does  not support this par 
          // of the Message Inflow contract.
        
          return null;
      }

      public void endpointActivation(MessageEndpointFactory mef, 
          ActivationSpec as) 
      throws NotSupportedException
      {
          // This is also part of the Message Inflow contract.
          // The idea here is to create a message endpoint 
          // using the MEF's createEndpoint() method, which is 
          // then stored in the ActivationSpec class. This binds 
          // the EIS and the application server together so that 
          // the two can communicate independently of the 
          // messaging style of the EIS.
      }

      public void endpointDeactivation(MessageEndpointFactory mef, 
          ActivationSpec as)
      {
          //  This removes any resources that were created by the 
          //  endpointActivation() method above for the specified
          //  messaging endpoint. The resource adapter must notify
          //  any message providers that the endpoint is no longer
          //  valid
      }

   }

ResourceAdapter ¸Þ¼Òµå¿¡ Àü´ÞµÇ´Â ActivationSpec Ŭ·¡½º´Â JavaBeanÀ¸·Î½á, ´Ù¾çÇÑ ¼Ó¼ºµéÀÇ Á¤º¸¸¦ ÀÔ¼ö/¼³Á¤ÇÏ´Â ¸Þ¼ÒµåµéÀ» ±¸ÇöÇÑ´Ù. ÀÌ·¯ÇÑ ÀÔ¼ö/¼³Á¤ ¸Þ¼Òµåµé À̿ܿ¡µµ ±¸ÇöÀº ¹Ýµå½Ã validate() ¸Þ¼Òµå¸¦ Á¦°øÇÏ¿© ¸ðµç ¼Ó¼ºµéÀÌ Àû¹ýÇÏ°Ô ¼³Á¤µÇ¾î ÀÖ´ÂÁö È®ÀÎÇØ¾ß ÇÑ´Ù. ¸¸¾à ¼Ó¼ºÀÌ ÀûÀýÈ÷ ¼³Á¤µÇ¾î ÀÖÁö ¾Ê´Ù¸é ¸Þ¼Òµå´Â InvalidPropertyExceptionÀ» ¹ÝȯÇÏ°Ô µÈ´Ù. ActivationSpec °´Ã¼°¡ equals()¸¦ ¿À¹ö¶óÀ̵åÇÒ ¼ö ¾ø´Ù´Â Á¡¿¡ À¯ÀÇÇϱ⠹ٶõ´Ù.

   public class MyActivationSpec implements ActivationSpec, 
           Serializable {

      public void setMyProperty(MyProperty s) { }
      public MyProperty getMyProperty() { }

      public void validate() throws InvalidPropertyException { }

   }

J2EE Ä¿³ØÅÍ ¾ÆÅ°ÅØÃ³ ¹öÀü 1.0ÀÇ °æ¿ì, ÀÚ¿ø ¾î´ðÅÍ´Â ÀÚ±â ÀڽŠȤÀº ¿ÜºÎ Æ®·£Àè¼Ç °ü¸®ÀڷκÎÅÍ EIS¿¡¸¸ Æ®·£Àè¼Ç Á¤º¸¸¦ Àü´ÞÇÒ ¼ö ÀÖ¾ú´Ù. ±×·¯³ª 1.5 ¹öÀü¿¡ Æ÷ÇÔµÈ Æ®·£Àè¼Ç À¯ÀÔ ÄÁÆ®·ºÆ®¿¡ ÀÇÇØ ÀÚ¿ø ¾î´ðÅͰ¡ EIS Æ®·£Àè¼Ç ¿ä±¸¸¦ ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿¡ Àü´ÞÇÒ ¼ö ÀÖ°Ô µÊÀº ¹°·Ð, »ý¸íÁÖ±â ÄÁÆ®·ºÆ®ÀÇ start() ¸Þ¼Òµå¿¡ Àü´ÞµÈ BootstrapContext ¿ÀºêÁ§Æ® ¶ÇÇÑ »ç¿ëÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. BootstrapContext ÀÎÅÍÆäÀ̽º´Â »ý¸íÁֱ⠰ü¸® contractÀÇ ºÎºÐ¿¡¼­ Àá±ñ ¾ð±ÞµÈ¹Ù ÀÖ´Ù. ´ÙÀ½Àº BootStrapContext ÀÎÅÍÆäÀ̽º ³»ÀÇ ¸Þ¼ÒµåÀÌ´Ù.

   public class NexesBootstrapContextImpl implements 
           BootstrapContext {

      public WorkManager getWorkManager() {
          //  Get the work manager from the application server
      }

      public XATerminator getXATerminator() {
          return new NexesXATerminatorImpl();
      }

      public Timer createTimer() {
          return new Timer();
      }

}

ÀÌÁ¦ XATerminator ÀÎÅÍÆäÀ̽º¿¡ ´ëÇØ ÀÚ¼¼È÷ ¾Ë¾Æº¸ÀÚ. BootStrapContext ÀÎÅÍÆäÀ̽ºÀÇ getXATerminator() ¸Þ¼ÒµåÀÇ ¹Ýȯ°ª¿¡ À¯ÀÇÇϱ⠹ٶõ´Ù. XATerminator ÀÎÅÍÆäÀ̽º´Â Æ®·£Àè¼Ç Å͸®¸¦ À§ÇØ 5°¡ÁöÀÇ °£´ÜÇÑ ¸Þ¼Òµå¸¦ Á¦°øÇÑ´Ù

   public class NexesXATerminatorImpl implements XATerminator {

      public void commit(Xid xid, boolean onePhase)
              throws XAException { }
      public void forget(Xid xid) throws XAException { }
      public int prepare(Xid xid) throws XAException { }
      public Xid[] recover(int flag) throws XAException { }
      public void rollback(Xid xid) throws XAException { }

   }

ÀÚ¿ø ¾î´ðÅÍ ÆÄÀÏ

ÀÚ¿ø ¾î´ðÅÍ µð½ºÅ©¸³ÅÍ ÆÄÀÏÀÎ ra.xmlÀº ¸Å¿ì ½±°Ô »ý¼ºÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ´Ü¼øÈ÷ ResourceAdapter ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϴ Ŭ·¡½º¸¦ ÆÄÀÏ¿¡ °¡¸®Å°´Â °Í¸¸À¸·Î ÀÌ·ç¾î Áø´Ù. ±×·¯¸é ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö°¡ ÀÌ °´Ã¼¿¡ Á¢±ÙÇÏ°Ô µÈ´Ù. J2EE Connector Architecture 1.5 specificationsÀ» ÂüÁ¶ÇÏ¸é ¼ö½Å ¸Þ½ÃÁö Ŭ·¡½º¸¦ ActivationSpec Ŭ·¡½º¿Í ¹­´Â ¹æ¹ý µîÀ» Æ÷ÇÔÇÏ¿© ÀÚ¿ø ¾î´ðÅÍÀÇ ¹èÄ¡ µð½ºÅ©¸³ÅÍ¿¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ¸ðµç ¹èÄ¡ µð½ºÅ©¸³ÅÍ¿Í ¸¶Âù°¡Áö·Î ra.xml ÆÄÀÏÀº WAR ÆÄÀÏÀÇ WEB-INF µð·ºÅ丮 ³»¿¡ À§Ä¡Çϰí ÀÖ¾î¾ß ÇÑ´Ù.

   <?xml version="1.0" encoding="UTF-8"?>
   <connector 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/connector_1_5.xsd" 
     version="1.5">

     <display-name>Skeleton Resource Adapter</display-name>
     <vendor-name>Sun Microsystems, Inc.</vendor-name>
     <eis-type>Unknown</eis-type>
     <resourceadapter-version>1.0</resourceadapter-version>

     <resourceadapter>
       <resourceadapter-class>
         com.nexes.ra.NexesResourceAdapterImpl
       </resourceadapter-class>
     </resourceadapter>

   </connector>

J2EE Ä¿³ØÅÍ ¾ÆÅ°ÅØÃ³¿¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸¸¦ À§Çؼ­´Â J2EE Connector Architecture page¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.

.
.

JAVASERVER FACES ±â¼ú°ú »ç¿ëÀÚ Á¤ÀÇ ÄÄÆ÷³ÍÆ®

Improving Designs With the MVC Design Pattern¿¡¼­´Â ¸ðµ¨, ºä, ÄÁÆ®·Ñ·¯ (MVC ȤÀº Model2)¶ó´Â ¾ÆÅ°ÅØÃ³ ÆÐÅÏ¿¡ ´ëÇØ ¼Ò°³Çϰí ÀÖ´Ù. MVC´Â ÄÄÇ»ÅÍ °úÇÐÀÇ ºÐ¾ß¿¡¼­´Â º¸ÆíÀûÀ¸·Î »ç¿ëµÇ´Â ÆÐÅÏÀÌ¸ç ¶ÇÇÑ JavaServer Faces(JSF) ±â¼úÀ» ÀÌÇØÇϱâ À§ÇØ ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù. ÀÌ ÆÐÅÏÀº ¾ÖÇø®ÄÉÀ̼ÇÀÇ µ¥ÀÌÅÍ ¹× ºñÁî´Ï½º ·ÎÁ÷À» ½Ã°¢Àû Ç¥½Ã ¹æ½Ä°ú ºÐ¸® ½ÃŲ´Ù. µ¥ÀÌÅÍ ¹× ºñÁî´Ï½º ·ÎÁ÷Àº ¸ðµ¨À̶ó´Â °´Ã¼¿¡ ÀúÀåµÇ¸ç, ½Ã°¢Àû Ç¥½Ã ¹æ½ÄÀº º°µµÀÇ °´Ã¼ÀÎ ºä¿¡ ÀúÀåµÈ´Ù. ÀÌ µÎ °³ÀÇ °´Ã¼µéÀº ¶Ç´Ù¸¥ °´Ã¼ÀÎ ÄÁÆ®·Ñ·¯·Î ÇÔ²² ¿¬°áµÇ¾î ÀÖ´Ù. ÄÁÆ®·Ñ·¯´Â ºä¿¡¼­ÀÇ ÀԷ¿¡ ¹ÝÀÀÇÏ¿© ±×¿¡ µû¶ó ¸ðµ¨ µ¥ÀÌÅ͸¦ °»½ÅÇÑ´Ù. ÀÌ·¯ÇÑ µðÀÚÀÎÀÇ ÀåÁ¡Àº ºñÁî´Ï½º ·ÎÁ÷ ȤÀº µ¥ÀÌÅÍ¿¡ ´ëÇÑ º¯È­°¡ »ý°Üµµ ºä¿¡ ¿µÇâÀ» ÁÖÁö ¾Ê°í ¸ðµ¨À» À¯ÁöÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¸ðµ¨¿¡ ¿µÇâÀ» ÁÖÁö ¾Ê°í ´Ù¼öÀÇ ºä¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù.

Introducing JavaServer Faces Technology ¿¡¼­´Â JSF ÇÁ·¹ÀÓ¿öÅ©ÀÇ ¸ðµ¨À» »ç¿ëÇÏ¿© GUI ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÏ´Â JSF ¾ÖÇø®ÄÉÀ̼ÇÀ» °³¹ßÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¼Ò°³Çϰí ÀÖ´Ù. ÀÌ ÆÁÀ» ÅëÇØ¼­ JSF ±â¼úÀ» »ç¿ëÇÏ¿© »ç¿ëÀÚ Á¤ÀÇ ÄÄÆ÷³ÍÆ®¸¦ »ý¼ºÇÏ´Â ¹æ¹ýÀ» ¹è¿ï ¼ö ÀÖ´Ù. Á»´õ Á¤È®È÷ ¸»ÇØ, °£´ÜÇÑ ÁÖ½Ä »óȲÀ» º¸¿©ÁÖ´Â JSF ±â¼ú ±â¹ÝÀÇ »ç¿ëÀÚ Á¤ÀÇ ÄÄÆ÷³ÍÆ®¸¦ °³¹ßÇÒ ¼ö ÀÖ´Ù. ÇÔ²² Á¦°øµÈ JavaServer Pages (JSP)¸¦ ÅëÇØ »ç¿ëÀÚ´Â ÁÖ½Ä ±âÈ£¸¦ ÀÔ·Â ÅØ½ºÆ® Çʵ忡 »ðÀÔÇϰí Àü¼Û ¹öưÀ» Ŭ¸¯Çϵµ·Ï ÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ¿¡ ´ëÇØ »ç¿ëÀÚÀÇ ÄÄÆ÷³ÍÆ®´Â ÅØ½ºÆ® ÇÊµå ¹Ø¿¡ Å×À̺íÀ» Ç¥½ÃÇÑ´Ù. ÀÌ Å×ÀÌºí¿¡´Â ÁÖ½ÄÀÇ ±âÈ£, ÁÖ½ÄÀÇ ÇöÀç °¡°Ý, ±×¸®°í ÀÏÀÏ ÁÖ½Ä °¡°Ý º¯µ¿À» Æ÷ÇÔÇϰíÀÖ´Ù.

ÀÌ ÆÁÀº µ¶ÀÚ°¡ JSF ±â¼úÀÇ ±âº»¿¡ Àͼ÷Çϸç JSP ±â¼úÀ» ÀÌ¿ëÇÏ¿© »ç¿ëÀÚ Á¤ÀÇ ÅÂ±× ¶óÀ̺귯¸®¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù°í °¡Á¤Çϰí ÀÖ´Ù. JSF ±â¼úÀÇ ±âº»¿¡ ´ëÇØ¼­´Â An Introduction to JavaServer Faces¸¦ ÂüÁ¶ÇϽñ⠹ٶõ´Ù. ÀڽŸ¸ÀÇ JSP ÅÂ±× ¶óÀ̺귯¸®¸¦ »ý¼ºÇÏ´Â °Í¿¡ ´ëÇÑ Á¤º¸´Â J2EE 1.4 Æ©Å丮¾óÀÇ Using Custom Tags¸¦ ÂüÁ¶ÇϽñ⠹ٶõ´Ù.

»ç¿ëÀÚ Á¤ÀÇ ÄÄÆ÷³ÍÆ®¸¦ »ý¼ºÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°Àº »çÇ×ÀÌ ¿ä±¸µÈ´Ù.

  • ¡¤ ÁÖ½Ä µ¥ÀÌÅ͸¦ ȸ¼öÇϱâ À§ÇØ »ç¿ëµÇ´Â JavaBean ¸ðµ¨ Ŭ·¡½º »ý¼º

  • javax.faces.component.UIComponent¸¦ È®ÀåÇÏ´Â »ç¿ëÀÚ Á¤ÀÇ JSF ºä Ãâ·Â ÄÄÆ÷³ÍÆ® Ŭ·¡½º »ý¼º

  • javax.faces.render.Renderer¸¦ È®ÀåÇÏ´Â »ç¿ëÀÚ Á¤ÀÇ JSF ºä Ŭ·¡½º »ý¼º

  • »ç¿ëÀÚ Á¤ÀÇ Å±׸¦ »ç¿ëÇÏ¿© »ç¿ëÀÚ Á¤ÀÇ ÄÄÆ÷³ÍÆ®¸¦ JSF ÇÁ·¹ÀÓ¿öÅ©¿¡ ÅëÇÕ

  • ÀÔ·Â ÅØ½ºÆ® Çʵ带 Æ÷ÇÔÇÏ´Â JSP ÆäÀÌÁö »ý¼º, ±×¸®°í »ç¿ëÀÚ Á¤ÀÇ ÄÄÆ÷³ÍÆ®ÀÇ ÀÔ·Â ÅØ½ºÆ® Çʵ带 À§ÇÑ ¹é±×¶ó¿îµå ºó

´ÙÀ½Àº ÀÌ·¯ÇÑ °´Ã¼µéÀÌ MVC ¾ÆÅ°ÅØÃ³¿¡ Àû¿ëµÇ´ÂÁö¿¡ ´ëÇÑ µµÇ¥ÀÌ´Ù.

JavaBean ¸ðµ¨ »ý¼º

ÁÖ½Ä ÄÄÆ÷³ÍÆ®ÀÇ ¸ðµ¨Àº ȸ¼ö/¼³Á¤ Á¢±Ù ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ÀúÀå ¹× È¸¼öÇÏ´Â ±â´ÉÀ» °®Ãá °£´ÜÇÑ JavaBean Ŭ·¡½ºÀÌ´Ù. ÀÌ ºó¿¡´Â retrieveStock()À̶ó´Â ¸Þ¼Òµå°¡ ÀÖ¾î »ç¿ëÀÚ°¡ ÁÖ½Ä ±âÈ£¸¦ ÀÔ·ÂÇϸé UI ÄÄÆ÷³ÍÆ®°¡ ÀÌ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. ÀÌ ¸Þ¼Òµå´Â ÀÔ·ÂµÈ ÁÖ½Ä ±âÈ£¸¦ ¹Þ¾Æ ÀûÀýÇÏ°Ô ¸ðµ¨ Á¤º¸¸¦ °»½ÅÇÑ´Ù.

ÀÌ ÆÁ¿¡ Æ÷ÇÔµÈ ¿¹½Ã¿¡´Â ÁÖ½Ä ÄÄÆ÷³ÍÆ®¿¡ ´ëÇÑ ¸ðµç ¼Ò½º Äڵ尡 Æ÷ÇԵǾî ÀÖ´Ù. ¸ðµ¨ ÄÄÆ÷³ÍÆ®ÀÎ StockModel Ŭ·¡½º¿¡ ´ëÇÑ ´ÙÀ½°ú °°Àº ¼Ò½º Äڵ带 ãÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.

   public class StockModel {
   
       private String selectedStock = "UNKNOWN";
       private String currentValue = "0";
       private String dailyChange = "0";
   
       public String getSelectedStock() { return selectedStock; }
       public String getCurrentValue() { return currentValue; }
       public String getDailyChange() { return dailyChange; }
   
       public void retrieveStock(String stockSubmitted) {
           selectedStock = stockSubmitted;
           currentValue = "23.5";  
           dailyChange = "+2.5";   
       }
   }

ÀϹÝÀûÀ¸·Î retrieveStock()°ú °°Àº ¸Þ¼Òµå´Â µ¥ÀÌÅͺ£À̽º¿¡ Á¢±ÙÇÏ¿© µ¥ÀÌÅ͸¦ ȸ¼öÇÏÁö¸¸ ´Ü¼øÈ­¸¦ À§ÇØ ÀÌ Å¬·¡½ºÀÇ ¸Þ¼Òµå´Â Ŭ·¡½º¿¡ Á¤ÀÇµÈ ÄÁ½ºÅÏÆ® ½ºÆ®¸µÀ» ÀÌ¿ëÇÏ¿© ¸ðµ¨À» °»½ÅÇÑ´Ù.

UI ÄÄÆ÷³ÍÆ® »ý¼º

ºäÀÇ ÇÑ ºÎºÐÀÎ UI ÄÄÆ÷³ÍÆ®ÀÇ ÁÖ ¸ñÀûÀº ¸ðµ¨·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ȸ¼öÇÏ¿© ÀÚ½ÅÀÌ Á÷Á¢ À̸¦ Ç¥½ÃÇϰųª, Çʿ信 µû¶ó »ç¿ëÀÚ Á¤ÀÇ renderer¿¡ µ¥ÀÌÅ͸¦ Àü´ÞÇÏ¿© Ç¥½ÃÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀÌ´Ù. »ç¿ëÀÚ Á¤ÀÇ UI ÄÄÆ÷³ÍÆ®´Â javax.faces.component.UIComponent¸¦ È®ÀåÇÑ´Ù. ÀÌ Å¬·¡½º´Â javax.faces.component.UIOutputÀ» È®ÀåÇϸç UIOutput Ŭ·¡½º´Â UIComponent Ŭ·¡½ºÀÇ ¼­ºê Ŭ·¡½ºÀÌ´Ù. »ç¿ëÀÚ Á¤ÀÇ ÄÄÆ÷³ÍÆ®¿¡¼­ ÇÊ¿äÇÑ ºäÀÇ ¸¹Àº ±â´ÉµéÀÌ ÀÌ¹Ì UIOutputÀ» ÅëÇÏ¿© Á¦°øµÈ´Ù. ÀÌ Å¬·¡½º¿¡ Ãß°¡µÉ °ÍÀº ´ÜÁö ÄÄÆ÷³ÍÆ® ÆÐ¹Ð¸®ÀÇ Á¤ÀÇ¿¡ ´ëÇÑ ½ºÆ®¸µ(ÀÌ´Â ÈÄ¿¡ ÀÚ¿ø µð½ºÅ©¸³ÅÍÀÇ ÀԷ°ª°ú µ¿ÀÏÇØ¾ßÇÔ)À» ¹ÝȯÇÏ´Â getFamily() ¸Þ¼ÒµåÀÌ´Ù. ´ÙÀ½Àº UIStockChoiceOutput: Ŭ·¡½º¿¡ ´ëÇÑ ¼Ò½º ÄÚµåÀÌ´Ù.

   public class UIStockChoiceOutput extends UIOutput {

       public static final String STOCK_FAMILY = "StockFamily";

       public UIStockChoiceOutput() {
           super();
       }

       public String getFamily() {
           return STOCK_FAMILY;
       }

   }

»ç¿ëÀÚ Á¤ÀÇ renderer »ý¼º

´ÙÀ½ °úÁ¤Àº JSF ÄÄÆ÷³ÍÆ®°¡ Ŭ¶óÀÌ¾ðÆ® ºê¶ó¿ìÀú¿¡ ¾î¶»°Ô Ç¥½ÃµÉ °ÍÀÎÁö¸¦ °áÁ¤ÇÏ´Â renderer¸¦ »ý¼ºÇÏ´Â °ÍÀÌ´Ù. ÀÌ´Â javax.faces.render.Renderer Ŭ·¡½º¸¦ È®ÀåÇÏ´Â »ç¿ëÀÚ Á¤ÀÇ ºä Ŭ·¡½ºÀÌ´Ù. ÀÌ rendererÀÇ ¸ñÀûÀº ÁÖ½Ä Á¤º¸ Ç¥½Ã¸¦ À§ÇÑ HTML Å×À̺íÀ» »ý¼ºÇÏ´Â °ÍÀÌ´Ù. ºñ·Ï ÀÌ °æ¿ì¿¡´Â ÇØ´çÇÏÁö ¾ÊÁö¸¸ renderer´Â ÀԷ°ªÀ» ·»´õ¸µÇÒ ¼öµµ ÀÖ´Ù. µû¶ó¼­ renderer´Â µÎ Á¾·ùÀÇ º¯È¯ ¼­ºñ½º¸¦ ¼öÇàÇÑ´Ù. ¿ì¼± ¸ðµç ÀÔ·Â µ¥ÀÌÅ͸¦ ÄÁÆ®·Ñ·¯·Î Àü´ÞÇÒ ¼ö ÀÖ´Â Çü½ÄÀ¸·Î µðÄÚµù ½ÃÄÑÁÖ´Â °Í°ú ÄÁÆ®·Ñ·¯ °´Ã¼·ÎºÎÅÍÀÇ ¸ðµç µ¥ÀÌÅ͸¦ ¿£ÄÚµùÇÏ¿© ºê¶ó¿ìÀú·Î ·»´õ¸µ½ÃÄÑÁÖ´Â °ÍÀÌ´Ù. µðÄÚµùÀº rendererÀÇ decode() ¸Þ¼Òµå¸¦ ÅëÇØ¼­ ½ÇÇàµÇ¸ç, ¿£ÄÚµùÀº ¿©·¯ °¡Áö ¹æ½ÄÀÇ ¿£ÄÚµù ¹æ¹ýÀ» ÅëÇØ °¡´ÉÇÏ´Ù. ´ÙÀ½ ¿¹Á¦´Â encodeEnd() ¸Þ¼Òµå¸¦ »ç¿ëÇϰí ÀÖ´Ù. ¾Æ·¡¿¡´Â renderer(±×¸®°í »ç¿ëÀÚ Á¤ÀÇ ºä ÄÄÆ÷³ÍÆ®)ÀÎ SimpleStockRendererÀÇ ¼Ò½º Äڵ带 ÀϺΠ¹ßÃéÇÑ °ÍÀÌ´Ù.

   public class SimpleStockRenderer extends Renderer {
       
       public void encodeEnd(FacesContext context, 
           UIComponent component) throws IOException
       {
           if (!component.isRendered())
               return;
   
           String selectedStock =
              (String)component.getAttributes().get("selectedStock");
           String currentValue =
              (String)component.getAttributes().get("currentValue");
           String dailyChange =
              (String)component.getAttributes().get("dailyChange");
           String id = (String)component.getClientId(context);
   
           ResponseWriter out = context.getResponseWriter();
           
           out.startElement("table", component);  
           out.writeAttribute("border", "0", "border");   
   
           out.startElement("tr", component);
           out.writeAttribute("bgcolor", "#000077", "bgcolor");                      
          
           writeTableHeader(out, component, "Stock Symbol");
           writeTableHeader(out, component, "Current Value");
           writeTableHeader(out, component, "Daily Change");
   
           out.endElement("tr");
    
           out.startElement("tr", component);
           out.writeAttribute("bgcolor", "#FFFFFF", "bgcolor");                      
   
           writeTableEntry(out, component, selectedStock);
           writeTableEntry(out, component, currentValue);
           writeTableEntry(out, component, dailyChange);
         
           out.endElement("tr");
                                                     
           out.endElement("table");                            
       }
   
       //  Methods writeTableEntry() and writeTableHeader() omitted
       
   }

FacesContext °´Ã¼¿Í UIComponent °´Ã¼°¡ encodeEnd() ¸Þ¼Òµå¿¡ Àü´ÞµÇ´Â °Í¿¡ À¯ÀÇÇϱ⠹ٶõ´Ù. FacesContext °´Ã¼´Â JSF ȯ°æ¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖÀ¸¸ç, UIComponent´Â Controller °´Ã¼ÀÇ ÂüÁ¶ °´Ã¼ÀÌ´Ù. encodeEnd() ¸Þ¼Òµå´Â UIComponent ÄÁÆ®·Ñ·¯¸¦ ÅëÇØ ¸ðµ¨ µ¥ÀÌÅ͸¦ ȸ¼öÇϰí ResponseWriter °´Ã¼¸¦ »ý¼ºÇÑ´Ù. ÀÌ ¸Þ¼Òµå´Â ÀÌ °´Ã¼¸¦ »ç¿ëÇÏ¿© HTML ¿ä¼Ò¿Í Çì´õ¸¦ Æ÷ÇÔÇÑ HTML Å×À̺íÀÇ ¼Ó¼ºÀ» ÀÛ¼ºÇÏ°Ô µÈ´Ù. Renderer Ŭ·¡½º¿¡´Â ÀÌ À̿ܿ¡µµ ´Ù¾çÇÑ ¿£ÄÚµù ¸Þ¼Òµå°¡ ÀÖ´Ù. ÀÌ·¯ÇÑ ¸Þ¼Òµåµé¿¡ ´ëÇÑ Á»´õ ÀÚ¼¼ÇÑ Á¤º¸´Â JSF specificationÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù.

¹é±×¶ó¿îµå ºó »ý¼º

´ÙÀ½ °úÁ¤Àº ÀÔ·Â ÄÄÆ÷³ÍÆ®¸¦ À§ÇÑ ¹é±×¶ó¿îµå ºóÀ» »ý¼ºÇÏ´Â °ÍÀÌ´Ù. ¹é±×¶ó¿îµå ºóÀº ÀÔ·Â ÁÖ½ÄÀ» À§ÇÑ ½ºÆ®¸µ ±â¹ÝÀÇ ¼Ó¼º Á¢±ÙÀÚ¸¦ Á¦°øÇÒ »Ó¸¸ ¾Æ´Ï¶ó °á°ú Å×À̺íÀÌ º¸¿©Á®¾ß ÇÏ´ÂÁö º¸¿©ÁÖ´Â (·»´õ¸µµÈ) ºÒ¸®¾ðµµ Á¦°øÇÕ´Ï´Ù. ÀÎÁõÀÚ°¡ ¼Ò½º Äڵ忡 Ãß°¡µÇ¾ú´Ù´Â Á¡¿¡ À¯ÀÇÇϱ⠹ٶõ´Ù. ¸¸¾à ÀÔ·Â °ªÀÌ ºÎÀûÀýÇÏ´Ù¸é ·»´õ¸µµÈ ºÒ¸®¾ðÀº °ÅÁþÀ¸·Î ¼³Á¤µÇ¸ç renderer´Â °á°ú Å×À̺íÀ» Ç¥½ÃÇÏÁö ¾Ê´Â´Ù. ¹é±×¶ó¿îµå ºó¿¡ ´ëÇÑ ¼Ò½º ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

public class InputBackingBean {

    private String inputStock = "";
    private boolean rendered = false;
    
    public void setStockOutputRendered(boolean r) 
       { rendered = r; }
    public boolean getStockOutputRendered() 
       { return rendered; }
        
    public String getInputStock() { return inputStock; }
    public void setInputStock(String stock) 
       { inputStock = stock; }
        
    public void validateStock
       (FacesContext ctx, UIComponent component, Object value)
    throws ValidatorException
    {
        
    public void validateStock(FacesContext ctx, 
        UIComponent component, Object value)
    throws ValidatorException
    {
        
        String string = (String)value;
        if ((value.equals("AAA")) || (value.equals("BBB")) ||        
            (value.equals("CCC")) || (value.equals("DDD")) ||        
            (value.equals("EEE")) || (value.equals("FFF")) ||        
            (value.equals("GGG")) || (value.equals("HHH"))) {
            
            rendered = true;
        } else {
            rendered = false;
            throw new ValidatorException(
                new FacesMessage
                ("Invalid Stock Entry: (Enter AAA,BBB, etc.)"));
        }
    }
    
    public String inputStockSubmitted() {

        FacesContext context = FacesContext.getCurrentInstance();
        StockModel model = (StockModel)
          context.getApplication().getVariableResolver().resolveVariable(
                context, "StockModel");
        model.retrieveStock(inputStock);
        
        return "Input Stock Accepted";
    }

}

inputStockSubmitted() ¸Þ¼Òµå´Â ¸Å¿ì Áß¿äÇÏ´Ù. ÀÌ ¸Þ¼Òµå´Â ¾×¼Ç ¼Ó¼ºÀÎ code><h:commandButton> (JSP ÆäÀÌÁöÀÇ submit ¹öư)¿¡ ¿¬°áµÇ¾î ÀÖ´Ù. Ȱ¼ºÈ­ µÇ¸é ÀÌ ¸Þ¼Òµå´Â ÇöÀçÀÇ ÆäÀ̽º ³»¿ëÀ» ¹ÙÅÁÀ¸·Î StockModelÀ» ȸ¼öÇÏ°Ô µÈ´Ù. ±× ÈÄ retrieveStock() ¸Þ¼Òµå°¡ ¸ðµ¨¿¡ È£ÃâµÇ¾î °á°ú Å×À̺íÀÇ ÁÖ½Ä Á¤º¸¸¦ °»½ÅÇÏ°Ô µÈ´Ù.

ÃÖÁ¾ ÀÛ¾÷

»ç¿ëÀÚ Á¤ÀÇ ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇϱâ À§Çؼ­´Â ¸î °¡Áö Ãß°¡ ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ´Ù. ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇϱâ À§Çؼ­´Â JSP ÇÁ·¹ÀÓ¿öÅ©°¡ JSP ÆÄÀϰúÀÇ µ¥ÀÌÅÍ Åë½ÅÀ» À§Çؼ­ »ç¿ëÇÏ´Â »ç¿ëÀÚ Á¤ÀÇ ÅÂ±× ¶óÀ̺귯¸® Ŭ·¡½º°¡ ÇÊ¿äÇÏ´Ù. SimpleStockInputTag.java Ŭ·¡½º´Â À̹ø ÆÁ¿¡¼­ »ç¿ëµÇ´Â »ç¿ëÀÚ Á¤ÀÇ ÅÂ±× ¶óÀ̺귯¸® Ŭ·¡½ºÀÌ´Ù. À̹ø ÆÁ¿¡¼­ »ç¿ëÇÏ´Â ÀÌ »ç¿ëÀÚ Á¤ÀÇ ÅÂ±× ¶óÀ̺귯¸®´Â "stock"À̶ó°í ºÎ¸¥´Ù.

¶ÇÇÑ JSF ÇÁ·¹ÀÓ¿öÅ©´Â ¸ðµ¨ ºóÀ» »ç¿ëÀÚ Á¤ÀÇ Å±׿¡ ¿¬°á½Ãų ¹æ¹ýÀ» ÇÊ¿ä·Î ÇÑ´Ù. À̴ ǥÁØ JSP ÅÂ±× ¶óÀ̺귯¸® µð½ºÅ©¸³ÅÍ ÆÄÀÏÀ» »ç¿ëÇÏ¿© ÇØ°áµÈ´Ù. JSP ÅÂ±× ¶óÀ̺귯¸® µð½ºÅ©¸³ÅÍ ÆÄÀÏÀÎ stock.tld´Â ¿¹Á¦ÀÇ WEB-INF/lib µð·ºÅ丮¿¡¼­ ã¾Æ º¼ ¼ö ÀÖ´Ù.

»ç¿ëÀÚ Á¤ÀÇ ÄÄÆ÷³ÍÆ® °´Ã¼µéÀº ¹Ýµå½Ã JSF ¾ÆÅ°ÅØÃ³¿¡ µî·ÏµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ´Â WEB-INF µð·ºÅ丮 ³»ÀÇ faces-config.xmlÀ» ÅëÇØ¼­ °¡´ÉÇÏ´Ù.

¸¶Áö¸·À¸·Î submit ¹öưÀ» Á¦°øÇϰí ÄÄÆ÷³ÍÆ®¸¦ Ç¥½ÃÇϱâ À§ÇØ JSP ÆäÀÌÁö°¡ ÇÊ¿äÇÏ´Ù. ´ÙÀ½Àº ÄÄÆ÷³ÍÆ®¸¦ Ç¥½ÃÇØÁÖ´Â ´ëºÎºÐÀÇJSP ÆäÀÌÁöÀÎ Stock.jspÀÌ´Ù.

   ...
   <%@taglib prefix="stock" 
       uri="http://nexes.org/example/stock"%> 
    
   <html>
     <head>
     <title>Stock Choice Example</title>
     </head>
     <body>
     <h2>Please Enter a Stock Symbol</h2>
     <f:view>
        <p>
        <h:messages id="messageList" showSummary="true"/>
        </p>
        <h:form>
        <h:inputText value="#{InputBackingBean.inputStock}" 
            validator="#{InputBackingBean.validateStock}" />
        <h:commandButton value="Submit"
            action="#{InputBackingBean.inputStockSubmitted}" />
        <stock:stockOutput id="symbol"
            rendered="#{InputBackingBean.stockOutputRendered}" 
            selectedStock="#{StockModel.selectedStock}"
            currentValue="#{StockModel.currentValue}"
            dailyChange="#{StockModel.dailyChange}" />
        </h:form>
     </f:view>
     </body>
   </html>

¿¹Á¦ ÄÚµå ½ÇÇà

¿¹Á¦ ÆÄÀϵéÀ» ´Ù¿î·Îµå ¹ÞÀ¸¼¼¿ä. ÀÌ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ·çÆ®´Â ttnov2004À̸ç, ´Ù¿î·ÎµåµÈ war ÆÄÀÏ¿¡´Â ¿¹Á¦ÀÇ ¸ðµç ¼Ò½º Äڵ尡 Æ÷ÇԵǾî ÀÖ½À´Ï´Ù.

¾ÖÇø®ÄÉÀÌ¼Ç ÆÄÀϵé(ttnov2004.war)À» J2EE 1.4 ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿¡ ¼³Ä¡ÇÏ·Á¸é deploytool ÇÁ·Î±×·¥ ȤÀº °ü¸®ÀÚ ÄܼÖÀ» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. ȤÀº ¾Æ·¡¿Í °°ÀÌ asadmin ¸í·É¾î¸¦ ÀÔ·ÂÇÏ¿© ¼³Ä¡¸¦ ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

   asadmin deploy install_dir/ttnov2004.war

install_dirÀ» war ÆÄÀÏÀ» ¼³Ä¡ÇÑ µð·ºÅ丮·Î ´ëüÇϽʽÿÀ.

¾ÖÇø®ÄÉÀ̼ÇÀº http://localhost:8000/ttnov2004¸¦ ÅëÇØ¼­ Á¢¼ÓÇÒ ¼ö ÀÖ½À´Ï´Ù.

J2EE 1.4 ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö ÀÌ¿ÜÀÇ J2EE 1.4 ȣȯ ¼³Ä¡¸¦ À§Çؼ­´Â J2EE Á¦Ç°ÀÇ ¼³Ä¡ ÅøÀ» »ç¿ëÇÏ¿© ¿øÇÏ´Â Ç÷§Æû¿¡ ¾ÖÇø®ÄÉÀ̼ÇÀ» ¼³Ä¡ÇϽñ⠹ٶø´Ï´Ù.

¾ÖÇø®ÄÉÀ̼ÇÀ» ½ÃÀÛÇÏ¸é ¾Æ·¡¿Í °°Àº ÆäÀÌÁö°¡ ³ªÅ¸³³´Ï´Ù. (ÆäÀÌÁö Àüü°¡ ³ªÅ¸³ª ÀÖÁö´Â ¾Ê½À´Ï´Ù.)

»ç¿ëÀÚ Á¤ÀÇ ÄÄÆ÷³ÍÆ® ¸µÅ©¸¦ Ŭ¸¯Çϼ¼¿ä. ÁÖ½Ä ±âÈ£¸¦ ÀÔ·ÂÇ϶ó´Â ÆäÀÌÁö°¡ ³ªÅ¸³¯ °ÍÀÔ´Ï´Ù. AAA ȤÀº BBB¿Í °°Àº ÁÖ½Ä ±âÈ£¸¦ µ¥ÀÌÅÍ Çʵ忡 ÀÔ·ÂÇϸé, ÀԷ°ª¿¡ µû¶ó¼­ ÀûÀýÇÑ ÁÖ½Ä Á¤º¸°¡ Å×ÀÌºí¿¡ ³ªÅ¸³³´Ï´Ù.

¸¸¾à ÀÎÁõÀÚ°¡ ÆÇ´ÜÇÏ¿´À» ¶§, À߸øµÈ ÁÖ½Ä ±âÈ£¸¦ ÀÔ·Â ¹ÞÀ¸¸é ÀÌ ÄÄÆ÷³ÍÆ®´Â JSP ÆäÀÌÁö¿¡¼­ <h:messages> ÅÂ±×¿Í ÇÔ²² Ç¥½ÃµÇ´Â FacesMessage¸¦ »ý¼ºÇÕ´Ï´Ù. ¿¹¸¦ µé¾î ¸¸¾à ABC ±âÈ£¸¦ ÀÔ·ÂÇϸé "Invalid Stock Entry ..."¶ó´Â ¸Þ½ÃÁö°¡ ³ªÅ¸³³´Ï´Ù.

.
.
.

Reader Feedback

  ¸Å¿ì ÁÁ´Ù    ÁÁ´Ù    ±×Àú ±×·¸´Ù 

 

ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀÌ ±Ã±ÝÇϼ¼¿ä? Java Online SupportÀ» Âü°íÇϼ¼¿ä.

.
.

º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù. °ü·Ã¹®ÀÇ : SunKorea@sun.com
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϽ÷Á¸é ¼ö½Å°ÅºÎ¸¦ Ŭ¸¯ÇØ ÁÖ¼¼¿ä.

Copyright 2003-2005 Sun Korea, Inc. All rights reserved.

Sun Microsystems, Inc.
.
.