nterprise Java Technologies Tech Tip¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù
Enterprise Java Technologies
Å×Å©ÆÁ
2006³â 3¿ù 3ÀÏÀÚ
 
3¿ùÀÇ Technology Day!

Java User Group ¼¼¹Ì³ª


  • ÀϽÃ: 2006³â 3¿ù 11ÀÏ(Åä)
  • Àå¼Ò: ÄÚ¿¢½º 3Ãþ À庸°íȦ
  • ´ë»ó: ÀÚ¹Ù °³¹ßÀÚ
  • ÁÖÁ¦: Peabody, Glassfish ¿ÀÇÂÄ¿¹Â´ÏƼ ÇÁ·ÎÁ§Æ®
               NetBeans, ¿ÀǼҽº ¼ÒÇÁÆ®¿þ¾î
  • ƯÇý: SCJP ÇÒÀ뱂 ÁõÁ¤, ¸ÆÁÖÆÄÆ¼
  • ÀÚ¼¼ÇÑ ³»¿ëº¸±â»
  • ¹®ÀÇ ¹× Âü°¡½Åû: Çѱ¹½ã ȲÀÎÀç (¢Ï 02-2193-5062 ,SKDN@Sun.COM)

  • *Âü°¡½ÅûÀº À̸§, ¼Ò¼Ó, ¿¬¶ôó¸¦ Àû¾î ¸ÞÀÏ·Î º¸³»Áֽñ⠹ٶø´Ï´Ù.
   
  À̹ø È£¿¡¼­´Â,

» JAXB 2.0¿¡ »õ·Î Ãß°¡µÈ ±â´É
» À¥ ¼­ºñ½º ¸ð´ÏÅ͸µ

¿¡ ´ëÇØ ´Ù·ì´Ï´Ù.

ÀÌ ÆÁµéÀº Java EE 5ÀÇ ¿ÀǼҽº ±¸Çö(GlassFish)À» ÀÌ¿ëÇÏ¿© °³¹ßµÇ¾úÀ¸¸ç, GlassFish ÇÁ·ÎÁ§Æ® ÆäÀÌÁö¿¡¼­ GlassFish¸¦ ´Ù¿î·Îµå ¹ÞÀ¸½Ç ¼ö ÀÖ½À´Ï´Ù.

-»ùÇà ¾ÆÄ«ÀÌºê ´Ù¿î·Îµå ¹Þ±â-
JAXB

JAXB 2.0¿¡ »õ·Î Ãß°¡µÈ ±â´É
 

ÀúÀÚ Kim LiChong

JAXB(Java Architecture for XML Binding)´Â ÀÚ¹Ù ÇÁ·Î±×·¡¹Ö ¾ð¾î ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ XML ÄÁÅÙÃ÷ÀÇ »ç¿ëÀ» °£¼ÒÈ­ÇØÁÖ´Â ±â¼ú·Î¼­, XML ¹®¼­ÀÇ XSD ½ºÅ°¸¶¸¦ ¹ÙÅÁÀ¸·Î ÇÏ¿© XML ¹®¼­¿Í JavaBeans ±â¼ú ÄÄÆ÷³ÍÆ® °£ÀÇ ¹ÙÀεùÀ» ÁöÁ¤ÇÔÀ¸·Î½á ÀÛ¾÷À» ¼öÇàÇÑ´Ù. Áö³­ J2EE Å×Å©ÆÁ¿¡¼­´Â JAXB¸¦ ÀÌ¿ëÇÑ XML Á÷·ÄÈ­¿Í JAXB¿¡¼­ RelaxNG ÀÌ¿ëÇϱ⸦ ´Ù·é ¹Ù ÀÖÀ¸¸ç, µÎ ÆÁ ¸ðµÎ Java WSDP(Java Web Services Developer Pack) 1.6 ÆÐŰÁö¿¡ Æ÷ÇԵǾî ÀÖ´Â JAXB 1.0ÀÌ »ç¿ëµÇ¾ú´Ù.

JAXB 2.0, JSR 222¿¡´Â JAXB 1.0¿¡¼­ °³¼±µÈ Áß¿äÇÑ Ç׸ñÀÌ ´Ù¼ö Æ÷ÇԵǾî Àִµ¥, ±×Áß ÀϺθ¦ ¼Ò°³ÇÏ¸é ´ÙÀ½°ú °°´Ù.

  • ¸ðµç W3C XML ½ºÅ°¸¶ ±â´É¿¡ ´ëÇÑ Áö¿ø. JAXB 1.0¿¡¼­´Â W3C XML ½ºÅ°¸¶ÀÇ ÀϺΠ±â´É¿¡ ´ëÇØ ¹ÙÀεùÀÌ ÁöÁ¤µÇÁö ¾Ê¾Ò´Ù. ÀÌ´Â FCS ¸±¸®Áî¿¡¼­ ¿Ïº®ÇÏ°Ô Áö¿øµÉ ¿¹Á¤ÀÌÁö¸¸, ÇöÀçÀÇ ¾ó¸® ¾×¼¼½º ¹öÀü¿¡¼­´Â ¾ÆÁ÷ Áö¿ø ¼öÁØÀÌ ¹ÌÈíÇÑ »óÅÂÀÌ´Ù.

  • Java-to-XML ¹ÙÀεù Áö¿ø, ±×¸®°í ÀÌ ¹ÙÀεùÀ» Á¦¾îÇϱâ À§ÇÑ javax.xml.bind.annotation ÆÐŰÁö Ãß°¡. JAXB 1.0¿¡¼­´Â XML Schema-to-JavaÀÇ ¸ÅÇÎÀº ÁöÁ¤µÇ¾úÁö¸¸ Java-to-XML SchemaÀÇ ¸ÅÇÎÀº ÁöÁ¤µÇÁö ¾Ê¾Ò´Ù.

  • »ý¼ºµÇ´Â ½ºÅ°¸¶ ÆÄ»ý Ŭ·¡½ºÀÇ ¼ö ´ëÆø °¨¼Ò.

  • JAXP 1.3 °ËÁõ API¸¦ ÅëÇÑ Ãß°¡ °ËÁõ ±â´É Á¦°ø.

  • ´õ ÀÛ¾ÆÁø ·±Å¸ÀÓ ¶óÀ̺귯¸®.

º» ÆÁ¿¡¼­´Â ÀÌ·¯ÇÑ °³¼±»çÇ× Áß ´ÙÀ½ÀÇ µÎ °¡Áö¸¦ ¿¹½ÃÇÑ´Ù - JAXP °ËÁõ API¸¦ ÀÌ¿ëÇÑ °ËÁõ(¸¶¼£¸µ/¾ð¸¶¼£¸µÀÇ ÀϺημ­)°ú Java-to-Schema ¹ÙÀεù.

º» ÆÁ°ú °ü·ÃÇÑ ÄÚµå´Â ´Ù¿î·Îµå ¾ÆÄ«À̺꿡¼­ ãÀ» ¼ö ÀÖÀ¸¸ç, ¿¹Á¦¸¦ ½ÇÇàÇÏ·Á¸é JAXB 2.0 ÂüÁ¶ ±¸ÇöÀÇ ÃֽŠ¾ó¸® ¾×¼¼½º 3 ¹öÀüÀÌ ÇÊ¿äÇÏ´Ù. JAXB 2.0 ÂüÁ¶ ±¸ÇöÀÇ ¾ó¸® ¾×¼¼½º 3 ¹öÀüÀº Java WSDP 2.0 ÆÐŰÁö¿¡µµ Æ÷ÇԵǾî ÀÖ´Ù.

JAXP 1.3 °ËÁõ ½ºÅ°¸¶¸¦ ÀÌ¿ëÇÑ ¾ð¸¶¼£¸µ/¸¶¼£¸µ

JAXB 2.0¿¡¼­ °³¼±µÈ »çÇ× Áß Çϳª°¡ ¹Ù·Î JAXP 1.3 °ËÁõ API¸¦ ÀÌ¿ëÇÑ Ãß°¡ °ËÁõ ±â´ÉÀÌ´Ù. ±×·³, ¸ÕÀú JAXP 1.3 °ËÁõ ½ºÅ°¸¶¸¦ ÀÌ¿ëÇÑ JAXB 2.0 ¾ð¸¶¼£¸µ/¸Ï¼£¸µ ±â´ÉÀ» »ìÆìº¸·Ï ÇÑ´Ù. ÀÚ¹Ù ¾ÖÇø®ÄÉÀ̼ÇÀº JAXB¸¦ ÀÌ¿ëÇÏ¿© XML ÀνºÅϽº ¹®¼­¸¦ ÀÚ¹Ù ÄÁÅÙÆ® °´Ã¼·Î ¾ð¸¶¼£¸µ ÇÒ ¼ö ÀÖÀ¸¸ç, ¿É¼ÇÀ¸·Î ÀÚ¹Ù ÄÁÅÙÃ÷ °´Ã¼¸¦ »ý¼ºÇϱâ Àü¿¡ ¼Ò½º XML ¹®¼­¸¦ °ËÁõÇÒ ¼ö ÀÖ´Ù. ÀÚ¹Ù ¾ÖÇø®ÄÉÀ̼ÇÀº ¶ÇÇÑ JAXB¸¦ ÀÌ¿ëÇÏ¿© ÀÚ¹Ù ÄÁÅÙÃ÷ °´Ã¼¸¦ XML ÀνºÅϽº ¹®¼­·Î ¸¶¼£¸µ ÇÒ ¼ö ÀÖ´Ù.

XML ¹®¼­¸¦ ¾ð¸¶¼£¸µ ÇÏ·Á¸é ¸ÕÀú XML ¹®¼­ÀÇ ½ºÅ°¸¶¸¦ ÇØ´ç ½ºÅ°¸¶¸¦ ³ªÅ¸³»´Â ÀÏ·ÃÀÇ ÀÚ¹Ù ÀÎÅÍÆäÀ̽º ¹× Ŭ·¡½º·Î ¹ÙÀεåÇØ¾ß Çϰí, ±×·± ´ÙÀ½ ÀÎÅÍÆäÀ̽º¿Í Ŭ·¡½º¸¦ ÄÄÆÄÀÏÇÑ´Ù. º» ÆÁÀÇ ¿¹Á¦¿¡¼­´Â ±¸ÀÔ ÁÖ¹®¼­ ½ºÅ°¸¶ po.xsd¸¦ ÀÌ¿ëÇϵµ·Ï ÇÑ´Ù. ÀÌ´Â Java WSDP 1.6 ÆÐŰÁö¿¡ Æ÷ÇÔµÈ JAXB ¿¹Á¦¿¡¼­ »ç¿ëµÇ´Â °Í°ú µ¿ÀÏÇÑ ½ºÅ°¸¶À̸ç, JAXB ¿¹Á¦´Â Java Web Services Developer Pack 1.6 Æ©Å丮¾ó¿¡ ¼³¸íµÇ¾î ÀÖ´Ù. po.xsd ½ºÅ°¸¶ °ËÅä ½Ã, quantity ¿¤¸®¸ÕÆ®¿Í partNum ¼Ó¼º¿¡ ÁöÁ¤µÈ Á¦ÇÑ»çÇ׿¡ ƯÈ÷ À¯ÀÇÇÒ °Í.

   <xsd:element name="quantity">
      <xsd:simpleType>
      <xsd:restriction base="xsd:positiveInteger">
         <xsd:maxExclusive value="100"/>
       </xsd:restriction>
              
      <xsd:attribute name="partNum" type="SKU" 
        use="required"/>

¼ö·®Àº 100À» ÃʰúÇÒ ¼ö ¾øÀ¸¸ç ºÎǰ¹øÈ£¿¡´Â ¹Ýµå½Ã SKU ŸÀÔÀÌ ±âÀçµÇ¾î¾ß ÇÑ´Ù.

JAXB 2.0ÀÇ ½ºÅ°¸¶µµ JAXB 1.0ÀÇ °æ¿ì¿Í ¸¶Âù°¡Áö·Î XML ¹ÙÀεù ÄÄÆÄÀÏ·¯(xjc)¸¦ ÀÌ¿ëÇÏ¿© ¹ÙÀεåÇϰí, ±×·± ´ÙÀ½ javac ¸í·É¾î¸¦ ÀÌ¿ëÇÏ¿© »ý¼ºµÈ ÀÎÅÍÆäÀ̽º¿Í Ŭ·¡½º¸¦ ÄÄÆÄÀÏÇÑ´Ù. ¿¹Á¦ ¾ÆÄ«À̺êÀÇ °æ¿ì, ¹ÙÀεù ¹× ÄÄÆÄÀÏ ´Ü°è´Â ºôµå ÆÄÀÏÀÎ build.xml ¿¡¼­ ant ŽºÅ©·Î Á¦°øµÈ´Ù.

¹ÙÀεù ¹× ÄÄÆÄÀÏÀ» ¿Ï·áÇÑ ÈÄ¿¡´Â XML ¹®¼­¸¦ ¾ð¸¶¼£¸µ ÇÒ ¼ö ÀÖ´Ù. º» ÆÁ¿¡¼­ »ç¿ëÇÏ´Â XML ¹®¼­ po.xmlÀº po.xsd ½ºÅ°¸¶¿¡ ÁöÁ¤µÈ Á¦ÇÑ»çÇ×À» À§¹ÝÇÏ´Â Á¤º¸°¡ Æ÷ÇÔµÈ ±¸ÀÔÁÖ¹®¼­À̰í, ƯÈ÷ ±¸ÀÔÁÖ¹®¼­ ³»ÀÇ Æ¯Á¤ Ç׸ñÀº 100À» ÃʰúÇÏ´Â ¼ö·®°ú SKU ŸÀÔ°ú ÀÏÄ¡ÇÏÁö ¾Ê´Â partNum ¼Ó¼ºÀ» ÁöÁ¤Çϰí ÀÖ´Ù.

     <item partNum="002" >
        <productName>Reliving the Ordeal</productName>
        <quantity>150</quantity>
        <USPrice>11.99</USPrice>
     </item>

JAXB 2.0ÀÇ ¾ð¸¶¼£¸µÀº JAXB 1.0ÀÇ ¾ð¸¶¼£¸µ°ú °ÅÀÇ µ¿ÀÏÇÏ´Ù. ¸ÕÀú JAXB API¿¡ ´ëÇÑ ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ Á¦°øÇÏ´Â JAXBContext °´Ã¼¸¦ »ý¼ºÇÑ ´ÙÀ½, ¾ð¸¶¼£¸µ ÇÁ·Î¼¼½º¸¦ Á¦¾îÇÏ´Â Unmarshaller °´Ã¼¸¦ »ý¼ºÇÑ´Ù.

   JAXBContext jc = JAXBContext.newInstance( "techtip" );
   Umarshaller u = jc.createUnmarshaller();  

¾ð¸¶¼£¸µ ÇÁ·Î¼¼½º¿¡¼­ JAXB 2.0ÀÌ JAXB 1.0°ú ´Ù¸¥ Á¡ÀÌ ¹Ù·Î °ËÁõ ºÎºÐÀε¥, JAXB 1.0¿¡¼­´Â ´ÙÀ½À» ÁöÁ¤ÇÔÀ¸·Î½á ¾ð¸¶¼£¸µ ÇÁ·Î¼¼½ºÀÇ ÀϺημ­ ¼Ò½º µ¥ÀÌÅ͸¦ °ü·Ã ½ºÅ°¸¶¿Í ´ëÁ¶ÇÏ¿© °ËÁõÇÒ ¼ö ÀÖ´Ù.

   unmarshaller.setValidating(true);

JAXB 2.0¿¡¼­´Â JAXP 1.3 ½ºÅ°¸¶ °ËÁõ ÇÁ·¹ÀÓ¿öÅ©¸¦ ÀÌ¿ëÇÏ¿© °ËÁõ ±â´ÉÀ» º¸´Ù Çâ»ó½ÃÄ×´Ù. ÀÌó·³ °­È­µÈ ·¹º§ÀÇ °ËÁõÀ» ÀÌ¿ëÇÏ·Á¸é ¸ÕÀú W3C XML Schema 1.0 ¾ð¾î¸¦ À§ÇÑ SchemaFactory ÀνºÅϽº¸¦ »ý¼ºÇÑ´Ù.

   SchemaFactory sf = SchemaFactory.newInstance(
      javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);

SchemaFactory ÀνºÅϽº´Â »õ·Î¿î JAXP 1.3 Schema °´Ã¼¸¦ »ý¼ºÇÏ´Â µ¥ »ç¿ëµÈ´Ù.

   Schema schema = sf.newSchema(new File("po.xsd"));

±×·± ´ÙÀ½ setSchema ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ¿© À̾îÁö´Â ¾ð¸¶¼£¸µ µ¿ÀÛÀ» °ËÁõÇÏ´Â µ¥ »ç¿ëÇÒ JAXP 1.3 Schema °´Ã¼(ÀÌ °æ¿ì¿¡´Â po.xsd)¸¦ ½Äº°ÇÑ´Ù. ÇÑÆí, ÀÌ ¸Þ¼Òµå¿¡ nullÀ» ÆÐ½ºÇÏ¸é °ËÁõ ±â´ÉÀº µð½º¿¡À̺í("»ç¿ëÇÏÁö ¾ÊÀ½") »óŰ¡ µÈ´Ù.

   u.setSchema(schema);

¾ÖÇø®ÄÉÀ̼ÇÀº ±âº»°ª À̺¥Æ® Çڵ鷯¸¦ ¿À¹ö¶óÀ̵åÇÏ¿© °ËÁõ ¿À·ù 󸮸¦ Ä¿½ºÅ͸¶ÀÌÁîÇÒ ¼ö ÀÖ´Â ¿É¼ÇÀ» °¡Áö´Âµ¥, ÀÌ °æ¿ì¿¡´Â ¸Þ¼Òµå ÄÝ setEventHandler(ValidationEventHandler)°¡ »ç¿ëµÈ´Ù.

JAXB 1.0À¸·Î ¾ð¸¶¼£¸µÀ» ÇÏ´Â ÀÌÀüÀÇ Á¢±Ù¹ý(¼ÒÀ§ '±¸Á¶Àû ¾ð¸¶¼£¸µ')Àº À¯È¿ÇÏÁö ¾ÊÀº XML ÄÁÅÙÃ÷¿¡ ´ëÇØ ´õ ¾ö°ÝÇÑ ÆíÀÌ´Ù. JAXB 1.0Àº º¹±¸ ºÒ°¡´ÉÇÑ ±¸Á¶Àû ºÒÀÏÄ¡°¡ ŽÁöµÇ¸é ¾ð¸¶¼£¸µ ÇÁ·Î¼¼½º¸¦ Ãë¼ÒÇϰí UnmarshalExceptionÀ» throwÇÑ´Ù. ½Ç·Ê·Î, ¿¹»óÄ¡ ¾ÊÀº ¿¤¸®¸ÕÆ®³ª ¼Ó¼º¿¡ ¸¶ÁÖÄ¡¸é ¾ð¸¶¼£¸µÀ» Áß´ÜÇÒ ¼ö ÀÖ´Ù.

ÀÌ¿Í ´Þ¸® JAXB 2.0Àº º¸´Ù À¯¿¬ÇÑ ¾ð¸¶¼£¸µÀ» Çã¿ëÇϴµ¥, ÀÌ´Â ºÎÀûÀýÇÑ XML ÄÁÅÙÃ÷ÀÇ ¾ð¸¶¼£¸µ °úÁ¤¿¡¼­ÀÇ ¿¹Ãø °¡´É¼ºÀ» ´õ¿í ³ô¿©ÁØ´Ù. JAXB 2.0ÀÇ °æ¿ì, ÄÁÅÙÃ÷ ¸ðµ¨ ³»ÀÇ ¿¤¸®¸ÕÆ® À§Ä¡¸¦ ±âÁØÀ¸·Î ÇÏ¿© ¾ö°ÝÇÏ°Ô Àû¿ë½ÃŰ±â º¸´Ù´Â ¿¤¸®¸ÕÆ® À̸§ º°·Î xmlÀ» ¾ð¸¶¼£¸µÇÑ´Ù.

°¢ÀÚÀÇ Ä¿½ºÅÒ À̺¥Æ® Çڵ鷯¸¦ ÁöÁ¤ÇÏ´Â ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.

   u.setEventHandler(new DefaultValidationEventHandler());  

Ä¿½ºÅÒ °ËÁõ À̺¥Æ® Çڵ鷯´Â ¹Ýµå½Ã ValidationEventHandler ÀÎÅÍÆäÀ̽º¿Í handleEvent ¸Þ¼Òµå¸¦ ±¸ÇöÇØ¾ß ÇÑ´Ù. JAXB Provider°¡ °æ°í ¶Ç´Â ¿À·ù¸¦ ó¸®ÇÑ ÈÄ¿¡ ÇöÀçÀÇ ¾ð¸¶¼£¸µ, °ËÁõ, ¶Ç´Â ¸¶¼£¸µ ¿¬»êÀ» °è¼ÓÇÏ·Á°í ½ÃµµÇÒ °æ¿ì¿¡´Â ºÒ(boolean) ¸®ÅÏ °ªÀÌ true·Î ¼³Á¤µÇ¾î¾ß ÇÑ´Ù. ÇÁ·Î¹ÙÀÌ´õ°¡ ÀûÀýÇÑ UnmarshalException, ValidationException, ¶Ç´Â MarshalExceptionÀ¸·Î ÇöÀçÀÇ ¿¬»êÀ» Á¾·áÇÒ °æ¿ì¿¡´Â ¸®ÅÏ °ªÀÌ false·Î ¼³Á¤µÇ¾î¾ß ÇÑ´Ù. JAXB 2.0ÀÇ ±âº»°ª ValidationHandler´Â Ç×»ó true¸¦ ¸®ÅÏÇÑ´Ù´Â Á¡¿¡ À¯ÀÇÇÒ °Í(´Ü, handleEvent°¡ ¿À¹ö¶óÀ̵åµÇÁö ¾Ê¾Æ¾ß ÇÔ). ´ÙÀ½Àº Ä¿½ºÅÒ À̺¥Æ® Çڵ鷯ÀÇ ¿¹Á¦ÀÌ´Ù.

   public class MyValidationEventHandler implements 
    ValidationEventHandler{
     
      public boolean handleEvent(ValidationEvent ve) {            
        if (ve.getSeverity()==ve.FATAL_ERROR ||  
                               ve .getSeverity()==ve.ERROR){
            ValidationEventLocator  locator = ve.getLocator();
            //print message from valdation event
            System.out.println("Message is " + ve.getMessage());
            //output line and column number
            System.out.println("Column is " + 
                  locator.getColumnNumber() + 
                  " at line number " + locator.getLineNumber());
         }
         return true;
       }
    
   }

JAXB ½ºÆåÀº ¿À·ù ¹ß»ý ½Ã ¸ðµç ÇÁ·Î¹ÙÀÌ´õ ±¸ÇöÀÌ °ËÁõ ¿À·ù¸¦ º¸°íÇÒ °ÍÀ» ¿ä±¸Çϰí ÀÖÁö¸¸, ±¸ÇöÀÌ µ¥ÀÌÅÍ ÇÁ·Î¼¼½ÌÀ» Áß´ÜÇÒ ÇÊ¿ä±îÁö´Â ¾ø´Ù. ÇÑÆí, XML ¹®¼­°¡ À¯È¿ÇÏÁö ¾Ê´õ¶óµµ JAXB ±¸ÇöÀº XML ¹®¼­¸¦ ¼º°øÀûÀ¸·Î ¾ð¸¶¼£¸µ ÇÒ ¼ö ÀÖ´Ù.

po.xmlÀÌ ¾ð¸¶¼£¸µµÈ ÈÄ¿¡´Â ¸¶¼£¸µµÈ °´Ã¼¸¦ ´Ù¸¥ ÀÚ¹Ù °´Ã¼¿Í ¸¶Âù°¡Áö·Î ó¸®ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, shipTo ÁÖ¼Ò¸¦ µð½ºÇ÷¹ÀÌÇÏ·Á¸é ´ÙÀ½ ÀýÂ÷¸¦ µû¸£µµ·Ï ÇÑ´Ù.

   JAXBElement<?> poElement = 
   JAXBElement<?>)u.unmarshal( 
      new FileInputStream( "po.xml" ) );
   PurchaseOrderType po = (
      PurchaseOrderType)poElement.getValue();
   USAddress address = po.getShipTo();            

ÄÁÅÙÃ÷¸¦ ´Ù½Ã XML ÆÄÀÏ·Î ¸¶¼£¸µÇÏ·Á¸é JAXB 1.0°ú µ¿ÀÏÇÑ ´Ü°è¸¦ °ÅÄ¡µµ·Ï ÇÑ´Ù. (¾Õ¼­ ¾ð¸¶¼£¸µ °úÁ¤¿¡¼­ º» °Íó·³) JAXBContext °´Ã¼¸¦ »ý¼ºÇÑ ÈÄ¿¡´Â, ¸¶¼£¸µ ÇÁ·Î¼¼½º¸¦ Á¦¾îÇÏ´Â Marshaller °´Ã¼¸¦ »ý¼ºÇÑ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½ÀÇ ÄÚµå ´ÜÆíÀº Marshaller¸¦ »ý¼ºÇÏ¿© ÄÁÅÙÃ÷¸¦ incorrectpo.xmlÀ̶ó´Â À̸§ÀÇ ÆÄÀÏ·Î ¸¶¼£¸µÇÏ´Â °æ¿ì¸¦ º¸¿©ÁÖ°í ÀÖ´Ù.

   Marshaller m = jc.createMarshaller();
        m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, 
              Boolean.TRUE );
        OutputStream os = new FileOutputStream( 
              "incorrectpo.xml" );
        m.marshal(po, os);

JAXB.FORMATTED.OUTPUT ¼Ó¼ºÀº Marshaller°¡ Ãâ·ÂµÈ XML µ¥ÀÌÅ͸¦ Áٹٲްú µé¿©¾²±â·Î Æ÷¸ËÇÒ °ÍÀÎÁö ¿©ºÎ¸¦ Á¦¾îÇÑ´Ù.

º» ÆÁÀÇ ¿¹Á¦ Äڵ忡´Â Ç¥½ÃµÇ¾î ÀÖÁö ¾ÊÁö¸¸, JAXB 2.0Àº ¸¶¼£¸µ ½Ã¿¡(¾ð¸¶¼£¸µ ½Ã¿¡µµ) °ËÁõÀ» Áö¿øÇÑ´Ù. ÇÑÆí, JAXB 1.0ÀÇ °æ¿ì¿¡´Â ¾ð¸¶¼£¸µ ½Ã¿¡¸¸ °ËÁõÀ» ±ÔÁ¤Çϰí, JAXB ÄÁÅÙÃ÷ Æ®¸®ÀÇ ¿Âµð¸Çµå °ËÁõÀ» Áö¿øÇϴµ¥, ¸¶¼£¸µ ½ÃÀÇ °ËÁõÀº À¥ ¼­ºñ½º ¶§¹®¿¡ Ãß°¡µÈ °ÍÀÌ´Ù. À¥ ¼­ºñ½º ÇÁ·Î¼¼½Ì ¸ðµ¨Àº µ¥ÀÌÅ͸¦ ÀоîµéÀÏ ¶§´Â ¾î´À Á¤µµ ´À½¼ÇÏ°í ¹Ý´ë·Î µ¥ÀÌÅ͸¦ ±â·ÏÇÒ ¶§´Â ¾ö°ÝÇØ¾ß ÇÑ´Ù. ÀÌ ¸ðµ¨¿¡ ºÎÇÕÇϵµ·Ï, JAXB 2.0Àº »ç¿ëÀÚ°¡ xml ¹®¼­¸¦ JAXB ¾ç½ÄÀ¸·Î ¼öÁ¤ÇÒ °æ¿ì ¹®¼­°¡ ¹«È¿È­µÇÁö ¾Êµµ·Ï Çϱâ À§ÇØ ¸¶¼£¸µ ½ÃÀÇ °ËÁõÀ» Ãß°¡ÇÏ¿´´Ù.

Java-to-Schema ¹ÙÀεùÀ» ÀÌ¿ëÇÏ¿© Àڹ٠Ŭ·¡½º¿¡¼­ XML »ý¼ºÇϱâ

¾Õ¼­ ¾ê±âÇÑ °Íó·³, JAXB 1.0ÀÇ °æ¿ì XML Schema-to-Java ¸ÅÇÎÀº ÁöÁ¤µÇ¾úÁö¸¸ Java-to-XML SchemaÀÇ ¸ÅÇÎÀº ÁöÁ¤µÇÁö ¾Ê¾Ò´Ù. ÇÑÆí, JAXB 2.0Àº Java-to-XML SchemaÀÇ ¸ÅÇÎÀ» ÁöÁ¤ÇÔÀ¸·Î½á ÀÌ ÀÛ¾÷À» ¿Ï¼öÇÔ°ú µ¿½Ã¿¡ "A Metadata Facility for the Java Programming Language", JSR 175¿¡ ¸í½ÃµÈ ÁÖ¼®À» ÀÌ¿ëÇÏ¿© ÀÌ ¹ÙÀεùÀ» Á¦¾îÇÑ´Ù.

º» ÆÁ¿¡¼­´Â JAXB 2.0À» ÀÌ¿ëÇÏ¿© ±âÁ¸ÀÇ Àڹ٠Ŭ·¡½º·ÎºÎÅÍ XML ÆÄÀÏÀ» »ý¼ºÇÑ ´ÙÀ½ »ý¼ºµÈ XML ÆÄÀÏÀÇ ³»¿ëÀ» ÄַܼΠÇÁ¸°Æ®ÇÏ´Â ¹æ¹ýÀ» ¿¹½ÃÇØº¸µµ·Ï ÇÑ´Ù. »ç¿ëµÇ´Â µÎ °¡Áö Ŭ·¡½º´Â Scientist¿Í PersonÀ̸ç, ¿©±â¼­ Person °´Ã¼´Â Scientist °´Ã¼¿¡ ÀÎĸ½¶·¹ÀÌÆ®µÈ´Ù.

Ŭ·¡½º´Â XML Schema ÄÄÇ÷º½º ŸÀÔ ¶Ç´Â XML Schema ½ÉÇà ŸÀÔÀ¸·Î ¸ÅÇεǴµ¥, XML Schema ŸÀÔÀº Ŭ·¡½º¿¡ Æ÷ÇÔµÈ JavaBean ¼Ó¼º ¹× ÇʵåÀÇ ¸ÅÇÎÀ» ±âÃÊ·Î ÇÏ¿© ÆÄ»ýµÈ´Ù. JAXB 2.0¿¡¼­ ÁÖ¼®Àº Java-to-Schema ¹ÙÀεù ÇÁ·¹ÀÓ¿öÅ©¿¡ ´ëÇØ Àڹ٠Ŭ·¡½º¸¦ Ãë±ÞÇÏ´Â ¹æ¹ýÀ» Áö½ÃÇϱâ À§ÇØ »ç¿ëµÈ´Ù. Åé ·¹º§ °ª Ŭ·¡½º¿¡ ´ëÇØ¼­´Â ÁÖ¼® @XmltypeÀ» ÀÌ¿ëÇÏ¿© ÄÄÇ÷º½º ½ºÅ°¸¶ ŸÀÔÀ¸·Î ¸ÅÇÎÇÑ´Ù:

   @XmlType       
   public class Person  {
            
      private String name;
       private int age;
   .....

Åé ·¹º§ Ŭ·¡½º¿¡ @XmlRootElement ÁÖ¼®ÀÌ Ã·ºÎµÉ °æ¿ì, Ŭ·¡½º °ªÀº XML ¹®¼­ ³»ÀÇ XML ·çÆ® ¿¤¸®¸ÕÆ®·Î Ç¥½ÃµÈ´Ù:

   @XmlRootElement
        
   public class Scientist  {
    
       private Person person;    
       private String researchInstitute; 
       private Collection publications;
   ...

ÀÌ ÁÖ¼®µéÀº Scientist °´Ã¼°¡ ·çÆ® ¿¤¸®¸ÕÆ®À̰í Person °´Ã¼´Â XmltypeÀ̶ó´Â °ÍÀ» ÁöÁ¤ÇÑ´Ù. Á¤ÀÇµÈ ÁÖ¼® ŸÀÔÀ¸·Î´Â XmlAttribute, XmlElement, XmlSchema µîÀ» Æ÷ÇÔÇÑ ¿©·¯ Á¾·ù°¡ ÀÖÀ¸¸ç, javax.xml.bind.annotation API ¹®¼­¿¡¼­ Àüü ¸ñ·ÏÀ» ±¸ÇÒ ¼ö ÀÖ´Ù.

ÁÖ¼®°ú ±âº»°ª ¸ÅÇÎÀº ±âÁ¸ Äڵ带 ÃÖ¼ÒÇÑÀ¸·Î º¯°æÇÏ¿© Ŭ·¡½º¸¦ ½ºÅ°¸¶¿¡ ¸ÅÇÎÇÒ ¼ö ÀÖµµ·Ï ¼³°èµÇ¾úÀ¸¸ç, ±âº»°ª ¸ÅÇÎÀº ÁÖ¼®ÀÌ ÁöÁ¤µÇÁö ¾Ê´õ¶óµµ ÇÁ·Î±×·¥ ¿¤¸®¸ÕÆ®¿¡ Àû¿ëµÇ´Â °ÍÀ¸·Î °£ÁֵǴ ±âº»°ª ÁÖ¼®À» ±âÃÊ·Î ÇÏ¿© ÁöÁ¤µÈ´Ù. ÀÌ¿Í °ü·ÃÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀ» º¸·Á¸é ÃÖÁ¾º» JAXB 2.0 ½ºÆåÀÇ ¼½¼Ç 8.12¸¦ ÂüÁ¶ÇÒ °Í. º» ÆÁÀÇ ÄÚµå ¿¹Á¦ÀÇ °æ¿ì, Person Ŭ·¡½º¿¡ @XmlType ÁÖ¼®À» ÷ºÎÇÒ Çʿ䰡 ¾øÀ¸¸ç, ÁÖ¼®ÀÌ ¾ø´õ¶óµµ JavaBeans °´Ã¼´Â ¿©ÀüÈ÷ ÇØ´ç ŸÀÔ¿¡ Á¤È®È÷ ¸ÅÇεȴÙ(ÁÖ¼®¿¡ ÄÚ¸àÆ®¸¦ ºÙ¿©¼­ Å×½ºÆ®Çغ¸¸é ¾Ë ¼ö ÀÖ´Ù). ±âº»°ª ¹ÙÀεùÀÌ ÃæºÐÄ¡ ¾ÊÀ» ¶§´Â Ä¿½ºÅ͸¶ÀÌ¡ ÁÖ¼®À» ÁöÁ¤ÇØ¾ß Çϴµ¥, ¿¹¸¦ µé¾î ÇÊµå ¶Ç´Â ¼Ó¼ºÀÇ ±âº»°ª ¹ÙÀεùÀ» À§ÇÑ Ä¿½ºÅ͸¶ÀÌ¡ ÁÖ¼®À» ÁöÁ¤ÇÏ·Á¸é @XmlAttributeÀ» ÀÌ¿ëÇØ¾ß ÇÑ´Ù.

Java-to-XML Schema ¸ÅÇÎÀÌ °®Ãß¾îÁø »óÅ¿¡¼­´Â XMLSchema¸¦ Á¦°øÇÏÁö ¾Ê°í ÀÚ¹Ù °´Ã¼¸¦ ¸¶¼£¸µÇÒ ¼ö ÀÖ´Ù. ¸ÕÀú JavaContext °´Ã¼¸¦ »ý¼ºÇÏ¿© ÇØ´ç ÄÁÅØ½ºÆ® °æ·Î¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ ¿¹Á¦¿¡¼­´Â Scientist ÀÚ¹Ù °´Ã¼(Person °´Ã¼ÀÇ »ý¼ºÀ» ¿ä±¸ÇÏ´Â)°¡ ÄÁÅØ½ºÆ® °æ·Î¸¦ Á¦°øÇÑ´Ù. ´ÙÀ½À¸·Î, JavaContext °´Ã¼¸¦ marshaller¿¡ ÆÐ½ºÇÑ´Ù.

   JAXBContext context = 
      JAXBContext.newInstance(Scientist.class);
   Marshaller m = context.createMarshaller();
   m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

ÇØ´ç ¼Ó¼ºÀ» ÀÌ¿ëÇÏ¿© ÇÊ¿äÇÑ Scientist¿Í Person °´Ã¼¸¦ »ý¼ºÇÑ ÈÄ¿¡´Â ¸¶¼£¸µ µÈ XML ÆÄÀÏ·Î ¾î¶² ¿¬»êÀÌµç ¼öÇàÇÒ ¼ö ÀÖ´Ù. XML ÄÁÅÙÃ÷¸¦ ÄַܼΠÇÁ¸°Æ® ¾Æ¿ôÇÏ´Â °æ¿ì¸¦ ÇÑ ¿¹·Î µé ¼ö ÀÖ´Ù.

   Scientist scientist = js.getScientist();
   m.marshal(scientist, System.out);

JAXB 2.0¿¡ °üÇÑ ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº JAXB 2.0 ÇÁ·ÎÁ§Æ® ÆäÀÌÁö¸¦ ÂüÁ¶ÇÒ °Í.

¿¹Á¦ ÄÚµå ½ÇÇàÇϱâ

¿¹Á¦ ÆÐÁöŰ¿¡´Â ÆÁ¿¡¼­ ´Ù·é ±â¹ýÀ» ¿¹½ÃÇÏ´Â º» ÆÁÀÌ Æ÷ÇԵǾî ÀÖ´Ù. ¿¹Á¦¸¦ ¼³Ä¡ÇÏ°í ½ÇÇàÇÏ·Á¸é ´ÙÀ½ÀÇ ÀÛ¾÷ ÀýÂ÷¸¦ µû¸£µµ·Ï ÇÑ´Ù.

  1. J2SE(Java 2 Platform, Standard Edition) 5.0ÀÌ ¼³Ä¡µÇ¾î ÀÖÁö ¾Ê´Ù¸é J2SE 5.0 ´Ù¿î·Îµå ÆäÀÌÁö¿¡¼­ ´Ù¿î·ÎµåÇÏ¿© ¼³Ä¡ÇÑ´Ù. JAXB 2.0Àº ÁÖ¼®°ú °°Àº »õ·Î¿î J2SE 5.0 ¾ð¾î ±â´ÉÀ» ÀÌ¿ëÇϱ⠶§¹®¿¡ J2SE 5.0À» ÇÊ¿ä·Î ÇÑ´Ù.

  2. JAXB 2.0 ÇÁ·ÎÁ§Æ® ´Ù¿î·Îµå ÆäÀÌÁö¿¡¼­ ÃÖ½ÅÀÇ JAXB 2.0 ¹øµéÀ» ´Ù¿î·ÎµåÇÏ¿© ¼³Ä¡ÇÑ´Ù.

  3. ÆÁ°ú °ü·ÃÇÑ ¿¹Á¦ ¾ÆÄ«À̺긦 ´Ù¿î·ÎµåÇÑ´Ù. ´Ù¿î·ÎµåÇÑ ¾ÆÄ«À̺긦 <JAXB_RI>/samples µð·ºÅ丮¿¡ ¾ÐÃàÀ» Ǭ´Ù. ÀÌ ¶§, <JAXB_RI>´Â JAXB 2.0 RI EA 3À» ¼³Ä¡ÇÑ µð·ºÅ丮ÀÌ´Ù. ÀÌÁ¦ »õ·Î ¾ÐÃàÀ» Ǭ µð·ºÅ丮°¡ <JAXB_RI>/samples/techtipÀ¸·Î Ç¥½ÃµÇ¾î¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î, EA3 ¸±¸®Á Windows ÄÄÇ»ÅÍÀÇ C:\Sun\¿¡ ¼³Ä¡Çß´Ù¸é »õ·Î »ý¼ºµÈ µð·ºÅ丮´Â C:\Sun\jaxb-ri-20050622\samples\techtipÀÌ µÇ¾î¾ß ÇÑ´Ù.

    ÆÁÀÇ build.xml ÆÄÀÏÀº JAXB 2.0 EA3 ¹øµé¿¡ Á¤ÀÇµÈ µð·ºÅ丮 ±¸Á¶¿¡ ÀÇÁ¸Çϱ⠶§¹®¿¡ ÀÌ zip ÆÄÀÏÀ» ÀÌ µð·ºÅ丮¿¡¼­ ¾ÐÃàÀ» Ǫ´Â °ÍÀÌ Áß¿äÇÏ´Ù. classpath ¹× ½ÇÇà ¼Ó¼ºÀº ÀÌ¹Ì build.xml ÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î, ÇØ´ç Ÿ±êÀ» ÄÄÆÄÀÏÇÏ¿© ½ÇÇàÇϱ⸸ ÇÏ¸é µÈ´Ù.

    ¾ð¸¶¼£¸µ/¸¶¼£¸µ ¿¹Á¦¸¦ ½ÇÇàÇÏ·Á¸é ´ÙÀ½ ´Ü°è¸¦ ¼öÇàÇÑ´Ù:

  4. <JAXB_RI>/samples/techtip µð·ºÅ丮·Î ³»ºñ°ÔÀÌÆ®ÇÏ¿© ´ÙÀ½ÀÇ ¸í·É¾î¸¦ ½ÇÇàÇÑ´Ù.
          ant compile
    
    ÀÌ ¸í·É¾î´Â po.xsd ½ºÅ°¸¶·ÎºÎÅÍ Àڹ٠Ŭ·¡½º¿Í ¿¹Á¦ Àڹ٠Ŭ·¡½º¸¦ »ý¼ºÇϰí ÄÄÆÄÀÏÇϴµ¥ »ç¿ëµÈ´Ù. JAXB 2.0 ÆÐŰÁö¿¡´Â ant ¹ÙÀ̳ʸ®°¡ Æ÷ÇԵǾî ÀÖÁö ¾Ê´Ù´Â Á¡¿¡ À¯ÀÇÇÒ °Í. Java WSDP 1.6ÀÌ ¼³Ä¡µÇ¾î ÀÖ´Ù¸é, <JWSDP_HOME>/apache-ant/bin µð·ºÅ丮¿¡ À§Ä¡ÇÑ ant ¹ÙÀ̳ʸ®¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù(ÀÌ ¶§, <JWSDP_HOME>´Â Java WSDP 1.6ÀÌ ¼³Ä¡µÈ °÷À» °¡¸®Å´). ¶Ç´Â apache À¥ »çÀÌÆ®¿¡¼­ ant¸¦ ´Ù¿î·ÎµåÇÒ ¼öµµ ÀÖ´Ù.

  5. po.xml ¹®¼­¸¦ ¾ð¸¶¼£¸µÇϰí JAXP 1.3 ½ºÅ°¸¶ °ËÁõ ÇÁ·¹ÀÓ¿öÅ©¸¦ ÀÌ¿ëÇÏ¿© °ËÁõÀ» °ÅÄ£ ´ÙÀ½ ¸¶¼£¸µÀ» ¼öÇàÇÑ´Ù. ÀÌ ÀÛ¾÷¿¡´Â ´ÙÀ½ÀÇ ¸í·É¾î¸¦ »ç¿ëÇÑ´Ù.
       
          ant run-validate
    
    ¸¶¼£¸µ ¿¬»êÀº incorrectpo.xml ÆÄÀÏÀ» »ý¼ºÇÏ°Ô µÇ´Âµ¥, Ãâ·Â¿¡´Â ´ÙÀ½ÀÇ ³»¿ëÀÌ Æ÷ÇԵǾî¾ß ÇÑ´Ù.
         Message is cvc-type.3.1.3: The value '150' of element 
         'quantity' is not valid.
         Column is 31 at line number 28
            Bugsy Brown
            99 9th Avenue
            New York, NY 12345
            US
            
         Still able to marshal invalid document
    
    Java-to-Schema ¹ÙÀεù ¿¹Á¦¸¦ ½ÇÇàÇÏ·Á¸é ´ÙÀ½ÀÇ ¸í·É¾î¸¦ ½ÇÇàÇÑ´Ù.
       ant run-javaToSchema 
    
    Ãâ·Â¿¡´Â ´ÙÀ½ÀÇ ³»¿ëÀÌ Æ÷ÇԵǾî¾ß ÇÑ´Ù.
       <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
       <scientist>
           <person>
               <name>Linus Pauling</name>
               <age>93</age>
               <sex>Male</sex>
           </person>
           <publications xmlns:
           xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xsi:type="xs:string">Respect for vitamin C
           </publications>
           <publications xmlns:
           xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xsi:type="xs:string">The Nature of the Chemical Bond
           </publications>
       </scientist>
    

ÇÊÀÚ ¼Ò°³

Kim LiChongÀº ½ã ¸¶ÀÌÅ©·Î½Ã½ºÅÛÁî Java Web Services Performance Engineering Group ±â¼úÁøÀÇ ¸â¹ö·Î¼­, XML ÆÄ½Ì ¼º´É¿¡ ´ëÇØ ƯÈ÷ Áö´ëÇÑ °ü½ÉÀ» °¡Áö°í ÀÖÀ¸¸ç, StAX 1.0 White Paper: Streaming APIs for XML ParsersÀÇ °øµ¿ ÀúÀÚ Áß ÇÑ »ç¶÷À̱⵵ ÇÏ´Ù. ±×´Â ¶ÇÇÑ XML ÆÄ½Ì ¼º´É ÃøÁ¤¿¡ »ç¿ëµÇ´Â ¸¶ÀÌÅ©·Îº¥Ä¡¸¶Å©ÀÎ xmltestÀÇ °øµ¿ ¼ÒÀ¯ÀÚÀÌ´Ù. xmltest¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀ» º¸·Á¸é xmltest ÇÁ·ÎÁ§Æ® ÆäÀÌÁö¸¦ ÂüÁ¶ÇÒ °Í.

¸ÇÀ§·Î

À¥ ¼­ºñ½º ¸ð´ÏÅ͸µ
 

Satish Viswanatham, Nazrul Islam °øÀú

J2EE 1.4¿¡¼­ »õ·Î ¼Ò°³µÈ ±â¼ú Áß Çϳª°¡ ¹Ù·Î J2EE Management, JSR 77À̾ú´Ù. J2EE Mnagement´Â J2EE ÄÄÆ÷³ÍÆ®¸¦ À§ÇÑ °ü¸® Á¤º¸, ¿ÀÆÛ·¹À̼Ç, ¼Ó¼º °ø°³ ¹× ¾×¼¼½º¸¦ À§ÇÑ Ç¥ÁØ °ü¸® ¸ðµ¨À» Á¦°øÇÒ »Ó ¾Æ´Ï¶ó JMX(Java Management Extensions)¿Í °°Àº ±â¼ú°ú ´õºÒ¾î °³¹ßÀڵ鿡°Ô J2EE ¼­¹ö »ó¿¡¼­ÀÇ ¸®¼Ò½º °ü¸® ¹× ¸ð´ÏÅ͸µÀ» À§ÇÑ º¥´õ Á߸³Àû ¹æ½ÄÀ» Á¦°øÇÑ´Ù. (JMX¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀ» º¸·Á¸é Å×Å©ÆÁ JMX ±â¼ú ÀÌÇØÇϱ⸦ ÂüÁ¶ÇÒ °Í.) ÀÌ·± ±â¼úµéÀ» ÅëÇØ °ü¸®ÇÏ°í ¸ð´ÏÅÍÇÒ ¼ö ÀÖ´Â ¸®¼Ò½ºÀÇ Çϳª°¡ ¹Ù·Î À¥ ¼­ºñ½ºÀÌ´Ù. ÇÏÁö¸¸, ±×µ¿¾È À¥ ¼­ºñ½ºÀÇ °ü¸®¿Í ¸ð´ÏÅ͸µÀÇ ¿ëÀ̼ºÀ» ³ôÀ̱â À§ÇØ ÀÌ·± ±â¼úµéÀ» Ȱ¿ëÇÏ´Â ÅøÀ» ã¾Æº¸±â¶õ °ÅÀÇ ºÒ°¡´ÉÇß´Ù. ÃÖ±ÙÀÇ ¿¹¿Ü Áß Çϳª°¡ ¹Ù·Î Java EE 5ÀÇ ¿ÀǼҽº ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö ±¸ÇöÀÎ GlassFishÀε¥, GlassFish¿¡¼­ À¥ ¼­ºñ½º´Â ¸ð´ÏÅÍ ¹× °ü¸®°¡ ¿ëÀÌÇÑ 1Â÷ Ŭ·¡½º °´Ã¼ÀÌ´Ù. ÀÌÁ¦ ¿©·¯ºÐÀº º» ÆÁ¿¡¼­ ÀÌ GlassFish ±â´ÉÀ» ÀÌ¿ëÇÏ¿© À¥ ¼­ºñ½º¸¦ ¸ð´ÏÅÍÇÒ ¼ö ÀÖ´Â ±âȸ¸¦ °®°Ô µÉ °ÍÀÌ´Ù.

½ÃÀÛÇϱâ

¸ÕÀú Ãʱ⠼³Á¤ ÀÛ¾÷ºÎÅÍ ½ÃÀÛÇØº¸µµ·Ï ÇÏÀÚ. GlassFish¸¦ ¾ÆÁ÷ ±¸ÇÏÁö ¸øÇß´Ù¸é GlassFish ´Ù¿î·Îµå ÆäÀÌÁö¿¡¼­ ´Ù¿î·ÎµåÇÑ ´ÙÀ½, ¾Æ·¡¿Í °°ÀÌ È¯°æ º¯¼ö¸¦ ¼³Á¤ÇÑ´Ù.

  • GLASSFISH_HOME. GlassFishÀÇ ¼³Ä¡ Àå¼Ò(°¡·É C:\Sun\AppServer)¸¦ Ç¥½ÃÇØ¾ß ÇÑ´Ù.

  • ANT_HOME. antÀÇ ¼³Ä¡ Àå¼Ò¸¦ Ç¥½ÃÇØ¾ß ÇÑ´Ù. ant´Â ´Ù¿î·ÎµåÇÑ GlassFish ¹øµé¿¡ ÇÔ²² Æ÷ÇԵǾî ÀÖ´Ù. (Windows¿¡¼­´Â lib\ant ¼­ºêµð·ºÅ丮¿¡ ÀÖÀ½.) ¶Ç´Â Apache Ant ÇÁ·ÎÁ§Æ® ÆäÀÌÁö¿¡¼­ ant¸¦ ´Ù¿î·ÎµåÇÒ ¼öµµ ÀÖ´Ù. º» ¿¹Á¦ÀÇ °æ¿ì Apache ant 1.6.5¸¦ ÇÊ¿ä·Î ÇÑ´Ù.

  • JAVA_HOME. »ç¿ëÀÚ ½Ã½ºÅÛ¿¡¼­ÀÇ JDK 5.0 À§Ä¡¸¦ Ç¥½ÃÇØ¾ß ÇÑ´Ù.

¾Æ¿ï·¯, ant À§Ä¡¸¦ °¢ÀÚÀÇ PATH ȯ°æ º¯¼ö¿¡ Ãß°¡ÇÑ´Ù.

º» ÆÁÀº Å×Å©ÆÁ JAX-WS¸¦ ÀÌ¿ëÇÏ¿© À¥ ¼­ºñ½º °³¹ßÇϱ⿡¼­ ¼³¸íÇÑ Calculator¶ó´Â À̸§ÀÇ À¥ ¼­ºñ½º¸¦ ÀÌ¿ëÇÑ´Ù . ÇØ´ç À¥ ¼­ºñ½º°¡ ¹èÄ¡µÇ¾î ÀÖÁö ¾ÊÀ» °æ¿ì ÇØ´ç Å×Å©ÆÁ¿¡¼­ À¥ ¼­ºñ½ºÀÇ ±¸Ãà ¹× ¹èÄ¡¸¦ À§ÇÑ Áöħ »çÇ×À» µû¸£µµ·Ï ÇÑ´Ù.

1Â÷ Ŭ·¡½º °´Ã¼·Î¼­ÀÇ À¥ ¼­ºñ½º

´ëºÎºÐÀÇ J2EE Áؼö ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö´Â ¹èÄ¡µÈ ¾ÆÄ«À̺ê, Áï ear, war, jar, rar ÆÄÀÏÀ» ¸®½ºÆ®ÇÏÁö¸¸, ¹èÄ¡µÈ À¥ ¼­ºñ½º´Â ¸®½ºÆ®ÇÏÁö ¾Ê´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù -- Àû¾îµµ, µµ¸ÞÀÎ ³»¿¡ ¹èÄ¡µÈ ¸ðµç À¥ ¼­ºñ½º ¿£µåÆ÷ÀÎÆ®¸¦ ½±°Ô ãÀ» ¼ö ÀÖ´Â ¹æ½ÄÀ¸·Î ¸®½ºÆ®ÇÏÁö´Â ¾Ê´Â´Ù. ÀÌ·¯ÇÑ À¯ÇüÀÇ ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿¡¼­ À¥ ¼­ºñ½º¸¦ °ü¸®Çϱâ À§Çؼ­´Â ÇØ´ç À¥ ¼­ºñ½º¿¡ ´ëÇÑ ¹èÄ¡ ¼­¼úÀÚ¸¦ °ËÅäÇØ¾ß ÇÑ´Ù. ÇÑÆí, À̿ʹ ´ëÁ¶ÀûÀ¸·Î GlassFish¿¡¼­´Â ¸ðµç À¥ ¼­ºñ½º ¿£µåÆ÷ÀÎÆ®°¡ ¸íÈ®ÇÏ°Ô Ç¥½ÃµÈ´Ù. ¸ðµç À¥ ¼­ºñ½º´Â EJB(Enterprise JavaBeans) ÄÄÆ÷³ÍÆ® ¹× ¼­ºí¸´°ú °°Àº ´Ù¸¥ ¿£ÅÍÇÁ¶óÀÌÁî ¸®¼Ò½º¿Í ´õºÒ¾î GlassFish °ü¸® Äֿܼ¡ ¸®½ºÆ®µÇ´Âµ¥, ÀÌ´Â À¥ ¼­ºñ½º¸¦ ½±°Ô °ü¸®ÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù.

¿¹½Ã¸¦ À§ÇØ ´ÙÀ½ ¸í·É¾î¸¦ ÀÔ·ÂÇÏ¿© GlassFish ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¸¦ ½ÃÀÛÇÑ´Ù.

     <GLASSFISH_HOME>\bin\asadmin start-domain domain1

ÀÌ ¶§, <GLASSFISH_HOME>Àº GlassFish°¡ ¼³Ä¡µÈ µð·ºÅ丮¸¦ ³ªÅ¸³½´Ù.

´ÙÀ½°ú °°Àº ³»¿ëÀÌ Ç¥½ÃµÇ¾î¾ß ÇÑ´Ù.

   Starting Domain domain1, please wait.
   Log redirected to 
   <GLASSFISH_HOME>/domains/domain1/logs/server.log.
   Domain domain1 started.

GlassFish°¡ ½ÃÀÛµÈ ÈÄ °¢ÀÚÀÇ ºê¶ó¿ìÀú¸¦ http://localhost:4848·Î Æ÷ÀÎÆ®ÇÏ¿© Administration ConsoleÀ» ¿¬ ´ÙÀ½, ÇØ´ç °ü¸®ÀÚÀÇ »ç¿ëÀÚ¸í°ú ºñ¹Ð¹øÈ£¸¦ ÀÌ¿ëÇÏ¿© ·Î±×ÀÎÇÑ´Ù(±âº» »ç¿ëÀÚ¸íÀº admin, ±âº» ºñ¹Ð¹øÈ£´Â adminadminÀÓ). Welcome È­¸éÀÌ Ç¥½ÃµÈ´Ù. Welcome È­¸é¿¡¼­ ÁÂÃø Ž»öâÀÇ Applications Æú´õ¸¦ È®ÀåÇϰí Web Services¸¦ ¼±ÅÃÇϸé Web Services âÀÌ ¿­¸°´Ù. ÀÌ ¶§, Calculator ¼­ºñ½º¸¦ À§ÇÑ ¿£Æ®¸®°¡ Ç¥½ÃµÇ¾î¾ß ÇÑ´Ù. ¿£Æ®¸®¿¡´Â ¼­ºñ½º°¡ ¼ÓÇÑ ¾ÖÇø®ÄÉÀ̼Ç(jaxws-webservice-web), °ü·Ã WSDL ÆÄÀÏ(CalculatorService.wsdl), ¼­ºñ½º ±¸Çö ¹æ½Ä(¼­ºí¸´) µî°ú °°ÀÌ ¼­ºñ½º¿¡ °üÇÑ ±âº» Á¤º¸°¡ µð½ºÇ÷¹À̵ȴٴ Á¡¿¡ À¯ÀÇÇÒ °Í.

Web Services window

Calculator ¿£µåÆ÷ÀÎÆ®¸¦ Ŭ¸¯Çϸé ÇØ´ç ¿£µåÆ÷ÀÎÆ®ÀÇ URI, À¥ ¼­ºñ½º°¡ ÆÐŰÁö·Î Æ÷ÇÔµÈ ¸ðµâÀÇ À̸§, °ü·Ã ¼­¼úÀÚ ÆÄÀÏÀÇ ¸®½ºÆ® µî°ú °°Àº ÇØ´ç À¥ ¼­ºñ½º¿¡ °üÇÑ »ó¼¼ Á¤º¸°¡ Ç¥½ÃµÇ¾î¾ß ÇÑ´Ù.

General - Calculator window

À¥ ¼­ºñ½º ¸ð´ÏÅ͸µÇϱâ

GlassFish´Â ÃÊ´ç ¿äû ¼ö, Æò±Õ ÀÀ´ä ½Ã°£, ¾²·çDz µî°ú °°Àº À¥ ¼­ºñ½ºÀÇ ¿î¿µ Åë°è¸¦ ÃßÀûÇÏ°í ±×·¡ÇÈ Çü½ÄÀ¸·Î Ç¥½ÃÇØÁÖ´Â ±â´ÉÀ» °®Ãß°í ÀÖÀ¸¸ç, »ç¿ëÀÚ´Â ¾ÖÇø®ÄÉÀÌ¼Ç ³»ÀÇ °³º° À¥ ¼­ºñ½º¿¡ ´ëÇÑ ¸ð´ÏÅ͸µÀ» Àο¡À̺í("»ç¿ëÇÔ")½Ãų ¼ö ÀÖ´Ù. ¸ð´ÏÅ͸µÀº ´ÙÀ½°ú °°Àº ¼¼ °¡Áö ·¹º§À» Áö¿øÇÑ´Ù.

  • LOW. ÀÀ´ä ½Ã°£, ¾²·çDz, ¿äû°ú Àå¾ÖÀÇ ÃѼö¸¦ ¸ð´ÏÅÍÇÑ´Ù.

  • HIGH. LOW¿Í µ¿ÀÏÇÑ ¸ð´ÏÅ͸µÀ» ¼öÇàÇϸç Message Trace(ÄÁÅÙÃ÷ ½Ã°¢È­)¸¦ Àο¡À̺í½ÃŲ´Ù.

  • OFF. ¸ð´ÏÅ͸µ µ¥ÀÌÅ͸¦ ¼öÁýÇÏÁö ¾Ê´Â´Ù.

(LOW ¶Ç´Â HIGH¸¦ ÁöÁ¤ÇÏ¿©) À¥ ¼­ºñ½º¿¡ ´ëÇÑ ¸ð´ÏÅ͸µ ±â´ÉÀ» ÀÛµ¿½Ã۸é, ÇØ´ç À¥ ¼­ºñ½º¿¡ ÀÇÇØ ¼öÇàµÇ´Â ¸ðµç ¿¬»ê¿¡ ´ëÇØ ¸ð´ÏÅ͸µÀÌ Àο¡À̺íµÈ´Ù.

¸ð´ÏÅ͸µ Á¤º¸¸¦ µð½ºÇ÷¹ÀÌÇÏ·Á¸é À¥ ¼­ºñ½º¿¡ °üÇÑ »ó¼¼ Á¤º¸°¡ Ç¥½ÃµÇ´Â â¿¡¼­ Monitor ÅÇÀ» Ŭ¸¯ÇÑ´Ù. ¸ð´ÏÅ͸µ ±â´ÉÀº OFF·Î ±âº» ¼³Á¤µÇ¾î ÀÖÀ¸¹Ç·Î óÀ½¿¡´Â "No Statistic is available for this web service"¶ó´Â ¸Þ½ÃÁö°¡ Ç¥½ÃµÈ´Ù. ÀÌ ¶§, âÀÇ Configuration ÅÇÀ» Ŭ¸¯ÇÏ¸é ¸ð´ÏÅ͸µÀÌ ÀÛµ¿µÈ´Ù. Åë°è¿Í ¸Þ½ÃÁöÀÇ ¼öÁýÀ» ½ÃÀÛÇÏ·Á¸é ¸ð´ÏÅ͸µ ·¹º§À» HIGH·Î ¼³Á¤Çϰí Save¸¦ Ŭ¸¯ÇÑ´Ù.

Calculator - Monitoring Configuration window

ÀÌÁ¦ "JAX-WS¸¦ ÀÌ¿ëÇÏ¿© À¥ ¼­ºñ½º °³¹ßÇϱâ" Å×Å©ÆÁÀÇ "Ŭ¶óÀÌ¾ðÆ® ½ÇÇà(Run the Client)" ¼½¼ÇÀÇ Áö½Ã»çÇ׿¡ µû¶ó Calculator À¥ ¼­ºñ½º¿¡ SOAP ¿äûÀ» Àü¼ÛÇÑ´Ù. ´ÙÀ½°ú À¯»çÇÑ Ãâ·ÂÀÌ Ç¥½ÃµÇ¾î¾ß ÇÑ´Ù.

   runtest-jaxws:
        [echo] Executing appclient with client class as 
        client.JAXWSClient
        [exec]  Retrieving port from the service 
        com.techtip.jaxws.sample.CalculatorService@162522b
        [exec]  Invoking add operation on the calculator port
        [exec]  Adding : 0 + 10 = 10
        [exec]  Adding : 1 + 10 = 11
        [exec]  Adding : 2 + 10 = 12
        [exec]  Adding : 3 + 10 = 13
        [exec]  Adding : 4 + 10 = 14
        [exec]  Adding : 5 + 10 = 15
        [exec]  Adding : 6 + 10 = 16
        [exec]  Adding : 7 + 10 = 17
        [exec]  Adding : 8 + 10 = 18
        [exec]  Adding : 9 + 10 = 19
 
   all: 
   BUILD SUCCESSFUL
   Total time: 6 seconds

Monitor âÀÇ Statistics ÅÇÀ» Ŭ¸¯Çϸé Calculator À¥ ¼­ºñ½º¿Í °ü·ÃÇÏ¿© ¼öÁýµÈ ´ÙÀ½ÀÇ Åë°è°¡ Ç¥½ÃµÇ¾î¾ß ÇÑ´Ù.

Calculator - Monitoring Statistics window

´ÙÀ½ÀÇ CLI ¸í·É¾î¸¦ ÀÌ¿ëÇØµµ µ¿ÀÏÇÑ °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù(¸í·É¾î´Â ÇÑ Çà¿¡ ÀÔ·ÂÇØ¾ß ÇÔ).

   <GLASSFISH_HOME>\bin\asadmin get -m --port 4848 
   "server.applications.jaxws-webservice-web.Calculator.
   webservice-endpoint.*"

´ÙÀ½°ú À¯»çÇÑ Ãâ·ÂÀÌ Ç¥½ÃµÇ¾î¾ß ÇÑ´Ù.

   server.applications.jaxws-webservice-web.Calculator.
   webservice-endpoint.averageresponsetime-count = 9
   server.applications.jaxws-webservice-web.Calculator.
   webservice-endpoint.averageresponsetime-description 
   = Average response time measured in milliseconds
   server.applications.jaxws-webservice-web.Calculator.
   webservice-endpoint.averageresponsetime-lastsampletime 
   = 1136835037801
   server.applications.jaxws-webservice-web.Calculator.
   webservice-endpoint.averageresponsetime-name 
   = AverageResponseTime
   ...

°á°ú¹°¿¡´Â Administration Äֿܼ¡ Ç¥½ÃµÈ °Íº¸´Ù ´õ ¸¹Àº Á¤º¸°¡ Æ÷ÇԵȴٴ Á¡¿¡ À¯ÀÇÇÒ °Í. ¿¹¸¦ µé¾î, CLI °á°ú¿¡´Â °¢ Åë°è¿Í ±× ÃøÁ¤ ´ÜÀ§¿¡ ´ëÇÑ ¼³¸íÀÌ ¸ðµÎ Æ÷ÇԵǾî ÀÖ´Ù.

Message Trace »ç¿ëÇϱâ

¸ð´ÏÅ͸µ ·¹º§ÀÌ HIGHÀÎ °æ¿ì¿¡´Â À¥ ¼­ºñ½º ¿£µåÆ÷ÀÎÆ®¿¡ ´ëÇÑ ¸¶Áö¸· n°³ÀÇ ¸Þ½ÃÁö¸¦ µð½ºÇ÷¹ÀÌÇÒ ¼ö ÀÖ´Ù(±âº»°ªÀº 25). ¸Þ½ÃÁö´Â °¢ ¼­¹ö ÀνºÅϽºÀÇ ÇØ´ç ¸Þ¸ð¸®¿¡ º¸°üµÈ´Ù. ¸Þ½ÃÁö´Â SOAP ¿äûÀÇ ¼¼ºÎ»çÇ×°ú ´õºÒ¾î ÀÀ´ä ¹× HTTP Çì´õ Á¤º¸¸¦ Ç¥½ÃÇϴµ¥, ¸Þ½ÃÁö¸¦ µð½ºÇ÷¹ÀÌÇÏ·Á¸é Monitor âÀÇ Messages ÅÇÀ» Ŭ¸¯ÇÑ´Ù.

Calculator - Messages window

Messages â¿¡¼­ ¸Þ½ÃÁö¸¦ Ŭ¸¯ÇÏ¸é ¸Þ½ÃÁö¿¡ ´ëÇÑ Ãß°¡ ¼¼ºÎ»çÇ×À» º¼ ¼ö ÀÖÀ¸¸ç, µð½ºÇ÷¹ÀÌµÈ ¼¼ºÎ»çÇ׿¡µµ XML Æ÷¸ËÀÇ ¼¼ºÎ»çÇ×À» ¿äûÇϴµ¥ »ç¿ëµÇ´Â ¹öưÀÌ Æ÷ÇԵǾî ÀÖ´Ù.

ÇÊÀÚ ¼Ò°³

Satish ViswanathamÀº ½ã Application Server ÆÀ ¼Ò¼Ó ¿£Áö´Ï¾î·Î, ÃÊâ±âºÎÅÍ J2EE ±â¼ú¿¡ Âü¿©ÇØ ¿Ô´Ù. ±×´Â ÇöÀç J2EE ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¸¦ ¼­ºñ½º ÁöÇâ ¾ÆÅ°ÅØÃ³(SOA) ¿£ÁøÀ¸·Î ¸¸µå´Â ÀÛ¾÷¿¡ Àû±ØÀûÀ¸·Î Âü¿©Çϰí ÀÖÀ¸¸ç, JDBC/EJB Æ®·£Àè¼Ç ¹× °ü¸® ±â¼ú ºÐ¾ß¿¡¼­ dzºÎÇÑ °æ·ÂÀ» ½×Àº ¹Ù ÀÖ´Ù. ½ã¿¡ ÇÕ·ùÇϱâ Àü¿¡ Satish´Â Kiva ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿Í Netscape À¥ ¼­¹ö °°Àº pre-J2EE ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö ÀÛ¾÷¿¡ Âü¿©ÇßÀ¸¸ç, ½ã¿¡ ÀçÁ÷ÇÏ´Â µ¿¾È 3°³ÀÇ Æ¯Ç㸦 Ãâ¿øÇϱ⵵ Çß´Ù.

Nazrul IslamÀº Application ServerÀÇ Administration & Management ÆÀÀÇ °íÂü ¸â¹ö·Î¼­ Áö³­ 5³â µ¿¾È J2EE ±×·ì¿¡ ²ÙÁØÈ÷ Âü¿©ÇØ ¿Ô´Ù. ±×´Â Application Server Enterprise Edition ¼³°è¿Í ±¸Çö¿¡ Å©°Ô ±â¿©ÇßÀ¸¸ç, ½ã¿¡ ÀçÁ÷ÇÏ´Â µ¿¾È 8°³ÀÇ Æ¯Ç㸦 Ãâ¿øÇß´Ù.

¸ÇÀ§·Î

º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù.
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϰųª ¼ö½ÅÁÖ¼Ò¸¦ º¯°æÇÏ·Á¸é SKDN@Sun.comÀ¸·Î ¹®ÀÇ Áֽñ⠹ٶø´Ï´Ù.

SKDN(Sun Korea Developers Network)¿¡¼­ J2EE/J2SE Å×Å©ÆÁ µî ´Ù¾çÇÑ ¾ÆÆ¼Å¬µéÀ» Âü°íÇϼ¼¿ä.

Copyright 2003-2006 Sun Korea, Ltd. All rights reserved.