| 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 ..."¶ó´Â ¸Þ½ÃÁö°¡ ³ªÅ¸³³´Ï´Ù.
º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù. °ü·Ã¹®ÀÇ : SunKorea@sun.com
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϽ÷Á¸é ¼ö½Å°ÅºÎ¸¦
Ŭ¸¯ÇØ ÁÖ¼¼¿ä.
Copyright 2003-2005 Sun Korea, Inc. All rights reserved.
|