ÀÚ¹Ù EE 5¿¡¼´Â ±âÁ¸¿¡ XML¿¡ ±â¹ÝÀ» µÐ º¹ÀâÇÑ ÇÁ·Î±×·¡¹Ö ¸ðµ¨¿¡¼ Å»ÇÇÇÏ¿© Á» ´õ ½±°í Á÷°üÀûÀ¸·Î ¾ÖÇø®ÄÉÀ̼ÇÀ» °³¹ßÇÒ ¼ö ÀÖµµ·Ï ¸ÞŸµ¥ÀÌÅÍ ¾î³ëÅ×À̼ÇÀ» Àû±ØÀûÀ¸·Î Ȱ¿ëÇϱ⠽ÃÀÛÇÏ¿´´Ù. ƯÁý 2ºÎ¿¡¼´Â ÀÚ¹Ù EE 5¿¡¼ ¾î³ëÅ×À̼ÇÀ» ¾î¶² °æ¿ì¿¡ »ç¿ëÇØ¾ß ÇÏ´ÂÁö ¾Ë¾Æº»´Ù.
ÀÚ¹Ù EE 5°¡ ÀÛ³â ÀÚ¹Ù¿ø¿¡¼ °ø½Ä ¸±¸®Áî µÈÁö ¹ú½á 1³âÀÌ Áö³µ´Ù. µ¶ÀÚ ¿©·¯ºÐµéµµ Àß ¾Ë°í ÀÖµíÀÌ ´ëºÎºÐÀÇ ÀÚ¹Ù EE ±â¼úÀº ¼±¾ðÀûÀÎ ÇÁ·Î±×·¡¹Ö ¸ðµ¨(Declarative Programming Model)¿¡ ±â¹ÝÇϰí ÀÖ°í ÀÌ´Â ÀÌ¹Ì ´ë¼¼·Î ÀÚ¸® ÀâÀº µíÇÏ´Ù.
ÀÚ¹Ù EE 5 ÀÌÀü¿¡´Â ¼±¾ðÀûÀÎ ÇÁ·Î±×·¡¹Ö ¸ðµ¨ÀÇ ´ëºÎºÐÀ» XML µð½ºÅ©¸³Å͸¦ ÅëÇØ¼ ±¸¼ºÇß´Ù. ¹Ý¸é¿¡ ÀÚ¹Ù EE 5 ÀÌÈĺÎÅÍ´Â ¸ÞŸµ¥ÀÌÅÍ ¾î³ëÅ×À̼Ç(metadata annotation)À» ÅëÇØ Á» ´õ ½±°í Á÷°üÀûÀÎ °³¹ßÀÌ °¡´ÉÇØ Á³´Ù.
ÇÏÁö¸¸, Àß »ìÆìº¸¸é ÀÚ¹Ù EE 5¿¡¼ µµÀÔµÈ ¾î³ëÅ×À̼ÇÀÌ ¿ÏÀüÈ÷ »õ·Î¿î ¹æ½ÄÀº ¾Æ´Ï´Ù. ÀÌ¹Ì ¿¹ÀüºÎÅÍ ¸¹Àº °³¹ßÀÚµéÀÌ EJB ÄÄÆ÷³ÍÆ®¸¦ °³¹ßÇÒ ¶§ ÇÙ½É ·ÎÁ÷ÀÌ ´ã±ä Ŭ·¡½º À̿ܿ¡µµ º¹ÀâÇÑ XML µð½ºÅ©¸³ÅÍ¿Í ¿©·¯ ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇØ¾ß ÇÏ´Â °Í¿¡ ´ëÇØ ºÒ¸¸ÀÌ ¸¹¾Ò´Ù. µû¶ó¼ À̸¦ ÇØ°áÇϰíÀÚ XDoclet°ú °°Àº ¿ÀÇ ¼Ò½º ÇÁ·ÎÁ§Æ®°¡ °¢±¤À» ¹Þ¾Ò´Ù.
XDocletÀº ÃÊâ±âÀÇ ¸ÞŸµ¥ÀÌÅÍ ¾î³ëÅ×À̼ÇÀ¸·Î º¼ ¼ö Àִµ¥ ÇöÀç ÀÚ¹Ù ¾ð¾î¿¡¼ Á¦°øÇÏ´Â ¾î³ëÅ×À̼ǰú ÇüŰ¡ ¸Å¿ì À¯»çÇÏ´Ù. ÇÏÁö¸¸, ¼Ò½º ¼öÁØ¿¡¼¸¸ ÇØ´ç Á¤º¸°¡ À¯ÁöµÇ´Â Á¦¾àÀÌ ÀÖ¾î ÄÚµå »ý¼º ÅøÀ» À§ÇÑ ¸ÞŸµ¥ÀÌÅͷθ¸ »ç¿ëÇÒ ¼ö ÀÖ¾ú´Ù. ÇöÀç ÀÚ¹Ù ¾ð¾îÀÇ ¾î³ëÅ×À̼ÇÀº ·±Å¸ÀÓ¿¡¼ ÇØ´ç Ŭ·¡½ºÀÇ ¾î³ëÅ×À̼ÇÀ» ÀÐ¾î ¿Ã ¼ö Àֱ⠶§¹®¿¡ ´õ ¸¹Àº ºÐ¾ß¿¡¼ Ȱ¿ëµÇ°í ÀÖÀ¸¸ç ´ëÇ¥ÀûÀÎ ºÐ¾ß°¡ ¹Ù·Î Java EE ±â¼ú ºÐ¾ßÀÌ´Ù.
 | ¾î³ëÅ×À̼ÇÀÇ ÀåÁ¡ |  |
ÀÚ¹Ù EE 5°¡ ÀÌÀü ¹öÀü¿¡ ºñÇØ »ý»ê¼ºÀÌ ¾ó¸¶³ª ¸¹ÀÌ Çâ»óµÇ¾ú´ÂÁö ¾Ë¾Æº¸±â À§ÇØ <Ç¥ 1>À» »ìÆìº¸ÀÚ. <Ç¥ 1>À» º¸¸é ±²ÀåÈ÷ °í¹«ÀûÀÌ´Ù. ÀÌ´Â ÀÚ¹Ù EE 5¿¡¼ °³¼±µÈ ¿©·¯ °¡Áö Ãø¸é¿¡¼ ¼³¸íÇÒ ¼ö ÀÖÁö¸¸ ¾î³ëÅ×À̼ÇÀ» µµÀÔÇÑ °ÍÀÌ °¡Àå Å« ¿µÇâÀ» ÁÖ¾ú´Ù°í ÇÒ ¼ö ÀÖ´Ù.
¾î³ëÅ×À̼ÇÀÌ ÀÌ·¸°Ô XML¿¡ ºñÇØ¼ °³¹ß »ý»ê¼ºÀ» ȹ±âÀûÀ¸·Î ³ô¿©Áشٸé, XMLÀ» ÅëÇØ ¸ÞŸµ¥ÀÌÅ͸¦ ¼³Á¤ÇÏ´Â °ÍÀº ÀÌÁ¦ ±¸½Ã´ëÀÇ »ê¹°ÀÌ¸ç ´õ ÀÌ»ó »ç¿ëÇÏÁö ¸»¾Æ¾ß ÇÏ´Â °ÍÀϱî?
ÀÌ Áú¹®¿¡ ´ëÇÑ ´ë´äÀ» ÇÏ·Á¸é ¸ÕÀú ¾î³ëÅ×À̼ǰú XMLÀÌ °¡Áö´Â Àå/´ÜÁ¡À» ºñ±³ÇØ º¸´Â °ÍÀÌ ÁÁÀ» °Í °°´Ù. ¸ÕÀú, ¾î³ëÅ×À̼ÇÀÌ °¢±¤À» ¹ÞÀº °ÍÀº ºÐ¸í XML¿¡ ºñÇØ ¾Æ·¡¿Í °°Àº ÀåÁ¡ÀÌ Àֱ⠶§¹®ÀÌ´Ù.
¡Ü ÄÚµåÀÇ °¡µ¶¼º Áõ´ë - °ü·ÃµÈ ÄÚµå °ç¿¡ ¸ÞŸµ¥ÀÌÅ͸¦ ¼³Á¤ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÇØ´ç ÄÚµåÀÇ ±¸Á¶¸¦ ÆÄ¾ÇÇϱâ À§ÇØ XMLÀ» ÀÏÀÏÀÌ È®ÀÎÇØ¾ß ÇÒ Çʿ䰡 ¾ø´Ù.
¡Ü °³¹ß È¿À²¼º Áõ´ë - º¹ÀâÇÑ XML ½ºÅ°¸¶¸¦ ÆÄ¾ÇÇÏÁö ¾Ê¾Æµµ µÇ¸ç, ´Ù¸¥ ¾ð¾î ±¸¹®°ú ¸¶Âù°¡Áö·Î strong type üũ¸¦ ÇϹǷΠ°³¹ß Åø°ú ÄÄÆÄÀÏ·¯ÀÇ µµ¿òÀ» ¹ÞÀ» ¼ö ÀÖ´Ù.
¡Ü ÇÁ·Î±×·¥ ±¸Á¶ÀÇ Àϰü¼º È®º¸ – XML ¼³Á¤Àº ÀǵµÀûÀ̵ç ÀǵµÀûÀÌÁö ¾ÊµçÁö °£¿¡ À߸ø ¼öÁ¤Çϰųª ¼³Á¤ÇÏ¸é ¿ø·¡ µðÀÚÀÎ Àǵµ¿Í ´Ù¸¥ ¹æ½ÄÀ¸·Î µ¿ÀÛÇÒ ¼ö ÀÖ´Ù.
XML ¼³Á¤¿¡ ±â¹ÝÀ» µÐ EJB 2.1 ºó°ú ¾î³ëÅ×À̼Ǹ¸À¸·Î ÀÛ¼ºµÈ EJB 3.0 ºóÀ» ºñ±³Çغ¸¸é ¾Õ¼ ¸»ÇÑ ÀåÁ¡À» ºÐ¸íÈ÷ ÀνÄÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
 | ¾î³ëÅ×À̼ÇÀÇ ´ÜÁ¡ |  |
±×·¯¸é, ¹Ý´ë·Î ¾î¶² Á¡¿¡ ÀÖ¾î ¾î³ëÅ×À̼ÇÀº ¹®Á¦°¡ ȤÀº ¾àÁ¡ÀÌ ÀÖÀ»±î? Çϳª¾¿ »ìÆìº¸µµ·Ï ÇÏÀÚ.
1. ÇØ´ç Ŭ·¡½º°¡ ÇÑ ¹ø ÄÄÆÄÀÏ µÇ¸é ´õ ÀÌ»ó ¸ÞŸµ¥ÀÌÅ͸¦ ¼öÁ¤ÇÒ ¼ö ¾ø´Ù. Áï, µðÇ÷ÎÀÌ µÇ´Â ȯ°æ¿¡ µû¶ó¼ ¼³Á¤À» ¼öÁ¤ÇÒ ¼ö ¾ø´Ù.
ÀÚ¹Ù EE¿¡¼´Â °³¹ßµÈ ¾ÖÇø®ÄÉÀ̼ÇÀ» ½ÇÁ¦ µðÇ÷ÎÀÌ Çϴ ȯ°æ¿¡ °ü°è¾øÀÌ À̽ļº ÀÖ°Ô ¸¸µå´Â °ÍÀ» Áß¿äÇϱ⠶§¹®¿¡, µðÇ÷ÎÀÌ È¯°æ¿¡ ¸Â°Ô ¼³Á¤À» ¼öÁ¤ÇÒ ¼ö ¾ø´Ù¸é Å« ¹®Á¦°¡ ¾Æ´Ò ¼ö ¾ø´Ù. º¸¾È ¼³Á¤À̳ª µ¥ÀÌÅͺ£À̽º ¼³Á¤°ú °°Àº °ÍÀÌ ±×·± ¿¹Àε¥ À̽ļºÀ» °í·ÁÇÑ´Ù¸é ÀÌ·± ¼³Á¤Àº XML¿¡ ´ã´Â °ÍÀÌ ÀûÇÕÇÏ´Ù.
2. ¾î³ëÅ×À̼ÇÀº ¸ðµâÀ̳ª ¾ÖÇø®ÄÉÀÌ¼Ç Àü¹ÝÀûÀÎ ¸ÞŸµ¥ÀÌÅ͸¦ ¼³Á¤ÇÒ ¼ö ¾ø´Ù.
¾î³ëÅ×À̼ÇÀº ¹üÀ§°¡ Ä¿ ºÁ¾ß Ŭ·¡½º³ª ÆÐŰÁö ·¹º§·Î ÇÑÁ¤Çϱ⠶§¹®¿¡ ¿©·¯ Ŭ·¡½º¿¡ °ÉÄ£ °øÅëÀûÀÎ ¼³Á¤À̳ª ¸ðµâ·¹º§ ¼³Á¤ÀÌ ¾î·Æ´Ù.
¿¹¸¦ µé¾î, EJB¿¡¼ ¸ðµç ºó(Bean)¿¡ ´ëÇØ¼ °øÅë ÀÎÅͼÁÅ͸¦ ´Þ°í ½Í´Ù°Å³ª, JPA¿¡¼ ¸ðµç ¿£Æ¼Æ¼ Ŭ·¡½º¿¡ ´ëÇØ¼ °øÅëÀûÀ¸·Î DBÀÇ ¾î¶² ½ºÅ°¸¶¸¦ ¾²°Ô ÇÏ°í ½Í´Ù¸é À̸¦ ¾î³ëÅ×À̼ÇÀ¸·Î ÇÒ ¼ö°¡ ¾ø´Ù. µû¶ó¼ ÀÌ·± ¼³Á¤Àº ÇöÀç XMLÀ» ÅëÇØ¼¸¸ °¡´ÉÇÏ´Ù.
3. ¾î³ëÅ×ÀÌ¼Ç Ã³¸® ½Ã ¸®Ç÷º¼ÇÀ» ÅëÇØ ÇØ´ç Ŭ·¡½º¸¦ ºÐ¼®ÇØ¾ß ÇÏ´Â ¿À¹öÇìµå°¡ ÀÖ´Ù.
À̰ÍÀº µðÇ÷ÎÀÌ ½Ã°£°ú °ü·Ã Àִµ¥, ¾î³ëÅ×À̼ÇÀ» ¾²¸é Ç×»ó ´À¸®´Ù´Â À̾߱â´Â ¾Æ´Ï´Ù. XMLµµ ½ÇÁ¦·Î ÆÄ½ÌÇϰí ó¸®ÇÏ´Â ¿À¹öÇìµå°¡ Àֱ⠶§¹®¿¡ °æ¿ì¿¡ µû¶ó¼ ¾î³ëÅ×ÀÌ¼Ç Ã³¸®°¡ ´õ ºü¸¦ ¼ö ÀÖ´Ù.
¾î³ëÅ×ÀÌ¼Ç Ã³¸®´Â ó¸®ÇØ¾ß Çϴ Ŭ·¡½ºÀÇ °³¼ö¿¡ ºñ·ÊÇÑ´Ù. ¶§¹®¿¡ ¸¸¾à ¸ðµâ ¾È¿¡ Ŭ·¡½º°¡ ¾öû³ª°Ô ¸¹°í ¾î¶² Ŭ·¡½º°¡ ¾î³ëÅ×À̼ÇÀ» °¡Áö°í ÀÖ´ÂÁö ¾Ë ¼ö ¾ø´Ù¸é ¸ðµç Ŭ·¡½º¸¦ ½ºÄµ ÇØºÁ¾ß ÇϹǷΠ½Ã°£ÀÌ XML 󸮿¡ ºñÇØ »ó´ëÀûÀ¸·Î ¿À·¡ °É¸®°Ô µÈ´Ù.
EJB 3.0 ¸ðµâÀ̳ª JAX-WS À¥¼ºñ½º, JPA ¿£Æ¼Æ¼°¡ Æ÷ÇÔµÈ ¸ðµâÀÇ °æ¿ì°¡ ÀÌ¿¡ ÇØ´çÇϹǷΠµðÇ÷ÎÀÌ ½Ã°£ÀÌ ÇѾøÀÌ ´À¸®´Ù¸é ÀÌ·± Á¡À» °í·ÁÇØ¾ß ÇÑ´Ù.
4. ¼Ò½º°¡ ¾Æ´Ñ ¹ÙÀ̳ʸ®¸¦ »ìÆìº¸´Â °æ¿ì ¾î³ëÅ×À̼ÇÀº ´«¿¡ º¸ÀÌÁö ¾Ê±â ¶§¹®¿¡ ÇØ´ç ¸ðµâÀÇ ±¸Á¶¸¦ ÆÄ¾ÇÇϱⰡ ¾î·Æ´Ù.
¿¹¸¦ µé¾î, EJB 2.1ÀÇ °æ¿ì ÇØ´ç ¸ðµâÀÇ XML µð½ºÅ©¸³Å͸¦ ¿¾îº¸¸é ¾î¶² ºóµéÀÌ ÀÖ°í, ¾î¶² ŸÀÔÀÎÁö ÀÌ·± Á¤º¸¸¦ ¿ÜºÎ¿¡¼ º¸±â°¡ ½¬¿ü´Ù. ¹Ý¸é¿¡ ¾î³ëÅ×À̼Ǹ¸À» »ç¿ëÇØ¼ ¸¸µé¾îÁø EJB 3.0ÀÇ °æ¿ì´Â Ŭ·¡½ºµé ¹Û¿¡ ¾ø±â ¶§¹®¿¡ ÀÌ·± °ÍµéÀ» ¹Ù·Î ÆÄ¾ÇÇÒ ¼ö°¡ ¾ø´Ù.
¶ÇÇÑ, ÇöÀç±îÁö ³ª¿Í ÀÖ´Â µðÄÄÆÄÀÏ·¯¶ÇÇÑ ¾î³ëÅ×À̼ÇÀ» º¸¿©ÁÖÁö ¾Ê±â ¶§¹®¿¡ ¹ÙÀ̳ʸ®¸¸ °¡Áö°í ±¸Á¶¸¦ ÆÄ¾ÇÇϱⰡ ½±Áö ¾Ê´Ù. À̸¦ À§Çؼ Ŭ·¡½ºÀÇ ±¸Á¶¿Í ¾î³ëÅ×À̼ÇÀ» ÆÄ¾ÇÇØ¼ º¸¿©ÁÖ´Â ÅøÀÌ ÀÖ´Ù¸é Æí¸®ÇÒ °Í °°Àºµ¥, ¾ÆÁ÷±îÁö´Â ±×·± ÅøÀ» ³ª¿Í ÀÖÁö ¾Ê´Ù.
 | XML°ú ¾î³ëÅ×À̼ǰ°ÀÌ ¾²±â |  |
±×·¯¸é ÀÌÁ¦ ¾Õ¼ Á¦±âÇÑ Áú¹®¿¡ ´äÀ» ÇÒ ¼ö ÀÖ´Â ½ÃÁ¡ÀÌ µÈ °Í °°´Ù. ¾î³ëÅ×À̼ÇÀº ±× ³ª¸§´ë·ÎÀÇ ¿ªÇÒÀÌ ÀÖÁö¸¸ XMLÀ» ¿ÏÀüÈ÷ ´ëüÇÒ ¼ö´Â ¾ø´Ù. µû¶ó¼ ÀÚ¹Ù EE 5¿¡¼´Â µÎ °¡Áö ÇüÅÂÀÇ ¸ÞŸµ¥ÀÌÅ͸¦ ´Ù ¾µ ¼ö ÀÖµµ·Ï Áö¿øÇϰí ÀÖ´Ù. ÀÌ °æ¿ì ´ÙÀ½°ú °°ÀÌ 3°¡Áö Á¶ÇÕÀÌ °¡´ÉÇÏ´Ù.
1. ¾î³ëÅ×À̼Ǹ¸À» ¾²´Â °æ¿ì
2. ¾î³ëÅ×À̼ǰú XMLÀ» °°ÀÌ ¾²´Â °æ¿ì
3. ÀÌÀü ¹æ½Äó·³ XML¸¸ »ç¿ëÇÏ´Â °æ¿ì
¾î³ëÅ×À̼ǰú XMLÀ» È¥¿ëÇÏ¿© »ç¿ëÇÏ´Â °æ¿ì¿¡ XMLÀº ¾î³ëÅ×À̼ÇÀ» º¸ÃæÇϰųª overrideÇÏ´Â ¿ªÇÒÀ» ¸Ã°Ô µÈ´Ù. ÀÚ¹Ù EE 5ÀÇ ¸ðµç ¾î³ëÅ×À̼ÇÀº ±×¿¡ ÇØ´çÇÏ´Â XML ¼³Á¤ÀÌ Á¸ÀçÇϴµ¥ ÀÌ·± °æ¿ì¿¡ ¿ì¼±¼øÀ§´Â Ç×»ó XML¿¡°Ô ÀÖ´Ù.
¿©±â¼ °í¹ÎÀÌ ½ÃÀ۵Ǵµ¥, ±×·¯¸é ¾î¶² °æ¿ì¿¡ ¾î³ëÅ×À̼ÇÀ» ½á¾ß ÇÏ°í ¾î¶² °æ¿ì¿¡ XMLÀ» ½á¾ß ÇÒ±î? 3°¡Áö °æ¿ì°¡ ´Ù ¾²ÀÓ»õ°¡ Àֱ⠶§¹®¿¡ ¾Æ½±°Ôµµ Á¤´äÀº ¾ø°í °æ¿ì¿¡ µû¶ó¼ ¼±ÅÃÀ» ÇØ¾ß ÇÑ´Ù.
¸ÕÀú, ¾î³ëÅ×À̼Ǹ¸ »ç¿ëÇÏ´Â °æ¿ì´Â °£´ÜÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇϰųª »¡¸® ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇϰíÀÚ ÇÒ ¶§ À¯¿ëÇÒ °ÍÀÌ´Ù. ¾î³ëÅ×À̼ÇÀº XML¿¡ ºñÇØ »ç¿ëÇϱⰡ ½±±â ¶§¹®¿¡, ªÀº ½Ã°£¿¡ ¾ÖÇø®ÄÉÀ̼ÇÀ» °³¹ßÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖ´Ù.
XML¸¸ »ç¿ëÇÏ´Â °æ¿ì´Â ÀÌ¹Ì ±âÁ¸ ¾ÖÇø®ÄÉÀ̼ÇÀÌ J2EE 1.4 ±â¹ÝÀ¸·Î ÀÛ¼ºµÇ¾î Àְųª, ÇØ´ç ¾ÖÇø®ÄÉÀ̼ǿ¡ Ŭ·¡½º°¡ ¼ö¾øÀÌ ¸¹¾Æ µðÇ÷ÎÀÌ ½Ã°£ÀÌ ¿À·¡ °É¸°´Ù°Å³ª Àüü ¾ÖÇø®ÄÉÀÌ¼Ç ±¸¼ºÀ» ¼Ò½º°¡ ¾Æ´Ñ ¹ÙÀ̳ʸ®¿Í XMLÀ» ÅëÇØ ÆÄ¾ÇÇØ¾ß ÇÒ Çʿ伺ÀÌ ÀÖ´Â °æ¿ì¿¡ À¯¿ëÇÒ ¼ö ÀÖ´Ù.
ÀÌ·± °æ¿ì¸¦ À§Çؼ ÀÚ¹Ù EE 5 µð½ºÅ©¸³ÅÍ¿¡´Â <¸®½ºÆ® 1>°ú °°ÀÌ metadata-complete¶ó´Â ¼Ó¼ºÀ» true °ªÀ¸·Î ¼¼ÆÃÇÒ ¼ö ÀÖ´Ù. ÀÌ·¸°Ô ¼³Á¤ÇÏ¸é ¾î³ëÅ×ÀÌ¼Ç Ã³¸®¸¦ ÀüÇô ÇÏÁö ¾Ê°í XML¸¸ ó¸®ÇÏ°Ô µÈ´Ù.
| <¸®½ºÆ® 1> metadata-complete ¼Ó¼º | | | |
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.0" metadata-complete="true"
xmlns="http://java.sun.com/xml/ns/javaee" ...>
...
</ejb-jar>
| |
 |
metadata-complete ¼Ó¼ºÀÇ ±âº» °ªÀº falseÀ̱⠶§¹®¿¡ º¸ÅëÀº ¾î³ëÅ×À̼ǿ¡ ´ëÇÑ Ã³¸®°¡ ¼öÇàµÈ´Ù. ÇÑ °¡Áö ÁÖÀÇÇÒ Á¡ÀÌ ÀÖ´Ù¸é, EJB 2.1°ú °°ÀÌ ±âÁ¸ J2EE 1.4 ¸ðµâÀ» »ç¿ëÇÒ °æ¿ì¿¡´Â ¾î³ëÅ×ÀÌ¼Ç Ã³¸®°¡ ÇÊ¿ä ¾ø±â ¶§¹®¿¡ À̸¦ ó¸®ÇÏÁö ¾Ê´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù.
ÇÏÁö¸¸ À̸¦ ±¸ºÐÇϱâ À§ÇØ WAS¿¡ µû¶ó¼ µð½ºÅ©¸³ÅÍ¿¡ ÀÖ´Â version attribute °ªÀ» º¸°Ô µÈ´Ù. µû¶ó¼ <¸®½ºÆ® 2>¿Í °°ÀÌ ¾î³ëÅ×À̼ÇÀ» »ç¿ëÇØ ³õ°í µð½ºÅ©¸³ÅÍ¿¡ versionÀ» ÀÚ¹Ù EE 5 ÀÌÀü ¹öÀüÀ¸·Î ÇØ³õÀ¸¸é ¾î³ëÅ×ÀÌ¼Ç Ã³¸®°¡ µÇÁö ¾ÊÀ» ¼ö ÀÖ´Ù(Á¦Ç°¸¶´Ù ´Ù¸¦ ¼ö ÀÖÀ¸¸ç JEUS 6ÀÇ °æ¿ì ó¸®ÇÏÁö ¾Ê´Â´Ù).
| <¸®½ºÆ® 2> EJB 3.0 ºó¿¡ 2.1¿ë ejb-jar.xml¸¦ »ç¿ëÇÏ´Â °æ¿ì | | | |
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="2.1"
xmlns="http://java.sun.com/xml/ns/j2ee" ...>
...
</ejb-jar>
| |
 |
¸¶Áö¸·À¸·Î, ¾î³ëÅ×À̼ǰú XMLÀ» °°ÀÌ »ç¿ëÇÏ´Â °æ¿ì´Ù. ¾Æ¸¶ ´ëºÎºÐÀÇ ÀϹÝÀûÀÎ ¾ÖÇø®ÄÉÀ̼ǿ¡ ÀûÇÕÇÑ ¹æ¹ýÀÏ °ÍÀÌ´Ù. ¾ÖÇø®ÄÉÀÌ¼Ç »ó¿¡¼ µðÀÚÀΠŸÀÓ¿¡ °áÁ¤µÇ´Â ºÎºÐ¿¡ ´ëÇØ¼´Â ¾î³ëÅ×À̼ÇÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ°í, ½ÇÁ¦ µðÇ÷ÎÀÌ È¯°æ¿¡ µû¶ó ¹Ù²ð ¼ö ÀÖ´Â ºÎºÐÀÇ °æ¿ì XMLÀ» »ç¿ëÇÏ¿© Ç¥±âÇÏ´Â °ÍÀÌ ÁÁ´Ù.
¿¹¸¦ µé¾î, EJB¿Í °°Àº °æ¿ì ÇØ´ç ºóÀÌ Stateless ¼¼¼Ç ºóÀÎÁö Stateful ¼¼¼Ç ºóÀÎÁö´Â ÇØ´ç Ŭ·¡½º µðÀÚÀΠŸÀÓ¿¡ °áÁ¤µÈ´Ù. ºñÁî´Ï½º ¸Þ¼Òµå°¡ CMT(Container-Managed Transaction)¸¦ »ç¿ëÇÒ Áö BMT(Bean-Managed Transaction)¸¦ »ç¿ëÇÒÁöµµ µðÀÚÀΠŸÀÓ¿¡ °áÁ¤µÈ´Ù. µû¶ó¼ ÀÌ·± ºÎºÐÀº ¾î³ëÅ×À̼ÇÀ¸·Î Ç¥±âÇÏ´Â °ÍÀÌ ÀûÇÕÇÏ´Ù.
ÇÏÁö¸¸ ÇØ´ç ºóÀÌ ½ÇÁ¦·Î ¾î¶² JNDI À̸§À¸·Î ¹ÙÀεù µÉ °ÍÀÎÁö, ±×¸®°í ¸Þ¼Òµå¿¡ ¾î¶² º¸¾È Á¤Ã¥À» ºÎ¿©ÇÒ °ÍÀÎÁö´Â µðÇ÷ÎÀÌ È¯°æ¿¡ µû¶ó ´Þ¶óÁú ¼ö Àֱ⠶§¹®¿¡ ÀÌ´Â XML ¼³Á¤À¸·Î Ç¥±âÇÏ´Â °ÍÀÌ ÀûÇÕÇÏ´Ù.
JPAÀÇ °æ¿ìµµ ÇØ´ç ¿£Æ¼Æ¼ Ŭ·¡½ºÀÇ ¾î¶² Çʵ尡 DB·Î ¸ÅÇÎ µÉ °ÍÀÎÁö³ª ¾î¶² JPQL(Java Persistence Query Language)À» »ç¿ëÇϴ°¡ ¿ª½Ã µðÀÚÀΠŸÀÓ¿¡ °áÁ¤µÇ´Â ¹®Á¦À̹ǷΠ¾î³ëÅ×À̼ÇÀ¸·Î Ç¥±âÇÑ´Ù.
½ÇÁ¦ DB Å×À̺íÀÇ À̸§À̳ª Ä®·³ À̸§ ±×¸®°í Ȥ½Ã DB¿¡ Æ¯ÈµÈ SQLÀ» »ç¿ëÇÏ´Â °æ¿ì¿¡´Â À̸¦ XML¿¡ µî·ÏÇÏ¿© ÄÚµå ¼öÁ¤ ¾øÀÌ º¯°æÇÒ ¼ö ÀÖ°Ô ÇÏ´Â °ÍÀÌ À̽ļº ³ôÀº ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇÏ´Â ¹æ¹ýÀÌ´Ù.
 | Á¦Ç°¿¡ ƯȵÈ(vendor-specific) ¾î³ëÅ×ÀÌ¼Ç |  |
ÀÚ¹Ù EE 5 Ç¥ÁØ ½ºÆåÀÌ Á¤ÀÇµÈ ¾î³ëÅ×À̼ǵéÀº ±× ¹üÀ§°¡ Ç¥ÁØ µð½ºÅ©¸³ÅÍ¿¡¼ Á¤ÀÇÇÒ ¼ö Àִ ǥÁØ ¼³Á¤¿¡¸¸ ÇÑÁ¤µÇ¾î ÀÖ´Ù. ¾Ë´Ù½ÃÇÇ °¢ WAS´Â Á¦Ç° Ư¼º º°·Î °íÀ¯ÀÇ XML µð½ºÅ©¸³ÅÍ ¼³Á¤ÀÌ ÀÖ´Ù.
±×·¯¸é ÀÌ·± Á¦Ç°º° È®Àå(extensions) ¼³Á¤Àº ¾î³ëÅ×À̼ÇÀ» »ç¿ëÇÒ ¼ö ÀÖÀ»±î? ÀÌ°Ç Á¦Ç°¿¡ µû¶ó ´Ù¸£´Ù.
WebLogic Server 10Àº ÀÌ·± È®Àå ¾î³ëÅ×À̼ÇÀ» ÀüÇô Áö¿øÇÏÁö ¾Ê±â ¶§¹®¿¡ ¿©ÀüÈ÷ ¼³Á¤À» À§ÇØ XML µð½ºÅ©¸³ÅͰ¡ ÇÊ¿äÇÏ´Ù. Á¦¿ì½º 6À̳ª JBossÀÇ °æ¿ì ¸î °¡Áö ¼³Á¤¿¡ ´ëÇØ¼(¿¹¸¦ µé¾î, @Clustered, @Idempotent¿Í °°Àº Ŭ·¯½ºÅ͸µ ¼³Á¤) ¾î³ëÅ×À̼ÇÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÇÏÁö¸¸, ¸ðµç ¼³Á¤À» ¾î³ëÅ×À̼ÇÀ¸·Î ÇÒ ¼ö ÀÖµµ·Ï Áö¿øÇÏÁö´Â ¾Ê±â ¶§¹®¿¡ ¼¼¹ÐÇÑ ¼³Á¤À» ÇÏ´Â °æ¿ì¿¡´Â XML µð½ºÅ©¸³ÅͰ¡ ¿©ÀüÈ÷ ÇÊ¿äÇÒ °ÍÀÌ´Ù.
JPA ÇÁ·Î¹ÙÀÌ´õ Áß¿¡µµ ÇÏÀ̹ö³×ÀÌÆ®³ª Å鸵ũ(11g ºÎÅÍ)ÀÇ °æ¿ì È®Àå ¾î³ëÅ×À̼ÇÀ» Áö¿øÇÏ¿© Ç¥ÁØ ½ºÆå ÀÌ¿ÜÀÇ È®ÀåµÈ ORM ±â´ÉÀ» »ç¿ëÇÒ ¼ö°¡ ÀÖ´Ù.
vendor-specific ¾î³ëÅ×À̼ÇÀÇ °æ¿ì ÇØ´ç ¾î³ëÅ×ÀÌ¼Ç Å¬·¡½º°¡ ¾ø¾îµµ JVM¿¡¼´Â À̸¦ ¹«½ÃÇϱ⠶§¹®¿¡ ƯÁ¤ Á¦Ç°ÀÇ ¾î³ëÅ×À̼ÇÀ» ½è´Ù°í ÇØ¼ ´Ù¸¥ Á¦Ç°¿¡¼ µ¹¸± ¶§ ClassNotFoundException°ú °°Àº ¿¡·¯´Â ³ªÁö ¾Ê´Â´Ù. °á±¹ ƯÁ¤ Á¦Ç°¿¡ Á¾¼Ó(Lock-in) µÇ´Â ¹®Á¦´Â º°·Î ¾ø´Ù°í º¼ ¼ö ÀÖ´Ù.
Áö±ÝÀº ¾Æ´ÏÁö¸¸, ¾ÕÀ¸·Î °¢ Á¦Ç°µéÀÌ Á¡Á¡ ¾î³ëÅ×À̼ÇÀ» ´õ ¸¹ÀÌ Áö¿øÇÒ °ÍÀ̶ó°í »ý°¢µÈ´Ù. ÀÌ¿¡ µû¶ó XML ¼³Á¤¿¡ ´ëÇÑ Çʿ伺Àº ¸¹ÀÌ ÁÙ¾îµé °ÍÀÌ´Ù.
 | ÀÚ¹Ù EE 6¿¡¼ÀÇ ¾î³ëÅ×ÀÌ¼Ç È°¿ë |  |
ÇöÀç ³íÀǵǰí ÀÖ´Â ÀÚ¹Ù EE 6¿¡´Â Web Beans¿Í EJB 3.1, ÀÚ¹Ù ÆÛ½Ã½ºÅϽº(Java Persistence) 2.0°ú °°Àº ºñÁî´Ï½º ·ÎÁ÷ ·¹À̾î¿Í Servlet 3.0À̳ª JSF 2.0°°Àº ÇÁ¸®Á¨Å×ÀÌ¼Ç ·¹ÀÌ¾î ±â¼úµéÀÌ Æ÷Ç﵃ °ÍÀ¸·Î º¸ÀδÙ.
Áö±ÝºÎÅÍ´Â ÀÌ Áß¿¡¼ ÇöÀç ¾î´À Á¤µµ ÁøÇàµÇ°í ÀÖ´Â ¿£Æ¼Æ¼Web Beans¿Í EJB 3.1 ±â¼ú¿¡ ´ëÇØ¼ »ìÆìº¸°í ¾î¶² ½ÄÀ¸·Î ¾î³ëÅ×À̼ÇÀ» Ȱ¿ëÇÏ´ÂÁö »ìÆìº¸ÀÚ.
¿£Æ¼Æ¼Web Beans(JSR 299)´Â JBoss SeamÀ» ¸¸µç °³ºó Å·(Gavin King, ÇÏÀ̹ö³×ÀÌÆ® °³¹ßÀڷεµ À¯¸íÇÑ)ÀÌ ½ÃÀÛÇÑ °ÍÀ¸·Î JSF¿Í EJB 3.0 ÄÄÆ÷³ÍÆ® ±â¼úÀ» ¿¬°áÇÏ´Â ½ºÆåÀÌ´Ù. ±âº»ÀûÀ¸·Î JBoss SeamÀÇ ÄÄÆ÷³ÍÆ® ±â¼úÀ» Ç¥ÁØÈÇϱâ À§ÇØ ½ÃÀÛÇÏ¿´Áö¸¸, ÇöÀç´Â ±¸±Û Guice(ÁÖÀ̽º ȤÀº Á꽺·Î ¹ßÀ½ÇÑ´Ù) Áø¿µÀÇ Âü¿©·Î Á» ´õ ÀϹÝÀûÀÎ ÄÄÆ÷³ÍÆ® ±â¼ú·Î ³íÀǰ¡ ÁøÇà µÇ°í ÀÖ´Ù. ¿£Æ¼Æ¼ Web Beans¸¦ »ìÆìº¸±â À§Çؼ´Â ÀÌ ±â¼úÀÇ ±âº» ¹è°æÀÎ Seam ±â¼ú¿¡ ´ëÇØ ¸ÕÀú ÀÌÇØÇÒ Çʿ䰡 ÀÖÀ» µíÇÏ´Ù.
JBoss Seam
SeamÀº JSF°¡ ºñÁî´Ï½º ·ÎÁ÷À» ´ã´çÇÏ´Â ºÎºÐÀ» POJO(Plain-Old Java Object) Managed Bean(ȤÀº Backing Bean)À¸·Î ó¸®ÇÑ´Ù. °á±¹ DB¿Í °°Àº Æ®·£Àè¼ÇÇÑ ¸®¼Ò½º´Â EJB ºóÀ¸·Î ó¸®ÇÏ´Â °Í¿¡ Âø¾ÈÇÏ¿© Áߺ¹µÈ Äڵ带 ÁÙÀ̰í EJB ºóÀ» ¾Æ¿¹ JSFÀÇ Managed Bean ¿ªÇҷΠȰ¿ëÇϰíÀÚ ÇÏ´Â ¾ÆÀ̵ð¾î¿¡¼ Ãâ¹ßÇÏ¿´´Ù.
»ç½Ç ÀÌÁ¦ EJB ºóÀº JSFÀÇ Managed Beanó·³ POJO ÇüÅ·Π¸¸µé ¼ö ÀÖÀ¸¹Ç·Î ±¸Çö»ó º° Â÷À̰¡ ¾ø´Ù.
¶Ç, CMT(Container-Managed Transaction)¸¦ Áö¿øÇϱ⠶§¹®¿¡ DB¸¦ ´Ù·ç´Â Æ®·£Àè¼Ç Äڵ带 ½±°Ô ÀÛ¼ºÇÒ ¼ö°¡ ÀÖÀ¸¸ç, JSF¿Í ´Þ¸® ¾î³ëÅ×ÀÌ¼Ç Áß½ÉÀ¸·Î ºóÀ» ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ÀÎÅͼÁÅÍ¿Í °°Àº AOP °³³äÀ» Àû¿ëÇÒ ¼öµµ Àֱ⠶§¹®¿¡ ¿©·¯ °¡Áö Ãø¸é¿¡¼ Ȱ¿ë°¡´É¼ºÀÌ ´õ ³ô´Ù.
µû¶ó¼ SeamÀº EJB Stateless ¼¼¼Ç ºó°ú Stateful ¼¼¼Ç ºó ±×¸®°í JPA ¿£Æ¼Æ¼ ºóÀ» ¹Ù·Î JSF Managed BeanÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Â ±â´ÉÀ» Á¦°øÇÑ´Ù. ±×·¡¼ µ¥ÀÌÅÍ¿¡ ÇØ´çÇÏ´Â ºÎºÐÀº POJO ¿£Æ¼Æ¼ ºóÀ¸·Î ¼¼ÆÃÇØ ³õ°í ÀÖ´Ù°¡ ¾î¶² ¾×¼ÇÀÌ µé¾î¿À¸é ¼¼¼Ç ºóÀ» ÅëÇØ DB¿Í µ¿±âÈÇÏ´Â °ÍÀÌ °¡´ÉÇÏ°Ô µÈ´Ù.
¶ÇÇÑ, SeamÀº ÀüÅëÀûÀÎ À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¸ÖƼ-À©µµ¿ì(Multi-window) ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ÄÁÅØ½ºÆ®¿¡ ±â¹ÝÇÑ ÇÁ·Î±×·¡¹Ö ¸ðµ¨(Contextual Programming Model)¿¡ ±â¹ÝÇϰí ÀÖ´Ù. ¿¹¸¦ µé¾î, ¾î¶² »ç¿ëÀÚ°¡ ¼îÇθô¿¡¼ ÁÖ¹®À» Çϴµ¥ ¿©·¯ À©µµ¿ì¸¦ ¿¾î³õ°í µ¿½Ã¿¡ ¿©·¯ »óǰÀ» ÁÖ¹®ÇÏ´Â »óȲÀ» »ý°¢Çغ¸ÀÚ.
ÁÖ¹®ÀÌ ¿©·¯ ÆäÀÌÁö¿¡ °ÉÃÄ ÀÖ´Ù°í ÇÑ´Ù¸é º¸ÅëÀº °¢ ÁÖ¹®¿¡ °ü·ÃµÈ Áß°£ µ¥ÀÌÅÍ(»óǰÀ̳ª ½Å¿ëÄ«µå Á¤º¸ µî)¸¦ ¼¼¼Ç(HttpSession)¿¡ ÀúÀåÇÒ °ÍÀÌ´Ù.
¹®Á¦´Â ¿©·¯ À©µµ¿ì´Â °°Àº ¼¼¼ÇÀ» »ç¿ëÇϱ⠶§¹®¿¡ µ¿½Ã¿¡ ÁÖ¹®ÀÌ ÀϾ¸é µ¥ÀÌÅͰ¡ ¼·Î ¾ûÄѼ ÁÖ¹®ÀÌ ÀÌ»óÇÏ°Ô µÉ ¼ö°¡ ÀÖ´Ù´Â µ¥ ÀÖ´Ù. ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é °¢ ÁÖ¹®Àº µ¶¸³ÀûÀÎ conversationÀ¸·Î ´Ù·ç¾î¾ß ÇÑ´Ù.
ÀÌ·± »óȲÀº ¼îÇθôÀÌ ¾Æ´Ï´õ¶óµµ ¾î¶² À¥ ¾ÖÇø®ÄÉÀ̼ǿ¡¼µµ ºñ½ÁÇÏ°Ô ÀϾ ¼ö ÀÖ´Â ½Ã³ª¸®¿ÀÀÌ´Ù. Seam¿¡¼´Â ¼¼¼Ç scopeº¸´Ù ´õ ÀÛÀº °³³äÀÇ conversation scope¸¦ Á¦°øÇϸç ÀÌ·¯ÇÑ ÄÁÅØ½ºÆ® scope¸¦ °ü¸®ÇØ ÁØ´Ù.
¶ÇÇÑ, SeamÀº ÀÚ¹Ù EE 5¿Í ¸¹Àº IoC ÄÁÅ×À̳ʿ¡¼ Á¦°øÇϰí ÀÖ´Â ÀÎÁ§¼Ç(Dependency Injection) º¸´Ù Á» ´õ È®ÀåµÈ µ¿Àû ¹ÙÀÌÁ§¼Ç(Bijection)À̶ó´Â Ư¡À» Á¦°øÇÑ´Ù. ¹ÙÀÌÁ§¼ÇÀº ÀÎÁ§¼Ç(Injection)°ú ¾Æ¿ôÁ§¼Ç(Outjection)À» Æ÷°ýÇÑ ¸»·Î ¾ç¹æÇ⼺ Ư¼ºÀÌ ÀÖ´Ù.
ÀÌ´Â ÇöÀç ÄÁÅØ½ºÆ®¿¡¼ ºóÀ» È£ÃâÇϱâ Àü¿¡ º¯¼ö¿¡ ÀÎÁ§¼ÇÀ» ÇØÁÖ°í, È£Ãâ ÈÄ¿¡´Â ÇØ´ç º¯¼ö¸¦ ´Ù½Ã ÄÁÅØ½ºÆ®¿¡ ´Ù½Ã ¹ÙÀεù ÇØÁÖ°Ô µÇ¾î Á» ´õ ´Ü¼øÇÏ°Ô ÄÁÅØ½ºÆ®¿¡ ±â¹ÝÇÑ ÇÁ·Î±×·¥À» ÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. Seam¿¡ ´ëÇÑ ÀÌÇØ¸¦ Á» ´õ ³ôÀ̱â À§ÇÑ ¿¹Á¦·Î <¸®½ºÆ® 3>À» »ìÆìº¸ÀÚ.
| <¸®½ºÆ® 3> Seam ºó Ŭ·¡½º ¿¹Á¦ | | | |
@Stateful
@Name("hotelBooking") ............................................ (1)
@Restrict("#{identity.loggedIn}")
public class HotelBookingAction implements HotelBooking {
@PersistenceContext(type=EXTENDED)
private EntityManager em;
@In ............................................................ (2)
private User user;
@In(required=false) @Out ....................................... (3)
private Hotel hotel;
@In(required=false)
@Out(required=false)
private Booking booking;
...
@Begin ..........................................................(4)
public void selectHotel(Hotel selectedHotel) {
hotel = em.merge(selectedHotel);
}
public void bookHotel() {
booking = new Booking(hotel, user);
Calendar calendar = Calendar.getInstance();
booking.setCheckinDate( calendar.getTime() );
calendar.add(Calendar.DAY_OF_MONTH, 1);
booking.setCheckoutDate( calendar.getTime() );
}
public void setBookingDetails() { ... }
public boolean isBookingValid() {
return bookingValid;
}
@End ...........................................................(5)
public void confirm() {
em.persist(booking);
facesMessages.add("Thank you, #{user.name}, your confimation number for #{hotel.name} is #{booking.id}");
log.info("New booking: #{booking.id} for #{user.username}");
events.raiseTransactionSuccessEvent("bookingConfirmed");
}
@End
public void cancel() {}
@Destroy @Remove
public void destroy() {}
}
| |
 |
<¸®½ºÆ® 3>Àº Seam¿¡ Æ÷ÇԵǾî Àִ ȣÅÚ ¿¹¾à ¿¹Á¦ ÇÁ·Î±×·¥ÀÇ ÀϺÎÀÌ´Ù. HotelBookingAction Ŭ·¡½º´Â EJB Stateful ¼¼¼Ç ºóÀε¥, ¹Ù·Î conversation »óŸ¦ °ü¸®ÇÏ´Â Seam ºóÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. SeamÀº EJB 3.0¿¡¼ Á¤ÀÇÇÑ ¾î³ëÅ×ÀÌ¼Ç À̿ܿ¡ SeamÀÇ ºóÀ¸·Î Ȱ¿ëÇϱâ À§Çؼ ¿©·¯ ¾î³ëÅ×À̼ÇÀ» Á¤ÀÇÇØ ³õ¾Ò´Ù.
(1)ÀÇ @NameÀº ÇØ´ç ÄÄÆ÷³ÍÆ®¸¦ SeamÀÇ ºóÀ¸·Î ¸í½ÃÇÏ¸é¼ °íÀ¯ À̸§À» ÇÒ´çÇϱâ À§ÇÑ °ÍÀÌ´Ù. ÀÌ À̸§À» ÀÌ¿ëÇÏ¿© JSF ÆäÀÌÁö¿¡¼ ELÀ» ÅëÇØ ´ÙÀ½°ú °°ÀÌ ºó¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
<h:commandButton id="bookHotel" action="#{hotelBooking.bookHotel}" />
(2)ÀÇ @InÀº µ¿Àû ÀÎÁ§¼ÇÀ» ÅëÇØ ´Ù¸¥ ÄÄÆ÷³ÍÆ®¸¦ ¼¼¼Ç ÄÁÅØ½ºÆ®¿¡¼ ¾ò¾î¿À´Â °ÍÀÌ´Ù. ¿©±â¼ User, Hotel, BookingÀº JPA ¿£Æ¼Æ¼ ºóÀ¸·Î DB¿¡ ÇØ´çÇÏ´Â °´Ã¼ µµ¸ÞÀÎ ¸ðµ¨À» ³ªÅ¸³½´Ù. Seam¿¡¼´Â ¿£Æ¼Æ¼ ºóÀ» Seam ºóÀ¸·Î ¹Ù·Î ¾µ ¼ö Àֱ⠶§¹®¿¡ º°µµÀÇ ºóÀ» ¸¸µé Çʿ䰡 ¾ø¾îÁ³´Ù.
°¢°¢ ¡®user¡¯, ¡®hotel¡¯, ¡®booking¡¯À̶ó´Â À̸§À¸·Î ÇöÀç ÄÁÅØ½ºÆ®¿¡¼ ¾ò¾î¿Í ÇØ´ç Çʵ忡 ÀÎÁ§¼ÇÀ» ÇØÁÖ°Ô µÇ¹Ç·Î À̸¦ ¾ò¾î¿À±â À§ÇØ º°µµÀÇ ÄÚµùÀ» ÇÒ Çʿ䰡 ¾ø´Ù.
hotel°ú booking Çʵå´Â (3)ÀÇ @OutÀ̶ó´Â ¾Æ¿ôÁ§¼Ç ¾î³ëÅ×À̼ǵµ °¡Áö°í Àִµ¥ ÀÌ´Â ÇØ´ç Çʵ带 ¸Þ¼Òµå È£Ãâ ÈÄ¿¡ ´Ù½Ã ÇöÀç conversation ÄÁÅØ½ºÆ®¿¡ ¹ÙÀεù ÇÏ°Ô µÈ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ÀÌ·± ½ÄÀ¸·Î ºóÀº Á» ´õ ÄÁÅØ½ºÆ® Áß½ÉÀûÀÎ ÇÁ·Î±×·¡¹ÖÀ» ÇÒ ¼ö°¡ ÀÖÀ¸¸é¼ ¹ÙÀÌÁ§¼ÇÀ» ´öÅÃÀ¸·Î ÄÁÅØ½ºÆ®¿¡¼ °ªÀ» ¾ò¾î¿À°Å³ª ¼¼ÆÃÇÏ´Â Äڵ带 ÁÙ¿©ÁØ´Ù.
(4)ÀÇ selectHotel() ¸Þ¼Òµå´Â @BeginÀ» °¡Áö°í Àִµ¥, ÀÌ´Â »õ·Î¿î conversationÀ» ½ÃÀÛ½ÃŲ´Ù. ¹Ý´ë·Î (5)ÀÇ @End´Â ÇØ´ç conversationÀ» Á¾·á½ÃŲ´Ù.
conversationÀº º°µµÀÇ Å¸ÀӾƿô °ªÀ» °¡Áö°í ÀÖ¾î¼ ¾î´À Á¤µµ ½Ã°£ÀÌ Áö³ª¸é ÀÚµ¿À¸·Î »èÁ¦µÇ±â ¶§¹®¿¡ ºê¶ó¿ìÀú¸¦ ±×³É ´Ý°Å³ª ÇÏ´Â µîÀÇ ºñÁ¤»óÀûÀÎ Á¾·á°¡ ÀÖ´õ¶óµµ ¸Þ¸ð¸®¸¦ °è¼Ó Áõ°¡½ÃŰÁö´Â ¾Ê´Â´Ù.
¹°·Ð SeamÀº ÀÏ¹Ý JavaBean Çüŵµ Áö¿øÇϱ⠶§¹®¿¡ À§ ºóÀ» ¹Ýµå½Ã Stateful ¼¼¼Ç ºóÀ¸·Î ¸¸µéÁö ¾Ê¾Æµµ µÈ´Ù. ÇÏÁö¸¸, EJB´Â ÄÁÅ×À̳ʿ¡¼ Æ®·£Àè¼ÇÀ» °ü¸®ÇØ ÁÖ´Â ±â´É(CMT)ÀÌ Àֱ⠶§¹®¿¡ º°µµÀÇ Æ®·£Àè¼Ç ÄÚµå ¾øÀ̵µ DB¿Í µ¿±âȸ¦ À§ÇÑ JPA Äڵ带 ½±°Ô ±¸ÇöÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
¸¸¾à EJB°¡ ¾Æ´Ï¾ú´Ù¸é ÇØ´ç ºóÀº ·ÎÁ÷°ú °ü°è¾ø´Â ¸¹Àº Æ®·£Àè¼Ç Äڵ带 °¡Áö°í ÀÖ¾úÀ» °ÍÀÌ´Ù. ÀÌ·± ÀÌÀ¯·Î Seam¿¡¼´Â stateful ¼¼¼Ç ºó°ú ¿£Æ¼Æ¼ ºóÀ» ¸¹ÀÌ »ç¿ëÇÏ°Ô µÈ´Ù.
Seam¿¡ ´ëÇØ¼´Â ÀÌ Á¤µµ·Î ´Ù·ç±â·Î Çϰí Á» ´õ ÀÚ¼¼ÇÑ ³»¿ëÀ» ¾Ë°í ½ÍÀº µ¶ÀÚ´Â Seam Æ©Å丮¾óÀ» »ìÆìº¸±æ ¹Ù¶õ´Ù.
Web Beans
Web Beans´Â SeamÀÇ ÄÄÆ÷³ÍÆ® ¸ðµ¨¿¡ ±â¹ÝÀ» µÎ°í ÀÖÁö¸¸ ±¸±Û GuiceÀÇ ÀåÁ¡À» ¸¹ÀÌ ¼ö¿ëÇϰí ÀÖ´Ù. Áï, Guiceó·³ ¾î³ëÅ×À̼ÇÀ» »ç¿ëÇÏ¿© ´Ù¾çÇÑ scopeÀ» Á¤ÀÇÇÒ ¼ö ÀÖ°í ÇϳªÀÇ ÀÎÅÍÆäÀ̽º¿¡ ´ëÇØ ¿©·¯ °³ÀÇ ±¸Çö Ŭ·¡½º¸¦ °¡Áú ¼öµµ ÀÖ¾î¼ »óȲ¿¡ ¸Â°Ô ÀÎÁ§¼Ç ÇØÁÖ´Â µîÀÇ À¯»çÇÑ Æ¯Â¡À» °¡Áö°í ÀÖ´Ù(Web Beans JSR¿¡ Guice °³¹ßÀÚ°¡ ÁÖµµÀûÀ¸·Î Âü¿©Çϰí ÀÖÀ½).
Âü°í·Î JSR 299´Â ¾ÆÁ÷ Early Draft ÀÌÀü´Ü°è·Î ¿©±â¼ ¾ð±ÞÇÑ ³»¿ëÀº ¾ó¸¶µçÁö ÃßÈÄ¿¡ ¹Ù²ð ¼ö ÀÖ´Ù(ÁÁÀº ÀǰßÀÌ ÀÖ´Ù¸é ¾ðÁ¦µçÁö ÇÊÀÚ¿¡°Ô Çǵå¹éÀ» ÁÖ¸é ½ºÆå ³íÀÇ »ó¿¡ ÃæºÐÈ÷ °í·ÁÇϰڴÙ).
Web Beans´Â Seamó·³ ¾î³ëÅ×À̼ÇÀ» ÅëÇØ ÄÄÆ÷³ÍÆ®¸¦ Á¤ÀÇÇÏ°Ô µÈ´Ù. ¿¹¸¦ µé¾î <¸®½ºÆ® 4>¿Í °°ÀÌ ÀÏ¹Ý JavaBeanÀ̳ª EJB ºóÀ» @Component¸¦ ÅëÇØ ÄÄÆ÷³ÍÆ®·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 4> Web Bean ÄÄÆ÷³ÍÆ® | | | |
@Component
public class PaymentProcessorImpl implements PaymentProcessor { ... }
@Stateless
@Component
@Named("loginAction")
public class LoginActionImpl implements LoginAction { ... }
| |
 |
ÄÄÆ÷³ÍÆ®´Â ÇØ´ç ÄÄÆ÷³ÍÆ®¿¡ Á¢±ÙÇϱâ À§ÇÑ ÀÎÅÍÆäÀ̽º¸¦ °¡Áö´Âµ¥ À̸¦ ÅëÇØ ½ÇÁ¦ »ç¿ëµÉ ÄÄÆ÷³ÍÆ® Ŭ·¡½º¸¦ °áÁ¤ÇÏ°Ô µÈ´Ù. ÀÎÁ§¼ÇÀº ´ÙÀ½°ú °°ÀÌ ¼öÇàÇϸç ÇØ´ç ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÑ ÄÄÆ÷³ÍÆ® Ŭ·¡½ºÀÇ ÀνºÅϽº°¡ ÀÎÁ§¼Ç µÈ´Ù(ÀÚ¹Ù EE 5ÀÇ ÀÎÁ§¼Ç°ú À¯»çÇÏÁö¸¸ ¾Õ¼ ¸»ÇÑ Seam°ú °°ÀÌ ¸Þ¼Òµå È£Ãâ Àü¿¡ µ¿ÀûÀ¸·Î ÀÎÁ§¼ÇÀÌ ÀÌ·ç¾îÁø´Ù).
@In PaymentProcessor paymentProcessor;
Seam°ú ´Þ¸® Web Beans´Â ÇϳªÀÇ ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÑ ¿©·¯ °³ÀÇ ÄÄÆ÷³ÍÆ® ±¸Çö Ŭ·¡½º¸¦ Áö¿øÇϱâ À§ÇØ ¹ÙÀεù ¾î³ëÅ×À̼Ç(Binding Annotation)À̶ó´Â GuiceÀÇ °³³äÀ» µµÀÔÇÏ¿´´Ù. Áï, ´ÙÀ½°ú °°ÀÌ @BindingTypeÀ¸·Î ¾î³ëÅ×À̼ÇÀ» Á¤ÀÇÇÒ ¼ö Àִµ¥ À̸¦ ÄÄÆ÷³ÍÆ®¿Í ÀÎÁ§¼Ç µÇ´Â Çʵ忡 »ç¿ëÇÒ ¼ö ÀÖ´Ù.
@BindingType
@Retention(RUNTIME)
@Target({TYPE, FIELD, METHOD})
public @interface Synchronous {}
Á¤ÀÇµÈ ¾î³ëÅ×À̼ÇÀ» ´ÙÀ½°ú °°ÀÌ ½ÇÁ¦ ÄÄÆ÷³ÍÆ®¿¡ ¹ÙÀεù ¾î³ëÅ×À̼ÇÀ¸·Î ÁöÁ¤ÇÏ°Ô µÈ´Ù.
@Synchronous @Component
public class SynchronousPaymentProcessorImpl implements PaymentProcessor { ... }
±×·¯¸é, °á±¹ ´ÙÀ½°ú °°ÀÌ ¹ÙÀεù ¾î³ëÅ×À̼ÇÀ» »ç¿ëÇÏ¿© ¿øÇϴ ŸÀÔÀÇ ÄÄÆ÷³ÍÆ®¸¦ ÀÎÁ§¼ÇÇÒ ¼ö°¡ ÀÖ°Ô µÈ´Ù.
@In @Synchronous PaymentProcessor paymentProcessor;
@In @Asynchronous PaymentProcessor paymentProcessor;
¾Õ¼ @Named("loginAction")¸¦ »ç¿ëÇÏ¿© ÄÄÆ÷³ÍÆ®¸¦ Á¤ÀÇÇÏ¿´´Âµ¥ À̴ Ư¼öÇÑ ÇüÅÂÀÇ ¹ÙÀεù ¾î³ëÅ×À̼ÇÀÌ´Ù. ÁÖ·Î ´ÙÀ½°ú °°ÀÌ Å¸ÀÔ ±â¹ÝÀÌ ¾Æ´Ñ EL°ú °°Àº À̸§ ±â¹ÝÀÇ È¯°æ¿¡¼ ÄÄÆ÷³ÍÆ®¸¦ Âü°íÇÒ ¶§ »ç¿ëµÈ´Ù.
<h:commandButton value="#{loginAction.login}"/>
Seam¿¡¼´Â Ç×»ó ÄÄÆ÷³ÍÆ®°¡ À̸§À» ÅëÇØ¼¸¸ Á¢±ÙÇÒ ¼ö ÀÖ¾ú´Ù(ELÀ̵ç Àڹ٠Ŭ·¡½º¿¡¼µç). Web Beans¿¡¼´Â ÀÌ »Ó¸¸ ¾Æ´Ï¶ó ¾î³ëÅ×À̼ÇÀ» Ȱ¿ëÇÏ¿© Guice¿Í ¸¶Âù°¡Áö·Î ŸÀÔ ±â¹Ý ÀÎÁ§¼Çµµ Áö¿øÇÏ°í µ¿ÀÏÇÑ ÀÎÅÍÆäÀ̽ºÀÇ ¿©·¯ ±¸Çö Ŭ·¡½º¸¦ Áö¿øÇÏ´Â µî Á» ´õ À¯¿¬ÇÑ ÄÄÆ÷³ÍÆ® »ç¿ë ȯ°æÀ» Á¦°øÇÑ´Ù.
Seam°ú ´Ù¸¥ Web BeansÀÇ ¶Ç ´Ù¸¥ Ư¡Àº ¾î³ëÅ×À̼ÇÀ» »ç¿ëÇÏ¿© »ç¿ëÀÚ Á¤Àǰ¡ °¡´ÉÇÑ custom scope¸¦ Áö¿øÇÑ´Ù´Â °ÍÀÌ´Ù.
¹ÙÀεù¾î³ëÅ×À̼ÇÀÌ ¾î¶² ÄÄÆ÷³ÍÆ® ±¸Çö Ŭ·¡½º¸¦ »ç¿ëÇÒ Áö¸¦ °áÁ¤ÇÏ´Â ¸ÅÄ¿´ÏÁòÀ̶ó¸é scopeÀº ÇØ´ç Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¾î¶² ¹üÀ§¿¡¼ °øÀ¯ÇÒ °ÍÀΰ¡¸¦ °áÁ¤ÇÏ´Â ¸ÞÄ¿´ÏÁò°ú °ü·ÃµÇ¾î ÀÖ´Ù. ÀÌ¹Ì ¾Õ¿¡¼ Seam¿¡¼´Â ÄÁÅØ½ºÆ®¿¡ ±â¹ÝÇÑ ÇÁ·Î±×·¡¹Ö ¸ðµ¨À» À§Çؼ Conversation scope¸¦ Æ÷ÇÔÇÏ¿© ´Ù¾çÇÑ scopeÀ» Áö¿øÇÑ´Ù°í Çß´Ù.
Web Beans ¿ª½Ã ±âº»ÀûÀ¸·Î no scope¿Í request, session, conversation, application(singleton) scopeÀ» Áö¿øÇÑ´Ù. ¶ÇÇÑ »ç¿ëÀÚ Á¤Àǰ¡ °¡´ÉÇÑ custom scopeÀ» Áö¿øÇϱ⠶§¹®¿¡ º¹ÀâÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ̳ª »õ·Î¿î ÇÁ·¹ÀÓ¿öÅ©¿¡ È®À强À» Á¦°øÇÑ´Ù.
¿¹¸¦ µé¾î, BPM°ú °°Àº ¿µ¿ª¿¡¼´Â ÇϳªÀÇ process¿¡ ÇØ´ç ÇÏ´Â ¿À·¡ Áö¼ÓµÇ´Â scopeÀ» Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ¶Ç, Æ®·£Àè¼Ç ±â¹Ý ¾ÖÇø®ÄÉÀ̼ǿ¡¼´Â ÇϳªÀÇ Æ®·£Àè¼Ç¿¡ ¹ÙÀεù µÇ´Â transaction scope°ú °°Àº °Íµµ Á¤ÀÇÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
¿¹¸¦ µé¾î, ´ÙÀ½°ú °°ÀÌ ÀÌ¹Ì Á¤ÀÇµÈ conversationscopeÀ» »ç¿ëÇÏ¸é º°µµÀÇ ÄÚµå ¾øÀÌ ÇØ´ç scope ¾È¿¡¼ ÇϳªÀÇ ÀνºÅϽº¸¸ À¯ÁöÇÏ¿© conversation »óŸ¦ °ü¸®ÇÏ°Ô µÈ´Ù.
@Component @ConversationScoped
public class PaymentProcessorImpl implements PaymentProcessor { ... }
ȤÀº, ´ÙÀ½°ú °°ÀÌ custom scopeÀ» Á¤ÀÇÇÒ ¼öµµ ÀÖ´Ù. À̶§´Â Context API¸¦ »ç¿ëÇÏ¿© Á÷Á¢ scopeÀ» ½ÃÀÛ/Á¾·á ÇÏ°Ô µÈ´Ù(¾Æ¸¶ Web Beans ±â¹Ý Á¦ 3ÀÇ ÇÁ·¹ÀÓ¿öÅ©¿¡ À¯¿ëÇÑ ±â´ÉÀÌ µÉ µíÇÏ´Ù).
@ScopeType ...
public @interface TransactionScoped {}
@Component @TransactionScoped
public class TransactionScopeProcessorImpl implements Processor { ... }
Áö±Ý±îÁö »ìÆìº» Web Beans´Â ÇöÀç Ãʱâ´Ü°èÀÌ¸ç ¾ÕÀ¸·Î °è¼Ó Èï¹Ì·Î¿î ³»¿ëµéÀÌ Ãß°¡µÉ °ÍÀÌ´Ù. ÀÌ´Â µû·Î µû·Î ¹ßÀüÇÏ´ø À¥ ±â¼ú°ú EJB ±â¼úÀÇ ´ëÅëÇÕ(?)À» À§ÇÑ ¹Ø°Å¸§À» Á¦°øÇÑ´Ù´Â Á¡¿¡¼ ÁÖ¸ñÇÒ ¸¸ÇÑ Áß¿ä ±â¼úÀÌ µÉ °ÍÀ¸·Î ¿¹»óµÈ´Ù.
EJB 3.1
EJB 3.0¿¡¼´Â °³¹ßÀÇ ÆíÀǼºÀ» Çâ»ó½Ã۱â À§Çؼ ¾î³ëÅ×À̼ÇÀ» µµÀÔÇÏ´Â µî ¸¹Àº °³¼±ÀÌ ÀÖ¾ú´Ù. EJB 3.1Àº ÀÌ¿¡ ´õÇØ¼ À¥ ȯ°æ¿¡¼ EJB¸¦ »ç¿ëÇϱ⠽±°Ô ÇÏÀÚ´Â µî ´ÙÀ½°ú °°Àº °³¼±¾ÈÀ» °¡Áö°í Áغñ ÁßÀÌ´Ù.
¡Ü ºñÁî´Ï½º ÀÎÅÍÆäÀ̽º ¾ø´Â ·ÎÄà ºó
¡Ü WAR ¾È¿¡ EJB¸¦ ÆÐŰ¡ÇÏ´Â ±â´É
¡Ü ½Ì±ÛÅÏ(singleton) ºó
¡Ü ºóÀÌ ÄÁÄ¿·±½Ã¸¦ °ü¸®ÇÏ´Â ±â´É(Bean-managed concurrency) µîÀÇ ¿©·¯ °¡Áö ÄÁÄ¿·±½Ã ¿É¼Ç
¡Ü Å©·Ð(cron) ½ºÅ¸ÀÏÀÇ Å¸ÀÌ¸Ó ¼ºñ½º
¡Ü ºñµ¿±â(Asynchronous) ¸Þ¼Òµå Áö¿ø
¾ÕÀÇ ¼¼ °¡Áö °³¼±»çÇ×Àº Seam°ú °°Àº À¥ ±â¹Ý ÄÄÆ÷³ÍÆ® ±â¼ú¿¡¼ EJB¸¦ »ç¿ëÇÏ¸é¼ Çʿ伺ÀÌ Áõ´ëµÇ¾ú´Ù. »ç½Ç, À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÇ °æ¿ì ÁÖ·Î ELÀ» ÅëÇØ ºóÀ» Á¢±ÙÇϹǷΠº°µµÀÇ ÀÎÅÍÆäÀ̽º°¡ ÇÊ¿äÇÏÁö ¾Ê´Ù. ¶§¹®¿¡ EJB ºóµµ ÀÌ¿¡ ¸ÂÃß¾î º°µµÀÇ ÀÎÅÍÆäÀ̽º¸¦ ¸¸µé Çʿ䰡 ¾ø´Ù¸é ÁÁÀ» °ÍÀÌ´Ù(ÀÌ¹Ì JPA ¿£Æ¼Æ¼ ºóÀº ÀÎÅÍÆäÀ̽º°¡ ÇÊ¿ä ¾ø´Ù).
¶ÇÇÑ, SeamÀ̳ª Web Beans¿Í °°Àº À¥ ¾ÖÇø®ÄÉÀÌ¼Ç È¯°æ¿¡¼ EJB ºóÀ» »ç¿ëÇÏ´Â °æ¿ì ±»ÀÌ EJB¸¦ º°µµÀÇ ¸ðµâ·Î ÆÐŰ¡Çϰí À̸¦ ´Ù½Ã EAR·Î ÆÐŰ¡ÇÏ´Â °ÍÀº ¶Ç ÇϳªÀÇ ºÒÇÊ¿äÇÑ º¹ÀâÇÑ °úÁ¤ÀÌ´Ù. ´ë½Å¿¡ À̸¦ WAR ¾È¿¡ °°ÀÌ ³ÖÀ» ¼ö ÀÖ´Ù¸é ÆÐŰ¡ÀÌ Á» ´õ ´Ü¼øÇØ Áú °ÍÀÌ´Ù.
¶ÇÇÑ, ½Ì±ÛÅÏ ºóÀº ½Ì±ÛÅÏ scope(Web Beans¿¡¼´Â application scope)¸¦ °¡Áö´Â ºóÀ» ÇÊ¿ä·Î ÇÏ´Â °æ¿ì¿¡ À¯¿ëÇÑ ±â´ÉÀÌ µÉ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ·± °æ¿ì¿¡ ±»ÀÌ ±âÁ¸ EJB ºóó·³ Ç®¸µÀ» ÇÒ Çʿ䰡 ¾ø´Ù. ½Ì±ÛÅÏ ºóÀº µ¿½Ã¿¡ ¿©·¯ Ŭ¶óÀÌ¾ðÆ®°¡ Á¢±ÙÇÒ °æ¿ì ÄÁÄ¿·±½Ã ÄÁÆ®·ÑÀ» ¾î¶»°Ô ÇÒ °ÍÀ̳Ĵ ¹®Á¦°¡ ÀÖ´Ù.
À̸¦ À§Çؼ <¸®½ºÆ® 5>¿Í °°ÀÌ @ReadOnly, @ReadWrite¿Í °°Àº ÄÁÄ¿·±½Ã ¾î³ëÅ×À̼ÇÀ» Á¤ÀÇÇÏ¿© ÄÁÅ×À̳ʰ¡ Read/Write ¶ô(lock)À» ÅëÇØ ÄÁÄ¿·±½Ã¸¦ ÄÁÆ®·Ñ ÇØÁÖµµ·Ï ÇÑ´Ù.
| |
@Singleton
public class SingletonBean {
private SharedApplicationData data;
@ReadOnly
public int getFoo() {
return data.foo;
}
@ReadWrite
public void update() {
// update shared data...
}
}
| |
 |
¶ÇÇÑ, ÄÁÅ×À̳ʿ¡°Ô ±»ÀÌ ÄÁÄ¿·±½Ã ÄÁÆ®·ÑÀ» ¸Ã±â°í ½ÍÁö ¾ÊÀº °æ¿ì¸¦ À§ÇØ @BeanManagedConcurrency¿Í ¾î³ëÅ×À̼ÇÀ» ÅëÇØ À̸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Â ±â´Éµµ Á¦°øÇÑ´Ù.
Àç¹ÌÀÖ´Â °ÍÀº ´Ù¾çÇÑ ºñµ¿±â ¹æ½ÄÀ» Áö¿øÇϱâ À§ÇÑ °³¼±¾Èµµ ÀÖ´Ù´Â »ç½ÇÀÌ´Ù. EJB´Â ±âÁ¸ºÎÅÍ Å¸ÀÌ¸Ó ¼ºñ½º¸¦ Áö¿øÇÏ¿© Statelsss ¼¼¼Ç ºóÀ̳ª MDBÀÇ °æ¿ì ÀÏÁ¤ ½Ã°£¸¶´Ù ¸Þ¼Òµå°¡ È£ÃâµÇ°Ô ÇÒ ¼ö ÀÖ¾ú´Ù.
ÇÏÁö¸¸ ÀÌ´Â µðÇ÷ÎÀ̰¡ µÇ¸é ½ÃÀ۵Ǵ °ÍÀÌ ¾Æ´Ï¶ó ¾î¶² API¸¦ ÅëÇØ Á÷Á¢ ½ÃÀÛ½ÃÄÑ¾ß ÇÏ´Â ºÒÆíÇÔÀÌ ÀÖ¾î¼ Å©·Ð(cron) ½ºÅ¸ÀÏÀÇ ÁÖ±âÀûÀΠŸÀÌ¸Ó ÀÛ¾÷À» ¼öÇà½ÃŰ±â¿¡´Â ºÎÁ·ÇÏ¿´´Ù. À̸¦ <¸®½ºÆ® 6>ó·³ Å©·Ð ÀÛ¾÷°ú °°ÀÌ ¼±¾ðÀûÀ¸·Î Á¤ÀÇÇÏ¿© ŸÀÌ¸Ó ÀÛ¾÷À» ¼öÇà½Ãų ¼ö ÀÖ´Â ±â´ÉÀÌ °í·ÁµÇ°í ÀÖ´Ù.
| <¸®½ºÆ® 6> Å©·Ð ½ºÅ¸ÀÏ Å¸ÀÌ¸Ó ºó | | | |
@Stateless @EJBTimer("0 12 1 * *") // ¸Å´Þ ù°³¯ Á¤¿À¿¡ ¼öÇà
public class AccountBean {
@Timeout void sendMontlyStatements(Timer t) {
// ...
}
}
| |
 |
¶Ç ´Ù¸¥ ¹æ½ÄÀ¸·Î <¸®½ºÆ® 7>¿Í °°ÀÌ ¸Þ¼Òµå È£Ãâ ÀÚü¸¦ ºñµ¿±â È£ÃâÀÌ µÇµµ·Ï ÇÏ´Â ±â´Éµµ °í·ÁµÇ°í ÀÖ´Ù.
| <¸®½ºÆ® 7> ºñµ¿±â ¸Þ¼Òµå¸¦ °¡Áö´Â ºó | | | |
@Stateful @BeanManagedConcurrency
public class AsyncTaskBean implements AsyncTask {
private boolean taskComplete = false;
@Asynchronous public void doSomething(Details d) {
...
taskComplete = true;
}
public boolean isTaskComplete() {
return taskComplete;
}
}
| |
 |
JSR 303 Beans Validation
¾î³ëÅ×À̼ÇÀ» ÀÌ¿ëÇÑ ¶Ç ÇϳªÀÇ Àç¹ÌÀÖ´Â ÀÀ¿ëÀº JSR 303¿¡¼ ³íÀǵǰí ÀÖ´Â validation ¸ÞŸµ¥ÀÌÅÍ´Ù. JSR 303 Beans Validation ½ºÆåÀº <¸®½ºÆ® 8>¿¡¼ º¸µíÀÌ ÀÚ¹Ù ±âº» ŸÀÔ¿¡ ¾î¶² Á¦¾à»çÇ×(constraint)À» °¡ÇÏ°í ½ÍÀ» ¶§ »ç¿ëÇÒ ¼ö ÀÖ´Â °øÅë validation ¸ÞŸµ¥ÀÌÅ͸¦ Á¤ÀÇÇÑ´Ù.
À̹Ì, ÇÏÀ̹ö³×ÀÌÆ®¿¡¼´Â ÀÌ·± ÇüÅÂÀÇ ¾î³ëÅ×À̼ÇÀ» »ç¿ëÇÒ ¼ö°¡ ÀÖ¾ú´Âµ¥(Hibernate Validator) À̸¦ Á» ´õ Ç¥ÁØÈ ÇÏ¿© ÀϹÝÀûÀÎ JavaBean°ú JPA¿Í °°Àº °÷¿¡¼ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀÌ JSR 303ÀÌ Ãß±¸ÇÏ´Â ¹æÇâÀÌ´Ù. JSR 303ÀÌ ¿Ï·áµÇ¸é JPA 2.0¿¡¼ À̸¦ äÅÃÇÒ °ÍÀ¸·Î º¸ÀδÙ.
| <¸®½ºÆ® 8> Bean ValidationÀ» Àû¿ëÇÑ ¿£Æ¼Æ¼ ºó | | | |
@Entity
public class Employee {
@Id @GeneratedValue
protected Integer empId;
@Required protected String name;
@Length(max=5)protected String locationCode;
@Max(240)protected Integer vacationAccrued;
...
}
| |
 |
¸¸¾à <¸®½ºÆ® 8>¿¡¼ Á¦¾à»çÇ×À» XML ¸ÞŸµ¥ÀÌÅÍ·Î Á¤ÀÇÇϰíÀÚ Çß´Ù¸é ±²ÀåÈ÷ ºÒÆíÇϰí ÄÚµåÀÇ °¡µ¶¼ºµµ ¶³¾îÁ³À» °ÍÀÌ´Ù. ¾î³ëÅ×À̼ÇÀº ÀÌ·± Ãø¸é¿¡¼ ±²ÀåÈ÷ Æí¸®ÇÏ´Ù.
Áö±Ý±îÁö ÀÚ¹Ù EE 5¿¡¼ µµÀÔµÈ ¾î³ëÅ×À̼ÇÀÌ °¡Áö´Â Àå/´ÜÁ¡°ú XML°úÀÇ °ü°è, ±×¸®°í ÀÚ¹Ù EE 6¿¡¼ ³íÀǵǰí ÀÖ´Â ¿©·¯ ¾î³ëÅ×ÀÌ¼Ç ±â¼ú¿¡ ´ëÇØ¼ »ìÆìº¸¾Ò´Ù.
¾î³ëÅ×À̼ÇÀº ±âÁ¸ XML ¸ÞŸµ¥ÀÌÅÍ¿¡ ºñÇØ¼ ÄÚµåÀÇ °¡µ¶¼º, »ç¿ë»ó Æí¸®¼º ¹× È¿À²¼º µî¿¡¼ ÀåÁ¡ÀÌ Àֱ⠶§¹®¿¡ ¾ÕÀ¸·Î ¸¹Àº Â÷±â ÀÚ¹Ù EE ±â¼ú¿¡¼ ¾Õ´ÙÅõ¾î äÅÃµÉ °ÍÀ¸·Î º¸ÀδÙ. ¾Õ¼ »ìÆìº» Web Beans¿Í °°Àº ÄÄÆ÷³ÍÆ® ¸ðµ¨À» XML·Î ±¸ÇöÇÑ´Ù¸é ±²ÀåÈ÷ º¹ÀâÇØÁ³À» ÅÙµ¥ ¾î³ëÅ×À̼ÇÀ» ÅëÇØ ³î¶ó¿ï Á¤µµ·Î ½±°Ô ¸ðµ¨À» Á¤ÀÇÇϰí Çϰí ÀÖ´Ù.
¶ÇÇÑ, Beans Validation°ú °°Àº ±â¼úÀº ÀÚ¹ÙÀÇ Å¸ÀÔÀ» Á» ´õ »ó¼¼ÇÏ°Ô Á¤ÀÇÇÒ ¼ö ÀÖ´Â Áß¿äÇÑ ±â¹ÝÀ» Á¦°øÇϰí ÀÖ´Ù. ÀÌ·¸°Ô ¾î³ëÅ×À̼ÇÀº ´Ü¼øÈ÷ XMLÀ» ´ëüÇÏ´Â ¸ÞŸµ¥ÀÌÅͰ¡ ¾Æ´Ï¶ó ÀÚ¹Ù ±â¼ú¿¡ ÀÖ¾î¼ »õ·Î¿î µµ¾àÀ» ÀǹÌÇÏ´Â Áß¿äÇÑ ¿ä¼Ò·Î Á¡Á¡ °¢±¤À» ¹Þ°í ÀÖ´Ù.
ÇÏÁö¸¸ ¾î³ëÅ×À̼ÇÀº XMLÀ» ¿ÏÀüÈ÷ ´ëüÇÏ´Â ¸ÞŸµ¥ÀÌÅÍ´Â ¾Æ´Ï¹Ç·Î ¿©ÀüÈ÷ XMLÀº ²À ¹è¿ö¾ß ÇÏ´Â Ç׸ñ¿¡¼ ºüÁöÁö´Â ¾ÊÀ» °ÍÀ¸·Î º¸ÀδÙ. ¿ÀÈ÷·Á ÈǸ¢ÇÑ °³¹ßÀÚ¶ó¸é ¾î´À °æ¿ì¿¡ ¾î³ëÅ×À̼ÇÀ» ¾²°í, ¾î´À °æ¿ì¿¡ XMLÀ» ½á¾ß ÇÏ´ÂÁö ÀûÀýÇÏ°Ô ÆÇ´ÜÀ» ÇÏ¿© »ç¿ëÇÏ´Â ´É·ÂÀÌ ÇÊ¿äÇÒ °ÍÀÌ´Ù. µ¶ÀÚ ¿©·¯ºÐµéµµ ¾î³ëÅ×À̼ÇÀ» Àû±ØÀûÀ¸·Î µµÀÔÇÏ°í ½ÃµµÇÏ¿© ´Ù¾çÇÑ È°¿ë°¡´É¼ºÀ» Á¡Ã帴 °Íµµ Àç¹ÌÀÖÀ» °ÍÀÌ´Ù. @
Âü°íÀÚ·á
1. JSR 299 Web Beans ? http://jcp.org/en/jsr/detail?id=299
2. JSR 303 Beans Validation ? http://jcp.org/en/jsr/detail?id=303
3. JBoss Seam - http://www.jboss.com/products/seam
4. Google Guice - http://code.google.com/p/google-guice/
5. JavaOne 2007 - http://developers.sun.com/learning/javaoneonline/
* ÀÌ ±â»ç´Â ZDNet KoreaÀÇ Á¦ÈÞ¸ÅüÀÎ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î¿¡ °ÔÀçµÈ ³»¿ëÀÔ´Ï´Ù.