.
.
Core Java
Technologies Technical Tips
.
 
2004³â 10¿ù 5ÀÏ  


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 ¹è¿­À» »ç¿ëÇÏ´Â °ÍÀÌ ÀÖ´Ù. µÎ°³ÀÇ ¾ÖÇø®ÄÉÀ̼ÇÀ¸·ÎºÎÅÍÀÇ ÄÄÆ÷³ÍÆ®°¡ ¹ÙÀÌÆ®·Î ¹è¿­µÈ µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â °øÀ¯ Àå¼Ò°¡ ÀÖ°í, ¹öÀü Ãæµ¹ÀÌ ÀáÀçÀûÀ¸·Î ÀÖ´Ù´Â »ç½ÇÀ» ¹èÁ¦Çϸé ÀÌ Àü·«Àº ºü¸£°í È¿°úÀûÀÌ´Ù.

.
.
.

Reader Feedback

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

 

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

.
.

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

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

Sun Microsystems, Inc.
.

 


 


'ÀÚ¹ÙÀÇ ¾Æ¹öÁö' Á¦ÀÓ½º °í½½¸µ'À» ¸¸³¯ ¼ö ÀÖ´Â ±âȸ¸¦ ³õÄ¡Áö ¸¶¼¼¿ä!

10¿ù 7-8ÀÏ ¼­¿ï ¼¾Æ®·²½ÃƼ¿¡¼­ ÀÚ¹Ù °³¹ßÀÚ ÃàÁ¦°¡ ¿­¸³´Ï´Ù.
Sun Tech Days¿¡ Âü°¡ÇϽô ´º½º·¹ÅÍ ±¸µ¶Àںе鲲 ¼±¹°À» µå¸³´Ï´Ù.
ÀÚ¼¼ÇÑ ³»¿ë º¸±â>>

.