.
.
Core Java Technologies Technical Tips
.
2004³â 6¿ù 18ÀÏ    

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)¸¦ »ç¿ëÇÕ´Ï´Ù.

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

.µ¥ÀÌÅÍ ½ºÆ®·°Ãĸ¦ XML·Î º¯È¯Çϱâ
.¿£ÅÍÇÁ¶óÀÌÁî ºóÀÇ Å¸ÀÌ¸Ó ÀÎÅÍÆäÀ̽º »ç¿ëÇϱâ

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

ÀúÀÚ Mark Johnson

¿¹Á¦ÀÇ »ùÇà ¾ÆÄ«À̺긦 ´Ù¿î·Îµå ¹ÞÀ¸¼¼¿ä. ÄÁÅØ½ºÆ® ·çÆ®´Â ttmay2004ÀÌ°í »ùÇÃÄÚµåÀÇ »ç¿ë¹ýÀº index.html welcome file ¿¡¼­ º¸½Ç ¼ö ÀÖ½À´Ï´Ù. ÀÌ ÄÚµåÀÇ »ç¿ë¿¡ °üÇÑ ±ÇÇÑÀ̳ª Á¤º¸´Â license terms¸¦ Âü°íÇϽñ⠹ٶø´Ï´Ù.

.

µ¥ÀÌÅÍ ½ºÆ®·°Ãĸ¦ XML·Î º¯È¯Çϱâ

ÀÚ¹Ù Ç÷§ÆûÀº XML µ¥ÀÌÅÍ ½ºÆ®¸²À» ÆÄ½ÌÇÏ°í »ý¼ºÇϱâ À§ÇØ °­·ÂÇÑ API¸¦ Á¦°øÇÑ´Ù. XML½ºÆ®¸²À» ¸Þ¸ð¸®ÀÇ Document Object Model (DOM) Æ®¸®·Î ÆÄ½ÌÇϱâ À§ÇØ JAXP¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀº "Creating Parsers with JAXP."¸¦ Âü°íÇϱ⠹ٶõ´Ù. ¶ÇÇÑ DOM Æ®¸®¸¦ XML½ºÆ®¸²À¸·Î ¹Ù²Ù±â À§ÇØ java.xml.transform.Transformer ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀº "Transforming XML With XSL."¸¦ Âü°íÇÏÀÚ. ¸¸¾à ÀÌ·¯ÇÑ ³»¿ëÀ» ÀÌ¹Ì ¾Ë°í ÀÖ¾ú´Ù°í ÇÏ´õ¶óµµ ÄÚµåÀÇ ÀÏÁ¤ ºÎºÐ¸¸À» ÀÌÇØÇϰí ÀÖ¾ú´ø °ÍÀÌ ¾Æ´Ñ°¡? µ¥ÀÌÅ͸¦ Á÷Á¢ XML·Î ÀÛ¼ºÇØ º» ÀûÀÌ Àִ°¡?

À̹ø ±ÛÀº ÀÓÀÇÀÇ µ¥ÀÌÅÍ ½ºÆ®·°Ã³·ÎºÎÅÍ XMLÀ» »ý¼ºÇϱâ À§ÇØ ÀÚ¹Ù Ç÷§Æû¿¡¼­ Ç¥ÁØ XML Á¶ÀÛ ±â´ÉÀ» »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¼³¸íÇÑ´Ù. À̹ø ÆÁÀº JAXP ¿Í XSL º¯È¯¿¡ °üÇÑ ±âº» Áö½ÄÀ» °®Ãá °³¹ßÀÚµéÀ» ´ë»óÀ¸·Î ¼³¸íÇÏ°Ô µÉ °ÍÀ̸ç, µ¥ÀÌÅÍ ½ºÆ®·°Ã³¸¦ XML·Î º¯È¯Çϱâ À§ÇÑ ÇÁ·Î±×·¡¹Ö ±â¹ýÀÇ ¿¹Á¦¸¦ Á¦°øÇÑ´Ù. ÀÌ ¿¹Á¦´Â SQL ResultSet °´Ã¼ÀÇ XML·ÎÀÇ º¯È¯À» º¸¿©ÁØ´Ù. ÇÏÁö¸¸ ¾î¶°ÇÑ µ¥ÀÌÅÍ ½ºÆ®·°ÃÄÀÇ °æ¿ì¶óµµ ÀÌ¿Í µ¿ÀÏÇÑ ±â¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

Println »ç¿ëÀÇ À§Ç輺

¸¸¾à µ¥ÀÌÅͰ¡ ÀÌ¹Ì ÆÄÀÏÀ̳ª ½ºÆ®¸²À¸·Î XML·Î ÀÛ¼ºµÇ¾ú°Å³ª ¸Þ¸ð¸®»ó¿¡ DOMÀ¸·Î ÀÛ¼ºµÇ¾ú´Ù¸é XMLÀ» ÆÄ½ÌÇÏ°í »ý¼ºÇϱâ À§ÇØ Ç¥ÁØ ÀÚ¹Ù APIÀ̸é ÃæºÐÇÏ´Ù. ÇÏÁö¸¸ °³¹ßÀÚµéÀº Á¾Á¾ ÀÓÀÇÀÇ µ¥ÀÌÅÍ ½ºÆ®·°ÃÄÀÇ »óŸ¦ XML·Î ÀÎÄÚµùÇØ¾ß ÇÒ ¶§°¡ ÀÖ´Ù. ÀÌ·¯ÇÑ µ¥ÀÌÅÍ ½ºÆ®·°ÃÄ´Â ´ëºÎºÐ DOM ÀÎÅÍÆäÀ̽º¸¦ °®°í ÀÖÁö ¾Ê´Ù. µû¶ó¼­ °³¹ßÀÚµéÀº Ç×»ó µ¥ÀÌÅÍ ½ºÆ®·°ÃÄ(ȤÀº ½ºÆ®·°ÃÄÀÇ ÀϺκÐ)¸¦ println ±¸¹®À» ÀÌ¿ëÇØ¼­ XML·Î ³ª¿­ÇÏ´Â ÀÛ¾÷À» Á÷Á¢ ÄÚµùÇØ¾ß ÇÑ´Ù.

ÀÌ·¯ÇÑ Á¢±Ù¹æ¹ýÀº ¸î °¡Áö ÀÌÀ¯·Î ÀÎÇÏ¿© ¹®Á¦Á¡ÀÌ ¸¹´Ù. À̸¦ ±¸Ã¼ÀûÀ¸·Î »ìÆìº¸¸é,

  • XML·Î º¯°æÇÏ´Â °ÍÀº ¸¹Àº println ±¸¹®À» ¼öÁ¤ÇØ¾ß ÇÏ´Â ÀÛ¾÷À» µ¿¹ÝÇÑ´Ù.
  • Ãâ·Â XMLÀ» À籸¼ºÇÏ´Â °ÍÀº ¾î·Á¿ï »Ó¸¸ ¾Æ´Ï¶ó ¿¡·¯¸¦ ¸¸µé¾î³»±â ½±´Ù.
  • ·ÎÁ÷ÀÌ º¹ÀâÇÏ´Ù¸é XMLÀ» Àß ÀÛ¼ºÇϱⰡ ¾î·Æ´Ù.
  • XML ÅØ½ºÆ® ½ºÆ®¸²ÀÌ ¾Æ´Ñ °÷¿¡¼­ °¡Á®¿Í¾ß ÇÒ µ¥ÀÌÅͰ¡ ÇÊ¿äÇÒ ¼ö ÀÖ´Ù.

Á» ´õ ³ªÀº Á¢±Ù¹æ¹ýÀº µ¥ÀÌÅÍ ½ºÆ®·°ÃÄÀÇ µ¥ÀÌÅ͸¦ DOM Æ®¸®·Î ÀÎÄÚµùÇÏ´Â °ÍÀÌ´Ù. ±×¸®°í´Â ¿øÇÏ´Â ¹æ½ÄÀ¸·Î µ¥ÀÌÅ͸¦ ÀçÁ¤¸®Çϱâ À§ÇØ XSLT¸¦ »ç¿ëÇÑ´Ù. XSLT½ºÅ¸ÀÏ½ÃÆ®¿¡ ±â¹ÝÇÑ Transformer °´Ã¼´Â DOMÀ» XMLÀ¸·Î ÀÎÄÚµùÇÏ´Â ÀÛ¾÷ ¾øÀÌ DOM¿¡ ³ëµå¸¦ Ãß°¡, ºÐ·ù, Á¦°Å, º´ÇÕ, Á¶ÀÛÇÒ ¼ö°¡ ÀÖ´Ù. ±×·¯¸é Transformer´Â ÀÌ·¯ÇÑ º¯È¯ÀÇ °á°ú¸¦ ¾î¶°ÇÑ Çü½ÄÀÇ ÅØ½ºÆ® Æ÷¸ËÀ¸·Îµµ ÀüȯÇÒ ¼ö°¡ ÀÖ´Ù.

ÀÌ¿Í °°Àº Á¢±Ù ¹æ¹ýÀº À§¿¡¼­ ³ª¿­ÇÑ ¹®Á¦Á¡µéÀ» ÇØ°áÇÒ ¼ö ÀÖ´Ù. ƯÈ÷,

  • Äڵ带 ¼öÁ¤ÇÏ´Â ´ë½Å ½ºÅ¸ÀÏ½ÃÆ®¸¦ º¯°æÇÏ´Â °Í¸¸À¸·Î XML ´ÙÅ¥¸ÕÆ® ŸÀÔÀ» »ý¼ºÇϰųª ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

  • ½ºÅ¸ÀÏ½ÃÆ®¸¦ ÀÌ¿ëÇØ¼­ Ãâ·Â Æ÷¸ËÀ» »ý¼ºÇϸé ÀÚ¹Ù ÄÚµå ¿ÜºÎ¿¡ XMLÀ» ±¸ÃàÇÒ ¼ö°¡ ÀÖ¾î À¯Áö¸¦ ½±°Ô ÇÒ ¼ö ÀÖ´Ù.

  • Transformer´Â ÀÚµ¿ÀûÀ¸·Î Ãâ·Â °ªÀÌ Àß ÀÛ¼ºµÇ¾ú´ÂÁö È®ÀÎÇÑ´Ù.

  • Transformer´Â XML»Ó¸¸ ¾Æ´Ï¶ó ´Ù¸¥ ¸¹Àº Çü½ÄÀÇ Ãâ·Â °ªÀ» »ý¼ºÇÒ ¼ö ÀÖ´Ù.

±×·¸´Ù¸é ¹®Á¦´Â ÀÓÀÇÀÇ µ¥ÀÌÅÍ ½ºÆ®·°ÃÄ¿¡¼­ DOMÆ®¸®¸¦ ¾î¶»°Ô »ý¼ºÇÏ´Â °ÍÀ̳ÄÇÏ´Â °ÍÀÌ´Ù. ÀÌ ÆÁ¿¡¼­ ¼Ò°³µÇ´Â »ùÇà ÄÚµå´Â SQL ResultSet¸¦ DOM Æ®¸®·Î º¯È¯Çϱâ À§ÇØ Ç¥ÁØ Java XML APIs¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù. ±×¸®°í´Â ½ºÅ¸ÀÏ½ÃÆ®¸¦ »ç¿ëÇØ¼­ ±× °á°ú¸¦ XMLÀ̳ª HTML·Î º¯È¯ÇÑ´Ù. »ç¿ëÀÚ °íÀ¯ÀÇ µ¥ÀÌÅÍ ½ºÆ®·°Ãĸ¦ DOMÆ®¸®·Î ÀÎÄÚµùÇϱâ À§ÇØ µ¿ÀÏÇÑ ±â¹ýÀ» »ç¿ëÇÒ ¼öµµ ÀÖ´Ù.

°¡Â¥ ÆÄ¼­ ÀÌ¿ëÇϱâ

»ùÇà ÄÚµå´Â May2004Servlet ¼­ºí¸´À» Æ÷ÇÔÇÑ´Ù. ÀÌ ¼­ºí¸´Àº ÀÓÀÇÀÇ SQLÄõ¸®¸¦ ½ÇÇàÇÏ°í ±× °á°ú¸¦ DOMÆ®¸®·Î º¯È¯Çϸç, XMLÇü½ÄÀ¸·Î ±× °á°ú¸¦ ÀÛ¼ºÇÏ´Â getXML¸Þ¼Òµå¸¦ °®´Â´Ù. ¶ÇÇÑ SQL ResultSet¸¦ ¹Þ¾Æ¼­ À̸¦ XML·Î º¯È¯ÇÏ´Â resultSetToXML¸Þ¼Òµåµµ °®´Â´Ù.

resultSetToXML°¡ ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö¸¦ ÀÌÇØÇϱâ À§Çؼ­´Â DOM ÆÄ¼­ÀÇ ÀÛµ¿ ¿ø¸®¸¦ ¹Ýµå½Ã ¸ÕÀú ÀÌÇØÇØ¾ß ÇÑ´Ù. ´ëºÎºÐÀÇ DOM ÆÄ¼­´Â XML ¼Ò½º ½ºÆ®¸²À» ½ºÄµÇϱâ À§Çؼ­ SAX ÆÄ¼­¸¦ »ç¿ëÇÑ´Ù. SAX ÆÄ¼­´Â XMl ÀÔ·Â ÅØ½ºÆ®¸¦ ½ºÄµÇϰí ű×ÀÇ ½ÃÀÛÀ̳ª ³¡Á¡ ȤÀº ¾ÖÆ®¸®ºäÆ®ÀÇ ÃâÇö µî ƯÁ¤ ´Ü¾î¸¦ ¸¸³µÀ» ¶§ ¸®½º³Ê¿¡°Ô À̺¥Æ®¸¦ º¸³½´Ù.

DOM ÆÄ¼­´Â ÀÏ·ÃÀÇ SAX ÆÄ¼­ Äݹ鿡 ´ëÇÑ ÀÀ´äÀ¸·Î DOM Æ®¸®¸¦ ±¸ÃàÇÏ´Â ÄÝ¹é ¸Þ¼Òµå¸¦ Á¤ÀÇÇÑ´Ù. »ùÇà Äڵ忡¼­´Â DOM ÆÄ¼­°¡ ½ÇÁ¦·Î´Â µ¥ÀÌÅÍ ½ºÆ®·°Ãĸ¦ ºÐ¼®ÇÔ¿¡µµ ºÒ±¸Çϰí À̰ÍÀÌ ÅØ½ºÆ®¸¦ ½ºÄ³´×ÇÏ´Â °Íó·³ ÇൿÇÏ¿© DOM ÆÄ¼­¸¦ ¼ÓÀδÙ.

ÄÁ¼ÁÀº óÀ½¿¡´Â Á¶±Ý ÀÌÇØÇϱ⠾î·Á¿ï ¼ö ÀÖ´Ù. ´ëºÎºÐÀÇ °æ¿ì °³¹ßÀÚµéÀº ÇÁ·¹ÀÓ¿÷ À̺¥Æ®¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î ÄÝ¹é ¸Þ¼Òµå¿Í ÇÁ·¹ÀÓ¿÷ ÄÝÀ» Á¤ÀÇÇÑ´Ù. ÇÏÁö¸¸ ÀÌ ¿¹Á¦ÀÇ »ùÇÃÄڵ忡¼­´Â ¹Ý´ë·Î ÀÛµ¿ÇÑ´Ù. ÄÝ¹é ±â´ÉÀ» ÀÛ¼ºÇÏ´Â ´ë½Å ÄÚµå´Â DOM ÆÄ¼­¿¡ ÀÇÇØ Á¦°øµÇ´Â ÄÝ¹é ¸Å¼Òµå¸¦ È£ÃâÇϰí, DOM ÆÄ¼­´Â Æ®¸®¸¦ ±¸ÃàÇÑ´Ù. ´ÙÀ½°ú °°ÀÌ È£ÃâÀ» °£´ÜÇÏ°Ô »ý¼ºÇÏ´Â parse ¸Þ¼Òµå¸¦ °¡Á¤Çغ¸ÀÚ.

  startDocument();
  startElement("A");
  startElement("B");
  endElement("B");
  endElement("A");
  endDocument();

À§¿Í °°Àº ÀÏ·ÃÀÇ À̺¥Æ®¿¡¼­ DOMÆÄ¼­´Â ´ÙÀ½°ú °°Àº XML ´ÙÅ¥¸ÕÆ®¿¡ ÀÀ´äÇÏ´Â DOM Æ®¸®¸¦ »ý¼ºÇÑ´Ù.

  <?xml version="1.0" encoding="utf-8"?>
  <a><b/></a>

µû¶ó¼­, µ¥ÀÌÅÍÀÇ DOM Æ®¸®¸¦ ±¸ÃàÇ϶ó´Â ¸í·ÉÀ» DOM ÆÄ¼­¿¡ ÇϰíÀÚ ÇÑ´Ù¸é, µ¥ÀÌÅÍ ½ºÆ®·°ÃÄ´Â ºÐ¼®ÇÏÁö¸¸ SAX ÆÄ¼­ÀÇ Çü½ÄÀ» ÇÑ °¡Â¥ SAX ÆÄ¼­ Ŭ·¡½º¸¦ Çϳª ÀÛ¼ºÇϱ⸸ ÇÏ¸é µÈ´Ù. ±×¸®°í ³ª¼­, °¡Â¥ ÆÄ¼­ Ŭ·¡½º¸¦ DocumentBuilder¿¡ º¸¿©ÁÖÀÚ. DocumentBuilder´Â »ç¿ëÀÚ¸¦ À§ÇØ DOMÀ» ±¸ÃàÇÏ°Ô µÉ °ÍÀÌ´Ù. ±×·¯¸é DOMÀº XML¿¡ ¿­°ÅµÇ°Å³ª ȤÀº ´Ù¸¥ »ç¿ëÀ» À§ÇØ º¯È¯µÇ°Ô µÈ´Ù.

ÀÓÀÇÀÇ µ¥ÀÌÅͽºÆ®·°Ãĸ¦ XML·Î º¯È¯Çϱâ À§ÇØ Transformer¸¦ ¼³Á¤ÇÏ´Â ¹æ¹ýÀ» »ìÆìº¸ÀÚ.

¼Ò½º ÄÚµå

ResultSet¸¦ XML·Î º¯È¯ÇÏ´Â resultSetToXML ¸Þ¼Òµå ³»ÀÇ Äڵ带 º¸ÀÚ.

   protected void resultSetToXML(OutputStream out,
                                 ResultSet rs,
                                 String stylesheet)
      throws IOException, ServletException {

      // Create reader and source objects
      SqlXMLReader sxreader = new SqlXMLReader();
      SqlInputSource sis = new SqlInputSource(rs);

ÀÌ ÄÚµå´Â »õ·Î¿î µÎ°³ÀÇ Å¬·¡½º SqlXMLReader¿Í SqlInputSource¸¦ Á¤ÀÇÇϰí ÀÖ´Ù. SqlXMLReader Ŭ·¡½º´Â SAX ÆÄ¼­¸¦ À§ÇÑ XML ¸®´õÀÌ´Ù. (¿Ö³ÄÇϸé SqlXMLReaderÀÌ XMLReader¸¦ ±¸ÇöÇϱ⠶§¹®ÀÌ´Ù.) SqlInputSourceŬ·¡½º´Â XML ¸®´õ¸¦ »ç¿ëÇϱâ À§Çؼ­ ResultSet°´Ã¼ÀÇ º¹»çº»À» Æ÷ÇÔÇϰí ÀÖ´Ù. SqlXMLReaderÀÇ ÀÛµ¿¿ø¸®¸¦ »ìÆìº¸ÀÚ. resultSetToXMLÀÇ ´ÙÀ½ 2ÁÙÀÇ ÄÚµå´Â Ãâ·Â°ªÀ¸·Î DOMÆ®¸®¸¦ »ý¼ºÇϱâ À§ÇØ ÆÄ¼­¸¦ ¼³Á¤ÇÑ´Ù.

      // Create SAX source and StreamResult for transform
      SAXSource source = new SAXSource(sxreader, sis);
      StreamResult result = new StreamResult(out);

À§ÀÇ ÄÚµå´Â XML ¸®´õ (SqlXMLReader)¸¦ InputSource (SqlInputSource)¿Í °áÇÕ½ÃŰ´Â SAXSource °´Ã¼¸¦ »ý¼ºÇÑ´Ù. ¶ÇÇÑ ÀÌ ÄÚµå´Â XSLT Transformer °¡ XML ½ºÆ®¸²À¸·Î °á°ú °ªÀ» »ý¼º½Ã۱â À§ÇØ »ç¿ëÇÏ´Â StreamResult¸¦ »ý¼ºÇÑ´Ù.

ÄÚµåÀÇ ÀÌ ½ÃÁ¡¿¡¼­ ½ÇÁ¦·Î º¯È¯ÀÌ ÀϾ´Â µ¥ÀÌÅÍ´Â ¾ø´Ù. ´ë½Å ¸®´õÀÇ ´ÙÀ½ ºÎºÐÀº XML ¼Ò½º¸¦ ÀÐ¾î µéÀ̱â À§ÇÑ Transformer °´Ã¼¸¦ ¼³Á¤ÇÏ°í °á°ú°ªÀ» ½ºÆ®¸²À¸·Î º¯È¯ÇÑ´Ù.

      // Perform XSLT transform to get results. 
      // If "stylesheet" is NULL, then use identity 
      // transform. Otherwise, parse stylesheet and 
      // build transformer for it.
      try {
         // Create XSLT transformer
         TransformerFactory tf = 
                 TransformerFactory.newInstance();
         Transformer t;

         if (stylesheet == null) {
            t = tf.newTransformer();
         } else {
            // Read XSL stylesheet from app archive 
            // and wrap it as a StreamSource. Then use 
            // it to construct a transformer.
            InputStream xslstream = 
                    _config.getServletContext().
               getResourceAsStream(stylesheet);
            StreamSource xslsource = 
                    new StreamSource(xslstream);
            t = tf.newTransformer(xslsource);
         }

         // Do transform
         t.transform(source, result);
      }

ÀÌ ÄÚµå´Â ¸ÕÀú ÆÑÅ丮 ÀÎÅÍÆäÀ̽ºÀÎ newInstance ¸Þ¼Òµå·ÎºÎÅÍ »õ·Î¿î TransformerFactory¸¦ ¹Þ´Â´Ù. ÀÌ ¸Þ¼Òµå´Â ¾ÖÇø®ÄÉÀÌ¼Ç ¾ÆÄ«À̺ê(WAR file)ÀÇ °æ·Î·Î ½ºÅ¸ÀÏ½ÃÆ®ÀÇ À̸§À» XSLT ½ºÅ¸ÀÏ½ÃÆ®·Î ¹ø¿ªÇÑ´Ù. ±×¸®°í ³ª¼­ ¸Þ¼Òµå´Â InputStreamÀ¸·Î ½ºÅ¸ÀÏ½ÃÆ®ÀÇ ³»¿ëÀ» ¹Þ°í ÀÌ ½ºÅ¸ÀÏ½ÃÆ® ³»¿ë¿¡ ±â¹ÝÇÏ¿© Transformer¸¦ Çü¼ºÇÑ´Ù. ¸¸¾à ½ºÅ¸ÀÏ½ÃÆ®°¡ null°ªÀ» °®´Â´Ù¸é µðÆúÆ® identity transformer¸¦ »ý¼ºÇÑ´Ù. identity transformer´Â DOMÀ» ´Ù¸¥ ÇüÅ·Πº¯È¯ÇÏÁö ¾Ê°í¼­µµ ÀÔ·Â DOMÆ®¸®¸¦ °á°ú°ª(ÀÌ °æ¿ì¿¡´Â XML½ºÆ®¸²)À¸·Î °£´ÜÇÏ°Ô º¯È¯ÇÒ ¼ö ÀÖ´Ù.

¸¶Áö¸· ¶óÀÎÀ» º¸¸é À̸¦ ¾Ë ¼ö ÀÖ´Ù.

         // Do transform
         t.transform(source, result);

ÀÌ ÄÚµå´Â transformer¿¡°Ô SAXSource(SAXSource ´Â ResultSet ·ÎºÎÅÍ À̺¥Æ®¸¦ ¸¸µé¾î³»´Â, ÀÌ¹Ì »ý¼ºµÈ ¹Ù ÀÖ´Â ¸Þ¼ÒµåÀÌ´Ù.)¸¦ ÀÐ¾î µéÀ̵µ·Ï ¸í·ÉÇϰí, ÀÔ·Â °ªÀ» º¯È¯Çϸç, ÀÌÀÇ °á°ú°ªÀ» StreamResult °´Ã¼¿¡ ÀÛ¼ºÇÑ´Ù.

±×·¸´Ù¸é DocumentBuilder ¿Í DOM Æ®¸®´Â ¾î¶°ÇѰ¡? Transformer´Â ÀÚüÀûÀ¸·Î DOMÆ®¸®¸¦ ±¸ÃàÇÑ´Ù. ¶ÇÇÑ DOM Æ®¸®¸¦ »ý¼ºÇϱâ À§ÇØ °ø±ÞµÇ´Â SAXSource °´Ã¼¸¦ »ç¿ëÇÏ¿© ÇÊ¿äÇÏ´Ù¸é º¯È¯À» ¼öÇàÇϸç StreamResult¿¡ DOM Æ®¸®ÀÇ °á°ú°ªÀ» ¿­°ÅÇÏ°Ô µÈ´Ù.

ÀÌÁ¦ ÆÄ¼­¿Í transformer°¡ ¾î¶»°Ô ÇÔ²² ÀÛµ¿ÇÏ´ÂÁö ´ë°­ÀÇ ¾Æ¿ô¶óÀÎÀ» ÀÌÇØÇÏ¿´´Ù. ±×·¸´Ù¸é ResultSet·ÎºÎÅÍ SAX À̺¥Æ®¸¦ »ý¼ºÇϵµ·Ï ÆÄ¼­¿¡°Ô ¸í·ÉÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ.

ResultSet·ÎºÎÅÍ µ¥ÀÌÅÍ Àбâ

SAX ÆÄ¼­ÀÇ Ç¥ÁØ ÀÎÅÍÆäÀ̽º´Â(SAX2ÀÇ °æ¿ì¿¡´Â ÀÎÅÍÆäÀ̽ºÀÇ µÎ¹øÂ° ¹öÀüÀ» Âü°í)´Â XMLReader¶ó°í ºÒ¸°´Ù. ÇÏÁö¸¸ ÀÌ·¯ÇÑ À̸§¿¡µµ ºÒ±¸Çϰí, XMLReader´Â java.io.Reader¸¦ »ó¼ÓÇÏÁö ¾Ê´Â´Ù. ´ë½Å, DOM ÆÄ¼­°¡ ±×°ÍÀÇ µ¥ÀÌÅÍ ¼Ò½º·ÎºÎÅÍ ÄݹéÀ» ¹Þ±â À§ÇØ »ç¿ëÇÏ´Â ¸Þ¼Òµå¸¦ Á¤ÀÇÇÑ´Ù.

ÀÌ¹Ì ¾ð±ÞÇßµíÀÌ, ResultSet·ÎºÎÅÍ À̺¥Æ®¸¦ »ý¼ºÇϴ Ŭ·¡½º´Â SqlXMLReaderÀÌ´Ù. SqlXMLReaderÀÇ ¸Þ¼ÒµåµéÀº À̹ø ¿¹Á¦¿Í º° »ó°üÀÌ ¾ø±â ¶§¹®¿¡ ´ëºÎºÐÀÌ ºñ¾îÀÖ´Ù. ¸Þ¼Òµå ÆÄ½º(Method parse)°¡ »ç½Ç ´ëºÎºÐÀÇ ÀÏÀ» ÇÑ´Ù.

parse ¸Þ¼ÒµåÀÇ Ã¹¹øÂ° ºÎºÐÀ» ºÐ¼®Çϱâ À§ÇØ ResultSet¸¦ ¹Þ´Â´Ù.

   // Get result set from SqlInputSource.
   SqlInputSource sis = (SqlInputSource)is;
   ResultSet rs = sis.getResultSet();

DOM ÆÄ¼­°¡ ÀÌ ¸Þ¼Òµå¸¦ ¹Þ±â À§ÇØ ContentHandler¸¦ Á¦°øÇÑ ÀûÀÌ ¾ø´Ù¸é, ÀÌ´Â ¿¡·¯ÀÌ´Ù.

   if (_handler == null) {
   throw new SAXException("No XML ContentHandler");
   }

À§ÀÇ ÄÚµå´Â °á°ú XMLÀÇ ÅÂ±×¸í¿¡ ResultSetÀÇ Ä÷³ À̸§À» »ç¿ëÇÑ´Ù.

   // Get information about result set
   ResultSetMetaData md = rs.getMetaData();
   int nColumns = md.getColumnCount();
   int iRow = 0;

ÀÌ ÄÚµå´Â ÆÄ¼­¿¡°Ô ´ÙÅ¥¸ÕÆ®°¡ ½ÃÀ۵ǰí ÀÖ´Ù°í ¾Ë·ÁÁÖ±â À§ÇØ ÄݹéÀ» ¼öÇàÇϰí, ű׸í "result"¸¦ °®´Â ´ÙÅ¥¸ÕÆ®ÀÇ Ã¹¹øÂ° ±¸¼º¿ä¼ÒÀÎ ´ÙÅ¥¸ÕÆ® ·çÆ®¸¦ ½ÃÀÛÇÑ´Ù.

   // Send startDocument and startElement events 
   // to handler
   _handler.startDocument();
   _handler.startElement(uri, docroot, docroot, attrs);

±×·¯¸é ÄÚµå´Â ű׸í°ú ÅØ½ºÆ®, °¡µ¶¼ºÀ» À§ÇÑ ºóÄ­µéÀ» Ãâ·ÂÇϸ鼭 °á°ú ¼¼Æ®¸¦ ¹Ýº¹ÇÏ¿© Ãâ·ÂÇÑ´Ù. °¢ ÇàÀ» À§ÇØ "row"¶ó°í ºÒ¸®´Â ¿ä¼Ò°¡ »ý¼ºµÇ°í, °¢ ÇàÀÇ ¿­À» À§Çؼ­´Â ű׸íÀ» ¿­ÀÇ À̸§À¸·Î °®´Â ¿ä¼Ò°¡ »ý¼ºµÈ´Ù.

   while (rs.next()) {

      // Output "row" tag
      _handler.startElement(uri, "row", "row", attrs);
      outputIgnorableWhitespace("\n");

      String s;
      for (int i = 1; i <= nColumns; i++) {
         String tag = md.getColumnName(i);
         _handler.startElement(uri, tag, tag, attrs);
         s = rs.getString(i);
         if (s == null) {
            s = "";
         }
         outputString(s);
         _handler.endElement(uri, tag, tag);
         outputIgnorableWhitespace("\n");
      }
      _handler.endElement(uri, "row", "row");
      outputIgnorableWhitespace("\n");
   }

¸¶Áö¸·À¸·Î, ÀÌ ÄÚµå´Â ÆÄ¼­¿¡°Ô ´ÙÅ¥¸ÕÆ® ·çÆ®¸¦ ´Ý°í ´ÙÅ¥¸ÕÆ®¸¦ ³¡³¾ °ÍÀ» ¸í·ÉÇÑ´Ù.

   _handler.endElement(uri, docroot, docroot);
   outputIgnorableWhitespace("\n");
   _handler.endDocument();

»ùÇà Äڵ忡¼­´Â Áö¸® Á¤º¸ÀÇ »ùÇà µ¥ÀÌÅͺ£À̽º¸¦ ÀÌ¿ëÇϰí ÀÖ´Ù. »ç¿ëÀÚ´Â ÀÎÅÍÆäÀ̽º¿¡ Äõ¸®¸¦ º¸³»±â À§ÇØ »ùÇà ÄÚµåÀÇ ¸ÞÀÎ ÆäÀÌÁö¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.

¼­ºí¸´Àº ´ÙÀ½ XML ´ÙÅ¥¸ÕÆ®¸¦ »ý¼ºÇϱâ À§ÇØ resultSetToXMLÀ» »ç¿ëÇÑ´Ù.

   <?xml version="1.0" encoding="UTF-8"?>
   <results><row>
   <COUNTRY_COUNT>231</COUNTRY_COUNT>
   </row>
   </results>

°á°ú°¡ XMLÇü½ÄÀ¸·Î º¸ÀÌÁö ¾Ê´Â´Ù¸é ºê¶ó¿ìÀú¿¡¼­ View Source¸¦ ¼±ÅÃÇÏ¿© ½ÇÁ¦ XMLÅØ½ºÆ®¸¦ º¼ ¼ö ÀÖ´Ù.

ºñ·Ï ÀÌ ¿¹Á¦°¡ ƯÁ¤ÇÏ°Ô ResultSetÀ¸·ÎºÎÅÍ XML ´ÙÅ¥¸ÕÆ®¸¦ »ý¼ºÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁÖ°í ÀÖ±â´Â ÇÏÁö¸¸ »ç¿ëÀÚ °íÀ¯ÀÇ µ¥ÀÌÅÍ ½ºÆ®·°Ãĸ¦ XML·Î º¯È¯ÇÒ ¶§µµ ÀÌ¿Í µ¿ÀÏÇÑ ±â¹ýÀ» ÀÌ¿ëÇÒ ¼ö°¡ ÀÖ´Ù.

.
.

¿£ÅÍÇÁ¶óÀÌÁî ºóÀÇ Å¸ÀÌ¸Ó ÀÎÅÍÆäÀ̽º »ç¿ëÇϱâ

Enterprise JavaBeans (EJB) 2.1 ¸í¼¼¼­´Â ¿£ÅÍÆ¼ ºóÁî, ºñ»óÅ À¯Áö ¼¼¼Ç ºó(stateless session beans)°ú ¸Þ½ÃÁö µå¸®ºì ºó(message-driven beans)À» À§ÇÑ TimerÀÇ »õ·Î¿î ±â´ÉÀ» Á¤ÀÇÇϰí ÀÖ´Ù.(ŸÀ̸Ӵ »óÅ À¯Áö ¼¼¼Ç ºó(stateful session beans)¿¡¼­´Â ÀÌ¿ëÇÒ ¼ö ¾ø´Ù.) ŸÀ̸Ӵ ¾ÖÇø®ÄÉÀÌ¼Ç µðÀÚÀ̳ʵéÀÌ ±×µéÀÇ ¾ÖÇø®ÄÉÀ̼ǿ¡ ÀÌ½Ä °¡´ÉÇÑ ¹æ¹ýÀ¸·Î ½Ã°£¿¡ °üÇÑ ¼Ó¼º°ú ¿öÅ©Ç÷ο츦 Â¥ ³ÖÀ» ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.

Timer´Â Á¤ÇØÁø ½Ã°£ÀÌ ¸¸·áµÇ¾úÀ» ¶§ »ý¼ºµÇ´Â ºó¿¡ ¸ÂÃß¾î ÄݹéÀ» Çü¼ºÇÏ´Â EJB ÄÁÅ×À̳ʰ¡ °ü¸®ÇÏ´Â °´Ã¼ÀÌ´Ù. ŸÀ̸Ӵ ƯÁ¤ ½Ã°£ °£°ÝÀÌ °æ°úµÈ Èijª ƯÁ¤ ³¯Â¥³ª ½Ã°£ÀÌ ¸¸·áµÇ¾úÀ» ¶§ Çü¼ºµÉ ¼ö ÀÖ´Ù. ±×¸®°í ŸÀ̸Ӵ ´Ü Çѹø¸¸ ¸¸·áµÇ°Å³ª ȤÀº ÄݹéÀÌ Á¾·áµÉ ¶§±îÁö ÄݹéÀ» ÁÖ±âÀûÀ¸·Î ½ÇÇàÇϵµ·Ï ±¸¼ºµÉ ¼öµµ ÀÖ´Ù. °¢°¢ÀÇ ¿£ÅÍÇÁ¶óÀÌÁî ºóÀº ±¸ÇöÇÏ´Â Ç÷§ÆûÀÌ Çã¶ôÇÏ´Â ¼ö¸¸Å­ÀÇ Å¸À̸Ӹ¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. ¿£ÅÍÇÁ¶óÀÌÁî ºóÁî¿¡ ÀÇÇØ »ý¼ºµÈ ŸÀ̸Ӵ ±× ŸÀ̸Ӹ¦ »ý¼ºÇÑ Æ¯Á¤ ºó¿¡¸¸ ÀÛµ¿ÇÑ´Ù. ¹Ý¸é ¸Þ½ÃÁö µå¸®ºì ºó°ú ºñ»óÅ À¯Áö ¼¼¼Ç ºó¿¡ ÀÇÇØ »ý¼ºµÈ ŸÀ̸Ӵ ÀνºÅϽº°£¿¡ °øÀ¯¸¦ ÇÒ ¼ö°¡ Àִµ¥ ÀÌ´Â ÀÌ·¯ÇÑ Å¸ÀÔÀÇ ºóÁî°¡ Ŭ¶óÀÌ¾ðÆ®¿¡¼­ Á¢¼ÓÀÌ °¡´ÉÇÑ ¾ÆÀ̵§Æ¼Æ¼(client-accessible identity)¸¦ °®Áö ¾Ê±â ¶§¹®ÀÌ´Ù.

Timer ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÒ ¶§ÀÇ ÀåÁ¡À» ¸î °¡Áö »ìÆìº¸ÀÚ.

  • EJB ŸÀ̸Ӵ ¿µ¼ÓÀûÀÌ´Ù. ¼­¹ö°¡ ´Ù¿îµÇ°Å³ª ¹é¾÷µÇ´õ¶óµµ EJB ŸÀ̸Ӵ Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÑ´Ù.

  • EJB ŸÀ̸Ӵ Ʈ·£Àè¼ÇÀÌ °¡´ÉÇÏ´Ù. EJB ¼­¹ö¿¡¼­ ÄÁÅ×À̳ʰ¡ °ü¸®ÇÏ´Â Æ®·£Àè¼Ç ±â´ÉÀº ¸Å¿ì À¯¿ëÇÏ´Ù. ¿Ö³ÄÇϸé Java Timer service¸¦ »ç¿ëÇÏ¸é Æ®·£Àè¼ÇÀ» ÀÚüÀûÀ¸·Î ó¸®ÇÏ´Â °ÍÀÌ °¡´ÉÇϱ⠶§¹®ÀÌ´Ù.

  • EJB ŸÀ̸Ӵ ǥÁØÈ­µÇ¾î ÀÖ´Ù. ¼­¹ö°¡ EJB 2.1 ÀÌ»óÀÇ ¹öÀüÀ» µû¸¥´Ù¸é, Timer ÀÎÅÍÆäÀ̽º¸¦ Áö¿øÇÑ´Ù°í È®½ÅÇØµµ ÁÁ´Ù. UNIX cron°ú °°Àº OS±â¹ÝÀÇ Å¸ÀÌ¹Ö ¼Ö·ç¼ÇÀº »ç¿ëÀÚ ¾ÖÇø®ÄÉÀ̼ÇÀÇ Å¸°Ù Ç÷§Æû¿¡¼­ »ç¿ë°¡´ÉÇÒ ¼öµµ, ¾Æ´Ò ¼öµµ ÀÖ´Ù.

  • ŸÀ̸Ӱ¡ ¸¸·áµÇ¸é ±×°ÍÀÇ ejbTimeout ¸Þ¼Òµå´Â ¸ðµç EJB ÄÁÅ×ÀÌ³Ê ¼­ºñ½º¿¡ ¾×¼¼½º°¡ °¡´ÉÇÏ´Ù.

ÀÌ ±Û¿¡¼­ Á¦°øÇÏ´Â ¼Ò½ºÄÚµå´Â °ü°è ÀÖ´Â µ¥ÀÌÅͺ£À̽º¿¡¼­ ·Î±× Å×À̺íÀ» ÁÖ±âÀûÀ¸·Î Á¦°ÅÇÏ´Â ¼¼¼Ç ºóÀÎ LogCleanerÀÌ´Ù.

ŸÀÌ¸Ó ÀÎÅÍÆäÀ̽º(Timer Interface)

¿£ÅÍÇÁ¶óÀÌÁî ºóÀº TimedObject ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÑ´Ù°í ¼±¾ðÇÔÀ¸·Î½á Timer ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÏ°í »ç¿ëÇÏ°Ô µÈ´Ù. ÀÌ ÀÎÅÍÆäÀ̽º´Â ŸÀ̸Ӱ¡ ¸¸·áµÇ¾úÀ» ¶§ È£ÃâµÇ´Â ´ÜÀÏ ÄÝ¹é ¸Þ¼Òµå¸¦ °®´Â´Ù.

   void ejbTimeout(Timer timer)

¿£ÅÍÇÁ¶óÀÌÁî ºó Ŭ·¡½º´Â ¹Ýµå½Ã À§ÀÇ ¸Þ¼Òµå¸¦ Á¤ÀÇÇØ¾ß ÇÑ´Ù. ÀÌ ¸Þ¼Òµå´Â ºóÀÇ ÄÄÆ÷³ÍÆ® ÀÎÅÍÆäÀ̽º¿¡ ³ªÅ¸³ªÁö ¾Ê´Â ´ë½Å, ŸÀ̸Ӱ¡ ¸¸·áµÇ¾úÀ» ¶§ EJB ÄÁÅ×À̳ʿ¡ ÀÇÇØ È£ÃâµÈ´Ù.

¿£ÅÍÇÁ¶óÀÌÁî ºóÀº ¿©·¯ °³ÀÇ Å¸À̸Ӹ¦ »ý¼ºÇÒ ¼ö Àֱ⠶§¹®¿¡ ŸÀ̸Ӱ¡ ¸¸·áµÇ¸é ejbTimeout Äݹ鿡 ´ëÇÑ Àμö·Î ºó¿¡ ³Ñ°ÜÁú ¼ö ÀÖ´Ù. ¸¸¾à ºóÀÌ ¿©·¯ °³ÀÇ Å¸À̸Ӹ¦ »ç¿ëÇϰí ÀÖ´Ù¸é, ÄݹéÀÌ ÀϾÀ» ¶§ ºó¿¡ ÀÇÇØ À̵éÀÌ ±¸º°µÇ¾î¾ß ÇÑ´Ù.

»ùÇà ÄÚµåÀÎ May2004Servlet ³»ÀÇ ¼­ºí¸´Àº SERVLETLOGÀ̶ó ºÒ¸®´Â µ¥ÀÌÅͺ£À̽º Å×ÀÌºí ¾È¿¡¼­ ¹Þ´Â ¸ðµç ¿äûµéÀ» ±â·ÏÇÑ´Ù. À̶§ »ùÇà ÄÚµå´Â TimerBeanÀ̶ó ºÒ¸®´Â ¿£ÅÍÇÁ¶óÀÌÁî ºóÀ» Æ÷ÇÔÇϴµ¥, ÀÌ ¿£ÅÍÇÁ¶óÀÌÁî ºóÀº ·Î±×ÀÇ ³»¿ëÀ» ÁÖ±âÀûÀ¸·Î Á¦°ÅÇϵµ·Ï ±¸¼ºµÉ ¼ö ÀÖ´Ù. ºó Ŭ·¡½º´Â EJB ÄÁÅ×À̳ʷκÎÅÍ Å¸ÀÌ¸Ó À̺¥Æ®¸¦ »ý¼ºÇϰí ÀÌ¿¡ ÀÀ´äÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù.

ŸÀÌ¸Ó ºó ·ÎÄà ÀÎÅÍÆäÀ̽º(Timer Bean Local Interface)

TimerBeanÀÇ ¼Ò½º ÄÚµå´Â °£´ÜÇÏ´Ù. ±×°ÍÀÇ ÄÄÆ÷³ÍÆ® ÀÎÅÍÆäÀ̽º´Â ·ÎÄÃÀÌ°í ´ÙÀ½°ú °°Àº ¸Þ¼Òµå¸¦ Æ÷ÇÔÇÑ´Ù.

   public interface TimerLocal extends
       EJBLocalObject {
   public void start(TimerData data);
   public void stop(String timerName);
   public boolean isRunning(String timerName);
}  

start ¸Þ¼Òµå´Â ¸Å "secs" Ãʸ¶´Ù ·Î±×¸¦ Á¦°ÅÇϵµ·Ï ŸÀ̸ӿ¡ ¸í·ÉÇϰí, stop ¸Þ¼Òµå´Â ŸÀ̸Ӹ¦ ÁßÁö½ÃŲ´Ù. isRunning ¸Þ¼Òµå´Â Ŭ¸®³Ê°¡ ½ÇÇà ÁßÀÎÁö ¾Æ´ÑÁö¸¦ °¡¸£Å²´Ù. »ùÇà ¼­ºí¸´Àº ŸÀ̸Ӹ¦ ½ÃÀÛ, ÁßÁö, ¿äûÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù. ¹°·Ð, ½ÇÁ¦ ½Ã½ºÅÛ¿¡¼­ ÀÌ·¯ÇÑ ·Î±× Ŭ¸®³Ê´Â JMX Mbeans¸¦ »ç¿ëÇÏ´Â ¾ÖÇø®ÄÉÀÌ¼Ç ¸Å´ÏÁö¸ÕÆ® Åø¿¡ ÀÇÇØ ½ÃÀ۵ǰí ÁßÁöµÈ´Ù. ÇÏÁö¸¸ »ùÇà Äڵ忡¼­´Â ´Ü¼ø¼º°ú ¸íÈ®¼ºÀ» À§ÇØ ¼­ºí¸´À» ÀÌ¿ëÇϰí ÀÖ´Ù.

TimerBeanÀº ¿©·¯ °¡Áö ŸÀ̸Ӹ¦ °¢°¢ ´Ù¸¥ À̸§À» »ç¿ëÇÏ¿© Çѹø¿¡ °ü¸®ÇÒ ¼ö ÀÖ´Ù. TimerBean.startÀÇ Ã¹¹øÂ° Àμö´Â TimerData °´Ã¼Àε¥ ÀÌ´Â TimerBean¸¦ ÀÌ¿ëÇØ¼­ Á¤ÀǵȴÙ. ÀÌ °´Ã¼¸¦ Á¤ÀÇÇÒ ¶§´Â ŸÀ̸ÓÀÇ À̸§°ú ŸÀ̸ÓÀÇ ±â°£(milliseconds), ±×¸®°í ÇÁ·Î±×·¡¸ÓÀÇ »ç¿ëÆíÀǸ¦ À§ÇÑ "data" Object¸¦ Æ÷ÇÔÇÑ´Ù. ÁÖ¾îÁø À̸§À¸·Î ŸÀ̸Ӱ¡ ½ÃÀ۵ǰí, Á¤ÁöµÇ°í ȤÀº ÁöÁ¤µÈ ½Ã°£ÀÌ ¸¸·áµÉ ¶§¸¶´Ù, TimerBeanÀº ±× ŸÀ̸ÓÀÇ TimerData °´Ã¼ÀÇ ÇØ´ç ¸Þ¼Òµå(onStart, onStop, ȤÀº onTimeout)¿¡ ÄݹéÀ» ¸¸µç´Ù.

ŸÀÌ¸Ó¿Í °ü·ÃµÈ ±â´ÉÀ» ¼öÇàÇϱâ À§Çؼ­ TTimerDataÀÇ ¼­ºêŬ·¡½º¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î »ùÇà ÇÁ·Î±×·¥¿¡¼­´Â ŸÀ̸ÓÀÇ ½Ã°£ÀÇ ¸¸·áµÇ¾úÀ» ¶§ Web Ƽ¾îÀÇ ¼­ºí¸´¿¡ ÄݹéÀ» ¸¸µêÀ¸·Î½á ·Î±×¸¦ Á¦°ÅÇÏ´Â TLogCleanerTimerData °´Ã¼¸¦ Á¤ÀÇÇÑ´Ù.

ŸÀÌ¸Ó ºó Ŭ·¡½º(Timer Bean Class)

Timer BeanÀ» À§ÇÑ Å¬·¡½º Á¤ÀǸ¦ º¸¸é ºóÀÌ ¼¼¼Ç ºóÀ̰í ŸÀ̸Ӹ¦ »ç¿ëÇϰí ÀÖ´Ù´Â »ç½ÇÀ» ¾Ë ¼ö ÀÖ´Ù.

   public class TimerBean
      implements SessionBean, TimedObject {

ºóÀÇ start ¸Þ¼Òµå´Â ¼­ºí¸´ ÄÁÅØ½ºÆ® ¸Þ¼ÒµåÀÎ getTimerService ¸¦ »ç¿ëÇÏ¿© TimerService ¿¡ °üÇÑ ·¹ÆÛ·±½º¸¦ ¹Þ´Â´Ù. TimerService´Â ºóÁî°¡ ŸÀ̸ӵéÀ» »ý¼ºÇϰí Á¶ÀÛÇϱâ À§ÇØ »ç¿ëÇÏ´Â ÄÁÅ×ÀÌ³Ê µµ±¸ÀÌ´Ù. start ¸Þ¼Òµå´Â ¸Å "secs" Ãʸ¶´Ù Çѹø¾¿ ÀÛµ¿Çϴ ŸÀ̸Ӹ¦ »ý¼ºÇÑ´Ù. ´Ù¸¥ Timer´Â ¿ÀÁ÷ Çѹø¸¸ ÀÛµ¿Çϴ ŸÀ̸Ӹ¦ »ý¼ºÇÏ´Â TimerServiceÀÇ ¸Þ¼ÒµåµéÀ» »ý¼ºÇÑ´Ù.

   public void start(TimerData data) {

      long ms = data.getMs();

      try {
         TimerService ts = _context.getTimerService();

         // Execute after "secs" seconds, and then 
         // every "secs" seconds thereafter.
         Timer timer = ts.createTimer(ms, ms, data);
         data.onStart(timer);

      } catch (Exception e) {
         System.err.println
             ("TimerBean.start: " + e.getMessage());
      }
   }

createTimerÀÇ ¼¼¹øÂ° ¸Þ¼Òµå´Â "log cleaner"¶ó´Â ½ºÆ®¸µ°ªÀ̶ó´Â »ç½ÇÀ» ÁÖ¸ñÇÏÀÚ. createTimer ¸Þ¼ÒµåÀÇ ¸¶Áö¸· Àμö´Â »ç¿ëÀÚ µ¥ÀÌÅÍÀΠȣÃâÀÚ Á¤ÀÇ °´Ã¼ÀÌ´Ù. ÀÌ °´Ã¼´Â ¼ø¼­´ë·Î ³ª¿­ÀÌ SerializableÇÑ ¸ðµç °´Ã¼¿¡ ´ëÇØ¼­ ·¹ÆÛ·±½º°¡ µÉ ¼ö ÀÖ´Ù. È£ÃâÀڴ ŸÀ̸Ӱ¡ »ý¼ºµÇ¾úÀ» ¶§ ÀÌ °´Ã¼¸¦ ¼³Á¤Çϴµ¥, À̴ ŸÀ̸ÓÀÇ getInfo ¸Þ¼Òµå¸¦ È£ÃâÇÔÀ¸·Î½á ÄÚµåÀÇ ¸ðµç ºÎºÐ¿¡¼­ °Ë»öÀÌ °¡´ÉÇÏ´Ù. »ç¿ëÀÚ µ¥ÀÌÅÍ °´Ã¼´Â ¿©·¯ ŸÀ̸ӵéÀ» ±¸º°Çϱâ À§ÇØ »ç¿ëµÉ ¼ö ÀÖ°í, ŸÀ̸Ӹ¦ °®´Â ºóÀÌ ÇÊ¿ä·Î ÇÏ´Â ´Ù¸¥ µ¥ÀÌÅ͸¦ Æ÷ÇÔÇϰí ÀÖÀ» ¼öµµ ÀÖ´Ù.

TimerBeanÀÇ ÁßÁö ¸Þ¼Òµå´Â ºó°ú °ü·ÃµÈ ¸ðµç ŸÀ̸ÓÀÇ µ¿ÀÛÀ» ¸ØÃá´Ù.

   public void stop(String timerName) {
      try {
         TimerService ts = _context.getTimerService();
         Collection timers = ts.getTimers();
         Iterator it = timers.iterator();

         // For every timer whose "info" is TimerData, 
         // if the timer's name is timerName, pass that 
         // timer to TimerData.onStop. The TimerData object 
         // must decide whether or not to call Timer.cancel.
         while (it.hasNext()) {
            Timer t = (Timer)it.next();

            if (isCalled(t, timerName)) {
               TimerData td = (TimerData)t.getInfo();
               td.onStop(t);
            }
         }
      } catch (Exception e) {
         System.err.println("TimerBean.stop: " + e.getMessage());
      }
   }

isRunning ¸Þ¼Òµå´Â ºóÀÌ ½ÇÇàÁßÀÎ Timer¸¦ Æ÷ÇÔÇϰí ÀÖÀ¸¸é Æ®·ç¸¦ ¸®ÅÏÇÑ´Ù. ÀÌ¿ÜÀÇ °æ¿ì¿¡ ¸Þ¼Òµå´Â false¸¦ ¸®ÅÏÇÑ´Ù.

   public boolean isRunning(String timerName) {
      try {
         TimerService ts = _context.getTimerService();
         Collection timers = ts.getTimers();
         Iterator it = timers.iterator();

         if (it.hasNext()) {
            Timer t = (Timer)it.next();
            if (isCalled(t, timerName)) {
               return true;
            }
         }
      } catch (Exception e) {
         System.err.println("TimerBean.isRunning: " +
                            e.getMessage());
      }
      return false;
   }

¸¶Áö¸·À¸·Î, ºóÀÇ ejbTimeout ¸Þ¼Òµå´Â Timer°¡ ¸¸·áµÉ ¶§¸¶´Ù ÄÁÅ×À̳ʷκÎÅÍ ÄݹéÀ» ¹Þ°Ô µÈ´Ù.

   // When the EJB times out, call back 
   // to the Web tier to execute the SQL. 
   public void ejbTimeout(Timer timer) {
      HttpURLConnection conn = null;

      // Throw away everything in the servlet log
      // each time the timer ticks. Use a URLConnection 
      // to ask the Web tier to do that delete for us.
      try {
         InitialContext ic  = new InitialContext();
         URL url = (URL)ic.lookup
                 ("java:comp/env/url/cleanLog");
         conn = (HttpURLConnection)url.openConnection();
         int code = conn.getResponseCode();
         conn.disconnect();
      } catch (Exception ex) {
         throw new EJBException(ex.getMessage());
      }
   }

·Î±× Ŭ¸®³ÊÀÇ °æ¿ì, LogCleanerTimerData.onTimeout ¸Þ¼Òµå´Â TimerBean.ejbTimeout ¿¡ ÀÇÇØ È£ÃâµÈ´Ù. ÀÌ ¸Þ¼Òµå´Â ¼­ºí¸´¿¡ ÄݹéÇÏ°í ¼­ºí¸´ÀÌ À̸¦ ´ë½ÅÇØ¼­ ·Î±×¸¦ Á¦°ÅÇØÁֱ⸦ ¿äûÇÑ´Ù. ÀÌ ÄÚµå´Â µ¥ÀÌÅͺ£À̽º¿¡ Á¢¼ÓµÇ¾úÀ» ¼öµµ ÀÖ°í ÀÚüÀûÀ¸·Î ·Î±×¸¦ Á¦°ÅÇßÀ» ¼öµµ ÀÖ´Ù. onTimeout ¸¦ À§ÇÑ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

   public void onTimeout(Timer t)
      throws EJBException {
      System.out.print("Timer " + getName() + 
              "timed out. ");
      System.out.println("Cleaning log by calling " +
         getLogCleanURL());

      try {
         URL url = getLogCleanURL();
         HttpURLConnection conn =
            (HttpURLConnection)url.openConnection();
         int code = conn.getResponseCode();
         System.err.println("Cleaned log, code=" + code);
         conn.disconnect();
      } catch (Exception ex) {
         throw new EJBException(ex.getMessage());
      }
   }   

½Ç½ÀÀ» ÇØº¸±â À§Çؼ­ »ùÇÃÄڵ带 À§ÇÑ ºê¶ó¿ìÀú¸¦ ¸ÞÀÎ ÆäÀÌÁö¿¡¼­ ¿­¾îº¸ÀÚ. ¼­ºí¸´ ·Î±×¸¦ µð½ºÇ÷¹ÀÌÇÏ´Â À©µµ¿ì¸¦ ¿­±â À§ÇÑ ¼³¸íÀº µÎ¹øÂ° ÆÁ ÀÌÇÏ¿¡¼­ º¼ ¼ö ÀÖ´Ù. ¼­ºí¸´ ·Î±×´Â ¸Å 10Ãʸ¶´Ù ¸®ÇÁ·¹½ÃµÈ´Ù.

»ùÇÃÄÚµå ¸ÞÀÎ ÆäÀÌÁö¿¡¼­ Á¦°øÇÏ´Â ±â´É°ú ¸µÅ©¸¦ ÀÌ¿ëÇØ¼­ ŸÀ̸Ӹ¦ ½ÃÀÛÇϰí ÁßÁöÇÒ ¼ö ÀÖ´Ù.

À§¿Í °°Àº ±â´ÉÀ» ÀÌ¿ëÇØ¼­ ŸÀ̸ÓÀÇ »óŸ¦ ÁßÁö, ½ÃÀÛ, ¿äûÇÒ ¼ö ÀÖ´Ù.

»ùÇà ÄÚµå ½ÇÇàÇϱâ

J2EE¼­¹ö¸¦ ½ÃÀÛÇϱâ Àü¿¡ PointBase µ¥ÀÌÅͺ£À̽º ¼­¹ö¸¦ ½ÃÀÛÇØ¾ß ÇÑ´Ù. PointBase µ¥ÀÌÅͺ£À̽º ¼­¹ö¸¦ ½ÃÀÛÇϱâ À§Çؼ­´Â

  • ¼Ö¶ó¸®½º ¿ÀÆÛ·¹ÀÌÆÃ ½Ã½ºÅÛ:
    1. $J2EE_HOME/pointbase/tools/serveroption·Î µð·ºÅ丮 º¯°æ.

    2. ¼­¹ö¸¦ ½ÃÀÛÇϱâ À§ÇØ "./startserver.sh" ½ºÅ©¸³Æ® ½ÇÇà
  • À©µµ¿ì: Start¸Þ´º¿¡¼­ Programs -> Sun Microsystems -> J2EE 1.4 SDK -> Start PointBase¼±ÅÃ

ÀÌ ÆÁÀ» À§ÇÑ »ùÇà ¾ÆÄ«À̺긦 ´Ù¿î·Îµå ¹ÞÀÚ. ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÄÁÅØ½ºÆ® ·çÆ®´Â ttmay2004 ÀÌ´Ù. ´Ù¿î·ÎµåµÈ earÆÄÀÏÀº »ùÇÃÀ» À§ÇÑ ¿Ï¼ºµÈ ¼Ò½º ÄÚµå µµÇÑ Æ÷ÇÔÇÑ´Ù.

deploytool ÇÁ·Î±×·¥À̳ª ¾îµå¹Î ÄܼÖÀ» ÀÌ¿ëÇØ¼­ J2EE 1.4 Application Server¿¡ ¾ÖÇø®ÄÉÀÌ¼Ç ¾ÆÄ«À̺ê(ttmay2004.ear)¸¦ ¹èÆ÷ÇÒ ¼ö ÀÖ´Ù. ¾Æ´Ï¸é ´ÙÀ½°ú °°ÀÌ asadmin Ä¿¸Çµå¸¦ Á÷Á¢ ÀÔ·ÂÇØ¼­ À̸¦ ¹èÆ÷ÇÒ ¼ö ÀÖ´Ù.

  
   asadmin deploy install_dir/ttmay2004.ear

earÆÄÀÏÀ» ÀνºÅçÇÑ µð·ºÅ丮¸¦ install_dir·Î º¯°æÇÏÀÚ.

¾ÖÇø®ÄÉÀ̼ÇÀº http://localhost:8080/ttmay2004¿¡¼­ Á¢¼ÓÀÌ °¡´ÉÇÏ´Ù.

J2EE 1.4 Application Serverº¸´Ù J2EE 1.4¿¡ ¸Â´Â ±¸ÇöÀ» ÇϰíÀÚ ÇÑ´Ù¸é Ç÷§Æû¿¡ ¾ÖÇø®ÄÉÀ̼ÇÀ» ¹èÆ÷Çϱâ À§ÇØ J2EE ÇÁ·Î´öÆ®ÀÇ ¹èÆ÷ ÅøÀ» »ç¿ëÇÏÀÚ. ¾ÖÇø®ÄÉÀÌ¼Ç ½ÇÇà¿¡ ´ëÇÑ ¼³¸íÀº index.htmlÆÄÀÏÀ» Âü°íÇϱ⠹ٶõ´Ù.

.
.
.

Reader Feedback

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

 

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

.
.

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

Copyright 2004 Sun Korea, Inc. All rights reserved.

Sun Microsystems, Inc.
.
.