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

Working XML: °æ·Î ÄÄÆÄÀÏ°ú Å×½ºÆ® ÀÚµ¿È­
¸ñ Â÷:
ÇÁ·Ï½Ã ÄÄÆÄÀÏÇϱâ
JUnit
´ÙÀ½ Æí¿¡´Â
Âü°í ÀÚ·á
ÇÊÀÚ ¼Ò°³
±â»ç¿¡ ´ëÇÑ Æò°¡
°ü·Ã dW ¸µÅ©:
Working XML: HC ¼Ò°³
SAX, °­·ÂÇÑ API
US ¿ø¹® Àбâ
¾Ë°í¸®Áò°ú JUnit ÀÚ¼¼È÷ »ìÆ캸±â


Benoit Marchal
ÄÁ¼³ÅÏÆ®, Pineapplesoft
2002³â 1¿ù

SAX ContentHandler ÄÄÆÄÀÏ·¯ÀÎ HC¿¡ ´ëÇÑ ÀÛ¾÷ÀÌ °è¼ÓµÇ°í ÀÖ´Ù. À̹ø ´Þ¿¡ ¿ì¸®ÀÇ Ä÷³´Ï½ºÆ®´Â ÄÄÆÄÀÏ ¾Ë°í¸®ÁòÀ» ¼³¸íÇϸç, ¶ÇÇÑ JUnit·Î Å×½ºÆ®¸¦ ÀÚµ¿È­ÇÏ´Â »çÇ×µµ ´Ù·é´Ù.

Beniot MarchalÀº Working XML Ä÷³¿¡¼­ ¸Å´Þ µðÀÚÀÎ °áÁ¤¿¡¼­ºÎÅÍ ÄÚµùÀÇ °úÁ¦±îÁö XML °³¹ßÀÚµéÀ» À§ÇÑ ±×ÀÇ ¿ÀÇ ¼Ò½º ÇÁ·ÎÁ§Æ®ÀÇ ÁøÇà »óȲÀ» ¼³¸íÇÏ¿´´Ù. HC (Handler CompilerÀÇ Áظ»)¶ó°í ºÒ¸®´Â ÀÌ »õ·Î¿î ÇÁ·ÎÁ§Æ®´Â XPaths ¸ñ·Ï¿¡ ´ëÇØ SAX ContentHandler¸¦ ÀÚµ¿À¸·Î »ý¼ºÇÔÀ¸·Î½á À̺¥Æ® ÁöÇâÀÇ XML parsing¿¡¼­ ¸î °¡Áö Èûµç ÀÏÀ» ¾ø¾ÖÁÙ °ÍÀÌ´Ù.

Çڵ鷯 ÄÄÆÄÀÏ·¯ÀÎ HC¿¡ ´ëÇÑ ÀÛ¾÷ÀÌ °è¼ÓµÇ°í ÀÖ´Ù. Áö³­ ´Þ ÀÌ Ä÷³¿¡¼­ ¼Ò°³µÈ °Íó·³, HCÀÇ ¸ñÇ¥´Â SAX ContentHandlerÀÇ »óŸ¦ ÃßÀûÇÒ Çʿ並 ¾ø¾Ö´Â °ÍÀÌ´Ù. »óÅ ÃßÀûÀº Áö·çÇÏ°í ¿¡·¯°¡ ³ª±â ½¬¿î ÀÛ¾÷ÀÌ´Ù. HC´Â ÇÁ·Ï½Ã ContentHandler¸¦ ÄÄÆÄÀÏÇÔÀ¸·Î½á ÀÌ ÀýÂ÷¸¦ ÀÚµ¿È­Çϴµ¥, ÇÁ·Ï½Ã ContentHandler´Â »óÅ °ü¸®¿Í ¾ÖÇø®ÄÉÀÌ¼Ç ·ÎÁ÷¿¡ ÀûÇÕÇÑ ¾ÖÇø®ÄÉÀÌ¼Ç Çڵ鷯·ÎÀÇ È£ÃâÀ» ó¸®ÇÑ´Ù.

¾ð¶æ º¸¸é HC°¡ ÇÁ·Î±×·¡¸Ó¿¡°Ô ´õ ¸¹Àº ÀÛ¾÷À» ¿ä±¸ÇÏ´Â °Íó·³ º¸ÀÌÁö¸¸, ÇÁ·Ï½Ã°¡ ¾ÖÇø®ÄÉÀÌ¼Ç Çڵ鷯·ÎºÎÅÍ ÀÚµ¿À¸·Î ÄÄÆÄÀϵȴٴ Á¡À» ÀÌÇØÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. ¾î¶² ÇÁ·Î·¡¹Öµµ ÇÊ¿äÇÏÁö ¾Ê´Ù.

ÇÁ·Ï½Ã ÄÄÆÄÀÏÇϱâ

Áö³­ ´Þ¿¡ ¼³¸íÇßµíÀÌ, ³ª´Â Deterministic Finite Automaton (DFA)¸¦ »ç¿ëÇÏ¿© ÇÁ·Ï½Ã¸¦ ÄÄÆÄÀÏÇÒ °èȹÀÌ´Ù. DFA´Â ¸Å¿ì È¿À²ÀûÀ̱⠶§¹®¿¡ ¸Å·ÂÀûÀÌ´Ù. ¶ÇÇÑ À̵éÀ» ±¸ÃàÇϱâ À§ÇÑ ¾Ë°í¸®ÁòÀÌ Àß ¹®¼­È­µÇ¾î ÀÖ´Ù. ³»°¡ »ç¿ëÇÒ ¾Ë°í¸®ÁòÀº ¿ø·¡ Á¤±Ô½ÄÀ» ÄÄÆÄÀÏÇϱâ À§ÇØ ¼³°èµÇ¾úÁö¸¸, ³ª´Â ÀÌ°ÍÀÌ XPaths¿¡µµ ½±°Ô Àû¿ëµÉ ¼ö ÀÖ´Ù°í ¹Ï´Â´Ù.

³ª´Â ÄÄÆÄÀÏ·¯ ±¸Ãà¿¡ ÀÖ¾î °¡Àå È®½ÇÇÑ ÂüÁ¶ ÀÚ·á Áß ÇϳªÀÎ Compilers: Principles, Techniques and Tools (Âü°í ÀÚ·á)·ÎºÎÅÍ ´ëºÎºÐÀÇ ¾Ë°í¸®Áò ±¸¼º ¿ä¼Ò¸¦ °¡Á®¿Ã °ÍÀÌ´Ù. ¿©·¯ºÐ °¡±îÀÌ¿¡ ÇÑ ±ÇÀÌ ÀÖ´Ù¸é, DFA ±¸ÃàÀº ¾Ë°í¸®Áò 3.5ÀÌ´Ù.

¾Ë°í¸®ÁòÀÇ ±âº»

Áö³­ ´ÞÀÇ ¼³¸í¿¡¼­ DFA°¡ º¯È¯ (transition) ´ÙÀ̾î±×·¥À̶ó´Â »ç½ÇÀ» ȸ»óÇغ¸ÀÚ. ±×¸² 1Àº simpara/ulink XPathÀÇ º¯È¯ ´ÙÀ̾î±×·¥ÀÌ´Ù. ¿øÀº ÇÁ·Ï½Ã°¡ °¥ »óŵéÀ» ³ªÅ¸³»¸ç, È­»ìÇ¥´Â DFA º¯È¯À» °¡Á®¿À´Â ¿ä¼ÒµéÀ» ÁöĪÇÏ°í ÀÖ´Ù. ±½Àº ¼±À¸·Î µÈ ¿øÀº XPath°¡ ¼º°øÀûÀ¸·Î ÀνĵǾúÀ½À» ³ªÅ¸³½´Ù.

±×¸². simpara/ulinkÀÇ º¯È¯ ´ÙÀ̾î±×·¥
Transition diagram

¾Ë°í¸®ÁòÀ» ´õ Àß ÀÌÇØÇϱâ À§ÇØ ¿©·¯ºÐÀº ÀÌ º¯È¯ ´ÙÀ̾î±×·¥À» ½ºÅðú ºñ±³ÇÒ ¼ö ÀÖ´Ù. º»ÁúÀûÀ¸·Î ÇÁ·Ï½Ã´Â simpara element¸¦ ¸¸³µÀ» ¶§ À̸¦ ½ºÅÿ¡ µÐ´Ù. ´ÙÀ½¿¡ ulink¸¦ ¸¸³ª¸é ÀÌ°Í ¿ª½Ã ½ºÅÿ¡ µÐ´Ù. ½ºÅÃÀº ÀÌÁ¦ simpara¿Í ulink¶ó´Â µÎ element¸¦ °¡Áö°í Àִµ¥, ÀÌ°ÍÀº simpara/ulink ±¸¼ºÀÌ´Ù.

´ÙÀ̾î±×·¥ÀÇ ´Ù¾çÇÑ ´Ü°è´Â ½ºÅÃÀÇ ±¸¼ºÀ» ³ªÅ¸³½´Ù. »óÅ 0Àº ºó ½ºÅÃÀ», »óÅ 1Àº ÇÑ element (simpara)¸¦ °¡Áø ½ºÅÃÀ» Ç¥½ÃÇÑ´Ù. »óÅ 2´Â µÎ element (simpara¿Í ulink)À» °¡Áø ½ºÅÃÀÌ´Ù.

´Ù½Ã ¸»ÇØ, DFA¸¦ ±¸ÃàÇÏ·Á¸é ¿©·¯ºÐÀº °¡´ÉÇÑ ½ºÅà ±¸¼º¸¸Å­ ¸¹Àº »óŸ¦ ÇÒ´çÇØ¾ß ÇÏ°í ÀÌ »óŵ鰣ÀÇ º¯È¯ ±â´ÉÀ» »êÃâÇØ¾ß ÇÑ´Ù.

¿©·¯ºÐÀÌ »ó»óÇÒ ¼ö ÀÖµíÀÌ, ±×¸² 1Àº ³Ê¹« °£´ÜÇÏ´Ù. ½ÇÁ¦ ÇÁ·Ï½Ã´Â Çϳª°¡ ¾Æ´Ñ ¿©·¯ °³ÀÇ XPaths¸¦ ÀνÄÇÏ·Á ÇÒ °ÍÀ̱⠶§¹®¿¡ ¿©·¯ º¯È¯ ´ÙÀ̾î±×·¥À» º´ÇàÇÏ¿© ó¸®ÇÒ °ÍÀÌ´Ù. ¿¹¸¦ µé¾î, ÇÁ·Ï½Ã´Â ´ÙÀ½ ¼¼ XPaths Áß Çϳª¸¦ ãÀ» °ÍÀÌ´Ù.:

simpara/ulink
/
/article/articleinfo/title

DFA°¡ ´õ ¸¹Àº XPaths¸¦ ÀνÄÇÏ·Á°í ½ÃµµÇÏ¸é »óÅ ¹øÈ£°¡ Áõ°¡ÇÒ °ÍÀÌ´Ù. ½ÇÁ¦·Î, ½ºÅà Ãø¸é¿¡¼­ »ý°¢Çϸé simpara/ulink¸¦ ÀνÄÇÏ´Â °Íº¸´Ù ÀÌµé ¼¼ XPaths¸¦ ÀνÄÇϱâ À§ÇØ ´õ ¸¹Àº ½ºÅà ±¸¼ºÀÌ ÀÖÀ» °ÍÀÌ´Ù..

QName

XML elements´Â À̸§ °ø°£ URI¿Í Áö¿ª¸í(local name)ÀÌ °áÇÕµÈ °ÍÀ¸·Î ½Äº°µÈ´Ù. ÀÌ °áÇÕÀ» Á» ´õ È¿°úÀûÀ¸·Î ó¸®Çϱâ À§ÇØ ³ª´Â QName Ŭ·¡½º¸¦ ¸¸µé¾ú´Ù. XML ³ëµå¸¦ ¿Ïº®ÇÏ°Ô ½Äº°Çϱâ À§ÇØ QNameÀº ¶ÇÇÑ ³ëµåÀÇ Æ¯¼º (element, ¼Ó¼º, ȤÀº ·çÆ®(/))¸¦ ±â·ÏÇÑ´Ù. QNameÀÇ ÄÚµå´Â Listing 1¿¡ ÀÖ´Ù.

QNameÀº Çؽà Å×À̺í°ú ȣȯÇϱâ À§ÇØ equals()°ú hashCode()¸¦ ±¸ÇöÇÑ´Ù.

HCNode

¾Ë°í¸®ÁòÀº XPaths ¼¼Æ®¸¦ ó¸®ÇÏ°í ¼¼ °¡Áö¸¦ ÄÄÆÄÀÏÇÑ´Ù. º¯È¯ ´ÙÀ̾î±×·¥ÀÌ °ÅÄ¥ »óŵé, ÇÑ »óÅ¿¡¼­ ´Ù¸¥ »óÅ·ΠÀ̵¿ÇÏ´Â º¯È¯ ±â´É, ±×¸®°í ¾î¶² »óÅ°¡ Xpath¸¦ ¼º°øÀûÀ¸·Î ÀνÄÇß´ÂÁö¸¦ ³ªÅ¸³»´Â Ç¥½Ã°¡ ±×°ÍÀÌ´Ù.

¾Ë°í¸®ÁòÀº ÇÁ·±Æ® ¿£µå (ÇÁ·±Æ® ¿£µå¿Í ¹é ¿£µå¿¡ ´ëÇÑ »ó¼¼ »çÇ×Àº ÀÌÀü Ä÷³ ÂüÁ¶)°¡ ÀνÄÇÒ ¸ðµç XPaths¸¦ Æ÷ÇÔÇÑ parse Æ®¸®¸¦ ¹ÝȯÇÒ °ÍÀ̶ó°í ±â´ëÇÑ´Ù. Listing 2´Â Æ®¸®¿¡ ³ªÅ¸³­ elementµéÀÎ HCNodeÀÌ´Ù. ±×·¯³ª ÀÌ ¸ñ·ÏÀº HC °³¹ßÀÇ Çö ´Ü°è¿¡¼­´Â ºÒ¿ÏÀüÇÏ´Ù´Â Á¡¿¡ ÁÖÀÇÇÑ´Ù.; ´ÙÀ½ Ä÷³¿¡¼­ Á» ´õ ¿Ï¼ºµÈ ¹öÀüÀ» º¸¿©ÁÖ°Ú´Ù.

HCNode´Â ÄÄÆÄÀÏ·¯¿¡ ƯȭµÇ¾î Àֱ⠶§¹®¿¡ org.ananas.hc.compiler ÆÐÅ°Áö¿¡ ÀÖ´Ù. QNameÀº org.ananas.hc¿¡ Àִµ¥, ÇÁ·Ï½Ã°¡ À̸¦ ÀÌ¿ëÇÒ °ÍÀ¸·Î ±â´ëÇϱ⠶§¹®ÀÌ´Ù.

³ëµå´Â (ÀÚ½ÅÀÇ type ¼Ó¼º¿¡ µû¶ó) ´ÙÀ½ Áß Çϳª°¡ µÉ ¼ö ÀÖ´Ù.:

  • QName¿¡ ÀÇÇØ Ç¥ÇöµÇ´Â XML ³ëµå
  • XML ³ëµåµé°£ÀÇ "ºÎ¸ð" °ü°è¸¦ Ç¥½ÃÇϱâ À§ÇØ XPath¿¡ ÀÖ´Â / ±¸ºÐÀÚ
  • ÇÁ·Ï½Ã°¡ µÎ °³, ȤÀº ±× ÀÌ»óÀÇ XPaths¸¦ ÀνÄÇßÀ» ¶§ XPathsµéÀÇ °áÇÕ
  • parse Æ®¸®ÀÇ ³¡À» Ç¥½ÃÇϴ Ư¼ö ³ëµå

XML ³ëµå´Â QName¿¡ ´ëÇÑ ÂüÁ¶¸¦ °¡Áö°í ÀÖ´Ù. ´Ù¸¥ ³ëµå À¯ÇüÀº Æ®¸®¸¦ ±¸ÃàÇϱâ À§ÇØ ¿ÞÂÊ°ú ¿À¸¥ÂÊ HCNodes¿¡ ´ëÇÑ ÂüÁ¶¸¦ °¡Áö°í ÀÖ´Ù.

ÀÌÀü Ä÷³¿¡¼­ ¼³¸íÇÑ´ë·Î, DFA ±¸Ãà ¾Ë°í¸®ÁòÀº ÀÌ parse Æ®¸®¸¦ »óÅ ¼¼Æ®·Î º¯È¯ÇÑ´Ù. À̸¦ À§ÇØ ¾Ë°í¸®ÁòÀº ¾ó¸¶³ª ¸¹Àº XML ³ëµå°¡ ÁÖ¾îÁø ³ëµå µÚ¿¡ ³ªÅ¸³ª´ÂÁö¸¦ °è»êÇÑ´Ù. °¢ »óÅ°¡ ƯÁ¤ ½ºÅà ±¸¼ºÀ» ³ªÅ¸³½´Ù´Â Á¡À» ±â¾ïÇÏ¸é ¾Ë°í¸®ÁòÀÇ ÀÌ ºÎºÐÀ» ÀÌÇØÇϱⰡ ´õ ½¬¿ï °ÍÀÌ´Ù. ¾Ë°í¸®ÁòÀº º»ÁúÀûÀ¸·Î parse Æ®¸® ³»ÀÇ ÁÖ¾îÁø ³ëµå¿¡ À̸¦ ¼ö ÀÖ´Â ¸ðµç °¡´ÉÇÑ ½ºÅà ±¸¼ºÀ» »êÃâÇÑ´Ù.

À̸¦ À§ÇØ, HCNode´Â ´ÙÀ½ ¸Þ¼ÒµåµéÀ» Á¦°øÇÑ´Ù. :

  • n.firstpos(): n ³ëµå¿¡ ÀÖ´Â XPathÀÇ Ã¹¹ø° element¿Í ¸ÅÄ¡µÇ´Â XML ³ëµå ¼¼Æ®
  • n.lastpost(): n ³ëµå¿¡ ÀÖ´Â XPathÀÇ ¸¶Áö¸· element¿Í ¸ÅÄ¡µÇ´Â XML ³ëµå ¼¼Æ®
  • n.nullable(): nÀÌ °ø¹éÀÌ µÉ ¼ö ÀÖ´Â XPathÀÇ ·çÆ®ÀÏ °æ¿ì¿¡´Â Âü, ±×·¸Áö ¾ÊÀ¸¸é °ÅÁþÀÌ´Ù.

µÎ °¡Áö ¿¹¸¦ µé¾î º¸°Ú´Ù. XPath simpara·Î Ãâ¹ßÇØ º¸ÀÚ. ÀÌ XPath´Â ÇϳªÀÇ ³ëµå, XML_NODE À¯ÇüÀÇ n À¸·Î parsingµÉ °ÍÀÌ´Ù. ÀÌ ³ëµåÀÇ n.firstpos()°ú n.lastpos()´Â simpara°¡ µÉ °ÍÀÌ´Ù. simparark°¡ XPath simpara¿¡ ¸ÅÄ¡µÇ´Â À¯ÀÏÇÑ XML ³ëµåÀ̱⠶§¹®ÀÌ´Ù.

XPath simpara/ulink´Â °¢°¢ simpara¿Í ulink¸¦ °¡¸®Å°´Â ÁÂ¿ì ³ëµå¿Í ÇÔ²² PARENT_OF À¯ÇüÀÇ n ³ëµå·Î parsingµÉ °ÍÀÌ´Ù. XPathÀÇ ½ÃÀÛ°ú ¸ÅÄ¡µÇ´Â XML ³ëµå°¡ simparaÀÌ°í XPathÀÇ ³¡°ú ¸ÅÄ¡µÇ´Â ³ëµå°¡ ulinkÀ̱⠶§¹®¿¡, n.firstpos()¸Þ¼Òµå´Â simparaÀÌ°í n.lastpost()´Â ulinkÀÌ´Ù.

Ç¥ 1Àº firstpos()°ú nullable()À» »êÃâÇϱâ À§ÇÑ ±ÔÄ¢À» ¼³¸íÇÑ´Ù. lastpos()Àº firstpos()°ú À¯»çÇÏÁö¸¸, left¿Í right¿¡ ´ëÇÑ ±ÔÄ¢ÀÌ ¹Ý´ëÀÌ´Ù. ¿©·¯ºÐÀº nullableÀÌ ¸ðµÎ ¹«¾ùÀ» °¡¸®Å°´ÂÁö ±Ã±ÝÇÒ ¼öµµ ÀÖ´Ù.; ÀÌ°ÍÀº ´ÙÀ½ Ä÷³¿¡¼­ »ó´ë XPaths 󸮸¦ ¼³¸íÇÒ ¶§ ´õ ¸íÈ®ÇØÁú °ÍÀÌ´Ù.

Ç¥ 1.firstpos()¿Í nullable() »êÃâÇϱâ
  firstpos() nullable()
nÀÌ »ó´ë XPath¸¦ Ç¥½ÃÇÑ´Ù. empty set Âü

nÀÌ XML ³ëµåÀÌ´Ù.

{ qname } °ÅÁþ
OR_XPATH left.firstpos() U right.firstpos() left.nullable() or right.nullable()
PARENT_OF if left.nullable() then left.firstpos() U right.firstpos() else left.firstpos() left.nullable() and right.nullable()

È¥¶õ½º·´´Ù¸é, »óŵéÀÌ ½ºÅà ±¸¼ºÀ» ³ªÅ¸³½´Ù´Â »ç½Ç¸¸ ±â¾ïÇϵµ·Ï ÇÑ´Ù. firstpos()°ú lastpos()´Â ÁÖ¾îÁø ½ºÅà ±¸¼º¿¡ ÀÖ´Â XML ³ëµå ¼¼Æ®ÀÌ´Ù. °á±¹ ³ª´Â ÇϳªÀÇ »óÅ·Πº¯ÇÒ À¯ÀÏÇÑ ¼ýÀÚ¸¦ ÀÌ ¼¼Æ®µé °¢°¢¿¡ ÇÒ´çÇÒ °ÍÀÌ´Ù.

DFA »êÃâÇϱâ

parse Æ®¸®°¡ ÁÖ¾îÁø´Ù¸é, ¿©·¯ºÐÀº º¯È¯ ±â´ÉÀ» ó¸®Çϱâ À§ÇØ Listing 3ÀÇ ¾Ë°í¸®ÁòµéÀ» Àû¿ëÇÑ´Ù. ¿©·¯ºÐÀº º¯È¯ ±â´ÉÀ» ÀÌÂ÷¿ø Çà·ÄÀÎ dtranÀ¸·Î ³ªÅ¸³¾ ¼ö Àִµ¥, dtranÀº ÁÖ¾îÁø XML ³ëµå¿¡°Ô ´ÙÀ½ ´Ü°è¸¦ ¹ÝȯÇÑ´Ù. Listing 3ÀÇ ¾Ë°í¸®ÁòÀº ½ÇÁ¦ ÀÚ¹Ù Äڵ尡 ¾Æ´Ñ ÀÇ»ç ÄÚµåÀÓ¿¡ À¯ÀÇÇÑ´Ù.

Listing 3. ¾Ë°í¸®ÁòÀÇ ÀÇ»ç ÄÚµå
dstates <- root.firstpos()
for-each s as a state in dstates
   for-each a as an XML node in the input vocabulary
	   U <- s.followpos(a)
		if U is not empty and is not in dstates
		   dstates.append(U)
	   dtran[s,a] <- U

followpos(a)Àº XPath¿¡¼­ ¾î¶² XML ³ëµå°¡ ÁÖ¾îÁø XML ³ëµå¸¦ µû¸¦ °ÍÀÎÁö¸¦ ¸»ÇØÁØ´Ù. ¿©·¯ºÐÀº ´ÙÀ½ ±ÔÄ¢À» Àû¿ëÇؼ­ À̸¦ »êÃâÇÒ ¼ö ÀÖ´Ù. :

  • nÀÌ PARENT_OF ³ëµåÀÌ°í a°¡ left.lastpos() ³»ÀÇ ÇÑ XML ³ëµåÀÏ ¶§, right.firstpos()ÀÇ ¸ðµç ³ëµåµéÀÌ followpos(a)³»¿¡ ÀÖ´Ù.
  • nÀÌ »ó´ë °æ·Î¸¦ ³ªÅ¸³»°í, a°¡ n.lastpos()¿¡ ÀÖÀ» ¶§, n.firstpos()ÀÇ ¸ðµç ³ëµåµéÀÌ followpos(a)³»¿¡ ÀÖ´Ù

JUnit
³ª´Â À̹ø Ä÷³¿¡¼­ ÀÌ ¾Ë°í¸®ÁòÀ» ¿ÏÀüÇÏ°Ô ±¸ÇöÇÏ°í ½Í¾úÁö¸¸, JUnit¸¦ ¹è¿ì´Âµ¥ ¾ó¸¶°£ÀÇ ½Ã°£À» ÅõÀÚÇØ¾ß Çß´Ù. JUnit´Â ÀÚµ¿È­µÈ Å×½ºÆÃÀ» À§ÇÑ ¿ÀÇ ¼Ò½º·Î µÈ ÇÁ·¹ÀÓ¿öÅ©ÀÌ´Ù (Âü°í ÀÚ·á). ³ª´Â ÄÄÆÄÀÏ·¯¸¦ ÀÛ¼ºÇÒ ¶§ ÀÚµ¿È­µÈ Å×½ºÆÃÀÌ Àý´ëÀûÀ¸·Î ÇÊ¿äÇÏ´Ù´Â »ç½ÇÀ» ¾î·Æ°Ô ¾Ë¾Æ ³Â´Ù.

ÀÚµ¿È­µÈ Å×½ºÆÃ

¼ÒÇÁÆ®¿þ¾î ÇÁ·ÎÁ§Æ®¿¡¼­ ¸í¹éÇÑ ÇϳªÀÇ »ç½ÇÀº ÇÁ·Î±×·¡¸Ó°¡ ÀÚ½ÅÀÇ ¼ÒÇÁÆ®¿þ¾î¿¡ ¹ö±×¸¦ ³¢¿ö ³Ö´Â´Ù´Â °ÍÀÌ´Ù. ³ª´Â ÀϹÝÀûÀÎ ÇÁ·Î±×·¡¸Ó´Â ÄÚµå 10 ¶óÀδç 1°³ÀÇ ¹ö±×¸¦ ÀÛ¼ºÇÑ´Ù´Â Åë°è¸¦ ÀÐÀº ÀûÀÌ ÀÖ´Ù. Å×½ºÆ®´Â ¹ö±×¸¦ ¹ß°ßÇÏ°í °íÄ¡±â À§ÇØ ¼³°èµÇ¾ú´Ù. Å×½ºÆÃÀº ¸Å¿ì ¹Ýº¹ÀûÀÌ°í Áö°Ü¿î ÀÛ¾÷ÀÇ ÀüÇüÀûÀÎ ¿¹ÀÌ´Ù. ¼ÒÇÁÆ®¿þ¾î¸¦ Å×½ºÆ®ÇÒ ¶§ âÁ¶¼ºÀ̶õ °ÅÀÇ ¾ø´Ù.: ƯÁ¤ °ªÀ» ÁÖ°í °á°ú¸¦ º¸±â¸¸ ÇÏ¸é µÈ´Ù. °á°ú°¡ ¿©·¯ºÐÀÌ ¿¹»óÇÑ °Í°ú ´Ù¸£¸é ¿©·¯ºÐÀº ¹ö±×¸¦ ¹ß°ßÇÑ °ÍÀÌ´Ù.

¾ÆÁÖ Áö°ã°í ¹Ýº¹ÀûÀ̱⠶§¹®¿¡ Å×½ºÆ®µéÀº (Àû¾îµµ ÀϺΠÅ×½ºÆ®µéÀº) ÀÚµ¿È­µÇ¾î¾ß ÇÑ´Ù. ¾îÂî µÇ¾ú°Ç, ÄÄÇ»ÅÍ´Â ÇÁ·Î±×·¡¸Óº¸´Ù´Â Àγ»½ÉÀÌ °­ÇÏ´Ù. µû¶ó¼­ ÄÄÇ»ÅÍ´Â Áö°ã°í ¹Ýº¹ÀûÀÎ ÀÛ¾÷À» ¼öÇàÇÒ ÀÌ»óÀûÀÎ Èĺ¸ÀÚÀÌ´Ù.

ÀÚµ¿È­µÈ Å×½ºÆÃÀº ¿©·¯ºÐÀÌ ´Ù¸¥ ¼ÒÇÁÆ®¿þ¾î¸¦ Å×½ºÆ®Çϱâ À§ÇÑ ¼ÒÇÁÆ®¿þ¾î¸¦ ÀÛ¼ºÇÔÀ» ÀǹÌÇÑ´Ù. ÀÌ ¹æ½ÄÀÇ ÀåÁ¡Àº ¿©·¯ºÐÀÌ ÇÊ¿äÇÒ ¶§¸¶´Ù ÀÚÁÖ Å×½ºÆà ¼ÒÇÁÆ®¿þ¾î¸¦ ½ÇÇà½Ãų ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. ¿ì¸®´Â ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ º¯°æµÈ ºÎºÐ¸¸ Å×½ºÆ®ÇÏ´Â °æ¿ì°¡ ³Ê¹«³ª ¸¹´Ù. ÀÌ ¶§ ¹®Á¦´Â ¹°·Ð ¹«¾ùÀÌ º¯°æµÇ¾ú´ÂÁö¸¦ °áÁ¤ÇÏ´Â °ÍÀÌ´Ù. ÄÚµå ³» ÇÑ ¼½¼ÇÀÇ º¯È­°¡ ´Ù¸¥ ¼½¼Ç¿¡¼­ ¹ö±×¸¦ ¸¸µé¾î³»´Â °ÍÀº ÈçÇÑ ÀÏÀÌ´Ù. ¿©·¯ºÐÀÌ µÎ ¼½¼ÇÀÌ °ü·ÃµÇ¾î ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇÏÁö ¸øÇÑ´Ù¸é ¿©·¯ºÐÀº ÀÌ »óȲ¿¡ ´ëÇØ Å×½ºÆ®ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.

¹Ý¸é ÀÚµ¿È­µÈ Å×½ºÆ®´Â ¾ïÁö½º·¯¿î ¹æ½ÄÀ» ÅÃÇÑ´Ù. À̵éÀº ½ÇÇàµÉ ¶§¸¶´Ù Àü ¾ÖÇø®ÄÉÀ̼ÇÀ» Å×½ºÆ®ÇÒ °¡´É¼ºÀ» °¡Áö°í ÀÖ°í, ÀÌ´Â ÄÚµåÀÇ °ü·ÃµÇÁö ¾ÊÀº ¼½¼Ç¿¡¼­ ¹ö±×¸¦ ¹ß°ßÇÒ °¡´É¼ºÀ» ³ô¿©ÁØ´Ù.

ÀÚµ¿È­µÈ Å×½ºÆ®ÀÇ ¶Ç ´Ù¸¥ ÀÌÁ¡Àº ¹ö±×°¡ ¾ÖÇø®ÄÉÀ̼ǿ¡ ÀçµîÀåÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. ¿©·¯ºÐÀÌ ¹ö±×¸¦ °íÄ¥ ¶§¸¶´Ù ±× ¹ö±×¸¦ ó¸®Çϱâ À§ÇÑ Å×½ºÆ®¸¦ ÀÛ¼ºÇØ µÎ´Â °ÍÀÌ ÁÁ´Ù. ÇÁ·ÎÁ§Æ® ±â°£ µ¿¾È ±× ¹ö±×°¡ ´Ù½Ã µîÀåÇÒ ¶§ ¿©·¯ ¹ø Å×½ºÆ®ÇÏ´Â °ÍÀÌ ½ÇÆÐÇÒ °¡´É¼ºÀÌ ÀÖ´Ù.

extreme programming ¿îµ¿ (Âü°í ÀÚ·á)Àº ÀÚµ¿È­µÈ Å×½ºÆ®¸¦ º¸±Þ½ÃÄ×´Ù. °í¹éÄÁ´ë, ³ª´Â ÀÚµ¿È­µÈ Å×½ºÆ®¸¦ ü°èÀûÀ¸·Î »ç¿ëÇÏÁö ¾Ê´Â´Ù. ³» °æÇè¿¡ µû¸£¸é ÀÚµ¿È­µÈ Å×½ºÆ®´Â public ÀÎÅÍÆäÀ̽º°¡ ÀÚÁÖ º¯°æµÇÁö ¾Ê´Â Ŭ·¡½º¿¡¼­ °¡Àå È¿°úÀûÀ̾ú´Ù. public ÀÎÅÍÆäÀ̽º°¡ ¸¹ÀÌ º¯°æµÇ´Â Ŭ·¡½º¿¡¼­´Â ´ú È¿°úÀûÀ̾ú°í, ¿©±â¿¡´Â ´ëºÎºÐÀÇ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º Äڵ尡 Æ÷ÇԵȴÙ.

ÀÚµ¿È­µÈ Å×½ºÆÃÀÇ ¿¬»ê¾î´Â automatedÀÌ°í, ¿©·¯ºÐÀÌ ÀÚÁÖ »ç¿ëÇÏÁö ¾ÊÀ» ¹«¾ð°¡¸¦ ÀÚµ¿È­ÇÏ´Â °ÍÀº ¾µ¸ð¾ø´Â ÀÏÀÌ´Ù. ¸¶Âù°¡Áö·Î ¿©·¯ºÐÀÌ ÀÚÁÖ ½ÇÇà½Ãų °ÍÀ̶ó°í ¾Ë°í ÀÖ´Â °Í¿¡ ´ëÇÑ Å×½ºÆ®¸¦ ÀÛ¼ºÇÏ´Â °ÍÀÌ È¿°úÀûÀÌ´Ù. ÀÚµ¿È­µÈ Å×½ºÆ®´Â ¶ÇÇÑ Æ®¸® Á¶ÀÛ°ú °°Àº ´Ù¼Ò ¾Ö¸ÅÇÑ ÄÚµå¿Í ƯÈ÷ ÄÄÆÄÀÏ·¯¿¡ ÀÌ»óÀûÀÌ´Ù.

JUnit
ÀÚµ¿È­µÈ Å×½ºÆÃÀÌ ÀüÇô ¼ö°í¸¦ ÇÊ¿ä·Î ÇÏÁö ¾Ê°í °íÅëµµ ¾ø´Ù´Â ¹Ùº¸°°Àº »ý°¢Àº ÇÏÁö ¸»±â ¹Ù¶õ´Ù. ¿©·¯ºÐÀº Å×½ºÆ® ÄÉÀ̽º ÀÛ¼º¿¡ ½Ã°£À» ÅõÀÚÇØ¾ß ÇÏ°í, ¹°·Ð Å×½ºÆ® ¾ÖÇø®ÄÉÀ̼ÇÀ» Á¤±âÀûÀ¸·Î ½ÇÇà½ÃÄÑ¾ß ÇÑ´Ù. ½ÇÁ¦·Î ³»°¡ ÀÚµ¿È­µÈ Å×½ºÆ®¿¡ ±×·¸°Ô ¸¹Àº ½Ã°£À» ½ñ¾Æ º×Áö ¾Ê¾Ò´Ù¸é ³ª´Â À̹ø ´Þ¿¡ ¹ö±× Åõ¼ºÀÌÁö¸¸ Àß Å×½ºÆ®µÇÁö ¾ÊÀº DFA ÄÄÆÄÀÏ·¯ ¹öÀü ÀÛ¼ºÀ» ³¡³¾ ¼ö ÀÖ¾úÀ» °ÍÀÌ´Ù. ³ª´Â ³»°¡ ÇÒ ¼ö ÀÖ´Â °Íº¸´Ù ´õ ¸¹Àº ½Ã°£À» ÀÚµ¿È­µÈ Å×½ºÆ®¿¡ »ç¿ëÇߴµ¥, ÀÌ´Â ³»°¡ JUnit ÇнÀÀ» ½ÃµµÇ߱⠶§¹®ÀÌ´Ù.

¿©ÀüÈ÷, ÀÚµ¿È­µÈ Å×½ºÆÃÀº ÇÁ·ÎÁ§Æ® ±â°£µ¿¾È ±â´ëÇß´ø ¼º°ú¸¦ ¿Ã¸®´Â ÅõÀÚÀÌ´Ù. Å×½ºÆ®¸¦ ÀÚµ¿È­½ÃÅ°·Á°í ³ë·ÂÇÏ´Â °Íº¸´Ù Å×½ºÆ®¸¦ ¹Ù·Î ¼öÇàÇÏ´Â ÆíÀÌ ºü¸£´Ù. ¿¹¸¦ µé¾î, ÁÖ¾îÁø Ŭ·¡½º¸¦ ¼öÀÛ¾÷À¸·Î ÇÑ ¹ø Å×½ºÆ®ÇÏ´Â °Íº¸´Ù Å×½ºÆ® ÄÉÀ̽º¸¦ ÀÛ¼ºÇϴµ¥ 5½Ã°£ÀÇ ÀÛ¾÷ÀÌ ´õ ÇÊ¿äÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ¿©·¯ºÐÀÌ Å×½ºÆ®¸¦ 6¹ø ÀÌ»ó ½ÇÇà½ÃŲ´Ù¸é Å×½ºÆ® ÄÉÀ̽º¸¦ ÀÛ¼ºÇÏ´Â °ÍÀÌ ¼öÁö°¡ ¸ÂÀ» °ÍÀÌ´Ù. °¡·É ¿©·¯ºÐÀÌ Å×½ºÆ®¸¦ 50¹ø ½ÇÇà½ÃÅ°¸é (ÀÌ È½¼ö´Â Áß°£ ±Ô¸ðÀÇ ÇÁ·ÎÁ§Æ®¿¡¼­Á¶Â÷ ¸¹Àº °ÍÀÌ ¾Æ´Ï´Ù), ±× È¿°ú´Â ¾öû³ª´Ù.

½ÇÁúÀûÀ¸·Î ¸»ÇØ, ÀÚµ¿È­µÈ Å×½ºÆ®¸¦ ÀÛ¼ºÇϱâ À§Çؼ­´Â µÎ °¡Áö Àü·« Áß Çϳª¸¦ µû¸¦ ¼ö ÀÖ´Ù. Å×½ºÆõǴ Äڵ带 ÀÛ¼ºÇÒ ¶§ Å×½ºÆ®¸¦ ÀÛ¼ºÇÒ ¼öµµ ÀÖ°í Å×½ºÆ®¸¦ ÀÛ¼ºÀ» Àü´ãÇÏ´Â ¶Ç´Ù¸¥ °³¹ßÀÚ ÆÀÀ» ¸¸µé ¼öµµ ÀÖ´Ù. ´çºÐ°£Àº ³»°¡ È¥ÀÚ Å×½ºÆ®¸¦ ÀÛ¼ºÇÏ°ÚÁö¸¸, ¿©·¯ºÐÀÌ Å×½ºÆ® suite ÀÛ¼ºÀ» ÀÚ¿øÇÏ°í ½Í´Ù¸é ananas-discussion ¸ÞÀϸµ ¸®½ºÆ®¿¡ µî·ÏÇϱ⠹ٶõ´Ù.

°ú°Å¿¡ ³ª´Â ³» Å×½ºÆ®¸¦ ÆòÀÌÇÑ Àڹ٠Ŭ·¡½º·Î ÀÛ¼ºÇÏ¿´´Ù. ±×·¯³ª ÇÑ Ä£±¸°¡ JunitÀ» Å×½ºÆ®ÇØ º¸¶ó°í Á¦¾ÈÇÏ¿´´Ù. HC´Â JUnitÀ» Å×½ºÆ®Çϱ⿡ ÁÁÀº ÇÁ·ÎÁ§Æ®·Î º¸¿´À¸¹Ç·Î, ³ª´Â ÀÌ°ÍÀ» ´Ù¿î·ÎµåÇÏ¿´´Ù. JUnitÀº ÀÚµ¿È­µÈ Å×½ºÆ®¸¦ ÀÛ¼ºÇϱâ À§ÇÑ °£´ÜÇÏ°í ÀÛÀº ÇÁ·¹ÀÓ¿öÅ©ÀÌ´Ù. JUnitÀº ±×·¸°Ô ¸¹Àº ±â´ÉÀ» °¡Áö°í ÀÖÁö ¾ÊÁö¸¸ (´ÜÁö ¸î °³ÀÇ Å¬·¡½ºÀÏ »ÓÀÌ´Ù), Å×½ºÆà ÀýÂ÷¸¦ °ø½ÄÈ­ÇÏ´Â °ÍÀ» µµ¿ÍÁØ´Ù.

Listing 4´Â ³»°¡ QNameÀ» ¿¬½ÀÇϱâ À§ÇØ ÀÛ¼ºÇÑ Å×½ºÆ® ÀýÂ÷ÀÌ´Ù. ¿©·¯ºÐÀÌ º¼ ¼ö ÀÖµíÀÌ, Å×½ºÆ® Ŭ·¡½º´Â JUnit°¡ Á¤ÀÇÇÑ Å¬·¡½ºÀÎ TestCase·ÎºÎÅÍ »ó¼ÓµÈ´Ù. ³ª´Â ³» Å×½ºÆ®¸¦ testXXX() ¸Þ¼Òµå¿¡ ÀÛ¼ºÇÏ¿´´Ù. ³ª´Â ¼ÒÇÁÆ®¿þ¾îÀÇ ´Ù¾çÇÑ Ãø¸éÀ» ¿¬½ÀÇϱâ À§ÇØ ¼¼ °¡Áö ¸Þ¼Òµå¸¦ °¡Áö°í ÀÖ´Ù.: »ý¼ºÀÚ Å×½ºÆÃ, getters Å×½ºÆà ¹× equals()¿Í hashCode() ¸Þ¼Òµå Å×½ºÆÃÀÌ ±×°ÍÀÌ´Ù. JUnit¿¡ ÀÇÇØ ¼±¾ðµÇ´Â setUp() ¸Þ¼Òµå´Â Å×½ºÆ® °´Ã¼¸¦ ÃʱâÈ­½ÃŲ´Ù.

³ª´Â ³» Å×½ºÆ®µéÀ» º°°³ÀÇ ÆÐÅ°Áö(org.ananas.hc.test) ¿¡ µÎ±â·Î ÇÏ¿´´Âµ¥, ÀÌ´Â Junit ÀúÀÛÀÚÀÇ ±Ç°í¿Í ¹Ý´ëµÇ´Â °ÍÀ̾ú´Ù. ÀÌ ¼±ÅÃÀ» ÈÄȸÇÒÁöµµ ¸ð¸£Áö¸¸, ³ª´Â ½ÇÁ¦ Äڵ忡¼­ Å×½ºÆ®¸¦ ºÐ¸®ÇÏ´Â °ÍÀ» ¼±È£ÇÑ´Ù. ¹èÆ÷ÆÇ¿¡¼­ Å×½ºÆ®¸¦ Á¦°ÅÇϴµ¥ ´õ ½±±â ¶§¹®ÀÌ´Ù.

JUnitÀ» »ç¿ëÇÒ ¶§ÀÇ ÀÌÁ¡Àº ÇÁ·¹ÀÓ¿öÅ©°¡ Å×½ºÆ® Ŭ·¡½º ·Îµù, Å×½ºÆ® ½ÇÇà ¹× °á°ú º¸°í¸¦ Áö¿øÇÑ´Ù´Â Á¡ÀÌ´Ù. ÇÁ·¹ÀÓ¿öÅ©´Â ¶ÇÇÑ Å×½ºÆ® suite¶ó´Â °³³äÀ» Áö¿øÇϴµ¥, ÀÌ´Â Å×½ºÆ®¸¦ ³í¸®Àû ´ÜÀ§·Î Á¶Á÷È­ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. ¸¶Áö¸·À¸·Î, ÇÁ·¹ÀÓ¿öÅ©´Â ±×·¡ÇÈÀ¸·Î µÈ ½ÇÇàÀÚ¿Í ÄÜ¼Ö ½ÇÇàÀÚ¸¦ Á¦°øÇÑ´Ù. ±×·¡ÇÈ ÄܼÖÀº Çѵΰ³ Ŭ·¡½ºµéÀ» ´ëÈ­½ÄÀ¸·Î Å×½ºÆ®Çϴµ¥ ÁÁÀº ¹Ý¸é, ÄܼÖÀº ¿¹¸¦ µé¾î Àüü ÀçºôµåÀÇ ÀÏºÎ¿Í °°Àº ¹èÄ¡ ¸ðµå·Î Å×½ºÆ®¸¦ ½ÇÇà½ÃŲ´Ù.

´ÙÀ½ Æí¿¡´Â

³ª´Â ¾ÆÁ÷ HCÀÇ Äڵ带 ananas.org ·¹Æ÷ÁöÅ丮¿¡ °Ô½ÃÇÏÁö ¾Ê¾Ò´Âµ¥, ¿ÏÀüÇÑ Áغñ°¡ µÇÁö ¾Ê¾Ò±â ¶§¹®ÀÌ´Ù. DFA ÄÄÆÄÀÏÀ» ¸¶¹«¸®ÇØ¾ß °Ô½ÃÇÒ¸¸ÇÑ °¡Ä¡°¡ ÀÖ´Â »õ·Î¿î °ÍÀ» °¡Áú ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª ÀÚµ¿È­µÈ Å×½ºÆ®¿¡ (±×¸®°í JUnit¿¡ °üÇØ °øºÎÇϴµ¥) ÅõÀÚµÈ ½Ã°£Àº Àß »ç¿ëµÇ¾ú´Ù°í È®½ÅÇÑ´Ù. ; ±× ½Ã°£Àº À̹ø ÇÁ·ÎÁ§Æ® µ¿¾È º¸´äµÉ °ÍÀÌ´Ù. ´ÙÀ½ ´Þ¿¡´Â ÄÄÆÄÀÏ·¯ÀÇ ½ÇÇà ¹öÀüÀ» (ÃÖÀûÈ­µÇÁö ¾ÊÀº ¹öÀüÀ̱ä ÇÏÁö¸¸) °¡Áú ¼ö Àֱ⸦ ¹Ù¶ó¸ç, ÇÁ·Ï½Ã¿¡ ´ëÇØ ÀÛ¾÷ÇÒ °èȹÀÌ´Ù.

Âü°í ÀÚ·á

  • "Dragon Book" (Compilers: Principles, Techniques and Tools, A. Aho, R. Sethi°ú J. Ullman °øÀú) : ÄÄÆÄÀÏ·¯ ¼³°è¿Í ±¸Ãà¿¡ °üÇÑ ±ÇÀ§ ÀÖ´Â ¹®¼­
  • JUnitÀº ÀÚµ¿È­µÈ Å×½ºÆ®¸¦ ½ÇÇà½ÃÅ°±â À§ÇÑ ¿ÀÇ ¼Ò½º·Î µÈ ÇÁ·¹ÀÓ¿öÅ©ÀÌ´Ù.
  • Extreme programming (XP)Àº º¸´Ù ³ªÀº Ç°ÁúÀÇ ¼ÒÇÁÆ®¿þ¾î¸¦ ¾ò±â À§ÇÑ ±Ç°í¾È ¼¼Æ®ÀÌ´Ù.
  • Pragmatic ProgrammersÀº ¹æ¹ý·Ð ºÐ¾ß¿¡ ÃÖ±Ù µîÀåÇÑ ¶Ç ´Ù¸¥ °æÀïÀÚÀÌ´Ù.

ÇÊÀÚ¼Ò°³
Benoit MarchalBenoît Marchal Àº º§±â¿¡ Namur¿¡ ±â¹ÝÀ» µÐ ÄÁ¼³ÅÏÆ®°â ÀúÀÛÀÚÀÌ´Ù. ±×´Â ÃÖ±Ù XML by Example, second editionÀ» Ãâ°£ÇÏ¿´´Ù. ±×´Â ¶ÇÇÑ Applied XML Solutions°ú XML and the EnterpriseÀÇ ÀúÀÚÀ̱⵵ ÇÏ´Ù. ±×ÀÇ ÃÖ±Ù ÇÁ·ÎÁ§Æ®µé¿¡ ´ëÇÑ »ó¼¼ Á¤º¸¸¦ marchal.com ¿¡¼­ º¼ ¼ö ÀÖ´Ù.



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

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

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