IBM Korea Skip to main content
       IBM Ȩ    |  Á¦Ç° & ¼­ºñ½º  |  °í°´Áö¿ø & ´Ù¿î·Îµå  |  È¸¿ø°¡ÀÔ  

¾ÆÆÄÄ¡ SOAP À¯Çü ¸ÅÇÎ, Part 2 : Á÷·ÄÈ­ ¼³¸í¼­
¸ñ Â÷:
·çÆ® ¹× ÀÏ¹Ý (ºñ)Á÷·ÄÀÚ
Á÷·ÄÀÚ ¼³¸í¼­
ºñÁ÷·ÄÀÚ ¼³¸í¼­
·çÆ® (ºñ)Á÷·ÄÀÚ µî·ÏÇϱâ
½ºÅ°¸¶ÀÇ Á¦ÇÑÀ» ¹Þ´Â SOAP
ÃÖ±ÙÀÇ ÀÎÅÍÆäÀ̽º º¯°æ »çÇ×
°á·Ð
Âü°í ÀÚ·á
ÇÊÀÚ ¼Ò°³
±â»ç¿¡ ´ëÇÑ Æò°¡
°ü·Ã dW ¸µÅ©:
¾ÆÆÄÄ¡ SOAP À¯Çü ¸ÅÇÎ, Part 1
developerWorks newsletter ±¸µ¶Çϱâ
US ¿ø¹® Àбâ
Also in the Web services zone:
Æ©Å丮¾ó
Åø ¹× Á¦Ç°
Articles
Also in the Java zone:
Æ©Å丮¾ó
Åø ¹× Á¦Ç°
ÄÚµå ¹× ÄÄÆ÷³ÍÆ®
Articles
Á¤ÀÇµÈ Á÷·ÄÀÚ¿Í ºñÁ÷·ÄÀÚ¸¦ ÀÛ¼ºÇϱâ À§ÇÑ ´Ü°èµé


Gavin Bong
¼ÒÇÁÆ®¿þ¾î ¿£Áö´Ï¾î, eUtama Sdn. Bhd.
2002³â 3¿ù

SOAP »ç¾çÀº µ¥ÀÌÅͺ£À̽º, ÇÁ·Î±×·¡¹Ö ¾ð¾î (¿¹ : ÀÚ¹Ù ÇÁ·Î±×·¡¹Ö ¾ð¾î) ¹× µ¥ÀÌÅÍ ¸®ÆÄÁöÅ丮¿¡¼­ ¹ß°ßµÇ´Â ÀϹÝÀûÀÎ À¯ÇüµéÀ» Ç¥½ÃÇϱâ À§ÇÑ ÀÎÄÚµùÀ» ¸í½ÃÇÑ´Ù. ¾ÆÆÄÄ¡ SOAPÀÇ ÅøŶÀº ÀÚ¹Ù À¯ÇüµéÀ» Á÷·ÄÈ­µÈ XML Ç¥ÇöÀ¸·Î ¸ÅÇνÃÅ°´Â ÀÛ¾÷À» ¼öÇàÇϴ Ŭ·¡½ºÀÎ ±âÃÊÀûÀÎ (ºñ)Á÷·ÄÀÚ ¼¼Æ®¸¦ Á¦°øÇÔÀ¸·Î½á ÀÎÄÚµùÀ» Áö¿øÇÑ´Ù. Gavin BongÀº ÅøŶ¿¡¼­ Á¦°øµÇ´Â °ÍÀÌ ¿ä±¸»çÇ×°ú ¸ÂÁö ¾ÊÀ» ¶§ Á÷Á¢ (ºñ)Á÷·ÄÀÚ¸¦ ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù. ¿¹Á¦ ¾ÖÇø®ÄÉÀ̼ǵµ Á¦°øÇÑ´Ù.

Part 1¿¡¼­ SOAPÀÌ µ¥ÀÌÅÍ À¯ÇüÀ» XML¿¡ ¾î¶»°Ô ¸ÅÇνÃÅ°´ÂÁö¸¦ º¸¾Ò°í, ¾ÆÆÄÄ¡ SOAP ÅøŶ¿¡ Æ÷ÇԵǾî ÀÖ´Â Á÷·ÄÀÚ¿Í ºñÁ÷·ÄÀÚ (Áö±ÝºÎÅÍ´Â ÁýÇÕÀûÀ¸·Î (ºñ)Á÷·ÄÀÚ¶ó°í ĪÇÏ°Ú´Ù)¸¦ ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö¸¦ ¹è¿ü´Ù. À̹ø¿¡´Â (ºñ)Á÷·ÄÀÚ ÀÛ¼º ¹æ¹ýÀ» º¸¿©ÁÙ ¼³¸í¼­¸¦ »ìÆ캸°Ú´Ù. Part 1ÀÇ "À¯Çü ¸ÅÇÎ ÆÐÅÏ" ¼½¼ÇÀ» ´Ù½Ã Àо±â ¹Ù¶õ´Ù.

·çÆ® ¹× ÀÏ¹Ý (ºñ)Á÷·ÄÀÚ

¾ÆÆÄÄ¡ SOAP ÅøŶ°ú ÇÔ²² Á¦°øµÇ´Â (ºñ)Á÷·ÄÀÚ Áß ¿©·¯ºÐÀÇ Àڹ٠Ŭ·¡½º¿¡ ¸Â´Â °ÍÀÌ ¾øÀ» °æ¿ì ½º½º·Î »ç¿ëÀÚ Á¤ÀÇ ¹æ½ÄÀÇ (ºñ)Á÷·ÄÀÚ¸¦ ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ¸ÕÀú ¼ÒÀ§ ·çÆ® (ºñ)Á÷·ÄÀÚ¿Í ÀÏ¹Ý (ºñ)Á÷·ÄÀÚ¸¦ ±¸ºÐÇØ¾ß ÇÑ´Ù. RPC ¸Å°³ º¯¼ö¿Í ÀÀ´äµé¿¡ ´ëÇÑ Á÷·ÄÈ­¿Í ºñÁ÷·ÄÈ­ÀÇ Ãʱ⠺ÎÆ®½ºÆ®·¡ÇÎÀº ·çÆ® (ºñ)Á÷·ÄÀÚ¿¡ÀÇÇØ Ã³¸®µÈ´Ù. ¾ÆÆÄÄ¡ SOAP¿¡ ÀÖ´Â ¼¼ °¡Áö ·çÆ® (ºñ)Á÷·ÄÀÚ°¡ Ç¥ 1¿¡ ³ª¿Í ÀÖ´Ù.

Ç¥ 1. ·çÆ® (ºñ)Á÷·ÄÀÚ
encodingStyle (ºñ)Á÷·ÄÀÚ
Section 5 ParameterSerializer
Literal XML XMLParameterSerializer
XMI XMIParameterSerializer

ÀûÀýÇÑ ·çÆ® (ºñ)Á÷·ÄÀÚ´Â µÎ °¡Áö »çÇ׿¡ ±â¹ÝÇÏ¿© 󸮵ȴÙ. encodingStyle°ú Parameter Ŭ·¡½º (Á÷·ÄÈ­¿ë), ȤÀº QName SOAP-ENV:Parameter (ºñÁ÷·ÄÈ­¿ë)ÀÌ ±×°ÍÀÌ´Ù. ½ÇÁ¦ 󸮰¡ ¾î¶»°Ô ÀϾ´ÂÁö ¾Ë·Á¸é Ŭ¶óÀ̾ðÆ® Ãø¿¡¼­ ÀÚ¹Ù À¯ÇüÀÇ Á÷·ÄÈ­·Î ³ª¾Æ°¡´Â ¿¬¼ÓÀûÀÎ À̺¥Æ®µéÀ» ÀÌÇØÇØ¾ß ÇÑ´Ù.


  Call call = new Call();
  ...
  resp = call.invoke(url, ""); //1 

Call Ŭ·¡½ºÀÇ invoke ¸Þ½îµå°¡ À§ÀÇ 1Çà¿¡¼­ È£ÃâµÉ ¶§, Call Ŭ·¡½º´Â ÀÚ½ÅÀÇ °ü·Ã ¸Å°³º¯¼öµéÀ» ¹Ýº¹ Àû¿ëÇÑ´Ù.


org.apache.soap.rpc.RPCMessage:
  ...
  Serializer ser = xjmr.querySerializer(Parameter.class, actualParamEncStyle); //2
  ser.marshall(...); 
  ...

°¢ ¸Å°³º¯¼ö¿¡ ´ëÇØ À¯Çü ¸ÅÇÎ ·¹Áö½ºÆ®¸®°¡ Á¶È¸µÇ°í µÚÀ̾î marshall() ¸Þ½îµå°¡ ¹ÝȯµÇ´Â Á÷·ÄÀÚ¿¡ ÀÇÇØ È£ÃâµÈ´Ù. 2ÇàÀÇ ¹ÝȯµÇ´Â Á÷·ÄÀÚ´Â ·çÆ® Á÷·ÄÀÚÀÌ´Ù.

À¥ ¼­ºñ½º¿¡¼­ÀÇ ºñÁ÷·ÄÈ­ ÀýÂ÷·Î ÁÖÀǸ¦ µ¹·Á º¸ÀÚ. ¼­¹öÃø¿¡¼­ SOAP RPC ¸Þ½ÃÁöÀÇ listener´Â ¼­ºí¸´À¸·Î ±¸ÇöµÈ´Ù. doPost ¸Þ½îµå´Â SOAP ÀÀ´äÀ» °Ë»öÇÏ°í ÀÌ°ÍÀ¸·ÎºÎÅÍ Call °´Ã¼¸¦ À籸ÃàÇÏ·Á°í ½ÃµµÇÑ´Ù.


org.apache.soap.rpc.RPCMessage:
...
  Bean paramBean = smr.unmarshall(actualParamEncStyle, RPCConstants.Q_ELEM_PARAMETER
 ...); //3
  Parameter param = (Parameter)paramBean.value;
  ...

3Çà¿¡¼­ RPCConstants.Q_ELEM_PARAMETER´Â SOAP-ENV:Parmeter·Î ¹Ù²ï´Ù. ¹Ù·Î ÀÌ 3Çà¿¡¼­ unmarshall() ¸Þ½îµå°¡ ºÒ¸®¿öÁú ¶§ ·çÆ® ºñÁ÷·ÄÀÚ·ÎÀÇ ¹èÄ¡°¡ ÀÌ·ç¾îÁø´Ù.

·çÆ® (ºñ) Á÷·ÄÀÚ´Â ´ÙÀ½ ÀÏ¹Ý (ºñ)Á÷·ÄÀÚ°¡ È£ÃâµÇµµ·Ï À¯Çü ¸ÅÇÎ ·¹Áö½ºÆ®¸®¸¦ Â÷·Ê·Î Á¶È¸ÇÒ °ÍÀÌ´Ù. ÀÌ È£Ãâ ½ºÅÃÀº (Á÷·ÄÈ­ °úÁ¤ µ¿¾È) ·¹Áö½ºÆ®¸®°¡ ¿ø½Ã ÀÚ¹Ù À¯Çü¿¡ ´ëÇÑ (ºñ)Á÷·ÄÀÚ¸¦ ¹ÝȯÇÒ ¶§³ª (ºñÁ÷·ÄÈ­ °úÁ¤ µ¿¾È) XML element°¡ °£´ÜÇÑ À¯Çü¿¡ ´ëÇÑ ¼ø¼öÇÑ ÄÁÅ×À̳ÊÀÏ ¶§¸¸ ÇØ°áµÇ±â ½ÃÀÛÇÒ °ÍÀÌ´Ù.

Á¦°øµÇ´Â ÀÏ¹Ý (ºñ)Á÷·ÄÀÚÀÇ ´ëºÎºÐÀº -org.apache.soap.encoding.soapenc ÆÐÅ°Áö¿¡¼­ ¹ß°ßµÉ ¼ö ÀÖ´Â- ¾ÆÆÄÄ¡ SOAP ³»ÀÇ ´ëºÎºÐÀÇ ÇïÆÛ Å¬·¡½º°¡ ±×·¯ÇϵíÀÌ Section 5 ÀÎÄÚµù¿¡¼­ ÀÛµ¿ÇÑ´Ù. ÀÌ°ÍÀº ¿Ö ³»°¡ ÀÌ ¼³¸í¼­ÀÇ Æ÷Ä¿½º¸¦ Section 5 ÀÎÄÚµù (ºñ)Á÷·ÄÀÚ¿¡¸¸ ¸ÂÃß´ÂÁöÀÇ ÀÌÀ¯ÀÌ´Ù.

±×¸² 1. (ºñ)Á÷·ÄÀÚ ÀÛ¼ºÀ» À§ÇÑ API
APIs for writing (de)serializers

Á÷·ÄÀÚ ¼³¸í¼­

Á÷·ÄÀÚ´Â org.apache.soap.util.xml.SerializerÀ» ±¸ÇöÇÏ°í ÇÑ ¸Þ½îµå¸¦ ½ÇÇöÇÑ´Ù.


  void marshall(
    java.lang.String inScopeEncStyle, 
    java.lang.Class javaType, 
    java.lang.Object src, 
    java.lang.Object context, 
    java.io.Writer sink, 
    NSStack nsStack, 
    XMLJavaMappingRegistry xjmr, 
    SOAPContext ctx) 
      throws java.lang.IllegalArgumentException, 
             java.io.IOException 

marshall()ÀÇ ¸Å°³º¯¼ö °¢°¢À» Â÷·Ê·Î °ËÅäÇغ¸ÀÚ.

  • inScopeEncStyle: µÑ·¯½Î°í ÀÖ´Â CallÀ̳ª Response °´Ã¼¿¡ ÁöÁ¤µÈ´ë·Î encodingStyleURI¸¦ Ç¥ÇöÇÑ´Ù.
  • javaType: Á÷·ÄÈ­µÇ¾î¾ß ÇÏ´Â °´Ã¼ÀÇ ·±Å¸ÀÓ À¯ÇüÀÌ´Ù.
  • src: Á÷·ÄÈ­µÉ ÀÚ¹Ù °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶ÀÌ´Ù.
  • context: Á¢±ÙÀÚ À̸§À» Ç¥½ÃÇÏ´Â StringÀÌ´Ù. ÀÌ Á÷·ÄÀÚ°¡ ParameterSerializer¿¡ ÀÇÇØ È£ÃâµÇ¸é ÀÌ ¹®¸Æ°ªÀº Parameter Ŭ·¡½º (SOAP Ŭ¶óÀ̾ðÆ®¿¡ ¼±¾ðµÈ) ³»ÀÇ ¸í¸íµÈ Ư¼º°ª°ú ÀÏÄ¡Çϰųª ¸¸ÀÏ ÀÌ°ÍÀÌ SOAP ¼­¹ö¶ó¸é ¹ÝȯÀ» À§ÇØ Çϵå ÄÚµùµÈ´Ù. ÀÌ°ÍÀº null °ªÀ̾´Â ¾È µÈ´Ù.
  • sink: SOAP XML ÀνºÅϽº°¡ ÀÛ¼ºµÉ ¸ñÀûÁö ½ÌÅ©
  • nsStack: ÇöÀç ¹üÀ§ ³»¿¡ ÀÖ´Â ´Ù¼öÀÇ À̸§°ø°£ ¼±¾ðÀ» ±¸ÇöÇÏ´Â µ¥ÀÌÅÍ ±¸Á¶
  • xjmr: ÀÚ¹Ù À¯Çü¿¡ ±â¹ÝÇÏ¿© ´ÙÀ½¿¡ ¿©·¯ºÐÀÌ »ç¿ëÇÒ Á÷·ÄÀÚ¸¦ Á¶È¸Çϱâ À§ÇØ »ç¿ëÇÏ´Â smrÀÌ´Ù. [¿©·¯ºÐÀº ¶ÇÇÑ javaType°ú encodingStyle¿¡ ±â¹ÝÇÏ¿© ´Ù¸¥ Á÷·ÄÀÚ¿¡ À§ÀÓÇÒ xjmr ¹è¿­ ¸Þ½îµå¸¦ È£ÃâÇÒ °ÍÀÌ´Ù. ¿¹¸¦ µé¾î HashtableÀ̳ª Vector¿Í °°Àº º¹ÇÕ ±¸Á¶¸¦ À§ÇØ À̸¦ ¼öÇàÇÑ´Ù.
  • ctx: ¼­ºí¸´ ¹®¸ÆÀ¸·ÎºÎÅÍ ³ª¿À´Â javax.servlet.http.HttpServletRequest°ú javax.servlet.http.HttpSession °°Àº °ÍÀ» Àü´ÞÇϴµ¥ »ç¿ëµÈ´Ù.

marshall() ¸Þ½îµå¿¡ ´ëÇÑ ¼³¸í¼­´Â ´ÙÀ½°ú °°´Ù.

1´Ü°è : »õ·Î¿î À̸§°ø°£ ¹üÀ§¸¦ »ý¼ºÇÑ´Ù.


   nsStack.pushScope();
  

XML À̸§°ø°£ ¼±¾ðÀÇ ¹üÀ§¸¦ ÃßÀûÇϱâ À§ÇØ NSStack Ŭ·¡½º¸¦ »ç¿ëÇÑ´Ù. ³ªÁß¿¡ ÀÌ ¸Þ½îµå¿¡¼­ NSStackÀº »õ·Î¿î À̸§°ø°£À» Ãß°¡ÇÏ°í ÁöÁ¤µÈ URI¿¡ ´ëÇÑ Á¢µÎ»ç¸¦ ã±â À§ÇØ ½ºÅÃÀ» °Ë»öÇϴµ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù.

2´Ü°è : °´Ã¼ ÀÎÀÚ¿¡ ´ëÇÑ Á¦¾à »çÇ× Ã¼Å©Çϱâ

Á÷·ÄÈ­°¡ ¹ß»ýÇÏ·Á¸é µÎ °¡Áö Á¶°ÇÀÌ ÃæÁ·µÇ¾î¾ß ÇÑ´Ù. Á÷·ÄÀÚ¿¡°Ô Áö¿øµÇ´Â À¯ÇüÀÌ ÁÖ¾îÁ®¾ß ÇÏ°í Á÷·ÄÈ­µÉ °´Ã¼°¡ null °ªÀÌ ¾Æ´Ï¾î¾ß ÇÑ´Ù. ´ÙÀ½ ÄÚµå´Â VectorSerializer¿¡¼­ ÀÌ Á¦¾à »çÇ×µéÀÌ ¾î¶»°Ô Àû¿ëµÇ´ÂÁö¸¦ º¸¿©ÁØ´Ù.


     if ( (src != null) &&
         !(src instanceof Vector) &&
         !(src instanceof Enumeration))
              throw new IllegalArgumentException("Tried to pass a '" +
                      src.getClass().toString() + "' to VectorSerializer");

¸î °³ÀÇ ³»ÀåµÈ Á÷·ÄÀÚ´Â ½ÇÁ¦·Î ´ÙÀ½°ú °°ÀÌ javaType ¸Å°³º¯¼ö¿Í ¿¹»óµÇ´Â À¯ÇüÀ» ºñ±³ÇÑ´Ù.


  if(!javaType.equals(Foo.class)) ...
  

±×·¯³ª ÀÌ ±â¹ýÀº impostor À¯Çü ¹ö±×¿¡ °¨¿°µÇ±â ½±±â ¶§¹®¿¡ (Âü°íÀÚ·á) ÀÌ ¹æ¹ýÀº »ç¿ëÇÏÁö ¾Ê´Â°ÍÀÌ ³´´Ù.

3´Ü°è : null Á¢±ÙÀÚ »ý¼ºÇϱâ

°´Ã¼ ÀÎÀÚ°¡ null °ªÀ» °¡Áø´Ù¸é ±× À¯Çü¿¡ ´ëÇØ null Á¢±ÙÀÚ¸¦ »ý¼ºÇØ¾ß ÇÑ´Ù.


  SoapEncUtils.generateNullStructure(inScopeEncStyle,
javaType, context, sink, nsStack, xjmr);

4´Ü°è : °´Ã¼ Á÷·ÄÈ­Çϱâ

°´Ã¼¸¦ Section 5¸¦ µû¸£´Â SOAP XML ¹®¼­·Î Á÷·ÄÈ­ÇÏ·Á¸é ¼¼ ´Ü°è°¡ ÇÊ¿äÇÏ´Ù. Áï Á¢±ÙÀÚ¿¡ ´ëÇÑ °³½Ã element¸¦ »ý¼ºÇÏ°í °´Ã¼ °ªÀ» Á÷·ÄÈ­ÇÑ ÈÄ element¸¦ Á¾·áÇÏ´Â °ÍÀÌ´Ù.

ù¹ø° ´Ü°è´Â ´ÙÀ½ À¯Æ¿¸®Æ¼ ¸Þ½îµå¸¦ È£ÃâÇÔÀ¸·Î½á ½±°Ô ¼öÇàÇÒ ¼ö ÀÖ´Ù.


  SoapEncUtils.generateStructureHeader(inScopeEncStyle,
         javaType,
         context,
         sink,
         nsStack,xjmr);
  

ÀÌ ÄÚµå´Â ¸ÅÇÎµÈ QName for javaTypeÀ» °Ë»öÇϱâ À§ÇØ queryElementTypeÀ» È£ÃâÇÒ °ÍÀÌ´Ù.


  <context xsi:type="QName">
  

°´Ã¼ ÀÎÀÚÀÎ src°¡ °£´ÜÇÑ À¯ÇüÀ̶ó¸é, µÎ¹ø° ´Ü°èÀÎ °´Ã¼ °ª Á÷·ÄÈ­Çϱâ´Â src.toString() ¸Þ½îµå¸¦ È£ÃâÇÏ°í À̸¦ ÀÛ¼ºÇÏ´Â °£´ÜÇÑ ÀÛ¾÷ÀÌ´Ù. ±×·¸Áö ¾Ê´Ù¸é, °´Ã¼ÀÇ ±¸¼º ¿ä¼ÒµéÀ» È®ÀÎÇÏ°í À̵éÀ» º¸´Ù ¿ø½ÃÀûÀÎ Á÷·ÄÀÚ·Î °³º°ÀûÀ¸·Î Àü´ÞÇØ¾ß ÇÑ´Ù. ³»ÀåµÈ Á÷·ÄÀÚµéÀÇ ¼Ò½º¸¦ °ËÅäÇغ¸¸é ±¸¼º ¿ä¼ÒµéÀÌ ¿©·¯ ¹æ½ÄÀ¸·Î È®À뵃 ¼ö ÀÖÀ½À» ¾Ë°Ô µÉ °ÍÀÌ´Ù.

  • Java reflection (¿¹ : BeanSerializer)
  • List µ¥ÀÌÅÍ ±¸Á¶ ¹Ýº¹ Àû¿ëÇϱâ (¿¹ : ArraySerializer)
  • »çÀü¿¡ ¾Ë°í Àִ Ŭ·¡½º¸¦ ÅëÇÑ Á÷Á¢ÀûÀÎ Á¢±Ù (Áï ¿©·¯ºÐÀº ¿©·¯ºÐÀÇ Á÷·ÄÀÚ°¡ ÇϳªÀÇ Æ¯Á¤ Ŭ·¡½º¿¡ ´ëÇؼ­¸¸ ÀÛµ¿ÇÑ´Ù´Â °ÍÀ» »çÀü¿¡ ¾Ë°í ÀÖ´Ù.)

´Ù¸¥ Á÷·ÄÀÚµéÀ» È®ÀÎÇßÀ¸¸é, ´ÙÀ½À» È£ÃâÇÔÀ¸·Î½á À̵鿡 À§ÀÓÇÒ ¼ö ÀÖ´Ù.


  xjmr.marshall(inScopeEncStyle,
                componentType,
                componentValue,
                accessorName,
                sink, nsStack, ctx);
  

¿©±â¿¡¼­, componentType°ú componentValue´Â °¢°¢ ¿ø·¡ÀÇ src ¸Å°³º¯¼öÀÇ ±¸¼º ¿ä¼Òµé¿¡ ´ëÇÑ ·±Å¸ÀÓ À¯Çü°ú °´Ã¼ ÂüÁ¶¸¦ Ç¥½ÃÇÑ´Ù. marshall() ¸Þ½îµå´Â ¿¬°üµÈ Á÷·ÄÀÚ¸¦ °Ë»öÇϱâ À§ÇØ ½ÇÁ¦·Î querySerializerÀ» È£ÃâÇÏ°í µÚÀÌ¾î ¿¬°üµÈ Á÷·ÄÀÚÀÇ marshall() ¸Þ½îµå¸¦ È£ÃâÇÑ´Ù. ºÐ¸íÈ÷, ÀÌ°ÍÀº ¿©·¯ºÐÀÌ À¯Çü ¸ÅÇÎ ·¹Áö½ºÆ®¸®ÀÇ ¸ðµç ÄÄÆ÷³ÍÆ®¿¡ ´ëÇØ Á÷·ÄÀÚµéÀ» µî·ÏÇßÀ» ¶§¸¸ ÀÛµ¿ÇÑ´Ù.

¸¶Áö¸· ´Ü°èÀÎ element Á¾·áÇϱâ´Â °£´ÜÈ÷ Á¢±ÙÀÚ¿¡ ´ëÇÑ Á¾·á ű׸¦ ÀÛ¼ºÇÔÀ¸·Î½á ¿Ï·áµÈ´Ù.


  sink.write("</" + context + '>');
  

¸¶Áö¸·À¸·Î, ÇöÀçÀÇ À̸§°ø°£ ¹üÀ§¸¦ ³²°ÜµÎ°í ¸¶¹«¸®ÇØ¾ß ÇÑ´Ù.


  nsStack.popScope();
  

ºñÁ÷·ÄÀÚ ¼³¸í¼­

ºñÁ÷·ÄÀÚ´Â org.apache.soap.util.xml.DeserializerÀ» ±¸ÇöÇÏ°í ÇϳªÀÇ ¸Þ½îµå¸¦ ½ÇÇöÇÑ´Ù.


  Bean unmarshall(
    java.lang.String inScopeEncStyle, 
    QName elementType, 
    org.w3c.dom.Node src, 
    XMLJavaMappingRegistry xjmr, 
    SOAPContext ctx)         

unmarshall() ¸Þ½îµåÀÇ ¸ñÀûÀº ¸Å°³º¯¼ö¸¦ ÀÚ¹Ù °´Ã¼·Î À籸ÃàÇÏ´Â °ÍÀÌ´Ù. À̸¦ À§ÇØ src DOM ³ëµå¿¡ Æ÷ÇÔµÈ XML ºÎºÐÀ» ó¸®ÇØ¾ß ÇÑ´Ù. À̸¦ ¼öÇàÇϱâ À§ÇØ ¼±È£µÇ´Â ÇÁ·Î±×·¡¹Ö ¸ðµ¨Àº org.apache.soap.utils.xml.DOMUtils ³»ÀÇ DOM wrapper ¸Þ½îµå¸¦ À¯Çü ¸ÅÇÎ ·¹Áö½ºÆ®¸®¿Í ¿¬°èÇÏ¿© »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÀϹÝÀûÀ¸·Î, ºñÁ÷·ÄÈ­ÀÇ DOMUtils´Â Á÷·ÄÈ­ÀÇ SoapEncUtils¿¡ ÇÊÀûÇÏ´Â °ÍÀÌ´Ù.

src¿¡ µé¾î ÀÖ´Â XMLÀº ´ÙÁß ÂüÁ¶ °ªÀÇ Á¦¾àÀ» ¹ÞÁö ¾Êµµ·Ï º¸ÁõµÈ´Ù´Â Á¡¿¡ ÁÖÀÇÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. ¸ðµç ´ÙÁß ÂüÁ¶ hrefs´Â ·çÆ® ºñÁ÷·ÄÀÚÀÎ ParameterSerializer¿¡ ÀÇÇØ ½ÇÁ¦ °ªÀ¸·Î ´Ù½Ã ¹Ù²ï´Ù.

ºñÁ÷·ÄÀÚ ¼³¸í¼­´Â ´ÙÀ½°ú °°´Ù.

1´Ü°è : null °ª üũÇϱâ

nullÀÌ µÉ ¼ö ÀÖ´Â ¼Ó¼ºÀ» ´ÙÀ½°ú °°ÀÌ Ã¼Å©ÇÏ´Â °ÍÀÌ ÁÁ´Ù.


    Element root = (Element)src;
    if (SoapEncUtils.isNull(root))
    {
        return new Bean(Your.class, null);
    }
  

2´Ü°è : ÀÚ¹Ù °´Ã¼ À籸ÃàÇϱâ

ÀÚ¹Ù °´Ã¼ À籸Ãà ÀýÂ÷´Â µ¥ÀÌÅÍ À¯ÇüÀÌ ¼ÓÇÏ´Â Ä«Å×°í¸®¿¡ µû¶ó ´Ù¾çÇÏ´Ù. ( Part 1 ÂüÁ¶)

°£´ÜÇÑ À¯Çü

¿©·¯ºÐÀÌ °£´ÜÇÑ À¯ÇüÀ» ºñÁ÷·ÄÈ­ÇÏ°í ÀÖ´Ù¸é, ¹ÝȯµÉ °´Ã¼¸¦ ÃʱâÈ­Çϱâ À§ÇØ À̸¦ »ç¿ëÇϱâ Àü¿¡ ¸ÕÀú DOMUtils.getChildCharacterData(Element)À» »ç¿ëÇÏ¿© srcÀÇ ¹®ÀÚ¿­ °ªÀ» °Ë»öÇÏ°í ¼±ÅÃÀûÀ¸·Î À̸¦ »çÀü ó¸® (¿¹ : "NaN" ¹®ÀÚ¿­À» FloatDeserializer ³»ÀÇ Float.NaN¿¡ ¸ÅÇνÃÅ´)ÇØ¾ß ÇÑ´Ù.

º¹ÇÕ À¯Çü

º¹ÇÕ À¯ÇüÀº µÎ °³ÀÇ ÁÖ¿ä Ä«Å×°í¸®·Î ³ª´¶´Ù. ù¹ø°´Â °°Àº ±¸Á¶·Î µÈ ¹Ýº¹µÇ´Â element¸¦ °¡Áø À¯ÇüÀ¸·Î ±¸¼ºµÈ´Ù. ¿¹ÄÁ´ë, java.util.List¿Í java.util.MapÀ» ±¸ÇöÇÏ´Â ÀÚ¹Ù ¹è¿­À̳ª Ŭ·¡½º°¡ ¿©±â¿¡ Æ÷ÇԵȴÙ. ´Ù¸¥ Ä«Å×°í¸®´Â ÀÓÀÇÀûÀÎ ±¸Á¶¸¦ º¸ÀÌ´Â ´Ù¸¥ ¸ðµç Àڹ٠Ŭ·¡½º¸¦ ³ªÅ¸³½´Ù. ±×·¯¸é ºñÁ÷·ÄÈ­ ÀýÂ÷´Â °á±¹ °ü·ÃµÈ ÀÚ¼Õ element¸¦ È®ÀÎÇϱâ À§ÇØ XML ±¸Á¶¸¦ Ç×ÇØÇÏ°í µÚÀÌ¾î º¸´Ù ¿ø½ÃÀûÀÎ ºñÁ÷·ÄÀÚ·Î Á÷·ÄÈ­ Ã¥ÀÓÀ» À§ÀÓÇÏ´Â °ÍÀÌ µÇ´Âµ¥, ÀÌ°ÍÀº ´ÙÀ½°ú °°´Ù.

  • DOM Ç×ÇØÇϱ⠿©·¯ºÐÀÌ Ã¹¹ø° Ä«Å×°í¸®¿¡ ¼ÓÇÏ´Â º¹ÇÕ À¯ÇüÀ» ´Ù·ç°í ÀÖ´Ù¸é ¹Ýº¹µÇ´Â ¸ðµç ¸â¹öµé °£À» Ç×ÇØÇϱâ À§ÇØ DOMUtils.getFirstChildElement()°ú DOMUtils.getNextSiblingElement()¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¸Áö ¾Ê´Ù¸é ¸â¹ö Ư¼ºÀ» Ç¥ÇöÇÏ´Âelements¸¦ È®ÀÎÇϱâ À§ÇØ DOM API¸¦ »ç¿ëÇÑ´Ù.
  • ´Ù¸¥ ºñÁ÷·ÄÀÚ·Î ºñÁ÷·ÄÈ­ À§ÀÓÇϱ⠸ÕÀú ¿©·¯ºÐÀº soap À¯ÇüÀ» ÃßÃâÇØ¾ß ÇÑ´Ù.
    
    QName soapType = SoapEncUtils.getTypeQName(rootElement);
    

    ´ÙÀ½¿¡ º¸´Ù ¿ø½ÃÀûÀÎ ºñÁ÷·ÄÀÚ·Î À§ÀÓÇÑ´Ù.

    
    xjmr.unmarshall(inScopeEncStyle, soapType, rootElement, ctx);
    

    xjmr.unmarshallÀº ³»ºÎÀûÀ¸·Î queryDeserializer¸¦ È£ÃâÇÑ ÈÄ ¹ÝȯµÈ ºñÁ÷·ÄÀÚ¿¡ unmarshallÀ» È£ÃâÇÑ´Ù. À§ÀÇ µÎ ´Ü°èµéÀº ºñÁ÷·ÄÈ­¸¦ ParameterSerializer·Î À§ÀÓÇÔÀ¸·Î½á Çϳª·Î ÇÕÃÄÁö´Â °ÍÀÌ ³´´Ù. ÀÌ´Â xsi:type ¼Ó¼ºÀÌ ºüÁø »óȲ¿¡¼­ QName {""}/X (X´Â ·çÆ® elementÀÇ tagName)¿¡ ¼³Á¤µÈ soapType°ú ÇÔ²² xjmr.unmarshall()À» È£ÃâÇÏ°í ½Í±â ¶§¹®¿¡ ¼öÇàµÈ´Ù. À̸¦ ¼öÇàÇϱâ À§ÇÑ ÄÚµå´Â ÀÌ¹Ì ParameterSerializer.unmarshall() ³»¿¡ Æí¸®ÇÏ°Ô µé¾î Àֱ⠶§¹®¿¡ ÀÌ ÀýÂ÷´Â ´ÙÀ½°ú °°ÀÌ ´ÜÃàµÈ ÇüÅ·ΠµÈ´Ù.

  • 
    Bean paramBean = xjmr.unmarshall(inScopeEncStyle,
                                    RPCConstants.Q_ELEM_PARAMETER,
                                    rootElement, ctx);
    

  • ¸ñÇ¥ °´Ã¼ ÃʱâÈ­Çϱ⠸ñÇ¥ °´Ã¼ ´Â ¿©·¯ºÐÀÌ À籸ÃàÇÏ°í ÀÖ´Â °´Ã¼ ÀνºÅϽºÀÌ´Ù. ¸â¹ö Ư¼ºµéÀÌ ºñÁ÷·ÄÈ­µÊ¿¡ µû¶ó ¿©·¯ºÐÀº ¿©·¯ºÐÀÇ ¸ñÇ¥ °´Ã¼¿¡ º¯°æÀÚ(mutator) ¸Þ½îµå¸¦ È£ÃâÇÔÀ¸·Î½á ±× °ªÀ» º¹±¸ÇÒ ¼ö ÀÖ´Ù.
    
      Foo foo = new Foo();
      foo.setS( paramBean.value );
      

3´Ü°è : À籸ÃàµÈ °´Ã¼ ¹ÝȯÇϱâ

Bean Ŭ·¡½º´Â ·±Å¸ÀÓ À¯Çü°ú ½ÇÁ¦ ¹ÝȯµÇ´Â ÀνºÅϽº¸¦ ĸ½¶È­ÇÑ´Ù. ºñÁ÷·ÄÀÚ´Â ´ëºÎºÐÀÇ °æ¿ì ƯÁ¤ Ŭ·¡½º¿¡ ¸Â°Ô ¸¸µé¾îÁ³±â ¶§¹®¿¡ ¾î¶² Ŭ·¡½º¸¦ ¹ÝȯÇØ¾ß ÇÏ´ÂÁö¸¦ ¾Ë°í ÀÖ´Ù. BeanSerializer¿Í ArraySerializer °°Àº ÀÏ¹Ý ºñÁ÷·ÄÀÚ¿¡ ´ëÇؼ­´Â À¯Çü ¸ÅÇÎ ³»ÀÇ javaType ¼Ó¼ºÀÌ ¹ÝȯµÇ¾î¾ß ÇÏ´Â À¯ÇüÀ» Àü´ÞÇÑ´Ù.


   return(new Bean(Foo.class, foo));

·çÆ® (ºñ)Á÷·ÄÀÚ µî·ÏÇϱâ

¿©·¯ºÐÀÌ Á¤ÀÇÇÑ encodingStylesÀ» µµÀÔÇÏ·Á°í ÇÑ´Ù¸é ·çÆ® (ºñ)Á÷·ÄÀÚ¸¦ ÀÛ¼ºÇØ¾ß ÇÑ´Ù°í ÀÌ¹Ì ¾ð±ÞÇß´Ù. ·çÆ® (ºñ)Á÷·ÄÀÚ´Â ÇÑ °¡Áö ÀÛÀº Â÷À̸¦ Á¦¿ÜÇÏ°í´Â ÀÏ¹Ý (ºñ)Á÷·ÄÀÚ¿Í °°Àº ¹æ½ÄÀ¸·Î ±¸ÇöµÈ´Ù. ¸ðµç (ºñ)Á÷·ÄÀڴ Ưº°È÷ ÁöÁ¤µÈ QName°ú ÀÚ¹Ù À¯ÇüÀ¸·Î À¯Çü ¸ÅÇÎ ·¹Áö½ºÆ®¸®¿¡ µî·ÏµÇ´Âµ¥, À̵éÀº ¾ÆÆÄÄ¡ SOAP¿¡°Ô encodingStyles Ư¼º¿¡ ±â¹ÝÇÏ¿© (ºñ)Á÷·ÄÈ­ ÀýÂ÷¸¦ ½Ãµ¿Ç϶ó°í Áö½ÃÇÑ´Ù. ¾Æ·¡ÀÇ »ùÇà Äڵ忡¼­ °­Á¶µÈ °ªÀ» ±â·ÏÇØ µÎ¾ú´Ù°¡ ·çÆ® (ºñ)Á÷·ÄÀÚ¸¦ µî·ÏÇÒ ‹š »ç¿ëÇØ¾ß ÇÑ´Ù.

  [Client]

    smr.mapTypes(customEncURI,
      RPCConstants.Q_ELEM_PARAMETER, 
      Parameter.class,
      customSerializer, 
      null);

  [Server]

    <isd:map encodingStyle="customEncURI"
      xmlns:x="http://schemas.xmlsoap.org/soap/envelope" qname="x:Parameter"
      javaType="org.apache.soap.rpc.Parameter"
      java2XMLClassName="foo.customSerializer" />

½ºÅ°¸¶ÀÇ Á¦ÇÑÀ» ¹Þ´Â SOAP

ÀÌ ¼½¼Ç¿¡¼­ ³ª´Â º¹ÀâÇÑ À¯ÇüÀ» (ºñ)Á÷·ÄÈ­Çϱâ À§ÇÑ BeanSerializer¿¡ ´ëÇÑ ´ëü ¼Ö·ç¼ÇÀ» ¼Ò°³ÇÒ °ÍÀÌ´Ù. ³»°¡ ½ºÅ°¸¶ÀÇ Á¦ÇÑÀ» ¹Þ´Â SOAPÀ̶ó°í ºÎ¸£´Â ÀÌ ±â¹ýÀº PRC ¸Å°³º¯¼öÀÇ literal XML ±¸Á¶¸¦ ±â¼úÇϱâ À§ÇØ XML ½ºÅ°¸¶¸¦ »ç¿ëÇÑ´Ù. ¿©±â¿¡¼­ ¿ì¸®´Â Ŭ¶óÀ̾ðÆ®¿Í ¼­¹öÃøÀÇ µ¥ÀÌÅÍ ¸ðµ¨¿¡ ´ëÇؼ­´Â °³ÀÇÄ¡ ¾Ê°í ¸Þ½ÃÁö Æ÷¸Ë¿¡ ´ëÇØ ¾ö°ÝÇÏ°Ô »óÈ£¿î¿ëÇϱâ·Î µ¿ÀÇÇÑ´Ù. È¥¶õÀ» ÇÇÇϱâ À§ÇØ, PRC È£ÃâÀº ¿©ÀüÈ÷ Section 5¸¦ »ç¿ëÇØ ÀÎÄÚµùµÇÁö¸¸ ¸Å°³º¯¼ö´Â ±×·¸Áö ¾Ê´Ù´Â Á¡¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù.

¿¹Á¦ ¾ÖÇø®ÄÉÀ̼ÇÀ» »ç¿ëÇØ ÀÌ ±â¹ýÀ» º¸¿© ÁÖ°Ú´Ù. Âü°íÀÚ·á¿¡¼­ Àüü Äڵ带 ´Ù¿î·Îµå¹ÞÀ» ¼ö ÀÖ´Ù. Ŭ¶óÀ̾ðÆ®´Â À¥ ¼­ºñ½º¿¡°Ô ±¸¸Å ÁÖ¹®À» º¸³»°í, ¼­ºñ½º´Â ½ÂÀÎ ¹®ÀÚ¿­·Î ÀÀ´äÇÑ´Ù. À¥ ¼­ºñ½º°¡ ¿¢½ºÆ÷Æ®ÇÑ ¸Þ½îµå ¼­¸íÀº ´ÙÀ½°ú °°´Ù.


public String eatPo (PurchaseOrder p);

ÀÌ ±â¹ýÀÌ ÀÛµ¿Çϵµ·Ï ÇÏ·Á¸é XML/°´Ã¼ µ¥ÀÌÅÍ ¹ÙÀεù ÇÁ·¹ÀÓ¿öÅ©°¡ ÇÊ¿äÇÏ´Ù. ÀÌ ¿¹Á¦¿¡ ExolabÀÇ Castor ÅøŶÀ» »ç¿ëÇß´Ù. (Âü°íÀÚ·á)

ÀÌ ±â¹ýÀÇ ´Ü°èµéÀº ´ÙÀ½°ú °°´Ù.

  1. PurchaseOrder¿¡ ´ëÇÑ XML Æ÷¸Ë¿¡ ÇÕÀÇÇÑ´Ù.
  2. Castor¸¦ »ç¿ëÇÏ¿© Àڹ٠Ŭ·¡½º¸¦ »ý¼ºÇÑ´Ù.
  3. »ç¿ëÀÚ Á¤ÀÇ (ºñ)Á÷·ÄÀÚ¸¦ ÀÛ¼ºÇÑ´Ù.
  4. Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö ºÎºÐ¿¡ ´ëÇÑ À¯Çü ¸ÅÇÎÀ» ÀÛ¼ºÇÑ´Ù.

1´Ü°è : PurchaseOrder¿¡ ´ëÇÑ XML Æ÷¸Ë¿¡ ÇÕÀÇÇϱâ

¼³¸íÀ» °£´ÜÇÏ°Ô Çϱâ À§ÇØ PurchaseOrder ½ºÅ°¸¶¿¡¼­ ÁÖ¹® »ó¼¼ ¼½¼ÇÀ» ¾ø¾Ý´Ù. ¶ÇÇÑ PONumber ¼Ó¼ºÀº ÀÌ ½ºÅ°¸¶°¡ Section 5 ÀÎÄÚµùÀ» µû¸£Áö ¾Êµµ·Ï ¸¸µç´Ù´Â Á¡¿¡ ÁÖÀÇÇÑ´Ù.

±×¸² 2. PurchaseOrder.xsd
PurchaseOrder.xsd

2´Ü°è : Castor¸¦ »ç¿ëÇÏ¿© Àڹ٠Ŭ·¡½º »ý¼ºÇϱâ

CastorÀÇ SourceGenerator ¸í·ÉÇà ÅøÀ» ½ÇÇà½ÃÄÑ PurchaseOrder.xsd ³»ÀÇ ½ºÅ°¸¶¸¦ ±¸ÇöÇÏ´Â Àڹ٠Ŭ·¡½º¸¦ »ý¼ºÇÑ´Ù.


  java org.exolab.castor.builder.SourceGenerator
     -i PurchaseOrder.xsd
     -package com.raverun.po.castor

SourceGenerator ÅøÀº ÃֽŠ½ºÅ°¸¶ À̸§°ø°£¸¸ ÀνÄÇÑ´Ù. -- http://www.w3.org/2001/XMLSchema

´ÙÀ½¿¡ Àڹ٠Ŭ·¡½º ¼¼Æ®¸¦ ÄÄÆÄÀÏÇÑ´Ù. »ý¼ºµÈ ÆÄÀÏÀÌ SAX 1.0 API¸¦ »ç¿ëÇÔ¿¡ µû¶ó ¿©·¯ºÐÀº -deprecation ¿É¼ÇÀ» »ç¿ëÇØ¾ß ÇÒ °ÍÀÓ¿¡ ÁÖÀÇÇÑ´Ù. ÀÌ·¯ÇÑ ¼öÀÛ¾÷ ÄÄÆÄÀÏÀ» ÇÇÇϱâ À§ÇØ ExolabÀº À̸¦ ÀÚµ¿È­Çϱâ À§ÇÑ Ant taskdef¿¡ ´ëÇØ ÀÛ¾÷ÇÏ°í ÀÖ´Ù.

3´Ü°è : »ç¿ëÀÚ Á¤ÀÇ (ºñ)Á÷·ÄÀÚ ÀÛ¼ºÇϱâ

¿©·¯ºÐÀº ÀÌÁ¦ PurchaseOrderSerializer ³»ÀÇ (ºñ)Á÷·ÄÈ­ ¸Þ½îµå¸¦ ±¸ÇöÇϴµ¥, ÀÌ´Â PurchaseOrder Ŭ·¡½º°¡ ³ªÅ¸³»´Â ´ëÀÀ ¸Þ½îµå¸¦ È°¿ëÇÔÀ¸·Î½á ¼öÇàµÈ´Ù. Á÷·ÄÈ­¸¦ À§ÇØ PurchaseOrder´Â java.io.Writer³ª org.xml.sax.DocumentHandler·Î ¹è¿­µÉ ¼ö ÀÖ´Ù. Listing 1¿¡ ³ª¿Í ÀÖµíÀÌ ¿©·¯ºÐÀº Á÷·ÄÈ­¸¦ PurchaseOrder's marshal() ¸Þ½îµå¿¡ À§ÀÓÇÑ´Ù. (ÁÖÀÇ»çÇ×: marshal()¿¡ ÀÇÇØ »ý¼ºµÈ XML ½ºÆ®¸²Àº XML ÇÁ·Ñ·Î±×¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù.) PurchaseOrderSerializer´Â sink¸¦ java.io.FilterWriterÀÎ FilterXmlProlog·Î Æ÷ÀåÇÔÀ¸·Î½á ÀÌ ÇÁ·Ñ·Î±×¸¦ »èÁ¦ÇÑ´Ù. Listing 2´Â ºñÁ÷·ÄÈ­ °úÁ¤ µ¿¾È ¹ßÇàÇÒ ¼ö ÀÖ´Â ¸î °¡Áö ¿¹¿Ü »óȲÀ» Æ÷ÇÔÇÏ°í ÀÖ´Ù.

Listing 1. PurchaseOrderSerializer ³»ÀÇ marshal() ¸Þ½îµå¿¡¼­ ÃßÃâ

      ----o<---------
      SoapEncUtils.generateStructureHeader(inScopeEncStyle,
                                         javaType,
                                         context,
                                         sink,
                                         nsStack,
                                         xjmr);
      PurchaseOrder po = (PurchaseOrder)src; 
      try{
        po.marshal( new FilterXmlProlog(sink) );
      }catch(Exception e){ 
        throw (new java.io.IOException("Castor: Error marshalling"));
      }
      sink.write( StringUtils.lineSeparator );
      sink.write("</" + context + '>');
      ----o<---------

Listing 2. PurchaseOrderSerializer ³»ÀÇ ºñÁ÷·ÄÈ­ °úÁ¤µ¿¾È ¹ß»ýÇÏ´Â ¿¹¿Ü »óȲ

    (b1) Null PO.
                 
         ---------------------------
         <po 
           xmlns:ns2="urn:raverun" 
           xsi:type="ns2:po"
           xsi:null="true"/>
         ---------------------------

    (b2) Non null but nothing submitted in the body.

         ---------------------------
         <po 
           xmlns:ns2="urn:raverun" 
           xsi:type="ns2:po" />
         ---------------------------

    (b3) PO that violates the schema.

         ---------------------------
         <po 
           xmlns:ns2="urn:raverun" 
           xsi:type="ns2:po">
           <foo bar="123"/>
         </po>
         ---------------------------

4´Ü°è : Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö ºÎºÐ¿¡ ´ëÇÑ À¯Çü ¸ÅÇÎ ÀÛ¼ºÇϱâ

¸¶Áö¸·À¸·Î ¿©·¯ºÐÀÌ Á¤ÀÇÇÑ (ºñ)Á÷·ÄÀÚ¸¦ ÂüÁ¶Çϱâ À§ÇÑ À¯Çü ¸ÅÇÎÀ» ¼±¾ðÇØ¾ß ÇÑ´Ù. ¿©·¯ºÐÀº PurchaseOrder¿¡ ´ëÇÑ ÀÎÄÚµùÀ¸·Î Section 5°¡ ÁöÁ¤µÇ¾î ÀÖ´Â °ÍÀ» º¸¸é ³î¶ö °ÍÀÌ´Ù. ÀÌ·¸°Ô ÇÏ¸é ¿©·¯ºÐÀÌ ºñÁ÷·ÄÈ­ ÀýÂ÷¸¦ ½Ãµ¿Çϱâ À§ÇØ ParameterSerializer¸¦ »ç¿ëÇÒ ¼ö ÀÖ°í Á÷·ÄÈ­ ÄÚµå ³»ÀÇ SoapEncUtilsµµ »ç¿ëÇÒ ¼ö Àֱ⠶§¹®¿¡ ÆíÀÇ»ó ÀÌ·¸°Ô ÁöÁ¤ÇÑ °ÍÀÌ´Ù.


  [Client]
    SOAPMappingRegistry smr = new SOAPMappingRegistry();
    smr.mapTypes(Constants.NS_URI_SOAP_ENC,
                   new QName("urn:raverun", "po"),
                   PurchaseOrder.class, pos, null);

  [Server]
    <isd:map
       encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
       xmlns:x="urn:raverun" qname="x:po"
       javaType="com.raverun.po.castor.PurchaseOrder"
       xml2JavaClassName="com.raverun.po.PurchaseOrderSerializer" />

ÀáÀçÀûÀÎ ¹®Á¦Á¡

½ºÅ°¸¶ÀÇ Á¦ÇÑÀ» ¹Þ´Â SOAP ¿¹Á¦¸¦ °ËÅäÇÒ ¶§ ¿©·¯ºÐÀº ´ÙÀ½°ú °°Àº »çÇ×µéÀ» ¿°µÎ¿¡ µÎ¾î¾ß ÇÑ´Ù.

  • Ç¥ÁØÀ» µû¸£±â À§ÇØ ¿©·¯ºÐÀº <po> element ³»¿¡ ÀÖ´Â Section 5 ÀÎÄÚµù¿¡ °üÇØ ¾î¶² Ŭ·¹ÀÓµµ È°¼ºÈ­½ÃÅ°Áö ¸»¾Æ¾ß ÇÑ´Ù. (Ç¥ÁØ¿¡ º¸´Ù »óÀÀÇÏ´Â SOAP XML ÀνºÅϽº¿¡ ´ëÇؼ­´Â Listing 3 ÂüÁ¶). SOAP 1.1 »ç¾ç (Âü°íÀÚ·á)Àº ÀÌ ¿ä°ÇÀ» ´ÙÀ½°ú °°ÀÌ ±â¼úÇÏ°í ÀÖ´Ù.
  • ±æÀÌ°¡ 0ÀÎ URI ("")ÀÇ °ªÀº Æ÷ÇÔµÈ elementÀÇ ÀÎÄÚµù À¯Çü¿¡ ´ëÇØ ¾î¶² Ŭ·¹ÀÓµµ ÀÌ·ç¾îÁöÁö ¾Ê¾ÒÀ½À» ¸í½ÃÀûÀ¸·Î ³ªÅ¸³½´Ù.

    null °ªÀ» °¡Áø encodingStyle¿¡ ´ëÇÑ ´ë¾ÈÀº ¿©·¯ºÐÀÇ Åë½Å ¿ä±¸¿¡ ¸Â°Ô ¸¸µé¾îÁø »ç¿ëÀÚ Á¤ÀÇ encodingStyleURI¸¦ µµÀÔÇÏ´Â °ÍÀÌ´Ù.

  • Castor¿¡´Â Á¶½ÉÇØ¾ß ÇÒ ¸î °¡Áö ¹ö±×°¡ ÀÖÁö¸¸, ¸ðµÎ ÇØ°áÃ¥À» °¡Áö°í ÀÖ´Ù. ¿©·¯ºÐÀÌ ¹öÀü 0.9.3 ÀÌÀüÀÇ Castor¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é ½ºÅ°¸¶ À¯È¿¼º È®ÀÎÀÌ ±â´ëó·³ ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù. ¿©±â¿¡ ´ëÇÑ ¼Ö·ç¼ÇÀº ÃֽŠÃâ½ÃÆÇÀ¸·Î ¾÷±×·¹À̵åÇÏ´Â °ÍÀÌ´Ù. ¹Ý¸é Castor 0.9.3 (³»°¡ »ç¿ëÇÏ´Â ¹öÀü)Àº Ç¥ÁØ Ãâ·Â ½ºÆ®¸²¿¡ °¡Â¥ ¸Þ½ÃÁö¸¦ »ý¼ºÇÑ´Ù. ³»°¡ ¸¸³­ ¸Þ½ÃÁö´Â ´ÙÀ½°ú °°´Ù.

  • 
              Warning : preserved is a bad entry for the whiteSpace value.
    

    ÃֽŠ¹öÀüÀÎ Castor 0.9.3.9¿¡¼­´Â ÀÌ °æ°í°¡ ³ªÅ¸³ªÁö ¾Ê´Â´Ù.

  • PurchaseOrderSerializer´Â º¹¼ö ÂüÁ¶ °ª¿¡ ´ëÇØ Á÷·ÄÈ­ÇÏÁö ¾Ê´Â´Ù. ±×·¯³ª À̵éÀ» ¿Ã¹Ù·Î ºñÁ÷·ÄÈ­ÇÒ °ÍÀÌ´Ù. ÀÌ°ÍÀº º»ÁúÀûÀ¸·Î PurchaseOrderSerializerÀÇ ±â´ÉÀÌ ¾Æ´Ï¶ó ParameterSerializerÀÇ ±â´ÉÀÌ´Ù.
Listing 3. Ç¥ÁØ¿¡ º¸´Ù »óÀÀÇÏ´Â SOAP ÀνºÅϽº

<ns1:eatPo 
  xmlns:ns1="urn:poservice" 
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <po 
    xmlns:ns2="urn:raverun" 
    xsi:type="ns2:po"
    SOAP-ENV:encodingStyle="">
    <purchaseOrder xmlns="http://www.example.com/PO1">
      <header PONumber="9999-1212">
        <Date>2001-09-25T14:40:13.453</Date>
      </header>
      ...
    </purchaseOrder>
  </po>
</ns1:eatPo>

ÃÖ±ÙÀÇ ÀÎÅÍÆäÀ̽º º¯°æ »çÇ×

¾ÆÆÄÄ¡ SOAPÀÇ ÃֽŠ°ø½Ä Ãâ½ÃÆÇ (¹öÀü 2.2)Àº 2001³â 5¿ù¿¡ ³ª¿Ô´Ù. °³¹ß Æ÷Ä¿½º°¡ Axis (ÇöÀç º£Å¸ 1 ¹öÀü)·Î ¿Å°Ü°¬Áö¸¸, ¹ö±× ¼öÁ¤ÀÌ °è¼Ó Ãß°¡µÇ°í ÀÖ´Ù. ¿ì¸®´Â 2.3 Ãâ½Ã¸¦ ±â´Ù¸®°í ÀÖÁö¸¸ (¸¸¾à ÀÖ´Ù¸é), °ø½Ä Ãâ½ÃÆÇ »ç¿ëÀÚµéÀº ÄÚµå±â¹Ý, ƯÈ÷ SOAPMappingRegistry ¹× ÀÌ¿Í °ü·ÃµÈ Ŭ·¡½ºµé¿¡ ÁÖ¿ä ¾÷±×·¹À̵尡 ÀÖ¾úÀ½À» ¾Ë¾Æ¾ß ÇÑ´Ù. ±âÁ¸ÀÇ ÄÚµå´Â ÀÌ ¼öÁ¤ »çÇ×µé°ú »óÈ£ÀÛ¿ëÇϱâ À§ÇØ ¸î °¡Áö º¯°æÀÌ ÇÊ¿äÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½Àº ÁÖ¸ñÇÒ¸¸ÇÑ º¯°æ »çÇ×µéÀÌ´Ù.

  • ½ºÅ°¸¶ À̸§°ø°£Àº ÀÌÁ¦ 2001 ±Ç°í À̸§ °ø°£À» ±âº»À¸·Î ÂüÁ¶ÇÑ´Ù. ¹öÀü 2.2´Â 1999 À̸§°ø°£À» ÂüÁ¶ÇÏ¿´´Ù.
  • °á°úÀûÀ¸·Î, ¿©·¯ºÐÀÌ ÀÎÀÚ°¡ ¾ø´Â »ý¼ºÀÚ·Î SOAPMappingRegistry¸¦ ÀνºÅϽºÈ­ÇÒ °æ¿ì 2001 À̸§ °ø°£À» ÀνÄÇÏ´Â ÀνºÅϽº°¡ ¹ÝȯµÈ´Ù.
  • SOAPMappingRegistry¿¡ ´ëÇÑ ÀνºÅϽº »ý¼ºÀÌ Á¤ÀûÀÎ ÆÑÅ丮 À¯Çü¿¡ µû¶ó Àç¼³°èµÇ¾ú´Ù. µû¶ó¼­ ¿©·¯ºÐÀº ÀÌÁ¦ °úºÎÇÏµÈ »ý¼ºÀÚÀÎ SOAPMappingRegistry(schemaURI) ´ë½Å getBaseRegistry(schemaURI) ÆÑÅ丮 ¸Þ½îµå¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.
    
      public static SOAPMappingRegistry getBaseRegistry (String schemaURI);
    

  • ¹öÀü 2.2´Â ·¹Áö½ºÆ®¸®µéÀ» ¿¬°á½ÃÅ°´Â ±â´ÉÀ» Á¦°øÇÑ´Ù. ÀÌ ¸Þ½îµåµéÀº ÃÖ±Ù¿¡ Ãß°¡µÇ¾ú´Ù.
    
      public SOAPMappingRegistry(SOAPMappingRegistry parent);
      public SOAPMappingRegistry(SOAPMappingRegistry parent, String schemaURI);
      public SOAPMappingRegistry getParent()
      public String getSchemaURI()
      
    ÀÏÄ¡µÇ´Â °ÍÀÌ ¹ß°ßµÉ ¶§±îÁö üÀÎ Àü¹Ý¿¡ °ÉÃÄ À¯Çü ¸ÅÇÎÀÌ ÀüȯÀÌ ÀÌ·ç¾îÁú °ÍÀÌ´Ù.
  • DeploymentDescriptor Ŭ·¡½º´Â À¯Çü ¸ÅÇÎ ¼±¾ð¿¡¼­ qname ¼Ó¼ºÀ» ¿É¼ÇÀ¸·Î ó¸®ÇÒ °ÍÀÌ´Ù.

°á·Ð

ÀÌ ±Û¿¡ ³ª¿Â ¿¹Á¦°¡ Part 1ÀÇ ÀÌ·ÐÀû °³³äµéÀ» ¸íÈ®ÇÏ°Ô Ç߱⸦ ±â´ëÇÑ´Ù. ³×Æ®¿öÅ© »óÀÇ ¸¹Àº ¸Ó½Å¿¡¼­ ÀÛµ¿ÇÏ´Â À¥ ¼­ºñ½ºµéÀÌ ±¤¹üÀ§ÇÏ°Ô ½ÇÇöµÇ¸é °³¹ßÀÚµéÀº ÇÁ·Î±×·¥È­µÈ °´Ã¼µéÀÌ ÇÑ ¸Ó½Å¿¡¼­ ´Ù¸¥ ¸Ó½ÅÀ¸·Î ¾î¶»°Ô Àü¼ÛµÇ´ÂÁö¸¦ ÀÌÇØÇØ¾ß ÇÑ´Ù. SOAPÀÇ À¯Çü ¸ÅÇÎ ±â´ÉÀ» Àß ÀÌÇØÇÏ¸é º¸´Ù ³ªÀº ºÐ»ê ¾ÖÇø®ÄÉÀ̼ǰú ¼­ºñ½º °³¹ß¿¡ µµ¿òÀÌ µÉ °ÍÀÌ´Ù.

Âü°íÀÚ·á

ÇÊÀÚ¼Ò°³
Gavin BongGavin BongÀº ¸»·¹À̽þÆÀÇ ÀÚ¹Ù °³¹ßÀÚÀÌ´Ù. ¼­ºñ½º ÁöÇâ ¾ÆÅ°ÅØÃÄ¿Í ¹«¼± ÀÚ¹Ù¿¡ °ü½ÉÀ» °®°í ÀÖ´Ù.



ÀÌ ±â»ç¿¡ ´ëÇÏ¿© ¾î¶»°Ô »ý°¢ÇϽʴϱî?

Á¤¸» ÁÁ´Ù (5) ÁÁ´Ù (4) ±×Àú±×·¸´Ù (3) ¼öÁ¤º¸¿ÏÀÌ ÇÊ¿äÇÏ´Ù(2) ÇüÆí¾ø´Ù (1)

  È¸»ç¼Ò°³  |  °³Àκ¸È£Á¤Ã¥  |  ¹ý·ü  |  ¹®ÀÇ