|
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 µ¥ÀÌÅͺ£À̽º ¼¹ö¸¦ ½ÃÀÛÇϱâ À§Çؼ´Â
- ¼Ö¶ó¸®½º ¿ÀÆÛ·¹ÀÌÆÃ ½Ã½ºÅÛ:
-
$J2EE_HOME/pointbase/tools/serveroption·Î µð·ºÅ丮 º¯°æ.
- ¼¹ö¸¦ ½ÃÀÛÇϱâ À§ÇØ "./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ÆÄÀÏÀ» Âü°íÇϱ⠹ٶõ´Ù.
º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù. °ü·Ã¹®ÀÇ : SunKorea@sun.com
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϽ÷Á¸é ¼ö½Å°ÅºÎ¸¦
Ŭ¸¯ÇØ ÁÖ¼¼¿ä.
Copyright 2004 Sun Korea, Inc. All rights reserved.
|