|
Enterprise Java Technologies Tech Tips¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù.
Java 2 Platform, Enterprise Edition (J2EE)¿¡ ±â¹ÝÇÑ enterprise
Java technologies ¿Í APIsÀÇ »ç¿ë¿¡ °üÇÑ ÃֽŠÁ¤º¸¸¦ ¾ò¾î °¡½Ã±â ¹Ù¶ø´Ï´Ù. ÀÌ
±Û¿¡¼´Â Java 2 SDK, Standard Edition, v 1.4¿Í Java 2 SDK,
Enterprise Edition, v 1.3.1 (Reference Implementation)¸¦
»ç¿ëÇÕ´Ï´Ù.
À̹ø È£¿¡¼´Â,
À¥
¼ºñ½º·Î½áÀÇ Java ¿ÀºêÁ§Æ®¸¦ À§ÇÑ JAX-RPC Ȱ¿ëÇϱâ
ÄÄÆ÷³ÍÆ® ½Ã½ºÅÛ°ú Ŭ·¡½º ·Î´õ °æ°è
À» ´Ù·ç°Ô µË´Ï´Ù.
ÀúÀÚ N. Alex Rupp
¿¹Á¦ÀÇ »ùÇà ¾ÆÄ«À̺긦 ´Ù¿î·Îµå
¹ÞÀ¸¼¼¿ä. ÄÁÅØ½ºÆ® ·çÆ®´Â ttaug2004ÀÔ´Ï´Ù. ÀÌ ÄÚµåÀÇ »ç¿ë¿¡ °üÇÑ ±ÇÇÑÀ̳ª Á¤º¸´Â license
terms¸¦ Âü°íÇϽñ⠹ٶø´Ï´Ù.
À¥ ¼ºñ½º·Î½áÀÇ Java ¿ÀºêÁ§Æ®¸¦ À§ÇÑ JAX-RPC Ȱ¿ëÇϱâ
JAX-RPC ´Â Java API for XML-based Remote Procedural CallsÀÌ´Ù. ¸î ³âÀÌ Áö³ª±ä ÇßÁö¸¸ Áï½Ã acronym RPC¸¦ ¶°¿Ã¸± ¼öµµ ÀÖ´Ù. RPC(Remote Procedural Call)´Â ÇÑ ½Ã½ºÅÛÀÇ ÄÄÆ÷³ÍÆ®°¡ ³×Æ®¿öÅ©¸¦ ÅëÇØ ¸®¸ðÆ® ½Ã½ºÅÛÀÇ ÄÄÆ÷³ÍÆ®¿¡°Ô ¸Þ½ÃÁö¸¦ Àü´ÞÇÒ ¶§ ÀϾÙ. ÀÌ Àå°Å¸® Ä¿¹Â´ÏÄÉÀÌ¼Ç ±â¼ú°ú EJB(Enterprise JavaBeans),JMX(Java Management eXtensions ), RMI(Java Remote Method Invocation) APIs Çٽɰú´Â ¸Å¿ì °¡±î¿î °ü°è°¡ ÀÖ´Ù.
EJB, JMX, RMI¿Í ´Þ¸® JAX-RPC´Â .NET °°Àº Àڹ٠Ȱ¿ë Ç÷§ÆûÀÌ ¾Æ´Ñ °÷¿¡¼ ÄÄÆ÷³ÍÆ®¸¦ È£ÃâÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ´Â µ¥ÀÌÅÍ Àü¼Û ¸ÅÄ¿´ÏÁòÀÌ XMLÀ̱⠶§¹®¿¡ °¡´ÉÇÏ´Ù. Java¿Í .NET ¿¬»ê Ç÷¡Æû °£ÀÇ ¿¬°è¸¦ À§ÇÑ ¿òÁ÷ÀÓÀº WS-I ¶Ç´Â WebServices Interoperability(À¥¼ºñ½º ȣȯ¼º)·Î ºÒ¸®°í ÀÖ´Ù. WS-I´Â W3C (World Wide Web Consortium)·Î Á¦¾îµÇ¸ç XML-RPC ¸¦ ±¸ÃàÇϱâ À§ÇÏ¿© XML, HTTP, SOAP, MIME , WSDL (Web Services Definition Language) °°Àº ´Ù¸¥ W3C ±â¼úÀÇ È£½ºÆ®¸¦ °áÇÕ½ÃŲ´Ù. W3C¿¡ ÀÇÇØ À¯ÁöµÇ´Â °ü°è·Î Ç¥ÁØ XML-RPC´Â ÃæºÐÈ÷ Ç÷§Æû-Á߸³ÀûÀÌ¾î¼ Java¿Í .netÀÌ ¹ÐÁ¢ÇÏ°Ô È£È¯µÇµµ·Ï ½Ã½ºÅÛÀÌ ¼³°èµÇ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.
JAX-RPC´Â SOAP 1.1 ¿Í WSDL 1.1ÀÇ Àڹ٠ǥÁØ ±¸ÇöÀÌ´Ù. JAX-RPC¸¦ ÀÌÇØÇϱâ À§Çؼ´Â WSDL ¶ÇÇÑ ÀÌÇØÇØ¾ß ÇÑ´Ù. WSDLÀº ´ÜÁö À¥¼ºñ½ºÀÇ ½ºÆ®·°Ã³¿Í ºñÇìÀ̺ñ¾î¸¦ ¼¼úÇÏ´Â Àü¹®ÈµÈ XML ¾ð¾îÀÏ »ÓÀ̹ǷΠ°ÆÁ¤ÇÏÁö¸»±â ¹Ù¶õ´Ù. À¥¼ºñ½º¿¡¼ÀÇ WSDL ÆÄÀÏÀº Enterprise JavaBean ÄÄÆ÷³ÍÆ®¿¡¼ÀÇ µðÇ÷ÎÀÌ¸ÕÆ® µð½ºÅ©¸³ÅÍ¿Í °°Àº ¿ªÇÒÀ» ÇÑ´Ù, ÀÌ µÑÀº ÄÁÅ×ÀÌ³Ê ³»ºÎ¿¡¼ ÄÄÆ÷³ÍÆ® ½ºÅͺ긦 »ý¼ºÇÏ´Â µ¥ »ç¿ëÇÏ´Â ÀÎÅÍÆäÀ̽º¿Í ¿ÀºêÁ§Æ® ±¸ÇöÀ» XML Àǹ̷Π¼¼úÇÑ´Ù. WSDL ÆÄÀÏÀº ¶ÇÇÑ ¿ÜºÎ·Î ÅëÇÏ´Â Æ÷Æ®¿Í À¥ ¼ºñ½º¸¦ Àü´ÞÇÏ´Â Àü¼Û ÇÁ·ÎÅäÄÝÀ» ±ÔÁ¤ÇÑ´Ù.
Àü¼Û»óÀÇ µ¥ÀÌÅͰ¡ XML·Î ĸ½¶ÈµÇ¾îÀֱ⠶§¹®¿¡ ¼·Î ´Ù¸¥ Ç÷§ÆûÀÇ Å¬¶óÀÌ¾ðÆ®µé¿¡´Â ¿ø°Ý ¼ºñ½º¿Í Ä¿¹Â´ÏÄÉÀ̼ÇÇϴ ǥÁØ ¹æ½ÄÀÌ ÀÖ´Ù. XML°ú ¿ø½Ã ¾ð¾î ¶Ç´Â º¹ÀâÇÑ µ¥ÀÌÅÍ °£ÀÇ ¸ðµç Ç÷§Æû ÁöÁ¤ µ¥ÀÌÅÍÀÇ º¯È¯Àº JAX-RPC ÄÁÅ×À̳ʿ¡ ÀÇÇØ ÀÚµ¿ÀûÀ¸·Î Çڵ鸵µÈ´Ù. ¶ÇÇÑ JAX-RPC´Â Æ÷Æ® 80À» ÅëÇØ Ä¿¹Â´ÏÄÉÀ̼ÇÀ» Çã¿ëÇÏ´Â Àü¼Û ÇÁ·ÎÅäÄÝ·Î HTTP¸¦ »ç¿ëÇØ¼ SOAP¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. À̰ÍÀº JAX-RPC À¥¼ºñ½º°¡ Tomcat°ú °°Àº À¥¼ºñ½º¸¦ Á¦°øÇÏ´Â ¼ºí·¿ ÄÁÅ×À̳ÊÀÇ ´Ù¸¥ ¾ÖÇø®ÄÉÀÌ¼Ç ÄÄÆ÷³ÍÆ® °°ÀÌ ±¸µ¿ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
À¥¼ºñ½º ºÐ¼®
À¥¼ºñ½º°¡ ¾î¶»°Ô ±¸ÃàµÇ´Â Áö ¾Ë±â À§ÇÑ Ã¹¹øÂ° ´Ü°è´Â WSDL ¿ë¾î¸¦ ÀÌÇØÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¾ð¾î´Â À¥¼ºñ½º ÄÁ¼Á¿¡ °üÇØ ³ôÀº ´Ü°èÀÇ "ºÐ¼®ÀûÀÎ ÂüÁ¶"°¡ µÈ´Ù. Ãß»ó¼ºÀÌ Áõ°¡µÇ´Â ¼ø¼´ë·Î °¢°¢ÀÇ ¿ë¾î¿¡ ´ëÇØ¼ ¾Ë¾Æº¸ÀÚ.
- ŸÀÔ(type)Àº Java ŸÀÔÀ» ¼¼úÇÑ´Ù.
wsdl:types ¿ä¼Ò´Â °£´ÜÇÑ Ç¥ÁØ XML ŸÀÔÀ̳ª Á» ´õ º¹ÀâÇÑ Å¸ÀÔÀ» Ç¥ÇöÇÒ ¼ö ÀÖ´Â XML Á¤ÀǸ¦ Æ÷ÇÔÇÑ´Ù.
- ¸Þ½ÃÁö(message)´Â À̸§°ú ŸÀÔ ¸Å°³º¯¼ö¸¦ ¸ÅÇÎÇÏ´Â ºÎºÐµé·Î ±¸¼ºµÇ¾î ÀÖ´Ù.
- ¿¬»ê(operation)Àº Java¿¡¼ ¸Þ¼µå¸¦ ¼¼úÇÑ´Ù. ¿¬»êÀº ¸Å°³º¯¼ö¸¦ ¼¼úÇÏ´Â ÀÔ·Â ¸Þ½ÃÁö¿Í Java ¸Þ¼µåÀÇ ¸®ÅÏµÈ Å¸ÀÔÀ» ¼¼úÇÏ´Â Ãâ·Â ¸Þ½ÃÁö·Î ±¸ÃàµÈ´Ù.
- Æ÷ƮŸÀÔ(port type)Àº SEI(Service Endpoint Interface)¸¦ ĸ½¶ÈÇϰí Á¤ÀÇÇÑ´Ù. Æ÷Æ® ŸÀÔÀº ¿¬»êÀ» À§ÇØ SEIÀÇ ¸Þ¼µå¸¦ ¸ÅÇÎÇÑ´Ù.
- ¹ÙÀεù(binding)Àº Æ÷Æ® ŸÀÔÀ» ƯÁ¤ ÇÁ·ÎÅäÄÝ¿¡ ¸ÅÇÎÇÑ´Ù. ÀÌ ¸ÅÇÎÀÌ Æ÷Æ® ŸÀÔÀÇ ºñÇìÀ̺ñ¾î·Î ´ëüµÉ ¼ö Àֱ⠶§¹®¿¡ ¹ÙÀεùÀº ÁÖ¾îÁø Æ÷Æ® ŸÀÔÀÇ ÁöÁ¤ ÇÁ·ÎÅäÄÝ ºñÇìÀ̺ñ¾î¸¦ ±â¼úÇϱ⵵ ÇÑ´Ù. ¿¹¸¦ µé¾î SOAP ÇÁ·ÎÅäÄÝÀ» ÅëÇØ Æ÷ƮŸÀÔÀ» È£ÃâÇϸé HTTP·Î °°Àº Æ÷Æ® ŸÀÔÀ» È£ÃâÇÑ °Í°ú´Â ´Ù¸¥ ºñÇìÀ̺ñ¾î°¡ »ý¼ºµÈ´Ù. (¿¹¸¦ µé¾î SOAP ÇÁ·ÎÅäÄÝÀ» ÅëÇØ È£ÃâµÈ Æ÷ƮŸÀÔÀÇ ºñÇìÀ̺ñ¾î´Â HTTP·Î °°Àº Æ÷Æ® ŸÀÔÀ» È£ÃâÇßÀ» ¶§¿Í ´Ù¸£´Ù.) SOAPÀÇ °æ¿ì¿¡ Çϳª ÀÌ»óÀÇ ¿À·ù Á¤ÀÇ´Â ÀÌ ¹ÙÀεùÀ¸·Î Æ÷Æ® ŸÀÔ¿¡ ¸ÅÇ뵃 °ÍÀÌ´Ù.
- Æ÷Æ®(port)´Â URL°ú °°Àº ƯÁ¤ °ø°³ ÁÖ¼Ò·Î ¹ÙÀεùÀ» ¸ÅÇÎÇÑ´Ù.
- ¼ºñ½º(service)´Â Æ÷Æ®µéÀÇ ¸ðÀ½À» ĸ½¶ÈÇÑ´Ù.
µû¶ó¼ WSDL¿¡¼ÀÇ À¥¼ºñ½º´Â ½ÇÁ¦·Î °ø°³ÀûÀ¸·Î Á¢±Ù °¡´ÉÇÑ Æ÷Æ®¿Í Æ÷Æ® ŸÀÔ ¿¬»ê °£ÀÇ ÇÁ·ÎÅäÄÝ ¹ÙÀεù ¸ðÀ½ÀÎ °ÍÀÌ´Ù. ÀÌ¿¡ ´ëÇÑ Ä£¼÷ÇÑ ¿¹·Î, J2EE¿¡¼ ¼ºí·¿ ÄÁÅ×À̳ÊÀÇ URL°ú Service Endpoint Interface ±¸Çö ¿ÀºêÁ§Æ®°£ÀÇ SOAP ¹ÙÀεù ¸ðÀ½À» µé ¼ö ÀÖ´Ù. ȤÀº ´õ °£´ÜÈ÷, À¥¼ºñ½º´Â Java ÀÎÅÍÆäÀ̽º ¿ÀºêÁ§Æ®¿Í URL °£ÀÇ ¸ÅÇÎÀ̹ǷΠ¸Þ¼µå ȤÀº ÀýÂ÷ È£ÃâÀ» ¿ø°ÝÀ¸·Î ¼öÇàÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù´Â »ç½Ç¿¡¼µµ ¾Ë ¼ö ÀÖ´Ù.
¼ºñ½º µð½ºÅ©¸³ÅÍ ÀÛ¼º
J2SE 1.4.2 SDK, Tomcat 5.0 for Java WSDP 1.4, Java WSDP 1.4¸¦ ¼³Ä¡ÇÏÀÚ. ÀÌ ±â¼úµéÀÌ ÀÖ´Â À¥ÆäÀÌÁö¿¡¼ ¼³Ä¡ ¸í·É¾î¸¦ ãÀ» ¼ö ÀÖ´Ù. ±×·¯³ª ¼³Ä¡ ¼ø¼¸¦ ±â¾ïÇØ¾ß ÇÑ´Ù. Java¿Í Tomcat for JWSDP¸¦ ¸ÕÀú ¼³Ä¡ÇÑ´Ù¸é JWSDP ¼³Ä¡°¡ °£´ÜÇØÁú °ÍÀÌ´Ù. Java WSDP 1.4¸¦ ¼³Ä¡ÇÏ´Â µ¿¾È ºê¶ó¿ìÀú¿¡´Â ÀÌ Á¦Ç°À» ÅëÇÕÇϵµ·Ï ±ÇÀåÇÏ´Â À¥ÄÁÅ×ÀÌ³Ê ¿É¼Ç ¼±Åà âÀÌ ¶ã °ÍÀÌ´Ù. JWSDP 1.4 ´Ù¿î·Îµå¸¦ À§ÇÑ TomcatÀÌ ÀÌ¹Ì ¼³Ä¡µÇ¾î ÀÖ´Ù¸é À¥ÄÁÅ×ÀÌ³Ê ¸Þ´º¿¡ Ãß°¡ÇÏ¸é µÈ´Ù. ±×·¯¸é JWSDP´Â ÀÚµ¿ÀûÀ¸·Î Tomcat ¼³Ä¡ µð·ºÅ丮¿¡ ÅëÇÕµÉ °ÍÀÌ´Ù.
Tomcat À¥¼ºñ½º ¼³Ä¡¿¡´Â »õ·Î Ãâ½ÃµÈ ¸ðµç Java À¥¼ºñ½º API¿¡ ´ëÇÑ »ùÇÃÀÌ Æ÷ÇԵǾîÀÖ´Ù. ±×·¯³ª ÀÌ¿¡ ´ëÇÑ ¹®¼´Â ¸Å¿ì ºÎÁ·ÇÑ °ü°è·Î ÀÌ Å×Å©ÆÁ¿¡¼´Â ±× »ùÇõé Áß JAX-RPC ¿¹Á¦¸¦ ¼öÁ¤ÇÑ ¹öÀüÀ» ÀÌ¿ëÇϰڴÙ. ¼öÁ¤µÈ ¿¹´Â ¼¹öÀÇ ÇöÀç½Ã°£À» º¸¿©ÁÖ´Â °£´ÜÇÑ À¥ ¼ºñ½º·Î Ưº°ÇÏÁø ¾ÊÁö¸¸ Áß¿äÇÑ ¿äÁ¡À» °¡¸£ÃÄÁÙ °ÍÀÌ´Ù. »ç¿ëÀÚ°¡ À¥¼ºñ½º¸¦ Á÷Á¢ ÀÛ¼ºÇÒ ¶§ À̰Ͱú ºñ±³Çϸé ÁÁ´Ù.
¿¹Á¦ ¾ÖÇø®ÄÉÀ̼ÇÀ» ´Ù¿î·ÎµåÇϰí HelloWorld µð·ºÅ丮 ¿·ÀÇ <JWSDP_HOME>/jaxrpc/samples¿¡ ¾ÐÃàÀ» Ǭ´Ù. ±× ÈÄ¿¡ /etcµð·ºÅ丮¸¦ ã´Â´Ù. /etcµð·ºÅ丮¿¡¼ TimeService.wsdlÀÌ ÆÄÀÏÀ» ãÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ WSDL ÆÄÀÏÀ» ¿ ¶§ ¾Õ¼ ¼³¸íÇÑ ¿ë¾îµéÀ» À绡¸® ±â¾ïÇÒ Çʿ䰡 ÀÖ´Ù. °¡Àå ³ôÀº ´Ü°èÀÎ wsdl:definitions ¿ä¼Ò¿Í ¿©·¯ wsdl:message¿ä¼ÒµéÀ» ¹ß°ßÇÏ°Ô µÉ °ÍÀÌ´Ù.
<?xml version="1.0" encoding="UTF-8"?>
<!-- TimeService.wsdl -->
<definitions
name="TimeService"
targetNamespace="http://time.org/wsdl"
xmlns:tns="http://time.org/wsdl"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:ns2="http://time.org/types"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<message name="TimeSEI_sayTimeBack">
<part name="String_1" type="xsd:string"/>
</message>
<message name="TimeSEI_sayTimeBackResponse">
<part name="result" type="xsd:string"/>
</message>
...
Áß¿äÇÑ °ÍÀÌ ¸î °¡Áö ÀÖ´Ù. ¸ÕÀú http://time.org namespace ´Â ¿ÏÀüÈ÷ Áö¾î³½ °ÍÀ̸ç À¥¼ºñ½º¸¦ »ý¼ºÇÒ ¶§ ½ÇÁ¦ ³×ÀÓ½ºÆäÀ̽º¿Í ±³Ã¼ÇÏ°Ô µÉ °ÍÀÌ´Ù. µÑ°·Î ÆÄÀÏÀº °¢°¢ °á±¹ °°Àº ¿¬»ê¿¡ ¸ÅÇεǴ µÎ °³ÀÇ ¸Þ½ÃÁö¸¦ Á¤ÀÇÇÑ´Ù. °¢ ¸Þ½ÃÁö À̸§Àº TimeSEI_·Î ½ÃÀÛÇÑ´Ù. TimeSEI´Â ŸÀÓ¼¹ö ¿£µåÆ÷ÀÎÆ® ÀÎÅÍÆäÀ̽º¸¦ ÀǹÌÇϸç Á¸ÀçÇÏÁö ¾Ê´Â Java Service Endpoint Interface ¿ÀºêÁ§Æ®¸¦ ÂüÁ¶ÇÑ´Ù. ¸¶Áö¸·À¸·Î sayTimeBack°ú sayTimeBackResponse¸¦ ¸ðµÎ º¸À¯Çϰí ÀÖ´Â °ÍÀº ¾à°£ ÀåȲÇÏ°í º¹ÀâÇÏ°Ô º¸ÀÏ ¼öµµ ÀÖÁö¸¸ ´ÙÀ½ÀÇ Æ÷Æ® ŸÀÔ°ú ¿¬»ê Á¤ÀÇ(operation definition) ¹®¸ÆÀ» °í·ÁÇÒ ¶§ À̵éÀ» º¸À¯ ÇØ¾ßÇÏ´Â ÀÌÀ¯¸¦ ¾Ë°Ô µÉ °ÍÀÌ´Ù.
<portType name="TimeSEI">
<operation name="sayTimeBack" parameterOrder="String_1">
<input message="tns:TimeSEI_sayTimeBack"/>
<output message="tns:TimeSEI_sayTimeBackResponse"/>
</operation>
</portType>
¿¬»ê Á¤Àǽà ±â¾ïÇØµÎ¾î¾ß ÇÒ °ÍÀº °¢ ¿¬»êÀº ¹Ýµå½Ã Çϳª°¡ ¾Æ´Ñ µÎ°³ÀÇ ¸Þ½ÃÁö¸¦ Æ÷ÇÔÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ÀÌ´Â WSDL°ú JAX-RPCÀÌ SOAP ÇÁ·ÎÅäÄÝÀ» ÀÌ¿ëÇÏ¿© ¿¬»êÇϵµ·Ï ±¸ÃàµÇ¾îÀֱ⠶§¹®ÀÌ´Ù. SOAP ¸Þ½ÃÁöµéÀº ÇÑÂÊ ¹æÇâÀ¸·Î¸¸ ÀÛ¿ëÇÏÁö¸¸ RPC´Â ¹Ýµå½Ã ¾ç¹æÇâ ºñÇìÀ̺ñ¾îÀÌ´Ù. ¿¬»ê°ú ¿¬»êÀ¸·Î ¸ÅÇÎµÈ Java ¸Þ¼µå´Â ÀÔ·Â ¸Å°³º¯¼ö¿Í ¸®ÅϵǴ °ªÀ» Á¤ÀÇÇÑ´Ù. SOAP¿¡ Àß ¸ÅÇÎÇϱâ À§ÇØ, ¾ç¹æÇâ Ä¿¹Â´ÏÄÉÀ̼ǿ¡´Â µÎ°³ÀÇ °³º°ÀûÀÎ ¸Þ½ÃÁö°¡ ÇÊ¿äÇÏ´Ù.
portType ÀÇ À̸§ÀÌ TimeSEIÀÎ °Í¿¡ ÁÖ¸ñÇÏÀÚ. ´Ù½Ã¸»ÇØ, À̰ÍÀº Á¸ÀçÇÏÁö ¾Ê´Â Service Endpoint Interface¿¡ ´ëÇÑ ¸ÅÇÎÀÌ´Ù. À§ÀÇ Á¤ÀÇ¿¡ µû¸£¸é TimeSEI ÀÎÅÍÆäÀ̽º ¿ÀºêÁ§Æ®´Â ´ÙÀ½°ú °°Àº ¼¸íÀ» °®°íÀÖ´Â ´ÜÀÏ °ø°³ ¸Þ¼µå¸¦ ³ëÃâÇÑ´Ù.
public String sayTimeBack(String) throws RemoteException;
¸Þ½ÃÁö¿Í Æ÷Æ® ŸÀÔ Á¤ÀǸ¦ ÀÐÀ½À¸·Î½á ÀÌ ¸ðµç Á¤º¸¸¦ Á¶ÇÕÇÒ ¼ö ÀÖ´Ù.
ÀÚ, ÀÌÁ¦ SOAP ÇÁ·ÎÅäÄÝ ¹ÙÀεù¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ.
<binding name="TimeSEIBinding" type="tns:TimeSEI">
<operation name="sayTimeBack">
<input>
<soap:body
encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/"
use="encoded"
namespace="http://time.org/wsdl"/>
</input>
<output>
<soap:body
encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/"
use="encoded"
namespace="http://time.org/wsdl"/>
</output>
<soap:operation soapAction=""/>
</operation>
<soap:binding
transport="http://schemas.xmlsoap.org/soap/http"
style="rpc"/>
</binding>
ÀÌ ¹ÙÀεùÀº code>sayTimeBack ¿¬»ê¿¡¼ÀÇ ÀԷ¹°°ú Ãâ·Â¹° ¸Þ½ÃÁö ¹ÙµðÀÇ ÀÎÄÚµù ½ºÅ¸ÀÏÀ» Á¤ÀÇÇÑ´Ù. ÀÌ ¿¬»êÀº SOAPÀ» ÀÌ¿ëÇÏ¿© ÀÎÄÚµùµÇ¸ç ´Ù¸¥ ¿¬»ê ¸Þ½ÃÁö¿Í Ãæµ¹µÇ´Â °ÍÀ» ¸·±âÀ§ÇØ Æ¯º°ÇÑ ³×ÀÓ½ºÆäÀ̽º¸¦ ÇÒ´çÇÑ´Ù. ¸¶Áö¸·À¸·Î ¹ÙÀεùÀº RPC ¹ÙÀεù ½ºÅ¸Àϰú SOAP È£ÃâÀÌ HTTP°¡ µÇ°Ô ÇÏ´Â Àü¼Û ¸ÞÄ¿´ÏÁòÀ» ¼±¾ðÇÑ´Ù. ³²´Â °ÍÀº ¼ºñ½º Á¤ÀÇ ÀÚüÀÌ´Ù.
<service name="TimeService">
<port name="TimeSEIPort" binding="tns:TimeSEIBinding">
<soap:address location="REPLACE_WITH_ACTUAL_URL"/>
</port>
</service>
</definitions>
¼ºñ½º Á¤ÀǸ¦ TimeService¶ó À̸§ Áþ°í ±× Æ÷Æ®¸¦ ¹ÙÀεù¿¡ ¸ÅÇÎÇÑ´Ù. ÀÌ·Î½á °£´ÜÇÑ À¥ ¼ºñ½º Á¤Àǰ¡ ¿Ï·áµÇ¾ú´Ù.
¼ºñ½º ±¸Çö
ÀÚ, ÀÌÁ¦ ¼ºñ½º ±¸ÇöÀ» ÀÛ¼ºÇÒ ½Ã°£ÀÌ´Ù. µÎ°¡Áö ´Ù¸¥ Á¢±Ù¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. »ç¿ëÀÚ°¡ Á÷Á¢ SEL ½ºÅͺ긦 ÀÛ¼ºÇÏ¿© À¥ ¾ÆÄ«À̺êÀÇ ±¸Çö Ŭ·¡½º¿Í ¼öµ¿À¸·Î ÆÐŰ¡Çϰųª Java WSDP 1.4¿¡ Á¦°øµÇ´Â ANT build¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ANT´Â JWSDP 1.4 ȯ°æÀÇ ÀÌÁ¡À» »ì·Á SEI ½ºÅͺ긦 ÀÚµ¿ÀûÀ¸·Î »ý¼ºÇÒ ¼ö ÀÖ´Ù. µÎ¹øÂ° Á¢±Ù¹ýÀÌ ÈξÀ ºü¸£¹Ç·Î ±âº»ÀûÀÎ JAX-RPC ÇÁ·¹ÀÓ¿öÅ©ÀÇ º¹À⼺À» ´Ù·ê ½Ã°£Àû ¿©À¯°¡ »ý±ä´Ù.
ÀÌ ´Ü°è¸¦ ¿Ï¼ºÇϱâ À§ÇØ ¹Ýµå½Ã ÀÛ¼ºÇØ¾ß ÇÏ´Â ¸î °¡Áö ÆÄÀÏÀÌ ÀÖ´Ù. SEI ±¸Çö Ŭ·¡½ººÎÅÍ ½ÃÀÛÇÏÀÚ.ÀÌ ¿¹Á¦¿¡¼ »ç¿ëÇÑ °ÍÀº TimeOnServer/src/server/time/TimeImplÀÌ´Ù. ´ÙÀ½Àº ÀÌ Å¬·¡½ºÀÇ ÄÁÅÙÃ÷ÀÌ´Ù.
package time;
import java.util.Date;
public class TimeImpl implements time.TimeSEI,
java.rmi.Remote {
public String sayTimeBack(java.lang.String str) {
Date date = new Date(System.currentTimeMillis());
String result = " Hello, " + str
+ ". The time on the server is "
+ date.toString();
return result;
}
}
ÀÌ °£´ÜÇÑ Å¬·¡½º´Â time.TimeSEIÀÎÅÍÆäÀ̽º¿Í java.rmi.Remote ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÑ´Ù. TimeSEI´Â Æ÷Æ® ŸÀÔ Á¤ÀÇ·Î ¼±¾ðµÇ¾ú¾ú´Ù´Â »ç½ÇÀ» »ó±âÇÏÀÚ. ±×·¯³ª ÀÎÅÍÆäÀ̽º´Â ¿©ÀüÈ÷ ÀÛ¼ºµÇÁö ¾Ê¾Ò´Ù. ÀÌ ÀÎÅÍÆäÀ̽º´Â JWSDP ANT build·Î »ý¼ºÇÒ ¼ö ÀÖÀ¸¸ç ±¸Çö Ŭ·¡½º¿Í °°Àº ÆÐŰÁö ¾È¿¡ ÀÖ¾î¼ ÀÓÆ÷Æ®ÇÒ Çʿ䰡 ¾ø´Ù.
±×·¯³ª JAX-RPC ·¹ÆÛ·±½º ±¸ÇöÀ» À§ÇØ Æ¯º°ÇÑ µð½ºÅ©¸³ÅÍ ÆÄÀÏÀ» ÀÛ¼ºÇØ¾ß ÇÒ Çʿ䰡 ÀÖ´Ù. À̰ÍÀº ÄÁÅ×À̳ʿ¡ ÇÊ¿äÇÑ »çÇ×À̹ǷΠTimeImpl Ŭ·¡½º¿¡ ´ëÇÑ Æ÷Æ® ŸÀÔ Á¤ÀǷκÎÅÍ ¾î¶»°Ô TimeSEI ·¹ÆÛ·±½º¸¦ ¸ÅÇÎÇÏ´ÂÁö ¾Ë ¼ö ÀÖ´Ù.
<!-- jaxrpc-ri.xml -->
<webServices
xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/dd"
version="1.0"
targetNamespaceBase="http://time.org/wsdl"
typeNamespaceBase="http://time.org/types"
urlPatternBase="/ws">
<endpoint
name="Time"
displayName="Time Service"
description="A simple web service"
wsdl="/WEB-INF/TimeService.wsdl"
interface="time.TimeSEI"
implementation="time.TimeImpl"
model="/WEB-INF/model-wsdl-rpcenc.xml.gz"/>
<endpointMapping
endpointName="Time"
urlPattern="/time"/>
</webServices>
endpoint ¿ä¼Ò´Â ±×°ÍÀÇ SEI·ÎÀÇ °æ·Î¿Í ±¸Çö Ŭ·¡½º¸¦ Æ÷ÇÔÇÑ ¼ºñ½ºÀÇ ¼Ó¼ºÀ» ¼³¸íÇϸç, °ü¸® ÅøÀ» À§ÇØ ¿£µåÆ÷ÀÎÆ®¿¡ ´ëÇÑ ¸î°¡Áö ±âº» ¸ÞŸµ¥ÀÌÅ͸¦ Á¤ÀÇÇÑ´Ù. ¶ÇÇÑ endpointMappingÀº ¼ºñ½º ¿£Æ®Æ÷ÀÎÆ®·Î URL ÆÐÅÏÀ» ¹ÙÀεùÇÑ´Ù.
½ÇÁ¦ À¥ ¼ºñ½º¸¦ À§ÇØ ÀÌ ÆÄÀÏÀ» Çü¼ºÇÏ¿© ÇÁ·ÎÁ§Æ®¸¦ Á¤È®ÇÏ°Ô Á¤ÀÇÇß´ÂÁö È®ÀÎ Çϱâ À§ÇØ web.xml ÆÄÀÏÀ» Ã¼Å©ÇØ¾ß ÇÑ´Ù. ÀÌ·Î½á ¼ºñ½º¸¦ ±¸ÃàÇÏ°í µðÇ÷ÎÀÌÇÒ Áغñ°¡ ¿Ï·áµÈ °ÍÀÌ´Ù. PATH ¼¼ÆÃÀÌ ANT (<JWSDP_HOME>/apache-ant/bin)·ÎÀÇ °æ·Î¸¦ Æ÷ÇÔÇϰí ÀÖµµ·Ï È®ÀÎÇØ¾ß ÇÑ´Ù. ±× ÈÄ Ä¿¸àÆ® ¶óÀÎ ÀÎÅÍÆäÀ̽º ¾ÈÀÇ /TimeOnServer µð·ºÅ丮¸¦ Ž»öÇÏ¿© ´ÙÀ½ÀÇ Ä¿¸àµå¸¦ ÀÔ·ÂÇÏÀÚ.
ant
ANT´Â TimeSEI ÀÎÅÍÆäÀ̽º¸¦ »ý¼ºÇÒ °ÍÀÌ´Ù. ±×°ÍÀÇ ±¸Çö ½ºÅͺê Ŭ·¡½ºµµ »ý¼ºÇÏ¸ç »õ·Î¿î À¥ ¼ºñ½ºÀÇ »óÈ£ÀÛ¿ëÀ» Çڵ鸵 Çϱâ À§ÇØ SOAP ¿äû°ú ¹ÝÀÀ ±¸Á¶¸¦ ´ÙÁß ºÐ·ùÇÏ´Â ¹è¿ ¿ª½Ã »ý¼ºÇÒ °ÍÀÌ´Ù. ANT´Â ¸ðµç °ü·ÃµÈ ÆÄÀϵéÀ» WAR ÆÄÀÏ(jaxrpc-TimeOnServer.war)¿¡ Á¶ÇÕÇÏ¸é ¿Ï·áµÈ´Ù. ÀÌ ¾ÆÄÉÀ̺긦 tomcat_jwsdp/webapps µð·ºÅ丮¿¡ º¹»çÇÏ¿© startup.bat ÆÄÀÏÀ» ´õºí üŷÇϰųª /tomcat_jwsdp/bin µð·ºÅ丮¿¡¼ startup.sh½ºÅ©¸³Æ®¸¦ ±¸µ¿ÇÏ¿© TomcatÀ» ±âµ¿½Ãų ¼ö ÀÖ´Ù.
ÀÌ ¶§, ÃæºÐÈ÷ ¿î¿ëÇÒ ¼ö ÀÖ´Â À¥ ¼ºñ½º¸¦ º¸À¯Çϰí ÀÖ¾î¾ß ÇÏÁö¸¸, Å×½ºÆ®¸¦ ÇÒ ¶§´Â À¥ ¼ºñ½º¿¡ Ŭ¶óÀÌ¾ðÆ®¸¦ ±¸µ¿ÇÏ´Â °ÍÀ¸·Î ÃæºÐÇÏ´Ù.
°£´ÜÇÑ Å¬¶óÀÌ¾ðÆ® ±¸Çö
¿¹Á¦ ¾ÖÇø®ÄÉÀ̼ǿ¡´Â °£´ÜÇÑ Å¬¶óÀÌ¾ðÆ®¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù. À̸¦ ±¸µ¿Çϱâ À§Çؼ´Â /TimeOnServer µð·ºÅ丮ÀÇ Ä¿¸àµå ¶óÀÎ ÀÎÅÍÆäÀ̽º¿¡ ´ÙÀ½ Ä¿¸àµå¸¦ ÀÔ·ÂÇØ¾ßÇÑ´Ù.
ant run-client
ÀÌ Ä¿¸àµå´Â Ŭ¶óÀ̾ðµå Ŭ·¡½ºµéÀ» »ý¼ºÇϰí ÄÄÆÄÀÏÇϸç Ŭ¶óÀÌ¾ðÆ®¸¦ ±¸µ¿ÇÑ´Ù. ¸ðµç °ÍÀÌ ¼º°øÀûÀ̶ó¸é Ŭ¶óÀÌ¾ðÆ®¸¦ ±¸µ¿ÇÏ¿© Ãâ·Â ½Ã ¸¶Áö¸· ¸î ÁÙÀº ´ÙÀ½°ú °°ÀÌ ³ªÅ¸³ª¾ß ÇÑ´Ù.
run-client:
[java] Howdy, stranger.
The time on the server is Sun Aug 01 01:01:46 CDT 2004
BUILD SUCCESSFUL
Total time: 20 seconds
¾î¶»°Ô JAX-RPC ¼ºñ½º°¡ ÀÛ¿ëµÇ´ÂÁö Á» ´õ ÀÚ¼¼È÷ ¾Ë°í ½ÍÀ¸¸é ¿¹Á¦ÀÇ ¼Ò½ºÄڵ带 ÀÐ°í »ý¼ºµÈ WAR ÆÄÀÏ ¾ÈÀÇ Service Endpoint Interface³ª SOAP ¿äû/¹ÝÀÀ ¿ÀºêÁ§Æ® °°Àº Ŭ·¡½º ÆÄÀÏÀ» ÀÐÀÚ. ÇÁ·ÎÁ§Æ®ÀÇ ±¸Ãàȯ°æÀ» »ç¿ëÀÚ Á¤ÀÇÇÏ°í ½Í´Ù¸é build.xml file¿¡ ÇÁ·ÎÁ§Æ® À̸§À» ¾÷µ¥ÀÌÆ®ÇÏ´Â °ÍÀ» ÀØÁö ¸»±â ¹Ù¶õ´Ù. ¶ÇÇÑ Understanding your JAX-RPC SI Environment, Part 2 µµ ÂüÁ¶Çϱ⠹ٶõ´Ù. ÀÌ ¾ÆÆ¼Å¬Àº ¸î °¡Áö °³¹ß, µðÇ÷ÎÀÌ¸ÕÆ®, Çõ½Å ½Ã³ª¸®¿À¸¦ Á¦°øÇϰí ÀÖ´Ù.
ÄÄÆ÷³ÍÆ® ½Ã½ºÅÛ°ú Ŭ·¡½º ·Î´õ °æ°è
¾î´À °÷¿¡¼³ª ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚµéÀº ´ÜÀÏ ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ß Àü·«À» ³Ñ¾î¼¼ »óÈ£ÀÛ¿ë(interoperating) ¾ÖÇø®ÄÉÀÌ¼Ç ½Ã½ºÅÛ °³¹ß·Î ³ª¾Æ°¡°í ÀÖ´Ù. ÇöÀç ¿£ÅÍÇÁ¶óÀÌÁî °³¹ßÀÚµéÀÌ ´ç¸éÇϰí ÀÖ´Â ¹®Á¦µé Áß Çϳª´Â ÃÖ±ÙÀÇ WAR ¿Í EAR ÆÄÀÏ µî Web and Enterprise Archives °°Àº ´ÜÀÏ ¾ÖÇø®ÄÉÀÌ¼Ç µðÇ÷ÎÀÌ¸ÕÆ® ±¸Á¶¿¡¼ ´À½¼ÇÏ°Ô °áÇÕµÈ ¾ÖÇø®ÄÉÀÌ¼Ç ÄÄÆ÷³ÍÆ® ½Ã½ºÅÛÀ¸·Î ¾î¶»°Ô ¿Å°Ü°¥ °ÍÀΰ¡ ÀÌ´Ù. °³¹ßÀÚµéÀº J2EE Ç÷§ÆûÀÇ ±âº» ±â´É°ú ȣȯµÊ°ú µ¿½Ã¿¡ ÄÚµå Àç»ç¿ëÀ» ´Ã¸®°í ¾ÖÇø®ÄÉÀÌ¼Ç º¹À⼺À» ÁÙÀ̱â À§ÇØ ÄÄÆ÷³ÍÆ® ±â¹Ý ¾ÖÇø®ÄÉÀÌ¼Ç Àü·«À» »ç¿ëÇÏ±æ ¿øÇÑ´Ù. JARs, WARs, EARs µî°ú °°ÀÌ Ç÷¯±×ÇÒ ¼ö ÀÖ´Â ÄÄÆ÷³ÍÆ® ¾ÆÄ«À̺긦 °³¹ßÇÏ´Â °ÍÀÌ ÀÌ Àü·«ÀÇ °ü°ÇÀÌ µÉ °ÍÀÌ´Ù.
±×·¯³ª J2EE¿¡¼ÀÇ ÄÄÆ÷³ÍÆ® ±â¹Ý ¾ÖÇø®ÄÉÀÌ¼Ç ½Ã½ºÅÛ °³¹ß°ú ¹èÆ÷¸¦ µÑ·¯½Ñ ¸¹Àº ÇÔÁ¤ÀÌ µµ»ç¸®°í ÀÖ´Ù. Áß¿ä ÇÔÁ¤ Áß ÇѰ¡Áö´Â Java ¹öÃß¾ó ¸Ó½Å¿¡¼ Ŭ·¡½º ·Î´õÀÇ °æ°è¸¦ ±³Â÷ÇÏ¿© ±â´ÉÇϱâ À§ÇÑ ÄÄÆ÷³ÍÆ® ½Ã½ºÅÛÀ» ¾ò´Âµ¥ µû¸£´Â ¾î·Á¿òÀÌ´Ù.
Ŭ·¡½º ·Î´õ´Â ȯ°æ ±¸È¹ÀÇ Àǹ̷Π»ý°¢ÇÏ¸é µÈ´Ù. ¸í½ÉÇØ¾ß ÇÒ °ÍÀº Ŭ·¡½º ·Î´õ´Â ÇÏÀ§ Ŭ·¡½º ·Î´õµéÀ» »ý¼ºÇÒ ¼ö ÀÖÀ¸¸ç, µû¶ó¼ ÇÏÀ§È¯°æÀ» ¸¸µé¾î³¾ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ÀÌ ÇÏÀ§ Ŭ·¡½º ·Î´õ ȯ°æÀÇ Å¬·¡½ºµéÀº À °è±ÞÀÎ ½Ã½ºÅÛ Å¬·¡½º ·Î´õÂÊÀ» º¼ ¼ö ÀÖÁö¸¸ ´õ ÇÏÀ§ °è±ÞÀÇ Å¬·¡½ºµéÀº º¼ ¼ö ¾ø´Ù.
ÀÌ·± Á¾·ùÀÇ ´Ù´Ü°èÀû ȯ°æ ±¸Á¶´ÂJ2EE ¼¹ö ȯ°æ¿¡¼ ¸Å¿ì º¸ÆíÀûÀÌ¸ç ½ÉÁö¾î J2EE ±â¼úÀ» µÑ·¯½Ñ ´Ù¾çÇÑ ±Ô°Ý¿¡´Â ±ÇÀåµÇ°í ÀÖ´Â »çÇ×ÀÌ´Ù. ¿¹¸¦ µé¾î ¼ºí·¿µéÀº °¢°¢ WAR ÆÄÀÏ¿¡ ÆÐŰÁöȵǾî ÀÖÀ¸¸ç, ¿À¹ö·Ñ ½Ã½ºÅÛÀÇ °¢°¢ÀÇ Å¬·¡½º ·Î´õ ÄÁÅØ½ºÆ®¿¡ µðÆúÆ®°ªÀ¸·Î ÁÖ¾îÁ®ÀÖ´Ù. ÀÌ´Â WEB-INF/lib µð·ºÅ丮¿¡ Æ÷ÇԵǾî ÀÖ´Â JAR ÆÄÀÏÀº ´Ù¸¥ À¥ ¾ÆÄ«À̺êÀÇ JAR ÆÄÀÏ ¾È¿¡ ÀúÀåµÇ¾î Àִ Ŭ·¡½ºµé¿¡ Á¢±ÙÇÏÁö ¸øÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ´ÜÀÏ ¾ÖÇø®ÄÉÀ̼ǿ¡ ÆÐŰ¡Çϱâ À§ÇØ WARÀ» »ç¿ëÇÒ ¶§ ÀÌ ¹è¿Àº Çã¿ë°¡´ÉÇϳª ¿ÃÀοø Àü·«À» ³Ñ¾î¼¼ Á» ´õ ÄÄÆ÷³ÍÆ® ±â¹Ý ¾ÖÇø®ÄÉÀÌ¼Ç ¾ÆÅ°ÅØÃ³·Î ³ª¾Æ°£´Ù¸é ¹Ù·Î ¹®Á¦°¡ µÇ¾î¹ö¸± °ÍÀÌ´Ù.
ÀÌ·± ¹®Á¦µéÀÇ Áõ»óÀº È®½ÇÇÏÁö ¾ÊÀ» ¶§°¡ ¸¹À¸¹Ç·Î, Ŭ·¡½º ·Î´õ °æ°è¸¦ ±³Â÷ÇÏ¿© ÄÄÆ÷³ÍÆ®¸¦ Àü´ÞÇÏÁö ¸øÇÑ´Ù´Â °ÍÀ» Áø´ÜÇϱâ´Â ¸Å¿ì ¾î·Æ´Ù. ¿¹¸¦ µé¾î À¥ ¾ÖÇø®ÄÉÀÌ¼Ç ¾ÆÄ«À̺êÀÇ ¼ºí·¿µé »çÀÌ·Î Àü´Þ½Ã۰íÀÚ ÇÏ´Â Foo¶ó´Â À̸§ÀÇ ¿ÀºêÁ§Æ®°¡ ÀÖ´Ù°í ÇÏÀÚ(¾î´À ÇÑ À¥ ¾ÆÄ«ÀÌºê ¾ÈÀÇ ¼ºí·¿¿¡¼ºÎÅÍ ´Ù¸¥ À¥ ÆÄÄ«À̺êÀÇ ¼ºí·¿À¸·Î Àü´ÞµÊÀ» ÀǹÌ). FooÄÄÆ÷³ÍÆ®¸¦ À§ÇÑ Å¬·¡½º ÆÄÀÏÀº JAR ÆÄÀÏ¿¡ ÆÐŰ¡µÇ¾î ÀÖÀ¸¸ç JAR ÆÄÀÏÀÇ µ¿ÀÏÇÑ º¹»çº»ÀÌ °¢ À¥ ¾ÆÄ«À̺êÀÇ /WEB-INF/lib µð·ºÅ丮 ¾È¿¡ ÀÖ´Ù. ´ÙÀ½ÀÇ Äڵ带 ÀÛ¼ºÇÏÀÚ.
/* This code runs in a servlet in WAR #1 */
SystemScopeObjectCache cache =
SystemScopeObjectCacheFactory.getInstance();
WARScopeFoo foo = new WARScopeFoo ();
System.out.println(foo);
cache.addToCache("myFooObject", foo);
/* This code runs in a servlet in WAR #2 */
SystemScopeObjectCache cache =
SystemScopeObjectCacheFactory.getInstance();
Object o = cache.getFromCache("myFooObject");
try {
// the following throws a ClassCastException!
WARScopeFoo foo = (WARScopeFoo)o;
} catch(ClassCastException e) {
e.printStackTrace();
}
°¢ À¥ ¾ÆÄ«À̺êÀÇ ¼ºí·¿¿¡ Á¢±Ù°¡´ÉÇÑ WARScopeFoo ¿ÀºêÁ§Æ®¸¦ À§ÇÑ ÄÄÆ÷³ÍÆ® ij½Ã¸¦ ½±°Ô »ý¼ºÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ¸¸¾à ¼ºí·¿ A°¡ ¿ÀºêÁ§Æ®ÀÇ ÀνºÅϽº¸¦ Áß¾Ó Ä³½Ã·Î Àü´ÞÇϰí, ´Ù¸¥ WARÀÇ ¼ºí·¿ B°¡ ij½Ã·ÎºÎÅÍ ÀνºÅϽº¸¦ ²¨³» Object¿¡¼ WARScopeFoo·Î Àü´ÞÇÏ·ÁÇÑ´Ù¸é ½Ã½ºÅÛÀº ClassCastExceptionÀ» Àü´ÞÇÏ°Ô µÉ °ÍÀÌ´Ù.
ÀÌ »óȲÀº Ŭ·¡½º ·Î´õ¸¦ °í·ÁÇÑ °ÍÀÌ ¾Æ´Ï¶ó¸é ¾Æ¹« Àǹ̰¡ ¾ø´Ù. ¼ºí·¿ A ¿¡¼ ÂüÁ¶ÇÏ´Â WARScopeFoo Ŭ·¡½º´Â ¼ºí·¿ B¿¡¼ ÂüÁ¶ÇÏ´Â WARScopeFooŬ·¡½º¿Í ÀüÇô ¿¬°ü ¾ø´Â ´Ù¸¥ Ŭ·¡½º ·Î´õ·ÎºÎÅÍ »ý¼ºµÈ´Ù. Á¤È®È÷ ¾ê±âÇÏÀÚ¸é, ±× µÑÀº ÀǵµÀûÀ¸·Î ÀüÇô ¿¬°üµÇ¾î ÀÖÁö ¾Ê´Ù. À̰ÍÀº °°Àº ¼ºí·¿ ÄÁÅ×À̳ʿ¡¼ ±¸µ¿µÇ´Â À¥ ¾ÖÇø®ÄÉÀÌ¼Ç °£ÀÇ ³×ÀÓ½ºÆäÀ̽º º¸Àü¼ºÀ» °ÈÇϱâ À§ÇÑ ¾ÈÀüÇÑ ¸ÅÄ¿´ÏÁòÀÌ´Ù.
Ŭ·¡½º ·Î´õ°¡ Ãæµ¹ÇÑ´Ù´Â ¶Ç ´Ù¸¥ ½ÅÈ£´Â ½Ã½ºÅÛÀÇ ´ÜÀÏ Å¬·¡½º¿¡¼ ´ÙÁß ÀνºÅϽº¸¦ ã¾ÒÀ» ¶§ÀÌ´Ù. (´ÜÀÏ Å¬·¡½º¿¡´Â ´Ü ÇÑ °³ÀÇ Å¬·¡½º ÀνºÅϽº°¡ »ý¼ºµÇ¾î¾ß ÇÑ´Ù.) ±â¼úÀûÀ¸·Î ´ÜÀÏ ÀνºÅϽº´Â ±× Ŭ·¡½º ·Î´õ ¾È¿¡¼¸¸ µ¶ÀÚÀûÀÏ »ÓÀÌ´Ù. µû¶ó¼ Ŭ·¡½º ·Î´õ ´Ü°è¿¡¼ ´ÜÀϼº¿¡ ÀÇÁöÇÏ´Â °ÍÀº À§ÇèÇÏ´Ù. ´ÙÀ½ÀÇ ¿¹Á¦¸¦ º¸ÀÚ.
/* MyServlet in WAR #1 */
WARScopeSingleton cache = WARScopeSingleton.getInstance();
WARScopeFoo foo = new WARScopeFoo ();
cache.add("myFooObject", foo);
System.out.println(cache.length()); //output is 1
/* MyOtherServlet in WAR #2 */
WARScopeSingleton cache = WARScopeSingleton.getInstance();
System.out.println(cache.length()); //output is 0!
ÀÌ ¿¹Á¦¿¡¼ ÄÚµå´Â ´ÜÀÏ Å¬·¡½º¿¡¼ÀÇ ¿ÀºêÁ§Æ®µéÀ» ÀúÀåÇÑ´Ù. ±×·¯³ª ´ÜÀÏ Å¬·¡½º¿¡¼ÀÇ ½ºÄÚÇÁ´Â WAR Ŭ·¡½º ·Î´õ¸¦ ÇÊ¿¬ÀûÀ¸·Î ¹ß»ý½ÃŲ´Ù.
´ÙÇàÈ÷ ¿£ÅÍÇÁ¶óÀÌÁî Java °³¹ßÀÚµéÀ» À§ÇØ ÀÌ·± Àå¾ÖµéÀ» ±Øº¹ÇÒ ¸î °¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. ù¹øÂ° ´Ü°è´Â ¾î¶² Ŭ·¡½º ·Î´õ °æ°è°¡ ´Ã Á¸ÀçÇÏ´Â °ÍÀÌ º¸ÀåµÇ´ÂÁö È®ÀÎÇÏ°í ±×¿¡ ´ëÇÑ Àü·«À» °èȹÇÏ´Â °ÍÀÌ´Ù. ¸ðµç J2EE ȯ°æ¿¡´Â ¼¼ °³ÀÇ Å¬·¡½º ·Î´õ ·¹º§ÀÌ ±¸ÃàµÇ¾î ÀÖ´Ù. ½Ã½ºÅÛ ´Ü°èÀÇ ÄÁÅØ½ºÆ®´Â ´ëºÎºÐ VMÀ» ±³Â÷Çϸç J2SE¿Í J2EE Ç÷§ÆûÀÇ Å¬·¡½º¿Í ȣȯµÈ´Ù. À̰ÍÀº ¾ÖÇø®ÄÉÀÌ¼Ç ¼¹ö°¡ ÀÚüÀûÀ¸·Î ±¸µ¿ÇÏ´Â ·¹À̾îÀÌ´Ù.
´ÙÀ½ ´Ü°è´Â Enterprise Archive ÄÁÅØ½ºÆ®Àε¥, ÀÌ´Â ¿£ÅÍÇÁ¶óÀÌÁî ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¸ðµç JAR¿Í WAR¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù.
¸¶Áö¸· ´Ü°è´Â Web Archive ÄÁÅØ½ºÆ®À̸ç, ÀÌ´Â WAR ÆÄÀÏ /WEB-INF/classesµð·ºÅ丮ÀÇ ¸ðµç ÆÄÀϰú /WEB-INF/lib µð·ºÅ丮ÀÇ ¸ðµç JAR ÆÄÀÏÀ» Æ÷ÇÔÇϰí ÀÖ´Ù. WAR ÆÄÀÏ ¾È¿¡ ·ÎµùµÈ ¸ðµç Ŭ·¡½º°¡ »óÈ£ Á¢±Ù °¡´ÉÇÔÀº ¹°·ÐÀ̰í EAR ÆÄÀϰú System Ŭ·¡½º ·Î´õÀÇ Å¬·¡½ºµé°úµµ Á¢±Ù°¡´ÉÇÏÁö¸¸ ´Ù¸¥ WAR ÆÄÀÏ ¾È¿¡ ·ÎµùµÈ Ŭ·¡½ºµé°ú´Â Á¢±ÙµÉ ¼ö ¾ø´Ù.
µû¶ó¼ À¥ ¾ÆÄ«ÀÌºê °£ÀÇ »ç¿ëÀÚ ºñÁî´Ï½º ¿ÀºêÁ§Æ®¸¦ °øÀ¯ÇϰíÀÚ ÇÑ´Ù¸é ¿ÀºêÁ§Æ®ÀÇ JAR ÆÄÀÏÀ» EAR Ŭ·¡½º ·Î´õ ÄÁÅØ½ºÆ®¿¡ À§Ä¡½Ã۰í WAR ÆÄÀÏÀÇ /WEB-INF/lib µð·ºÅ丮´Â ÇÇÇÏ´Â °Ô ÁÁ´Ù. ´ÙÀ½Àº ±× ¿¹ÀÌ´Ù.
/* MyServlet in WAR #1 */
EARScopeCache cache =EARScopeCache.getInstance();
EARScopeFoo foo = new EARScopeFoo();
cache.add("MyFooObject", foo);
/* MyServlet in WAR #2 */
EARScopeCache cache = EARScopeCache.getInstance();
Object o = cache.get("myFooObject");
EARScopeFoo foo = (EARScopeFoo)o; //SUCCESS!
ÀÌ ÀÛ¾÷ÀÇ ÀÌÀ¯´Â °¢°¢ÀÇ ¼ºí·¿Àº »óÀ§ °è±ÞÀÇ Å¬·¡½º ·Î´õ¸¦ Ãß±¸Çϰí WAR Ŭ·¡½º ·Î´õ ÄÁÅØ½ºÆ®¿¡ Ŭ·¡½ºµéÀ» ·ÎµùÇÏ´Â ´ë½Å °°Àº EARScopeCache¿Í EARScopeFoo¿ÀºêÁ§Æ®¸¦ ã´Â´Ù´Â µ¥¿¡ ÀÖ´Ù.
±×·¯³ª, EAR ÆÄÀÏÀ» Á¶ÇÕÇÏ´Â °ÍÀº ¼ºí·¿ ±Ô°ÝÀÇ ÂüÁ¶ ±¸ÇöÀÎ Tomcat °°Àº ¾î¶² ÄÁÅ×ÀÌ³Ê ¿¡¼´Â ¿É¼ÇÀÌ ¾Æ´Ï´Ù. TomcatÀº EAR ÆÄÀÏ¿¡¼ Ŭ·¡½ºµéÀ» ·ÎµùÇÏ´Â Á¤º¸Ã³¸® ±â´ÉÀÌ ¾øÀ¸¸ç µû¶ó¼ ´ÙÁß À¥ ¾ÆÄ«À̺꿡 Ŭ·¡½ºµéÀ» ±³Â÷ÇÒ ¼ö ÀÖ°Ô ¸¸µéÁö ¸øÇÑ´Ù. ±×·¯³ª TomcatÀº ÀÏ¹Ý Å¬·¡½º ·Î´õ¸¦ º¸À¯ÇÏ¿© /commonµð·ºÅ丮ÀÇ ¸ðµç JAR ÆÄÀÏÀ» ¸ðµç À¥ ¾ÆÄ«À̺ê ÄÁÅØ½ºÆ®À§¿¡ Á÷Á¢ÀûÀ¸·Î Á¸ÀçÇÏ¿© Á¢±Ù°¡´ÉÇÑ Å¬·¡½º ·Î´õ ½ºÆäÀ̽º¿¡ ·ÎµùÇÑ´Ù.
»ý°¢Çغ¼ ¼ö ÀÖ´Â ´Ù¸¥ ±â¼ú·Î´Â ¼·Î ´Ù¸¥ ÄÄÆ÷³ÍÆ® ÇÏÀ§ ½Ã½ºÅÛ °£¿¡ µ¥ÀÌÅ͸¦ ¿Õº¹Àü´ÞÇϱâ À§ÇØJava ¹è¿À» »ç¿ëÇÏ´Â °ÍÀÌ ÀÖ´Ù. µÎ°³ÀÇ ¾ÖÇø®ÄÉÀ̼ÇÀ¸·ÎºÎÅÍÀÇ ÄÄÆ÷³ÍÆ®°¡ ¹ÙÀÌÆ®·Î ¹è¿µÈ µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â °øÀ¯ Àå¼Ò°¡ ÀÖ°í, ¹öÀü Ãæµ¹ÀÌ ÀáÀçÀûÀ¸·Î ÀÖ´Ù´Â »ç½ÇÀ» ¹èÁ¦Çϸé ÀÌ Àü·«Àº ºü¸£°í È¿°úÀûÀÌ´Ù.
º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù. °ü·Ã¹®ÀÇ : SKDN@sun.com
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϽ÷Á¸é ¼ö½Å°ÅºÎ¸¦
Ŭ¸¯ÇØ ÁÖ¼¼¿ä.
Copyright 2003-2005 Sun Korea, Inc. All rights reserved.
|