.
.
Enterprise Java Technologies Technical Tips
.
2005³â 4¿ù 19ÀÏ    

Enterprise Java Technologies Tech Tips¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù. Java 2 Platform, Enterprise Edition (J2EE)¿¡ ±â¹ÝÇÑ enterprise Java technologies ¿Í APIsÀÇ »ç¿ë¿¡ °üÇÑ ÃֽŠÁ¤º¸¸¦ ¾ò¾î °¡½Ã±â ¹Ù¶ø´Ï´Ù. ÀÌ ±Û¿¡¼­´Â Java 2 Java 2, Enterprise Edition, v 1.4 ¸¦ »ç¿ëÇÕ´Ï´Ù. ´Ù¿î·Îµå

À̹ø È£¿¡¼­´Â,

.JMX ±â¼ú ÀÌÇØÇϱâ
.SUN JAVA STREAMING XML PARSER ¼Ò°³

¸¦ ´Ù·ç°Ô µË´Ï´Ù.

ÀúÀÚ Robert Eckstein

.

JMX ±â¼ú ÀÌÇØÇϱâ

JMX(Java Management Extensions)´Â ÇÁ·Î±×·¡¸Óµé¿¡°Ô ÀÚ¹Ù ¾îÇø®ÄÉÀ̼ÇÀÇ ¸ð´ÏÅ͸µ°ú °ü¸® ±â´ÉÀ» Á¦°øÇÑ´Ù. ½ÇÁ¦·Î ÀÌ API´Â À¥¼­¹ö¿¡¼­ ³×Æ®¿öÅ© µð¹ÙÀ̽º, À¥Æù¿¡ À̸£±â±îÁö ÀÚ¹Ù·Î ÀÌ¿ë °¡´ÉÇÑ °ÍÀº ¾î´À °ÍÀÌµç ·ÎÄà ȤÀº ¿ø°ÝÀ¸·Î ó¸® ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. JMX ±â¼úÀº JCP(Java Community Process)¿¡ ÀÇÇØ °³¹ßµÈ ¹ÐÁ¢ÇÑ °ü°èÀÇ µÎ ½ºÆå, Java Specification Request (JSR) 3: Java Management Extensions (JMX) Specification ¿Í JSR 160: Java Management Extensions (JMX) Remote API 1.0¿¡ ÀÇÇØ Á¤ÀǵȴÙ. À̹ø Å×Å©ÆÁ¿¡¼­´Â JMX ¾ÆÅ°ÅØÃ³¸¦ ¼Ò°³ÇÏ°í °£´ÜÇÑ MBean(Managed Beans)À» »ý¼ºÇÏ´Â ¹æ¹ýÀ» ¼Ò°³Çϱâ·ÎÇÑ´Ù.

JMX ±â¼úÀ» »ç¿ëÇϸé MBean(Managed Bean)À¸·Î ¾Ë·ÁÁø Çϳª ÀÌ»óÀÇ »ç¿ëÀÚ JavaBean ¿ÀºêÁ§Æ®¸¦ ÅëÇØ (¸®¼Ò½º¸¦ È£ÃâÇÏ´Â) ÇÑ ±â°è ¾ÈÀÇ ¾ÖÇø®ÄÉÀ̼Ç, µð¹ÙÀ̽º, ¶Ç´Â ¼­ºñ½º¸¦ ¿ø°ÝÀ¸·Î Á¦¾îÇÒ ¼ö ÀÖ´Ù. ÀÌ MBeanµéÀº ±× ÈÄ ÇÙ½É °ü¸® ¿ÀºêÁ§Æ® ¼­¹ö(MBean ¼­¹ö)¿¡ µî·ÏµÈ´Ù. MBean¼­¹ö´Â ¸®¼Ò½º¿¡ Á¢±ÙÇϱ⠿øÇÏ´Â ¸ðµç ¿ø°Ý ¸Å´ÏÀú¿¡ ´ëÇÑ °ü¸® ¿¡ÀÌÀüÆ® ¿ªÇÒÀ» ÇÑ´Ù.

JMX ȯ°æ

JMX ½ºÆåÀº ¾ÆÅ°ÅØÃ³¸¦ ¼¼°³ÀÇ Æ¼¾î(tier)·Î Á¤ÀÇÇϰí ÀÖ´Ù. ¸ÕÀú ¼³¸íÇÒ µÎ ·¹º§Àº JSR 3¿¡¼­ Á¤ÀÇµÈ instrumentation tier¿Í agent tierÀÌ´Ù.

  • Instrumentation Tier. ¾îÇø®ÄÉÀ̼Ç, µð¹ÙÀ̽º, ¼­ºñ½º¿Í °°Àº ¸®¼Ò½ºµéÀº MBean (Managed Bean)À̶ó°í ºÒ¸®´Â ÀÚ¹Ù ¿ÀºêÁ§Æ®¸¦ ÀÌ¿ëÇÏ¿© ¼³Ä¡µÈ´Ù. MBeanÀº ¿ø°ÝÀ¸·Î °ü¸®ÇÏ°í ¸ð´ÏÅ͸µÇÏ´Â JMX ¿¡ÀÌÀüÆ®¸¦ ÅëÇØ ¼Ó¼º°ú ¿¬»êÀ¸·Î ±¸¼ºµÈ °ü¸® ÀÎÅÍÆäÀ̽º¸¦ º¸¿©ÁØ´Ù.

  • Agent Tier. JMX ¿¡ÀÌÀüÆ®ÀÇ ÁÖ¿ä ÄÄÆ÷³ÍÆ®´Â MBean ¼­¹öÀ̸ç, ÀÌ´Â MbeanÀÌ µî·ÏµÇ´Â ÄÚ¾î °ü¸® ¿¡ÀÌÀüÆ® ¿ÀºêÁ§Æ® ¼­¹öÀÌ´Ù. JMX ¿¡ÀÌÀüÆ®´Â ¶ÇÇÑ MBean À» Çڵ鸵Çϱâ À§ÇÑ ¼­ºñ½ºµéÀ» Æ÷ÇÔÇϰí ÀÖ´Ù. JMX ¿¡ÀÌÀüÆ®´Â Á÷Á¢ÀûÀ¸·Î ¸®¼Ò½º¸¦ Á¦¾îÇÏ°í °ü¸®°¡ °¡´ÉÇϵµ·Ï ÇÑ´Ù.

¼¼ ¹øÂ° Ƽ¾îÀÎ ¿ø°Ý °ü¸® ·¹º§Àº JSR 160¿¡ ºÎºÐÀûÀ¸·Î Á¤ÀǵǾîÀÖ´Ù.

  • Remote Management Tier. ÀÌ Æ¼¾î´Â ¿¡ÀÌÀüÆ® JVM(Java Virtual Machine) ¿ÜºÎÀÇ ¿ø°Ý °ü¸® ¾îÇø®ÄÉÀ̼ÇÀ¸·ÎºÎÅÍ Á¢±Ù °¡´ÉÇÑ JMX ¿¡ÀÌÀüÆ®¸¦ ¸¸µå´Â ÇÁ·ÎÅäÄÝ ¾î´þÅÍ(adaptor)¿Í Ä¿³ØÅÍ(connector)¸¦ Á¤ÀÇÇÑ´Ù.(JSR160¿¡´Â ´ÜÁö Ä¿³ØÅ͸¸ Á¤ÀÇ.) Ä¿³ØÅÍ´Â ¿ø°Ý Ŭ¶óÀÌ¾ðÆ®°¡ JMX-awareÀÌ°í ·ÎÄà Ŭ¶óÀÌ¾ðÆ®°¡ º¸°ÔµÉ °Í°ú °°Àº JMX API¸¦ º¼ ¶§ »ç¿ëµÈ´Ù. ¾î´þÅÍ´Â ¿ø°Ý Ŭ¶óÀÌ¾ðÆ®°¡ SNMP (Simple Network Management Protocol)³ª CIM/WBEM(Common Information Model and Web Based Enterprise Management) °°Àº ÀÏ¹Ý °ü¸® ÇÁ·ÎÆ÷ÄÝÀ» ÀÌ¿ëÇÒ ¶§ »ç¿ëµÈ´Ù.

ÀϹÝÀûÀ¸·Î JMX¸¦ »ç¿ëÇÏ´Â °³¹ßÀÚ´Â ´ÙÀ½ÀÇ ¼¼ ºÐ·ù·Î ³ª´©¾îÁø´Ù.

  • ¸®¼Ò½º¸¦ °ü¸®Çϱâ À§ÇØ MBeanÀ» ÀÛ¼ºÇÏ´Â °³¹ßÀÚ. ÀÌ ¶§, JMX ±â¼úÀº °ü¸®¸¦ À§ÇØ º¸¿©Áö´Â ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÑ´Ù. °³¹ßÀÚ´Â MBean°ú ¸®¼Ò½º ÀÚü °£ÀÇ "Á¢ÂøÃ¼"Ã¥ÀÓÀ» °¡Áø´Ù.

  • ¿¡ÀÌÀüÆ®¸¦ »ý¼ºÇÏ°í ¹èÄ¡ÇÏ´Â °³¹ßÀÚ. ´ÙÀ½°ú °°Àº ÀüÇüÀûÀÎ ¸î °³ÀÇ Å½ºÅ©¸¦ ¼öÇàÇÑ´Ù:

    • MBean ¼­¹ö¸¦ »ý¼ºÇϰųª Ç÷§Æû¿¡ ÀÇÇØ Á¦°øµÇ¾îÁö´Â °ÍÀ» »ç¿ëÇÑ´Ù.

    • MBean ³×ÀÌ¹Ö ÄÁº¥¼ÇÀ» ÀÌ¿ëÇÏ¿© ¸®¼Ò½º¸¦ ³ªÅ¸³»´Â MBeanµéÀ» µî·ÏÇÑ´Ù.

    • Ç÷§Æû(RMI/SNMP)¿¡ ÀÇÇØ °ø±ÞµÈ Ä¿³ØÅÍ¿Í ÇÁ·ÎÅäÄÝ ¾îµªÅ͸¦ Çü¼ºÇϰųª, ¸®¼Ò½º°¡ ¿ø°ÝÀ¸·Î Á¢±ÙµÇ¾úÀ» ¶§´Â Ä¿½ºÅÒ Ä¿³ØÅͳª ¾î´þÅ͸¦ Ãß°¡ÇÑ´Ù

  • ¿ø°Ý ¸Å´ÏÀú¸¦ ÀÛ¼ºÇÏ´Â °³¹ßÀÚ. JMX ¿¡ÀÌÀüÆ®¿Í »óÈ£ÀÛ¿ëÇÏ´Â Ä¿³ØÅͳª ÇÁ·ÎÅäÄÝÀ» ¼±ÅÃÇϰí, ³ªÅ¸³­ MBeanÀ» ÅëÇØ ¿ø°ÝÀ¸·Î °ü¸®µÇ´Â ¸®¼Ò½ºÀÇ ºä¸¦ ±¸ÃàÇÑ´Ù.

´ÙÀ½Àº JMX ½ºÆå¿¡ ÀÇÇØ Á¤ÀÇµÈ MBeanÀÇ ³×°¡Áö ŸÀÔÀÌ´Ù.

  • Ç¥ÁØ Mbean (Standard MBean): Ç¥ÁØ MbeanÀº ±× ¸Þ¼ÒµåÀÇ À̸§¿¡ ³ªÅ¸³ªµíÀÌ °ü¸® ÀÎÅÍÆäÀ̽ºÀÌ´Ù. ¸Þ¼Òµå´Â ÀÎÅÍÆäÀ̽ºÀÇ ³»¼º¿¡ ÀÇÇØ º¸¿©Áø´Ù´Ù. Ç¥ÁØMBeansÀº MBeanÀÇ °¡Àå ÀϹÝÀûÀΠŸÀÔÀÌ´Ù. ´ëºÎºÐÀÇ °³¹ßÀÚ´Â ÀÌ ¿ÜÀÇ MBean ŸÀÔÀ» »ý¼ºÇÒ Çʿ䰡 ¾ø´Ù.

  • ´ÙÀ̳ª¹Í MBean(Dynamic MBean): ´ÙÀ̳ª¹Í MBeanÀº ¸Þ¼Òµå À̸§ÀÇ introspectionÀ» ÅëÇÏ´Â ´ë½Å javax.management. DynamicMBeanÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇÏ¿© °ü¸® ÀÎÅÍÆäÀ̽º¸¦ ÇÁ·Î±×·¥ÀûÀ¸·Î ±¸ÇöÇÑ´Ù. À̸¦ À§Çؼ­´Â °ü¸®¸¦ À§ÇØ ³ªÅ¸³ª´Â ¼Ó¼º°ú ÀÛ¿ëÀ» Ç¥ÇöÇÏ´Â Á¤º¸ Ŭ·¡½º¿¡ ÀÇÁ¸ÇÑ´Ù. Dynamic MBeanÀº MBeanÀÇ °ü¸® ÀÎÅÍÆäÀ̽º°¡ ÄÄÆÄÀϽà ¾Ë·ÁÁöÁö ¾Ê¾ÒÀ» ¶§-¿¹¸¦ µé¾î, XML ÆÄÀÏÀ» ÆÄ½ÌÇϴµ¥ °áÁ¤µÇ¾úÀ» ¶§-Á¾Á¾ »ç¿ëµÈ´Ù.

  • ¸ðµ¨ MBean(Model MBean): ¸ðµ¨ MBeanÀº ÀϹÝÀûÀ̰í Çü¼º°¡´ÉÇÑ MBeanÀ¸·Î½á ¾îÇø®ÄÉÀ̼ÇÀÌ ¾î¶² ¸®¼Ò½ºµçÁö ´ÙÀ̳ª¹ÍÇÏ°Ô ¼³Ä¡ÇÏ´Â µ¥ »ç¿ëÇÑ´Ù. º»ÁúÀûÀ¸·Î, °ü¸® ÀÎÅÍÆäÀ̽º¿Í ½ÇÁ¦ ¸®¼Ò½º°¡ ÇÁ·Î±×·¥ÀûÀ¸·Î ¼³Á¤µÇµµ·Ï ±¸ÇöµÇ¾î¿Â °ÍÀÌ ´ÙÀ̳ª¹Í MBeanÀÌ´Ù. ÀÌ·ÎÀÎÇØ Java ´ÙÀ̳ª¹Í °ü¸® ¿¡ÀÌÀüÆ®¿¡ ¿¬°áµÈ ¾î¶² ¸Å´ÏÀú¶óµµ MBean ¸ðµ¨À» ´ÙÀ̳ª¹ÍÇÏ°Ô ½ÇÁõÇϰí Çü¼ºÇÒ ¼ö ÀÖ´Ù.

  • ¿ÀÇ MBean(Open MBean): ¿ÀÇ MBeanÀº µ¥ÀÌÅÍ Å¸ÀÔ¿¡ ƯÁ¤ Á¦ÇÑÀ» °¡Áø ´ÙÀ̳ª¹Í MBeanÀ̸ç, ÀÌ´Â °ü¸® ¾îÇø®ÄÉÀ̼ǰú À̵éÀÇ °ü¸®ÀÚµéÀÌ ·±Å¸Àӽà ¹ß°ßµÇ´Â »õ·Î¿î °ü¸® ¿ÀºêÁ§Æ®µéÀ» ÀÌÇØÇÏ°í »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. ¿ÀÇ MBeanÀº JMX ½ºÆå¿¡ µû¸£´Â ³ÐÀº ¹üÀ§ÀÇ ¾ÖÇø®ÄÉÀ̼ǿ¡ ¿ÀÇ嵃 Çʿ䰡 ÀÖ´Â ¸®¼Ò½º¸¦ ¼³Ä¡Çϴµ¥ ÀÖ¾î À¯µ¿ÀûÀÎ ¼ö´ÜÀ» Á¦°øÇÑ´Ù.

JMX °ü·Ã °ü¸® ÀÎÅÍÆäÀ̽º¸¦ »ý¼ºÇÏ´Â µ¥¿¡´Â ÀüÇüÀûÀ¸·Î ÃÖ¼Ò µÎ ´Ü°èÀÇ °úÁ¤À¸·Î ÁøÇàµÈ´Ù. ù¹øÂ° ´Ü°è¿¡¼­´Â MbeanÀ» MBean ¼­¹ö¿Í ÇÔ²² µî·ÏÇÏ´Â ¿¡ÀÌÀüÆ®´Â ¹°·Ð, MBean ÀÎÅÍÆäÀ̽º¸¦ »ý¼ºÇÑ´Ù. µÎ¹øÂ° ´Ü°è´Â ¿ø°Ý °ü¸® ¾îÇø®ÄÉÀ̼ÇÀ» »ç¿ëÇÏ¿© MBeanÀ» °ü¸®ÇÏ´Â °ÍÀÌ´Ù. JMX ½ºÆåÀº »ç¿ëÀÚ°¡ ¿ø°Ý °ü¸® ¾îÇø®ÄÉÀ̼ÇÀ¸·ÎºÎÅÍ JMX ¿¡ÀÌÀüÆ®¸¦ Á¢±ÙÇÏ´Â °ÍÀ» Çã¶ôÇÏ´Â Ä¿³ØÅ͵éÀÇ Ç¥ÁØÀ» Á¤ÀÇÇÑ´Ù. ÀÌ´Â ´Ù¸¥ ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÏ´Â JMX Ä¿³ØÅ͵éÀÌ °°Àº °ü¸® ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇϱ⠶§¹®¿¡ À¯¿ëÇÏ´Ù. ÀÌ·Î½á °ü¸® ¾ÖÇø®ÄÉÀ̼ÇÀÌ Ä¿¹Â´ÏÄÉÀÌ¼Ç ÇÁ·ÎÅäÄÝÀÇ »ç¿ë À¯¹«¿¡ °ü°è ¾øÀÌ Åõ°ú¼ºÀÖ°Ô ¸®¼Ò½º¸¦ °ü¸®ÇÒ ¼ö ÀÖ´Ù. JMX ¿¡ÀÌÀüÆ®´Â ¶ÇÇÑ JMX ½ºÆå¿¡´Â µû¸£Áö ¾ÊÀ¸³ª JMX ¿¡ÀÌÀüÆ®¸¦ Áö¿øÇÏ´Â ½Ã½ºÅÛ È¤Àº ¾îÇø®ÄÉÀ̼ǿ¡ ÀÇÇØ »ç¿ëµÉ ¼ö ÀÖ´Ù.

Ç¥ÁØ Mbean ÀÎÅÍÆäÀ̽º ¸¸µé±â

°¡»óÀÇ ¿Âµµ°è ÀåÄ¡¸¦ À§ÇÑ MBeanÀ» ¸¸µé¾îº¸ÀÚ. ¼Ò½º ÄÚµå´Â ÀÌ Å×Å©ÆÁÀÇ »ùÇà ¾ÆÄ«À̺ê(ttfeb2005jmx.jar)¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù. ù¹øÂ°·Î ÇØ¾ßÇÒ °ÍÀº, MBean ÀÎÅÍÆäÀ̽º¸¦ »ý¼ºÇÏ¿© ¸®¼Ò½º¸¦ "¼³Ä¡"ÇÏ´Â °ÍÀÌ´Ù. ´Ù½Ã ¸»ÇÏÀÚ¸é, ¸®¼Ò½ºÀÇ ¼³Ä¡¿¡ Á¢±ÙÀ» ±¸ÇöÇϱâ À§Çؼ­´Â MbeanÀ» »ý¼ºÇؾßÇÏ´Â °ÍÀÌ´Ù. ´ÙÀ½Àº °£´ÜÇÑ MBeanÀÇ ¿¹Á¦ÀÌ´Ù.

   public interface ThermometerMBean {

       //  Attributes
       public double getTemperature();
       public double getMaximumTemperature();
       public double getMinimumTemperature();

       //  Operations
       public void resetMaxAndMin();  

   }

MBeanÀÇ ÀÎÅÍÆäÀ̽º´Â ÀϹÝÀûÀ¸·Î ÀÐ°í ¾µ ¼ö ÀÖ´Â(¶Ç´Â µÑ´Ù) À̸§º°, ŸÀÔº° ¼Ó¼ºµé°ú Ȱ¼ºÈ­µÉ ¼ö ÀÖ´Â À̸§º°, ŸÀÔº° ÀÛ¿ëµé·Î ±¸¼ºµÇ¾îÀÖ´Ù.

JMX ±â¼úÀº ¶ÇÇÑ Java À̺¥Æ® ¸ðµ¨À» ±â¹ÝÀ¸·Î ÇÏ´Â ÀϹÝÀû ³ëƼÇÇÄÉÀÌ¼Ç ¸ðµ¨À» Á¤ÀÇÇÑ´Ù. JMX ¿¡ÀÌÀüÆ®¿Í MBeans´Â ÀÌ ³ëƼÇÇÄÉÀÌ¼Ç ¸ðµ¨À» »ç¿ëÇÏ¿© °ü¸® ¾ÖÇø®ÄÉÀ̼ÇÀ̳ª ´Ù¸¥ Mbeanµé°ú °°ÀÌ ÇÊ¿ä·ÎÇÏ´Â °÷¿¡ Áß¿äÇÑ Á¤º¸¸¦ Àü¼ÛÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌ ¿¹Á¦¿¡¼­´Â ³ëƼÇÇÄÉÀ̼ÇÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.

´ÙÀ½ ´Ü°è´Â MBean ÀÎÅÍÆäÀ̽ºÀÇ ±¸ÇöÀ» »ý¼ºÇÏ´Â °ÍÀε¥, À̰ÍÀº ²Ï °£´ÜÇÏ´Ù. ¿©±â¼­ ¿ì¸®´Â ´Ü¼øÇÏ°Ô °¡»óÀÇ static ½Ì±ÛÅæ Á¢±ÙÀÚ¸¦ È£ÃâÇÏ´Â Thermometer ¶ó´Â Ŭ·¡½º¸¦ »ý¼ºÇÑ´Ù. Á¢±ÙÀÚ´Â ¿Âµµ µ¥ÀÌÅ͸¦ °®°í ÀÖ´Â ¿ÀºêÁ§Æ®¿¡ ´ëÇØ ·¹ÆÛ·±½º¸¦ ¾ò´Â´Ù. Ç¥ÁØ MbeanÀ» À§Çؼ­, ±¸Çö Ŭ·¡½ºÀÇ À̸§°ú MBeanÀÎÅÍÆäÀ̽ºÀÇ À̸§Àº ¸¶Áö¸· ºÎºÐÀÇ "MBean"À» »©°í´Â ¹Ýµå½Ã °°¾Æ¾ßÇÑ´Ù. (¿¹¸¦ µé¾î ThermometerMBeanÀº ThermometerÀÌ´Ù.)

   public class Thermometer implements ThermometerMBean {


       //  Attributes

       public double getTemperature() {
           return getMyStaticDeviceInterface().getTemperature();
       }

       public double getMaximumTemperature() {
           return getMyStaticDeviceInterface().getMax();
       }

       public double getMinimumTemperature() {
           return getMyStaticDeviceInterface().getMin();
       }

       //  Operations

       public void resetMaxAndMin() {
           getMyStaticDeviceInterface().resetMaxAndMin();
       }

       // ...
   }

JMX ¿¡ÀÌÀüÆ® »ý¼ºÇϱâ

¸®¼Ò½º°¡ MBean¿¡ ÀÇÇØ ¼³Ä¡µÈ ÈÄ¿¡´Â JMX ¿¡ÀÌÀüÆ®¸¦ ÅëÇØ °ü¸®µÉ ¼ö ÀÖ´Ù. MBeanÀº °°ÀÌ ÀÛ¿ëÇÏ´Â JMX ¿¡ÀÌÀüÆ®¿¡ ´ëÇØ º°´Ù¸¥ Áö½ÄÀ» ÇÊ¿ä·Î ÇÏÁö ¾Ê´Â´Ù. ÀÌ·Î½á ¾ÖÇø®ÄÉÀ̼Ç, ½Ã½ºÅÛ, ³×Æ®¿öÅ©ÀÇ °³¹ßÀÚµéÀº º¹ÀâÇÑ °ü¸® ½Ã½ºÅÛ¿¡ ´ëÇÑ ÀÌÇØ ÇÊ¿ä ¾øÀÌ Ç¥ÁØ ¹æ¹ýÀ¸·Î Á¦Ç°À» °ü¸®ÇÒ ¼ö ÀÖ´Ù.

¿¡ÀÌÀüÆ®´Â ¼­¹ö¿¡ À§Ä¡ÇÑ ¼­ºñ½ºµé·ÎºÎÅÍ µµ¿òÀ» ¹Þ´Â´Ù. ¿¡ÀÌÀüÆ® ¼­ºñ½º´Â MBean ¼­¹ö¿¡ µî·ÏµÈ Mbean¿¡¼­ÀÇ °ü¸® ÀÛ¿ëÀ» ¼öÇàÇÒ ¼ö ÀÖ´Â ¿ÀºêÁ§Æ®ÀÌ´Ù. ¿¡ÀÌÀüÆ®¿¡ °ü¸® Áö´ÉÀ» Æ÷ÇÔ½ÃÅ´À¸·Î½á, JMX ±â¼úÀº Á» ´õ °­·ÂÇÑ °ü¸® ¾îÇø®ÄÉÀ̼ÇÀ» Çã¿ëÇÏ°Ô µÈ´Ù.

JMX ¿¡ÀÌÀüÆ®ÀÇ ÇÙ½É ÄÄÆ÷³ÍÆ®´Â MBean ¼­¹öÀ̸ç, MbeanÀÌ µî·ÏµÇ´Â °ü¸® ¿ÀºêÁ§Æ® ¼­¹öÀÌ´Ù. JMX ¿¡ÀÌÀüÆ®´Â ¶ÇÇÑ MbeanÀ» °ü¸®Çϱâ À§ÇÑ ¼­ºñ½ºµé°ú °ü¸® ¾îÇø®ÄÉÀ̼ǿ¡ ÀÇÇØ Á¢±ÙÇã¶ôÀÌ µÇ´Â Àû¾îµµ ÇϳªÀÇ Ä¿¹Â´ÏÄÉÀÌ¼Ç Ä¿³ØÅ͸¦ Æ÷ÇÔÇÑ´Ù. ´ÙÀ½Àº °£´ÜÇÑ ¿¡ÀÌÀüÆ®¸¦ À§ÇÑ ¼Ò½º ÄÚµåÀÌ´Ù.

   import java.lang.management.*;
   import javax.management.*;

   public class ThermometerAgent {

   private MBeanServer server = null;

      public ThermometerAgent() {

         server = ManagementFactory.getPlatformMBeanServer();
   
         Thermometer tBean = new Thermometer();
         ObjectName tBeanName = null;

         try {
            tBeanName = new ObjectName(
                "ThermometerAgent:type=Thermometer");
            server.registerMBean(tBean, tBeanName);
         } catch(Exception e) {
            e.printStackTrace();
         }
      }

      public static void main(String argv[]) {
         ThermometerAgent agent = new ThermometerAgent();
         System.out.println(
                 "Agent is ready... Press Enter to close");
         try {
             System.in.read();
         } catch (Exception e) { 
             e.printStackTrace();
         }
   
      }
   }

¿¹Á¦ ±¸µ¿Çϱâ

¿¹Á¦¸¦ ±¸µ¿Çϱâ À§Çؼ­´Â J2SE 1.5°¡ ÇÊ¿äÇÏ´Ù.

  1. À̹ø Å×Å©ÆÁ¿¡ ´ëÇÑ »ùÇà ¾ÆÄ«À̺ê(ttfeb2005jmx.jar)¸¦ ´Ù¿î·ÎµåÇÑ´Ù.

  2. ¿¹Á¦ ¾ÐÃàÆÄÀÏÀ» ´Ù¿î·Îµå ¹ÞÀº µð·ºÅ丮¸¦ º¯°æÇϰí, ´ÙÀ½°ú °°ÀÌ »ùÇà ¾ÆÄ«À̺꿡 ´ëÇÑ JAR ÆÄÀÏÀÇ ¾ÐÃàÀ» Ǭ´Ù.
          jar xvf ttfeb2005jmx.jar
    
    ¿¹Á¦¸¦ À§ÇÑ ¼Ò½ºÄڵ尡 ³ªÅ¸³¯ °ÍÀÌ´Ù.

  3. Ç¥ÁØ javac ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇÏ¿© Ŭ·¡½ºµéÀ» ÄÄÆÄÀÏÇÑ´Ù.

  4. ´ÙÀ½ ¸í·É¾î¸¦ »ç¿ëÇÏ¿© ¿¡ÀÌÀüÆ® Ŭ·¡½º¸¦ ±¸µ¿½ÃŲ´Ù.
          java -Dcom.sun.management.jmxremote ThermometerAgent
    
  5. »õ·Î¿î ½©À̳ª ¸í·É ÇÁ·ÒÇÁÆ®ÀÇ °æ¿ì jconsole Åø(J2SE bin µð·ºÅ丮¿¡ ÀÖÀ½)À» ½ÃÀÛÇϱ⠹ٶõ´Ù.

¿¡ÀÌÀüÆ®°¡ µî·ÏµÇ¸é, ´ÙÀ½°ú ºñ½ÁÇÑ È­¸éÀÌ ³ªÅ¸³­´Ù.

  1. JMX ¿¡ÀÌÀüÆ®¿¡ Á¢¼ÓÇÑ´Ù. MBeans ÅÇÀ» Ŭ¸¯ÇÏ°í ¿ÞÂÊ¿¡ ÀÖ´Â Æ®¸® Áß ThermometerAgent ¿£Æ®¸®ÀÇ Thermometer MBeanÀ» ¼±ÅÃÇÑ´Ù. Attributes ÅÇÀ» ¼±ÅÃÇϸé ÃÖ°í, ÃÖÀú, ÇöÀç ¿Âµµ¿¡ ´ëÇÑ ¿Âµµ°è ¼Ó¼ºÀÌ ³ªÅ¸³¯ °ÍÀÌ´Ù.
  1. Operations ÅÇÀ» Ŭ¸¯Çϸé resetMaxAndMin() ¹öưÀ» º¸°Ô µÉ°ÍÀÌ´Ù.

ÀÌ Å×Å©ÆÁÀº ´ÜÁö JMX ±â¼úÀÇ Ç¥¸éÀûÀÎ ºÎºÐ¸¸ ´Ù·ê »ÓÀÌ´Ù. ´õ ¸¹Àº Á¤º¸´Â Getting Started with Java Management Extensions (JMX): Developing Management and Monitoring Solutions ¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù. ÀÌ ¹®¼­¿¡¼­´Â ÀÌ Å×Å©ÆÁ¿¡¼­ º¸¿©Áö´Â °Í °°Àº ºñ½ÁÇÑ ¿¹Á¦¸¦ »ý¼ºÇÏÁö¸¸ Ä¿³ØÅÍ »ç¿ë¿¡ ÀÖ¾î Á» ´õ ÀÚ¼¼È÷ ¼³¸íÇÑ´Ù. ¶ÇÇÑ JMX technology page ¸¦ Âü°íÇϰí JMX ½ºÆå(v2.0)ÀÇ ¹ßÀüÀ» º¸±âÀ§Çؼ­´Â JSR 255¸¦ ÁÖ½ÃÇϱ⠹ٶõ´Ù.

.
.

SUN JAVA STREAMING XML PARSER ¼Ò°³

XMLÀ» »ç¿ëÇÏ´Â ´ëºÎºÐÀÇ Java °³¹ßÀÚ´Â SAX (Simple API for XML) ¶óÀ̺귯¸®¿Í DOM(Document Object Model) ¶óÀ̺귯¸®¿¡ Àͼ÷ÇÒ °ÍÀÌ´Ù. SAX´Â À̺¥Æ® ±â¹ÝÀÇ APIÀ̸ç, ÀÌ´Â ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¡¸Ó°¡ ÆÄ¼­¿Í ¸î °³ÀÇ ¸®½º³Ê¸¦ µî·ÏÇϰí, ƯÁ¤ XML ¹®¹ý »ý¼ºÀÚ(¿¹¸¦ µé¾î ¿ä¼Ò³ª ¼Ó¼º)°¡ µµÂøµÇ¸é ¸®½º³Ê ¸Þ¼Òµå°¡ È£ÃâµÈ´Ù´Â ÀǹÌÀÌ´Ù. ±× ¹Ý´ë·Î DOMÀº Æ®¸® ±â¹ÝÀÇ ¾ÆÄÉÅØÃ³¸¦ °¡Áö¸ç, Àüü ¹®¼­¸¦ ½ºÄµÇÏ¿© ¸¶ÁÖÄ¡´Â °¢°¢ÀÇ ¹®¹ý »ý¼ºÀÚÀÇ ¿ÀºêÁ§Æ® Æ®¸®¸¦ ±¸ÃàÇÑ´Ù. ÇÁ·Î±×·¡¸Ó´Â ½ºÄµÀÌ ¿Ï·áµÈ ÈÄ ¿ÀºêÁ§Æ® Æ®¸®¿¡ Á¢±ÙÇÏ¿© ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù

ÀÌ µÎ ¹æ¹ý ¸ðµÎ °¢°¢ÀÇ °áÁ¡À» °¡Áö°í ÀÖ´Ù: ¸®½º³Ê¸¦ ÀÌ¿ëÇÏ´Â À̺¥Æ® ±â¹ÝÀÇ API´Â ÀϹÝÀûÀ¸·Î ´Ù·ç±â Èûµé´Ù. ¸®½º³ÊµéÀÌ ÆÄ¼­¿¡ ÀÇÇØ Á¶Á¾µÇ±â ¶§¹®ÀÌ´Ù. Æ®¸® ±â¹ÝÀÇ API´Â ½ºÄµµÇ´Â ¹®¼­ÀÇ ¾ç¿¡ ºñÇØ °úµµÇÑ ¾çÀÇ ¸Þ¸ð¸®¸¦ ¼Ò¸ðÇÒ ¼ö ÀÖ´Ù. ÀÌÁ¦ Java °³¹ßÀÚµéÀÌ XML À» ½ºÄµÇϴµ¥ ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ¼¼ ¹øÂ° API°¡ µîÀåÇÏ¿´´Ù. StAX (Streaming API for XML parse)°¡ ±×°ÍÀÌ´Ù.

SJSXP¶õ?

SJSXP(Sun Java Streaming XML Parser)´Â StAX¸¦ ºü¸¥ ¼Óµµ·Î ±¸ÇöÇÑ´Ù. ½ã¸¶ÀÌÅ©·Î½Ã½ºÅÛÁî¿Í Çù·ÂÇϰí ÀÖ´Â BEA Systems, XML-guru James Clark, Stefan Haustein, Aleksandr Slominski (XmlPull °³¹ßÀÚµé), ±×¸®°í JCPÀÇ ´Ù¸¥ ¸â¹öµéÀº JSR 173¸¦ ±¸ÇöÇÏ´Â °ÍÀ¸·Î½á StAX¸¦ °³¹ßÇÏ¿´´Ù. StAXÀº °øÀ¯ ÀÎÅÍÆäÀ̽ºµé¿¡ ±â¹ÝÇÏ´Â, ÆÄ¼­(parser) µ¶¸³ÀûÀÎ Java APIÀÌ´Ù.

SJSXP´Â Java Web Services Developer Pack v1.5¿¡ Æ÷ÇԵǾîÀÖ´Ù. SJSXP¿¡ ´ëÇØ óÀ½À¸·Î ¾Ë¾ÆÂ÷¸±¸¸ÇÑ °ÍÀº À̰ÍÀÌ ½ºÆ®¸² API¿¡ ±â¹ÝÇÑ´Ù´Â °ÍÀÌ´Ù. Áï, °³¹ßÀÚ°¡ ¾î´À ÇÑ ³ëµå¿¡ Á¢±ÙÇϱâ À§ÇØ Àüü ¹®¼­¸¦ ÀÐÀ» Çʿ䰡 ¾ø´Ù. ¶ÇÇÑ, ÆÄ¼­¸¦ ½ÃÀÛÇÏ¿© ÆÄ¼­°¡ µ¥ÀÌÅ͸¦ À̺¥Æ® ¸®½º³Ê ¸Þ¼Òµå¿¡ "push"Çϵµ·Ï Çã¿ëÇÏ´Â ¹ýÄ¢À» µû¸£Áö ¾Ê´Â´Ù. ´ë½Å¿¡ SJSXP´Â "pull" ¸Þ¼Òµå¸¦ ±¸ÇöÇϸç, ÀÌ ¸Þ¼Òµå´Â Á¤·Ä Æ÷ÀÎÅ͸¦ ¹®¼­¿¡¼­ ÇöÀç ½ºÄµµÇ°í ÀÖ´Â ÁöÁ¡¿¡ À¯ÁöÇÑ´Ù. ÀÌ´Â Á¾Á¾ Ä¿¼­(cursor)¶ó°í ºÒ¸°´Ù. »ç¿ëÀÚ´Â ´Ü¼øÈ÷ Ä¿¼­°¡ ÇöÀç °¡¸®Å°°í ÀÖ´Â ³ëµå¿¡ ´ëÇÑ ÆÄ¼­¸¦ ¿äûÇÏ¸é µÈ´Ù.

XML ¹®¼­ ÆÄ½Ì¿¡ SJSXP ÀÌ¿ëÇϱâ

SJSXP¸¦ ÀÌ¿ëÇÏ¿© XML ¹®¼­¸¦ Àд °ÍÀº ¾ÆÁÖ ½±´Ù. ´ëºÎºÐÀÇ ÀÛ¾÷Àº javax.xml.stream.XMLStreamReader ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â ¿ÀºêÁ§Æ®¸¦ ÅëÇØ ÀÌ·ïÁø´Ù. ÀÌ ÀÎÅÍÆäÀ̽º´Â XML ¹®¼­ÀÇ Ã¹ ºÎºÐ¿¡¼­ ¸¶Áö¸·±îÁö À̵¿µÇ´Â Ä¿¼­¸¦ ³ªÅ¸³½´Ù. ¸î °¡Áö ¸í½ÉÇØ¾ßÇÒ °ÍÀÌ ÀÖ´Ù. Ä¿¼­´Â Ç×»ó ÇϳªÀÇ ¾ÆÀÌÅÛ(½ÃÀÛ ÅÂ±× ¿ä¼Ò, ÁøÇà ¸í·É, DTD ¼±¾ð µî)¸¸À» °¡¸®ÄÑ¾ß ÇÑ´Ù. ¶ÇÇÑ Ä¿¼­´Â Ç×»ó ¾ÕÀ¸·Î ¿òÁ÷¿©¾ß Çϸç (µÚ·Î ¿òÁ÷ÀÏ ¼ö ¾ø´Ù), ´ÙÀ½¿¡ ¹«¾ùÀÌ ³ªÅ¸³ª´ÂÁö ¹Ì¸® º¸±â¸¦ ½ÇÇàÇÒ ¼ö ¾ø´Ù. ´ÙÀ½ÀÇ ÄÚµå ¹ßÃé¿¡¼­ ÆÄÀϷκÎÅÍ XMLÀ» Àд XMLStreamReader¸¦ ¾òÀ» ¼ö ÀÖ´Ù.

   URL url = Class.forName("MyClassName").getResource(
           "sample.xml");            
   InputStream in = url.openStream();
   XMLInputFactory factory = XMLInputFactory.newInstance();
   XMLStreamReader parser = factory.createXMLStreamReader(in);

±× ÈÄ ´ÙÀ½ Äڵ带 ÀÌ¿ëÇÏ¿© XML ÆÄÀÏÀ» ¹Ýº¹ÇÒ ¼ö ÀÖ´Ù.

   while(parser.hasNext()) {
             
         eventType = parser.next();
         switch (eventType) {

              case START_ELEMENT:
              //  Do something
              break;
              case END_ELEMENT:
              //  Do something
              break;
              //  And so on ...
         }
     }

XMLStreamReaderÀÇ hasNext() ¸Þ¼Òµå´Â XML ÆÄÀÏ¿¡¼­ ¶Ç´Ù¸¥ À¯È¿ÇÑ ¾ÆÀÌÅÛÀÌ ÀÖ´ÂÁö È®ÀÎÇÑ´Ù. ¸¸¾à ÀÖ´Ù¸é, Ä¿¼­°¡ ´ÙÀ½ ¾ÆÀÌÅÛÀ¸·Î ³Ñ¾î°¡°ÔÇϱâ À§ÇØ next() ¸Þ¼Òµå¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. next() ¸Þ¼Òµå´Â ¸¸³ª°ÔµÇ´Â ¹®¹ý»ó »ý¼ºÀÚ(¾ÆÀÌÅÛ)ÀÇ Å¸ÀÔÀ» °¡¸®Å°´Â ÀÎÆ¼°Å Äڵ带 ¸®ÅÏÇÑ´Ù.

XMLInputStreamReader¿¡´Â ¸î °³ÀÇ get ¸Þ¼Òµå°¡ À־ Ä¿¼­°¡ °¡¸®Å°´Â XML ¾ÆÀÌÅÛÀÇ ³»¿ëÀ» ¾ò´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ù¹øÂ° ¸Þ¼Òµå´Â getEventType()ÀÌ´Ù:

   public int getEventType()

¸Þ¼Òµå´Â Ä¿¼­°¡ ÀÖ´Â °÷¿¡¼­ ÆÄ¼­°¡ ãÀº ¾ÆÀÌÅÛÀÇ Å¸ÀÔÀ» ½Äº°ÇÏ´Â integer Äڵ带 ¸®ÅÏÇÑ´Ù. next() ¸Þ¼Òµå¿¡ ÀÇÇØ ¸®ÅϵǴ °Í°ú °°Àº ÄÚµåÀÌ´Ù. ¾ÆÀÌÅÛÀº XMLInputStream »ó¼ö Áß Çϳª¿¡ ÀÇÇØ ½Äº°µÈ´Ù.

  XMLStreamConstants.START_DOCUMENT 
  XMLStreamConstants.END_DOCUMENT 
  XMLStreamConstants.START_ELEMENT 
  XMLStreamConstants.END_ELEMENT 
  XMLStreamConstants.ATTRIBUTE 
  XMLStreamConstants.CHARACTERS 
  XMLStreamConstants.CDATA 
  XMLStreamConstants.SPACE 
  XMLStreamConstants.COMMENT 
  XMLStreamConstants.DTD 
  XMLStreamConstants.START_ENTITY 
  XMLStreamConstants.END_ENTITY 
  XMLStreamConstants.ENTITY_DECLARATION 
  XMLStreamConstants.ENTITY_REFERENCE 
  XMLStreamConstants.NAMESPACE 
  XMLStreamConstants.NOTATION_DECLARATION 
  XMLStreamConstants.PROCESSING_INSTRUCTION 

¸¸¾à ¾ÆÀÌÅÛ¿¡ À̸§ÀÌ ÀÖ´Â °æ¿ì, getName()°ú getLocalName() ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© À̸§À» ¾òÀ» ¼ö ÀÖ´Ù. ÈÄÀÚ´Â ¾î¶² ´Ù¸¥ Á¤º¸(¿¹; È®ÀÎµÈ ³×ÀÓ½ºÆäÀ̽º°¡ ¾ø´Â ¿ä¼ÒÀÇ À̸§) ¾øÀÌ À̸§ ÀÚü¸¦ »êÃâÇÑ´Ù.

   public Qname getName()
   public String getLocalName()

¸¸¾à ´ç½ÅÀÌ ÇöÀç ¾ÆÀÌÅÛÀÇ ³×ÀÓ½ºÆäÀ̽º¸¦ ½Äº°ÇÏ°í ½Í´Ù¸é getNamespaceURI() ¸Þ¼Òµå¸¦ »ç¿ë ÇÒ ¼ö ÀÖ´Ù.

   public String getNamespaceURI()

¸¸¾à DTD ¼±¾ð ³»ÀÇ ÅØ½ºÆ®³ª ¿ä¼Ò ¾ÈÀÇ ÅØ½ºÆ® µî°ú °°Àº µ¿¹ÝµÇ´Â ÅØ½ºÆ®°¡ ÀÖÀ» ¶§¿¡´Â ´ÙÀ½ ¸Þ¼ÒµåµéÀ» »ç¿ëÇÏ¿© ¾òÀ» ¼ö ÀÖ´Ù.(ÈÄÀÚ´Â ¿ä¼Ò¸¦ À§ÇØ ´Üµ¶À¸·Î »ç¿ë µÉ ¼ö ÀÖ´Ù)

   public String getText()
   public String getElementText()

¸¸¾à ¿ä¼Ò°¡ ±×°Í°ú °ü°è µÇ´Â ¼Ó¼ºÀ» °¡Áø´Ù¸é getAttributeCount() ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© ÇöÀç ¿ä¼Ò°¡ °¡Áø ¼Ó¼ºµéÀÇ °¹¼ö¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ±× ÈÄ getAttributeName() ¿Í getAttributeValue() ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© °¢°¢ÀÇ Á¤º¸¸¦ °Ë»ö ÇÒ ¼ö ÀÖ´Ù.

   public int getAttributeCount()
   public Qname getAttributeName(int index)
   public String getAttributeValue(int index)

¸¸¾à ¼Ó¼ºÀÇ ·ÎÄà À̸§°ú ¿ä¼ÒÀÇ ³×ÀÓ½ºÆäÀ̽º URI¸¦ ¾È´Ù¸é, ¶ÇÇÑ ´ÙÀ½ÀÇ ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ¿© ¼Ó¼º°ªÀ» ¾òÀ» ¼ö ÀÖ´Ù.

   public String getAttributeValue(
     String elementNamespaceURI, String localAttributeName) 

ÃßÃøÇß°ÚÁö¸¸, ¸ðµç Á¢±ÙÀÚ ¸Þ¼Òµå°¡ ƯÁ¤ »óÅ¿¡ Àû¿ë°¡´ÉÇÑ °ÍÀÌ ¾Æ´Ï´Ù. ¿¹¸¦ µé¾î, ÇöÀç DTD¸¦ ÇÁ·Î¼¼½Ì ÁßÀ̶ó¸é getElementText()À» È£ÃâÇÒ ¼ö ¾ø´Ù. ¸¸¾à À̸¦ È£ÃâÇÑ´Ù¸é, ÆÄ¼­°¡ Ãæµ¹ÇÏ´Â À̺¥Æ® ŸÀÔÀ» ½Äº°Çß´Ù´Â XMLStreamExceptionÀ» ¾ò°Ô µÇ°Å³ª ¸Þ¼Òµå°¡ ½º½º·Î ³Î(null) °ªÀ» ¸®ÅÏÇÏ°Ô µÉ °ÍÀÌ´Ù.

XMLInputFactory Ŭ·¡½ºÀÇ setProperty() ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© ¸î °¡Áö ÆÄ¼­ ¼Ó¼ºÀ» ½ÃÀÛÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½Àº ÆÄ¼­¿Í ¸¶ÁÖÄ¡´Â ¿£Æ¼Æ¼ ·¹ÆÛ·±½º´Â ±³Ã¼µÉ °ÍÀ̶ó°í ÁöÁ¤ÇÑ´Ù.

   factory.setProperty(
     XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, 
       Boolean.TRUE);

ÆÄ¼­°¡ ¿ÜºÎ ¿£Æ¼Æ¼¸¦ Áö¿øÇÏ´Â °ÍÀ» ¸·±â À§ÇØ ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù.

   factory.setProperty(
     XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, 
       Boolean.FALSE);

ÆÄ¼­°¡ ³×ÀÓ½ºÆäÀ̽º¸¦ ¾Ë¾ÆÂ÷¸®°ÔÇϱâ À§ÇØ ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù.

   factory.setProperty(
     XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.TRUE);

SJSXPÀÇ ÇöÀç ¹öÀü¿¡¼­´Â ´ÙÀ½ÀÇ ¸í·ÉÀº Çã¿ëµÇÁö¸¸ ÆÄ¼­´Â È®ÀεÇÁö ¾Ê´Â´Ù´Â °ÍÀ» À¯ÀÇÇϱ⠹ٶõ´Ù.

   factory.setProperty(XMLInputFactory.IS_VALIDATING, 
     Boolean.TRUE);

¸¸¾à ÀÌ XMLInputFactory Ư¼ºµé Áß ¾î´À Çϳª¶óµµ °¡´ÉÇÏ°Ô µÈ´Ù¸é setXMLReporter() ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© ÆÄ¼­°¡ ¸¸³ª°ÔµÇ´Â ¿À·ù¸¦ Á¦¾îÇÒ ¼ö ÀÖ´Ù. ÆÄ¼­°¡ ¸¸³ª´Â ¿À·ùÀÇ Å¸ÀÔÀ» °¡Àå »¡¸® Á¤È®ÇÏ°Ô °áÁ¤ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº setXMLReporter() ¸Þ¼Òµå¿Í »óÈ£ ÀÛ¿ëÇÏ´Â À͸íÀÇ ÀÌ³Ê Å¬·¡½º¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ´Â ´ÙÀ½°ú °°´Ù.

   factory.setXMLReporter(new XMLReporter() {
     public void report(String message, String errorType,
       Object relatedInformation, Location location) {
         System.err.println("Error in " 
          + location.getLocationURI());
         System.err.println("at line " 
          + location.getLineNumber()
          + ", column " + location.getColumnNumber());
         System.err.println(message);
     }
   });

XML ¹®¼­ ÀÛ¼º¿¡ SJSXP »ç¿ëÇϱâ

XML °á°ú¸¦ ÀÛ¼ºÇÏ´Â °ÍÀº SJSXP¸¦ ÀÌ¿ëÇÏ¸é ½±´Ù. ÀÌ °æ¿ì, XMLStreamReader ÀÎÅÍÆäÀ̽º ´ë½Å¿¡ XMLStreamWriter ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. XMLStreamWriter ÀÎÅÍÆäÀ̽º´Â ÀÛ¼ºÇÏ´Â ¿ä¼Ò, ¼Ó¼º, ÄÚ¸àÆ®, ÅØ½ºÆ®¸¦ ºñ·ÔÇØ XML ¹®¼­ÀÇ ¸ðµç ºÎºÐÀ» ÀÛ¼ºÇϱâ À§ÇÑ Á÷Á¢ÀûÀÎ ¸Þ¼Òµå¸¦ Á¦°øÇÑ´Ù. ´ÙÀ½ÀÇ ¿¹Á¦¿¡¼­´Â ¾î¶»°Ô ÀÌ ÀÎÅÍÆäÀ̽º¸¦ ¾ò¾î¼­ XML ¹®¼­¸¦ ÀÛ¼ºÇϴµ¥ »ç¿ëÇÏ´ÂÁö º¸¿©ÁØ´Ù.

   XMLOutputFactory xof =  XMLOutputFactory.newInstance();
   XMLStreamWriter xtw = 
     xof.createXMLStreamWriter(new FileWriter("myFile"));

   xtw.writeComment(
     "all elements here are in the HTML namespace");
   xtw.writeStartDocument("utf-8","1.0");
   xtw.setPrefix("html", "http://www.w3.org/TR/REC-html40");
   xtw.writeStartElement(
     "http://www.w3.org/TR/REC-html40","html");
   xtw.writeNamespace(
     "html", "http://www.w3.org/TR/REC-html40");
   xtw.writeStartElement(
     "http://www.w3.org/TR/REC-html40","head");
   xtw.writeStartElement(
     "http://www.w3.org/TR/REC-html40","title");
   xtw.writeCharacters("Java Information");
   xtw.writeEndElement();
   xtw.writeEndElement();

   xtw.writeStartElement(
     "http://www.w3.org/TR/REC-html40","body");
   xtw.writeStartElement("http://www.w3.org/TR/REC-html40","p");
   xtw.writeCharacters("Java homepage is ");
   xtw.writeStartElement("http://www.w3.org/TR/REC-html40","a");
   xtw.writeAttribute("href","http://java.sun.com");
   xtw.writeCharacters("here");
   xtw.writeEndElement();
   xtw.writeEndElement();
   xtw.writeEndElement();
   xtw.writeEndElement();
   xtw.writeEndDocument();

   xtw.flush();
   xtw.close();

°¢ ¿ä¼Ò¸¦ ÀÛ¼ºÇÏ´Â °ÍÀÌ ³¡³ª¸é »ç¿ëÀÚ´Â ¶óÀÌÅÍ(writer)¸¦ ³¯·Áº¸³»°í ´Ý¾Æ¾ßÇÑ´Ù.

ÀÌÀüÀÇ ÄÚµå´Â ´ÙÀ½ÀÇ XML·Î °á°ú°¡ ³ªÅ¸³­´Ù.(¿©±â¼­´Â ½±°Ô ÀÐÀ» ¼ö ÀÖ°Ô ¶óÀÎ º°·Î ³ªÅ¸³»¾ú´Ù.)

   <!--all elements here are explicitly in the HTML namespace-->
   <?xml version="1.0" encoding="utf-8"?>
   <html:html xmlns:html="http://www.w3.org/TR/REC-html40">
   <html:head>
   <html:title>Java Information</html:title>
   </html:head>
   <html:body>
   <html:p>
   Java information is 
   <html:a href="http://frob.com">here</html:a>
   </html:p>
   </html:body>
   </html:html>

XML ¹®¼­ ÇÊÅ͸µ

¸¸¾à °¢°¢ÀÇ ¾ÆÀÌÅÛ Å¸ÀÔÀ» ½ºÄµÇÏ°í ½ÍÁö ¾Ê´Ù¸é µé¾î¿À´Â XML ¹®¼­¿¡ ´ëÇÑ ÇÊÅ͸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. À̸¦ À§Çؼ­´Â javax.xml.stream.StreamFilter ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϴ Ŭ·¡½º¸¦ »ý¼ºÇÑ´Ù. ÀÌ ÀÎÅÍÆäÀ̽º´Â ´ÜÁö accept() ¸Þ¼Òµå¸¸À¸·Î ±¸¼ºµÈ´Ù. ÀÌ ¸Þ¼Òµå´Â XMLStreamReader ¿ÀºêÁ§Æ®¸¦ Çã¿ëÇÏ°í ¿ø½Ã BooleanÀ» ¸®ÅÏÇÑ´Ù. StreamFilterÀÇ ÀϹÝÀûÀÎ ±¸ÇöÀº ´ÙÀ½°ú °°´Ù.

   public class MyStreamFilter implements StreamFilter {

       public boolean accept(XMLStreamReader reader) {
           if(!reader.isStartElement() && !reader.isEndElement())
               return false;
           else
               return true;
       }
   }

±× ´ÙÀ½À¸·Î XMLInputFactoryÀÇ createFilteredReader() ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© ÇÊÅ͸µµÈ ¸®´õ(reader)¸¦ »ý¼ºÇϰí À̸¦ ¿ø·¡ XML ½ºÆ®¸² ¸®´õ¿Í StreamFilter ±¸Çö¿¡ ¸ðµÎ Àü´ÞÇÑ´Ù. ´ÙÀ½°ú °°´Ù.

   factory.createFilteredReader(
     factory.createXMLStreamReader(in), new MyStreamFilter());

SJSXPÀÇ ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â Sun Java Streaming XML Parser release notes¸¦ Âü°íÇϱ⠹ٶõ´Ù.

Sun Java Streaming XML Parser ¿¹Á¦ ÄÚµå ±¸µ¿Çϱâ

  1. À̹ø Å×Å©ÆÁ¿¡ ´ëÇÑ »ùÇà ¾ÆÄ«À̺ê(ttfeb2005sjsxp.jar)¸¦ ´Ù¿î·ÎµåÇÑ´Ù.

  2. Java Web Services Developer Pack Downloads page¿¡¼­ Java WSDP 1.5¸¦ ´Ù¿î·Îµå, ¼³Ä¡ÇÑ´Ù.

  3. ¿¹Á¦ ¾ÐÃàÆÄÀÏÀ» ´Ù¿î·Îµå ¹ÞÀº µð·ºÅ丮¸¦ º¯°æÇϰí, ´ÙÀ½°ú °°ÀÌ »ùÇà ¾ÆÄ«À̺꿡 ´ëÇÑ JAR ÆÄÀÏÀÇ ¾ÐÃàÀ» Ǭ´Ù.
         jar xvf ttfeb2005sjsxp.jar
    
  4. »ç¿ëÀÚÀÇ classpath°¡ ttfeb2005sjsxp.jar¿Í jsr173_api.jar¸¦ Æ÷ÇÔÇϵµ·Ï ¼³Á¤ÇÑ´Ù. À̵éÀº Java WSDP 1.5 installationÀÇ sjsxp/lib µð·ºÅ丮¿¡ À§Ä¡Çϰí ÀÖ´Ù.

  5. SJSXPInput¸¦ ÄÄÆÄÀÏÇÏ°í ±¸µ¿ÇÑ´Ù.

    ´ÙÀ½ÀÇ °¢°¢ÀÇ XML ¾ÆÀÌÅÛ°ú À¯»çÇÑ ¿£Æ®¸®°¡ ³ªÅ¸³¯ °ÍÀÌ´Ù.
       Event Type (Code=11): DTD
       Without a Name
       With Text: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 
       Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-
       transitional.dtd">
      -----------------------------
    
  6. SJSXPOutput¸¦ ÄÄÆÄÀÏÇÏ°í ±¸µ¿ÇÑ´Ù. °á°ú´Â XMLOutputFile¶ó´Â À̸§ÀÇ ÆÄÀÏ¿¡ º¸³»Áö¸ç, À§ÀÇ °á°ú ¿¹Á¦¿¡ º¸¿©Áö´Â ¿ä¼ÒµéÀ» Æ÷ÇÔÇÒ °ÍÀÌ´Ù.
.
.
.

Reader Feedback

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

 

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

.
.


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

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

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

Sun Microsystems, Inc.
.
.