|
½Ç¿ë¼º ÀÖ´Â CGI ·Î °Ô½ÃÆÇÀ» ¸¸µé¾î º¸±â·Î ÇÏÀÚ. ¸®´ª½º ·¡µåÇÞ¿¡¼ ±¸ÇöÇÏ´Â SSI¿Í DB(Postgre) ¿¬µ¿À» ÅëÇÑ CGI·Î °Ô½ÃÆÇ ¸¸µé±â
1. °³¿ä CGI·Î ¸¾¿¡ ²À µå´Â °Ô½ÃÆÇÀ» ¸¸µé¾î º¸±â·Î ÇÏÀÚ. À̹ø È£¿¡¼´Â ¸¸µé±â À§Çؼ ÇÊ¿äÇÑ ¹è°æÁö½Ä°ú °£´ÜÇÑ ¶óÀ̺귯¸® »ç¿ë¹ý¿¡ ´ëÇؼ ¾Ë°í ³Ñ¾î°¡±â·Î ÇÏÀÚ. ¶Ç ½Ã°£ÀÌ ³²À¸¸é ¸¸µé°íÀÚ ÇÏ´Â °Ô½ÃÆÇÀÇ ±¸¼º¿¡ ´ëÇؼµµ Àá±ñ ¾ð±ÞÇÏ°í ³Ñ¾î°¡µµ·Ï ÇÏ°Ú´Ù. ±×·¯¸é ¸Ó¸®°¡ º¹ÀâÇÒ ¶§ ÀÌ·¸°Ô °£´ÜÇÑ CGI¸¦ Â¥¸é¼ ±â»ÝÀ» ¾ò±â ¹Ù¶ó°Ú´Ù.
2. ±â´É¼ºº¸´Ù´Â ½Ç¿ë¼º ÀÖ´Â CGI¿¡ ´ëÇÑ À̾߱â. CGI(Common Gateway Interface) - ºÒ°ú 1³â Àü¸¸ Çصµ ¹«Ã´À̳ª »ý¼ÒÇß´ø ´Ü¾î¿´´Âµ¥. ¾î´Àµ¡ CGI »çÀå¼³±îÁö ³ª¿Ô´Ù. ¹«Ã´À̳ª ±â¼úº¯È°¡ ºü¸£´Ù´Â °ÍÀ» ½Ç°¨ÇÏ°Ô µÈ´Ù. ÇÏÁö¸¸ ¾ÆÁ÷µµ ¾µ ¸¸ÇÑ ±â¼úÀÌ CGIÀÎ µí ½Í´Ù. »ç¿ëÀÚ¿¡°Ô Å©°Ô ºÎ´ã°¨ ÁÖÁö ¾Ê°í ±â´Ù¸®´Â ½Ã°£¿¡¼ ÀÚÀ¯·Î¿ï ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖ´Ù. ÀÚ¹Ù°¡ ¸¹ÀÌ ¹ßÀüÇؼ ÃæºÐÇÑ ±â´ë¿Í ¶Ç °¡´É¼ºÀÌ Çö½Ç·Î ¸¹ÀÌ ´Ù°¡ ¿ÔÁö¸¸ ¾ÆÁ÷µµ DataBase¿Í °ü·ÃµÈ ºÎºÐ¿¡¼ CGI ±â¼úÀÌ ¸¹ÀÌ È°¿ëµÇ°í ÀÖ´Ù. ¹°·Ð DataBase¸¦ ´Ù·ê ¶§ »óÅÂÀ¯ÁöÇϱâ À§ÇÑ ³ë·ÂÀÌ ÇÊ¿äÇϱâ´Â ÇÏÁö¸¸ ¾à°£ ¾ÈÁ¤¼º ÀÖ´Â DataBase ¿£ÁøÀ» »ç¿ëÇÑ´Ù¸é ¾µ ¸¸ÇÑ ApplicationÀ» ¸¸µå´Âµ¥ ±×¸® ¸¹Àº ³ë·ÂÀÌ ÇÊ¿äÇÏÁö ¾Ê´Ù. ¿©·¯¸ð·Î CGI´Â ¸¹ÀÌ ¾Ë·ÁÁ® ÀÖ°í ¶Ç ºÎ´ã¾øÀÌ °³¹ßÇÒ ¼ö ÀÖ´Â ÇÁ·Î±×·¥ ÀÎÅÍÆäÀ̽ºÀÎ µí ½Í´Ù. ¿Ö CGI°¡ ½¬¿î°¡? ÀÌÀ¯´Â °£´ÜÇÏ´Ù. Ãâ·ÂÀÇ °æ¿ì MIMEÇì´õ¸¸ Ãâ·ÂÇØÁÖ¸é ³ª¸ÓÁö ´Ù¸¥ ºÎºÐÀº ÀÏ¹Ý ÇÁ·Î±×·¥À» Â¥´Â °Í°ú µ¿ÀÏÇÏ°í ´Ù¸¸ CGI ÀԷ¿¡ ´ëÇÑ Decoding ¸¸ÀÌ ¹®Á¦Àε¥ ±×°Íµµ ¶óÀ̺귯¸®µéÀ» ÀÌ¿ëÇؼ °£´ÜÇÏ°Ô ÇØ°áÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¿©±â¼´Â À¯¸íÇÑ ÇÁ·Î±×·¥ ±â¹ýÀ̱⠶§¹®¿¡ ¿ø·Ð ÀûÀÎ ¾ê±â´Â ¸¹ÀÌ »ý·«ÇÏ°í ¹Ù·Î È°¿ëÇÒ ¼ö ÀÖ´Â °ÍµéÀ» Áß½ÉÀ¸·Î À̾߱⸦ Ç®¾î ³ª°¡°íÀÚ ÇÑ´Ù. ¸¸ÀÏ ¿ø·ÐÀûÀÎ ³»¿ëÀÌ ¾Ë°í ½Í´Ù¸é http://hoohoo.ncsa.uuic.edu/cgi/ ¸¦ È®ÀÎÇØ º¸¶ó. CGI ¿¡ ´ëÇؼ ºÎÁ¤ÀûÀÎ °ßÇظ¦ ¸¹ÀÌ °¡Áö°í ÀÖ´Â »ç¶÷À̶ó¸é ÀÌ ±ÛÀÇ ÀÌÂë¿¡¼ ±ÛÀ» ±×¸¸ Àд´ٰí Çؼ ¼ÕÇØ ³¯ °ÍÀº ¾ø´Ù°í º»´Ù. ¹«¾ùº¸´Ùµµ ÇÊÀÚ°¡ ÀÌ Áö¸éÀ» ÅëÇؼ Àá±ñ ¸»ÇÏ°í ½ÍÀº °ÍÀÌ Àִµ¥ ±×°ÍÀº ¹Ù·Î content¿¡ °üÇÑ °ÍÀÌ´Ù. ½Å ±â¼ú¸¸À» °¡Áö°í ÀÎÅͳݻó(¾Æ´Ï ¾î¼¸é ÇÁ·Î±×·¥¼¼°è¿¡¼)¿¡¼ ¹«¾ð°¡¸¦ ²Þ²Û´Ù´Â °ÍÀº ¹«¸®°¡ Àֱ⠶§¹®ÀÌ´Ù. ¿ì¸®³ª¶ó ¿©°Ç»ó ±â¼ú¸¸À» °³¹ßÇϱ⸸ ÇÑ´Ù°í Çؼ ÀÌµæ º¼ ÀÏÀº ¸¹ÀÌ ¾ø´Ù°í ´À²¸Áø´Ù. ¾î¼¸é °¡Àå Áß¿äÇÑ ÀÏÀº ±âÁ¸¿¡ °³¹ßµÇ¾îÀÖ´Â ÁÁÀº ±â¼úÀÌ ÀÖ´Ù¸é ±×°ÍÀ» È°¿ëÇؼ ÀÎÅͳݻóÀÇ À¯ÀúµéÀ» ²ø¾î ¸ðÀ¸´Â ÀÏÀÏ °ÍÀÌ´Ù. Á»´õ ±ôÂïÇÏ°í »óÅÇÑ ¾ÆÀ̵ð¾î·Î »ç¿ëÀÚµéÀ» ¸Å·á½ÃÅ°´Â ÀÏÀÌ¾ß ¸»·Î À¥»ó¿¡¼ ApplicationÀ» °³¹ßÇϰųª Homepage¸¦ Á¦ÀÛÇϰųª ÇÒ ¶§ »ý°¢ÇØ µÎ¾î¾ß ÇÒ ÀÏÀÌ ¾Æ´Ò±î? ÇÊÀÚ°¡ ¸¸µå´Â °Ô½ÃÆÇÀÌ ±×·¸°Ô »óÅÇÏ°í ¸Å·ÂÀûÀ̶ó°í ¸»ÇÒ ¼ö´Â ¾øÁö¸¸ ´ëºÎºÐÀÇ À¥º¸µå(À¥°Ô½ÃÆÇ)ÇÁ·Î±×·¥¿¡¼ °£°úÇÏ°í ³Ñ¾î°¡´Â ºÎºÐ¿¡ ±â´ÉÀ» Ãß°¡ÇÏ¿© º¸¾Ò´Ù.
3. CGI¿Í °ü·ÃÇؼ ¾Ë¾ÆµÎ¸é °¡²ûÀº ¾µ ¸¸ÇÑ ±â¼ú SSI(Server Side Include) Ǫ½¬±â¼ú ÀÌÀü¿¡ ÁÖ·Î »ç¿ëµÇ´ø °ÍÀÌ ¹Ù·Î ÀÌ ±â¹ýÀÌ´Ù. ÀÌ°ÍÀ» Html¿¡¼ À¥¼¹ö¿¡ ÀÖ´Â ¸í·ÉÀ» ½ÇÇàÇϰųª ÆÄÀϵîÀ» include ÇÒ ¶§ »ç¿ëÇϴµ¥ ¸í·É¾î³ª CGI ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°´Â °ÍÀº ¾à°£ ¹«¸ðÇÑ ÁþÀ̱⠶§¹®¿¡ ÆÄÀϸ¸À» include½ÃÅ°´Â °Í¸¸À» »ç¿ëÇϱâ·Î ÇÑ´Ù. SSI ÆÄÀÏÀº º¸Åë È®ÀåÀÚ°¡ .shtml¸¦ ³¡³ª´Â ÆÄÀÏÀ» ¸¹ÀÌ »ç¿ëÇÑ´Ù. .htmlÀ» ¹Ù·Î »ç¿ëÇÏÁö ¾Ê´Â ÀÌÀ¯´Â SSI¸¦ ÀÌ¿ëÇÏ°Ô µÇ¸é ¹®¼¸¦ ÀÏÀÏÀÌ ÆĽÌÇØ¾ß Çϱ⠶§¹®¿¡ ¼¹ö¿¡ ºÎ´ãÀ» Áֱ⠶§¹®Àε¥ °¡±ÞÀûÀ̸é È®ÀåÀÚ¸¦ ±¸ºÐÇؼ »ç¿ëÇϵµ·Ï ÇÏ°í ÀÚÁ¦Çؼ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ°í ¸¸ÀÏ »ç¿ëÇÏÁö ¾ÊÀ» ¼ö ÀÖ´Â ´Ù¸¥ ¾ÆÀ̵ð¾î°¡ ÀÖ´Ù¸é ±×°ÍÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¾î·µç ÇÊÀÚ°¡ ÀÌ°ÍÀ» ÀÌ¿ëÇؼ ÇÏ°í ½ÍÀº ÀÏÀº °Ô½ÃÆÇ¿¡¼ ¸¸µé¾î³½ µ¿ÀûÀÎ Ãâ·Â¹°À» html¿¡ Æ÷ÇÔ ½ÃÅ°±â À§ÇÑ °ÍÀÌ´Ù. SSI°¡ ÀÛµ¿Çϱâ À§Çؼ´Â httpd ÀÇ srm.conf ¿Í access.conf ÆÄÀÏÀ» ¼öÁ¤Çؼ SSI °¡ µÇµµ·Ï ÇÑ´Ù. access.conf ÆÄÀÏÀÇ ÀϺκÐÀ» º¸¸é httpd µµÅ¥¸àÆ® root°¡ Àִµ¥, ±× °÷ÀÇ ºÎºÐÀÌ ¾Æ·¡¿Í °°ÀÌ µÇ¾î ÀÖÀ» °ÍÀÌ´Ù. Option ºÎºÐ¿¡ include¸¦ Ãß°¡ ½ÃÄÑÁÖ¸é µÈ´Ù. ¾Æ·¡´Â ÀÌ¹Ì Ãß°¡°¡ µÇ¾î ÀÖ´Â »óÅÂÀÌ´Ù. < Directory /var/www/docs > AllowOverride None srm.conf ÆÄÀÏ¿¡¼´Â Áß°£Âë¿¡ ´ÙÀ½°ú °°Àº Ç׸ñÀÌ ÁÖ¼®Ç¥½Ã(#)°¡ µÇ¾î ÀÖ´Ù¸é ¾ø¾ÖÁÖµµ·Ï ÇÏ°í Áß°£ºÎºÐ¿¡ AddHandier server-parsed Ç׸ñÀ» ã¾Æ¼ ¾Æ·¡¿Í °°ÀÌ ¼öÁ¤ÇØ ÁÖ¸é µÈ´Ù. : ÀÌÁ¦ SSI°¡ ÀÛµ¿µÉ Áغñ´Â ³¡ÀÌ ³ °ÍÀÌ´Ù. httpdÀ» ´Ù½Ã ±¸µ¿½ÃÅ°°í(ps -ax | grep httpd¸¦ ½ÇÇà½ÃŲ ´ÙÀ½ °¡Àå ÀÛÀº ¹øÈ£ÀÇ httpd ÀÇ PID¸¦ °¡Áö°í kill -HUP httpd ÀÇ PID¸¦ ÇÏ¸é µÈ´Ù.) °£´ÜÇÏ°Ô SSI °ü·Ã ¸í·É¾î¿¡ ´ëÇؼ »ìÆ캸±â·Î ÇÏÀÚ. SSI ¸í·É¾î´Â html ÀÇ ÁÖ¼®ÀÎ <!---->»çÀÌ¿¡
µé¾î°£´Ù. ÀÚ, ±×·³ ¿ì¸®¿¡°Ô ÇÊ¿äÇÑ °ÍÀº ÆÄÀÏÀ» include ÇÏ´Â
°ÍÀ̹ǷΠÇѹø È®ÀÎÇغ¸µµ·Ï ÇÏÀÚ.
4. °Ô½ÃÆÇÀ» ¸¸µé±â Àü¿¡ ÇÊ¿äÇÑ DB¿¬µ¿¿¡ ´ëÇÑ À̾߱â. °Ô½ÃÆÇÀ» ¸¸µå´Âµ¥ DataBase¸¦ ¿¬°áÇØ¾ß Çϴ°¡? ±×°Ô Àǹ®Á¡À¸·Î ³²À»Áö ¸ð¸£°Ú´Ù. ¿Ö³ÄÇϸé, File I/O¸¦ ÀÌ¿ëÇؼ Á÷Á¢ ±¸ÇöÇÒ ¼öµµ Àִµ¥ ¸»ÀÌ´Ù. Àå´ÜÁ¡ÀÌ ÀÖ´Ù. ÀÏ´Ü File I/O¸¦ »ç¿ëÇÏ°Ô µÇ¸é ºü¸£°Ô ±¸ÇöÇÒ ¼ö ÀÖÁö¸¸ º¹ÀâÇÑ Á¤·Ä±â´ÉÀ̶óµç°¡ µ¥ÀÌÅÍÀÇ ÀϺκÐÀ» °¡Á®¿À´Âµ¥ ¸¹Àº Äڵ尡 ÇÊ¿äÇÏ°Ô µÇ´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. °£´ÜÇÑ ¹æ¸í·ÏÀ» ¸¸µå´Â °æ¿ì¶ó¸é File I/O¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ¿ÀÈ÷·Á È¿°úÀûÀÏ ¼öµµ ÀÖ´Ù. DataBase¸¦ ¿¬µ¿ÇÏ°Ô µÇ¸é µ¢Ä¡´Â Ä¿Áö´Â ´ë½Å ´Ù¾çÇÑ ÀÚ·á°ü¸® ±â´ÉÀ» Á¦°øÇØ ÁØ´Ù. ÇÊÀÚ´Â DataBase¸¦ Á÷Á¢ ¿¬µ¿ÇÑ´Ù. ÀÌÀ¯¶ó¸é, Æí¸®ÇÏ°Ô ÇÁ·Î±×·¥À̶óµç°¡ µ¥ÀÌÅ͸¦ °ü¸®ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¶ÇÇÑ ApplicationÀ» °³¹ßÇϴµ¥ µéÀÌ´Â ½Ã°£À» Àý¾àÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¶ÇÇÑ ¾î¶² DataBase ¿£ÁøÀÌ°Ç °£¿¡ API¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ °ÅÀÇ ºñ½ÁÇÏ°Ô ±¸¼ºµÇ¾î Àֱ⠶§¹®¿¡ Çϳª¸¦ Á¦´ë·Î ¾µ ÁÙ ¾Æ´Â »ç¶÷À̶ó¸é ´Ù¸¥ DataBase ¿£Áø¿¡¼ Á¦°øÇØÁÖ´Â API ¶óµç°¡ JDBC¸¦ »ç¿ëÇÒ ¶§µµ ½±°Ô ÀüÀÌ°¡ °¡´ÉÇÏ´Ù. CGI ·Î µ¥ÀÌŸ¸¦ ó¸®ÇÒ ¶§ ÇÑ°¡Áö ÁÖ¿äÇÏ°Ô ±â¾ïÇØ µÎ¾î¾ß ÇÒ °ÍÀº WEB ÀÇ Æ¯¼ºÀÎ »óžøÀ½ (stateless) ÀÌ´Ù. ¸»ÇÏÀÚ¸é ÇÁ·Î±×·¥ÀÌ Çѹø Á¢¼ÓÇؼ µ¥ÀÌÅ͸¦ ¹Þ¾Æ¿À¸é ´ÙÀ½¿¡ Á¢¼ÓÇÒ ¶§ ÇÁ·Î±×·¥À» óÀ½ºÎÅÍ ´Ù½Ã ½ÃÀÛÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ÀÌ°ÍÀº ¹«¾ùÀ» ÀǹÌÇϴ°¡? °á±¹ Áß°£¿¡ ¾î¶² °á°ú °ªÀ» °¡Á®¿À°í ³ ´ÙÀ½ »óŸ¦ ±â¾ïÇß´Ù°¡ ÀϺκÐÀ» ¿¬¼ÓÀûÀ¸·Î!! º»´Ù´Â °ÍÀº ºÒ°¡´ÉÇÏ´Ù´Â ¼Ò¸®°¡ µÈ´Ù. °á±¹ ÀÌ°ÍÀ» ±¸ÇöÇϱâ À§Çؼ´Â ¿©·¯ °¡Áö º¯¼ö¿¡ »óÅ °ªÀ» CGI¿¡¼ CGI·Î ³Ñ°ÜÁÜÀ¸·Î½á °è¼Ó »óŸ¦ À¯ÁöÇÏ´Â °Íó·³ µ¿ÀÛÇÏ°Ô ÇÏ´Â ÀÏÁ¾ÀÇ Æ®¸¯À» »ç¿ëÇØ¾ß ÇÑ´Ù. ÀÌ ¼ºÁú(stateless) ¶§¹®¿¡ CGI¿Í DataBase ¿¬µ¿ÀÇ ¹®Á¦´Â ¸Å¹ø ÇÁ·Î±×·¥ÀÇ Àç½ÃÀÛÀ» ÇÔÀ¸·Î½á ¼¹öÁ·¿¡ ¿À¹öÇìµå°¡ ¹ß»ýÇÑ´Ù´Â °ÍÀÌ´Ù. ¾î¼¸é ÀÌ°ÍÀº CGI ÀÇ ÇÑ°èÀÏÁöµµ ¸ð¸¥´Ù. ¹°·Ð JAVA¸¦ ¾´´Ù¸é ÀÌ ¹®Á¦´Â ÇØ°áÇÒ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ ¼¹ö°¡ ÃæºÐÈ÷ µ¥ÀÌÅ͸¦ ´Ù·ê ¼ö ÀÖÀ» ¸¸ÅÀÇ ÆÛÆ÷¸Õ½º¸¦ ³»°í ÃÖ¼ÒÇÑ UNIX ȯ°æÀ̶ó¸é ±×·¸°Ô °ÆÁ¤ÇÒ °ÍÀÌ ¾ø´Ù. ÆæƼ¾ö 100¿¡ 32MÀÇ ¸Þ¸ð¸®¸¦ °¡Á³´Ù¸é ¿ì¸®°¡ Àϻ󿡼 »ç¿ëÇÏ°í ÀÖ´Â ¿Ø¸¸ÇÑ Áß¼Ò±Þ data¸¦ ó¸®ÇÏ´Â µ¥¿¡´Â ±×·¸°Ô Å« °ÆÁ¤µÉ °ÍÀº ¾ø´Ù°í º»´Ù.
5. CGI Library - cgihtml - 1.66 ¿Ö Library¸¦ »ç¿ëÇØ¾ß ÇÏ´Â °ÇÁö? ¿©±â¼ ´Ù½ÃÇѹø ¸»ÇÏÁö¸¸ ÇÁ·Î±×·¥À» °³¹ßÇÒ ¶§ ¾îµð¿¡ ÁßÁ¡À» ¸ÂÃß°í Àִ°¡¸¦ ÀØÀ¸¸é ¾ÈµÈ´Ù. ¸¸ÀÏ CGI ÀÚü ±¸ÇöÀÌ ¸ñÀûÀ̶ó¸é ±×°Í¿¡¸¸ ½Å°æÀ» ½á¾ß ÇÒ °ÍÀÌ°í Application ÀÌ ¸ñÀûÀ̶ó¸é Application ¿¡¸¸ ½Å°æÀ» ¾µ ¼ö ÀÖµµ·Ï ÀÚ½ÅÀÇ È¯°æÀ» ¸¸µé¾î¾ß ÇÑ´Ù. °¡²û °¡´Ù°¡ ÀÌ»óÇÑ ÀÚÁ¸½É(?)À» ¹ßÈÖÇÏ´Â »ç¶÷µéÀÌ ÀÖ¾î¼ ¸ðµç °ÍÀ» ÀÚ½ÅÀÇ ¼ÕÀ¸·Î °³¹ßÇØ¾ß ÇÑ´Ù´Â ½ÄÀÇ »ç°í¹æ½ÄÀ¸·Î ½ÃÀÛÇÏ·Á°í ÇÏ´Â »ç¶÷µéÀÌ ÀÖ´Ù´Â °ÍÀÌ´Ù. ¾Æ¹«Æ° ¿©±â¼ ¿ì¸®ÀÇ ¸ñÀûÀº ApplicationÀ» °³¹ßÇÏ´Â µ¥ ÀÖ´Ù. ÀÚ½ÅÀÌ ApplicationÀ» °³¹ßÇϴµ¥ ÀÖ¾î¼ Áß¿äÇÑ Content¸¦ ±¸ÇöÇϴµ¥ Àü·ÂÀ» ´ÙÇÒ ¼ö ÀÖ¾î¾ß ÇÏ´Â °ÍÀÌ´Ù. ÇÊÀÚ°¡ ÀÌ ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÏ´Â ÀÌÀ¯´Â ¿©·¯ °¡Áö°¡ ÀÖ´Ù. Text »óÅ¿¡¼ Á÷Á¢ µ¥ÀÌÅ͸¦ ÀÔ·ÂÇÏ°í µð¹ö±ëÇÒ ¼ö Àֱ⠶§¹®¿¡ À¥¿¡¼ÀÇ °ñÄ¡ ¾ÆÇ Debugging ÀÛ¾÷¿¡¼ ¹þ¾î³ª°Ô ÇØ Áֱ⠶§¹®ÀÌ´Ù. ÀÌ ¶óÀ̺귯¸®¿¡ ´ëÇؼ ¼³¸íÇϱâ Àü¿¡ À¥¿¡¼ÀÇ ÀÛ¾÷À» Àá½Ã ¾ê±âÇغ¸ÀÚ. ¿Ö °ñÄ¡ ¾ÆÇ Debugging Àΰ¡? ±×³É Application ¿¡¼¿Í ´Þ¸®(ƯÈ÷ UNIX ¿¡¼) CGI¿¡¼´Â ¿©·¯ °¡Áö ºÎºÐ¿¡¼ Error °¡ ¹ß»ýÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ±×¸®°í ¿¡·¯°¡ ³ª¸é httpd ´Â ¾ÆÁÖ ¹«¼ºÀÇÇÑ error message ¸¸À» ³»°í ¸¸´Ù. error debug¸¦ Çϱâ À§Çؼ ÇÒ ¼ö ÀÖ´Â °¡Àå ¿ø½ÃÀûÀÎ ¹æ¹ýÀÎ print¸¦ ÀÌ¿ëÇÏ´Â °ÍÀ» Çã¿ëÇÏÁö ¾Ê´Â´Ù. °á±¹ Áß°£¿¡ ¾îµð¿¡¼±°¡ error °¡ ³ª¸é, ±âÁ¸¿¡ ³ª¿À´Â ¸ðµç Ãâ·ÂÀÌ ¹«½ÃµÇ°í httpd error message ¸¸ ³ª¿À±â ¶§¹®ÀÌ´Ù. ±×·¸±â ¶§¹®¿¡ ÀÌ°Ô httpd¿¡¼ ³ °ÍÀÎÁö, Application¿¡¼ ³ °ÍÀÎÁö Àß ¾Ë ¼ö°¡ ¾ø´Ù. UNIX¿¡¼ Debugging ToolÀ» µû·Î ¾²Áö ¾Ê´Â »ç¶÷À̶ó¸é ÀÌ·¸°Ô error debugging ÇÏ´Â °ÍÀº Á¤¸» ¸Ó¸®ÅÐ ºüÁö´Â ÀÏÀÏ ¼ö¹Û¿¡ ¾ø´Ù. ´õ±º´Ù³ª CGI ¸¸ °³¹ßÇÏ°í httpd ¿¡ ´ëÇؼ Àß ¸ð¸¥´Ù¸é Á¤¸» ¼Ó¼ö¹«Ã¥ ÀÌ´Ù. º¸Åë error °¡ ¹ß»ýÇÏ´Â °æ¿ì´Â httpdÀÇ Æ¯¼º»ó ÁÖ¾îÁö´Â µð·ºÅ丮ÀÇ ±ÇÇÑ ¹®Á¦¿¡¼ ³¯ ¼ö°¡ ÀÖ°í ¾Æ´Ï¸é UNIX ÀÇ µð·ºÅ丮 ±ÇÇѹ®Á¦, ¶Ç´Â CGI Äڵ忡¼ ¾Æ´Ï¸é ¿ì¸®°¡ ¿¬µ¿Çؼ ¾²°íÀÚ ÇÏ´Â DB ¿£ÁøÀÇ setting ¹®Á¦ ÀÏ ¼öµµ ÀÖ´Ù. ÀÌ·¸°Ô ¿©·¯ °¡Áö °æ¿ìÀÇ ¼ö¸¦ ´Ù °Ë»çÇغ¸¾Æ¾ß Çϴµ¥ ÀÌ·± »óȲÀ» Àß ¸ð¸£´Â »óÅ¿¡¼ ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ù°¡ º¸¸é ªÀº ¸î Á٠¥°í Debugging Çϴµ¥ ³¯ ¹ã ²Ãµü »õ´Â °ÍÀº Á¤¸» ¿ì½º¿î ÀÏÀÌ µÇ´Â °ÍÀÌ´Ù. ÀÌ·± °æ¿ì¿¡ CGI¸¦ °³¹ßÇϴµ¥ ÀÇ¿åÀ» »ó½ÇÇÏ°Ô µÇ°í ¿ì¸®°¡ ¿øÇÏ´Â ¸ñÀûÀ» Á¦´ë·Î ´Þ¼ºÇÒ ¼ö ¾ø°Ô µÇ´Â °ÍÀÌ´Ù. ¸¸ÀÏ ¿©±â¼ Web Broswer ¸¸ ¾î¶»°Ô ¹þ¾î³´Ù¸é ±×³ª¸¶ Debugging Çϱâ´Â Æí¸®ÇÒ °ÍÀÌ´Ù. cgi-htmlµµ Text ¸ðµå¿¡¼ Á÷Á¢ CGI ÀԷº¯¼ö¸¦ ³ÖÀ» ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ±×·¸°Ô ÇÔÀ¸·Î ¾òÀ» ¼ö ÀÖ´Â ÀåÁ¡Àº ¹Ù·Î httpdÀÇ ¹«½Ã¹«½ÃÇÑ server error message¸¦ ÇÇÇÒ ¼ö ÀÖ´Ù. ÀÌ·¸°Ô debugging ÇÏ´Â °ÍÀÌ 100% ¿Ïº®ÇÏÁö´Â ¾Ê¾ÒÁö¸¸ ÇÊÀÚÀÇ °æÇèÀ¸·Î´Â 90% Á¤µµ´Â È¿°ú°¡ ÀÖ´Â µí ½Í´Ù. ±×·¯¸é ÀÌÁ¦ cgi-html ¿¡ ´ëÇؼ Àá±ñ ¼³¸íÀ» ÇÏ°í ³Ñ¾î°¡±â·Î ÇÏÀÚ. ±âº»ÀûÀÎ ±¸¼º ÇÁ·Î±×·¥ È帧Àº ´ÙÀ½°ú °°´Ù. ÀÚ¼¼ÇÑ library ¼³¸íÀº ´ÙÀ½ ±Û¿¡¼ ¼Ò°³Çϵµ·Ï ÇÏ°í ¿©±â¼´Â ¾î¶»°Ô »ç¿ëÇϴ°¡¸¸ È®ÀÎÇØ º¸µµ·Ï ÇÏ°Ú´Ù. 1 /* template using cgihtml.a library
*/ cgi-html ¿¡¼´Â 3°³ÀÇ header ÆÄÀÏÀ» Á¦°øÇØÁִµ¥ cgi-lib.h´Â cgi ÀԷº¯¼ö¸¦ ÆĽÌÇϴµ¥ ÇÊ¿äÇÑ ÇÔ¼öµéÀÌ Á¤ÀÇ°¡ µÇ¾îÀÖ´Ù. ÀԷº¯¼öµéÀ» ó¸®Çϱâ À§Çؼ llist ¶ó´Â ±¸Á¶Ã¼¸¦ ÀÌ¿ëÇÏ¿© linked list¸¦ »ç¿ëÇÑ´Ù. html-lib.h°¡ Àִµ¥ ÀÌ°ÍÀº html tag¿Í °ü·ÃÀÌ ÀÖ´Â ÇÔ¼öµéÀ» Á¤ÀÇ ÇØ µÎ¾ú´Ù. ´ÙÀ½ string-lib´Â ¹®ÀÚ¿ ÇÔ¼ö¸¦ ó¸®ÇÏ´Â µ¥ ÇÊ¿äÇÑ ÇÔ¼öµéÀ» Á¦°øÇØÁÖ°í ÀÖ´Ù. ƯÈ÷ ¸¹ÀÌ »ç¿ëÇÒ ÇÔ¼ö°¡ Àִµ¥ ±×°ÍÀº ¹®ÀÚ¿ ¸Þ¸ð¸® ÇÒ´ç ÇÔ¼öÀÌ´Ù. ¸¸ÀÏ CGI ÀԷº¯¼ö¸¦ ó¸®ÇÏ´Â °æ¿ì¶ó¸é ¹Ýµå½Ã llist ±¸Á¶Ã¼¸¦ ¹Ýµå½Ã ¼±¾ðÇØÁØ´Ù. 11¹ø° ÁÙ¿¡¼ entries ¶ó´Â ±¸Á¶Ã¼¸¦ ¼±¾ðÇØÁÖ¾ú´Ù. ±× ´ÙÀ½ CGI·Î µé¾î¿À´Â ÀÔ·ÂÀ» ó¸®ÇØÁÖ±â À§Çؼ ÀоîÁÖ´Â ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ´Ù. 15¹ø° ÁÙÀ» º¸¸é read_cgi_input ÇÔ¼ö¸¦ »ç¿ëÇÏ¿´´Ù. ÀÌ°ÍÀ» ÅëÇؼ linked list ¿¡ CGI ÀÔ·Â °ªÀ» ÀúÀåÇÑ´Ù. ±× ´ÙÀ½¿£ CGI º¯¼öÀÇ °ªÀ» ÇÊ¿äÇÒ ¶§ ºÒ·¯¼ ¾²±â¸¸ ÇÏ¸é µÈ´Ù. CGI º¯¼ö¸¦ ºÎ¸£´Â ÇÔ¼ö·Î cgi_val() ÇÔ¼ö¸¦ ¾´´Ù. CGI ÀÔ·Â °ª Áß¿¡¼ º¯¼ö¸íÀ» ³ÖÀ¸¸é ¸®½ºÆ®¿¡¼ ã¾Æ¼ ±× °ªÀ» ¸®ÅÏÇØÁØ´Ù. ¹®ÀÚ¿ °ªÀ¸·Î ¸®ÅÏÀÌ µÇ´Âµ¥, ¿©±â¼ ÁÖÀÇÇØ¾ß ÇÒ »çÇ×ÀÌ ÀÖ´Ù. 16, 17 ¹ø° ÁÙÀ» »ìÆ캸ÀÚ. µÑ ´Ù Á¦´ë·Î °ªÀÌ µé¾î°£´Ù. ±×·±µ¥ 16 ¹ø° ÁÙó·³ Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇؼ °ªÀ» ¹ÞÀ» ¶§ Á¦´ë·Î °ªÀ» Àü´ÞµÇÁö ¾Ê´Â °æ¿ì°¡ ÀÖÀ¸¹Ç·Î 17 ¹ø° ÁÙó·³ cgi_html¿¡¼ Á¦°øÇÏ´Â newstr ÇÔ¼ö¸¦ ½á¼ ¸Þ·Î¸® ÇÒ´çÇÑ ´ÙÀ½ ÀÚµ¿À¸·Î ½ºÆ®¸µÀ» º¹»çÇÏ´øÁö ¾Æ´Ï¸é ¹®ÀÚ¹è¿À» ¼±¾ðÇÑ ´ÙÀ½ strcpy ¸í·ÉÀ¸·Î º¹»ç¸¦ Çؼ ¾²´Â °ÍÀÌ ³´´Ù. ¾î·µç 17 ¹ø° ÁÙó·³ »ç¿ëÇÒ °ÍÀ» ±ÇÀåÇÑ´Ù. html_header() ´Â html MIME typeÀ» Ãâ·ÂÇÏ´Â °ÍÀε¥ puts("Content-type : text/html¡¬n¡¬n") ; °ú ¶È°°Àº °á°ú°¡ µÈ´Ù. ÇÑ°¡Áö ±â¾ïÇØ µÎ¾î¾ß ÇÒ °ÍÀº HTML Çü½ÄÀ¸·Î Ãâ·ÂÇÏ·Á°í ÇÑ´Ù¸é ¹Ýµå½Ã ³Ö¾îÁÖ¾î¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é httpd °¡ ¾î¶² Á¾·ùÀÇ ¹®¼¸¦ Ãâ·ÂÇØ¾ß ÇÒÁö ¸ô¶ó¼ Ȳ´çÇÑ server error¸¦ ³»°í ¸» °ÍÀÌ´Ù. ÀÌ·¸°Ô ÇÑ ´ÙÀ½ ³ª¸ÓÁö ó¸®ÇÏ°í ½ÍÀº °ÍÀ» ó¸®ÇÑ ´ÙÀ½ list ±¸Á¶Ã¼ÀÇ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇØÁÖ¾î¾ß ÇÑ´Ù. 21¹ø° ÁÙó·³ list_clear() ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù. ÁÖÀÇÇÒ °ÍÀº &entriesÀ» ÆĶó¸ÞÅÍ·Î ³Ñ°å´Ù´Â °ÍÀÌ´Ù. ÀÏ¹Ý ÇÁ·Î±×·¥¿¡¼ Ãß°¡µÇ´Â °ÍÀÌ ¾ó¸¶ µÇÁö ¾Ê´Â´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ÄÄÆÄÀÏÇÏ´Â ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù. cc -o program.cgi program.cgi.o cgihtml.a ÄÄÆÄÀÏ·¯´Â cc ¶Ç´Â, gcc ¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ¿©±â¼ -o ¿É¼ÇÀ» ¾²¸é »ý¼ºÇÏ°í ½ÍÀº ÆÄÀÏÀ̸§À» ÁöÁ¤ÇÏ´Â °ÍÀÌ°í cgihtml.a ¶óÀ̺귯¸® archive¸¦ Æ÷ÇÔ½ÃÄÑ ÁÖ¸é µÈ´Ù. cgi-html ¶óÀ̺귯¸®´Â ¾Æ·¡ÀÇ »çÀÌÆ®¿¡ °¡¸é ¹ÞÀ» ¼ö ÀÖ´Ù. eekim.com FTP Site ftp://ftp.eekim.com/users/eekim/cgihtml/ Harvard Computer Society FTP Site ftp://hcs.harvard.edu/pub/web/tools/cgihtml/ cgi-html ȨÆäÀÌÁö°¡ Àִµ¥ ÀÌ°÷¿¡ °¡¸é Ãë±ÙÀÇ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖÀ¸´Ï±î Çѹø °¡º¸µµ·Ï Ç϶ó. http://www.eekim.com/software/cgihtml/. cgi-html ÇÔ¼ö ·¹ÆÛ·±½º¸¦ ½Ç¾îº¸¾Ò´Ù. Âü°í°¡ µÇ¾úÀ¸¸é ÁÁ°Ú´Ù.
cgi_html ÇÔ¼ö ·¹ÆÛ·±½º-cgi-lib.h¿¡ Æ÷ÇԵǾî ÀÖ´Â °Íµé Library º¯¼ö cgi-lib.h CGI SERVER_SOFTWARE Library ÇÔ¼öµé short accept_image() void unescape_url() int real_cgi_input(llist *entries) ; char* cgi_val(llist 1, char *name) ; char **cgi_val_multi(llist 1, char *name)
; char* cgi_name(llist 1, char *value) ; char **cgi_name_multi(llist 1, char *value)
; int parse_cookies(llist *entries) ; void print_cgi_env() ; void print_entries(llist 1) ; char* escape_input(char *str) ; short is_form_empty(llist 1) ; short is_field_exists(llist 1, char *str)
; short is_field_empty(llist 1, char *str)
;
-html-lib.h : html °ú °ü·ÃµÈ ÇÔ¼öµé Library functions void html_header() ; void mime_header(char *mime) ; void nph_header(char *status) ; void show_html_page(char *loc) void status(char *status) ; void pragma(char *msg) ; void set_cookie(char *name, char *value,
char *expires, char *path, void html_begin(char *title) ; void html_end() ; void h1(char *header) ; ... void h6(char
*header) ; void hidden(char *name, char *value) ;
- string-lib.h : ¹®ÀÚ¿ ó¸®¿Í °ü·ÃµÈ ÇÔ¼öÀÌ´Ù. Library functions char* newstr(char *str) ; char* substr(char *str, int offset, int
len) ; char* replace_ltgt(char *str) ; char *lower_case(char *buffer) ;
query ÀÇ °á°ú¸¦ ÅؽºÆ®»óÅ¿¡¼ È®ÀÎÇÏ´Â ¹æ¹ý command line »ó¿¡¼ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°¸é ¾Æ·¡¿Í °°Àº °á°ú°¡ ³ª¿Â´Ù. --- cgihtml Interactive Mode --- Enter CGI input sting. Remember to encode
appropriate characters. ÀԷ¹®ÀÚ¿ÀÌ ´ÙÀ½°ú °°´Ù°í °¡Á¤ÇÑ´Ù¸é name=eugene&age=21 queryÀÇ °á°ú·Î ´ÙÀ½°ú °°Àº °ÍÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù. Input string : name=eugene&age=21 <h1>Quey results</h1> segmentation fault°¡ ÀϾٸé ÀÌ·¸°Ô ÆÄÀÏÀ» ½ÇÇà½ÃÄÑ º½À¸·Î½á ÇÁ·Î±×·¥ÀÇ error¸¦ ÀâÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.
6. Postgres C Library - libpq ¸®´ª½º ·¹µåÇÞÀ» ¼³Ä¡ÇßÀ» °æ¿ì Æ÷½ºÆ®±×·¡½ºÀÇ µð·ºÅ丮¿Í ½ÇÇàȯ°æ¿¡ ´ëÇؼ ¼³¸íÀ» ÇØÁÖ°í ÀνºÅ纻À» ¼³Ä¡ÇßÀ» °æ¿ìÀÇ È¯°æÀ» ¼³¸íÇØ ÁØ´Ù. Æ÷½ºÆ®±×·¡½º¿¡ ´ëÇÑ ³»¿ëÀº ³Ê¹«³ª À¯¸íÇÑ ³»¿ëÀ̱⠶§¹®¿£ ÇÊ¿äÇÑ API ¸¸À» ¼³¸íÇÑ°í ³ª¸ÓÁö´Â reference¸¦ Âü°í Çϵµ·Ï ÇÑ´Ù. Âü°í·Î LIBPQ¿¡ ´ëÇÑ ¾Æ·¡ÀÇ ¼³¸íÀº www.linuxlab.co.kr¿¡ ÀÖ´Â °ÁÂÆÄÀÏÀ» Âü°í ÇßÀ½À» ¹àÇô µÐ´Ù. -LIBPQ´Â Postgres¿¡ ´ëÇÑ API·Î »ç¿ëÀÚ ÇÁ·Î±×·¥Àº Çì´õÈÀÏ·Î libpq-fe.h¸¦ include ÇÏ°í library·Î libpq.a¸¦ link ÇÏ¿© ÀÛ¼ºÇÑ´Ù. /usr/local/pgsql/include/libpq-fe.h - ȯ°æº¯¼ö¿Í ÃʱâÈ(setenv ÇÔ¼ö¸¦ ÀÌ¿ë¼³Á¤?) PGHOST : Postgres °¡ žÀçµÈ ¼¹öÀ̸§ ¼³Á¤ PGOPTIONS : ºÎ°¡ÀûÀÎ runtime option PGPORT :Æ÷Æ®¹øÈ£ ¼³Á¤ PGTTY :¼¹ö·ÎºÎÅÍÀÇ µð¹ö±ë ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÒ ÆÄÀÏÀ̳ª ȸé(tty) ¼³Á¤ PGDATABASE : POSTGRES µ¥ÀÌÅͺ£À̽º À̸§ ¼³Á¤ PGREALM : POSTGRES ¿Í »ç¿ëÇÒ Kerberos realm ¼³Á¤ - API 1) µ¥ÀÌÅÍ º£À̽º ¿¬°á/Á¾·á : PQsetdb, PQfinish, PQreset PGconn *PQsetdb void PQfinish(PQconn *conn) void PQreset(PGconn *conn) 2) ¿¬°á°Ë»ç : PQstatus(PQdb, PQhost, PQoptions, PQport, PQtty) ConnStatusType *PQstatus(PGconn *conn) char *PQdb(PQconn *conn) char *PQhost(PQconn *conn) char *PQport(PQconn *conn) char *PQoptions(PQconn *conn) char *PQtty(PQconn *conn) 3) ¿¡·¯¸Þ¼¼Áö °ü·Ã ÇÔ¼ö char *PQerror Message(PQconn *conn) ; void PQtrace(PQconn *conn, FILE*debug_port)
; void PQuntrace(PQconn *conn) ; 4) Äõ¸®(Query) PGresult *PQexec(PQconn *conn, char *query)
; ExecStatusType PQresult structure(PGresult
*res) ; ¡ßquery ÇÑ tuple(instance, record)°á°ú¸¦
ÃßÃâÇÏ´Â ÇÔ¼ö int PQntuples(PGresult *res) ; int PQnfields(PGresult *res) ; char *PQfname(PGresult *res, int field_index)
; int PQfnumber(PGresult *res, char* field_name)
; Oid PQftype(PGresult *res, int field_num)
; int2 PQfsize(PGresult *res, int field_index)
; char *PQgetvalue(PGresult *res, int tup_num,
int field_num) ; int PQgetlength(PGresult *res, int tup_num,
int field_num) ; char *PQcmdStatus(PGresult *res) ; char *PQoidStatus(PGresult *res) ; void PQprintTuple(PGresult *res) ; void PQclear(PQresult *res) ; 5) Fast Path : db³»ÀÇ internal functionÈ£Ãâ PGresule* PQfn(PGconn,conn) 6) Asynchronous Notification PGnotify* PQNotifies(PGconn *conn) ; 7) COPY ¸í·É°ú °ü°èµÈ ÇÔ¼öµé * copy : libpq¿¡ ÀÇÇØ »ç¿ëµÈ Ä¿³Ø¼Ç¿¡
/À¸·Î µ¥ÀÌÅ͸¦ ¾²°Å³ª, Àоî¿À´Â ÇÁ·ÎÅäÄÝ ÀÌÇÏ ÇÔ¼öµéÀº ÀÌ
Ä¿³Ø¼Ç¿¡ direct·Î ºÙ¾î¼(ÀϹÝÀûÀÎ PQexecÀ¸·Î´Â ½ÇÇàµÇ´Â
query´Â ÇϳªÀÇ ³í¸®ÀÛ¾÷ ´ÜÀ§Àε¥, ÀÌÇÏ ÇÔ¼ö È£ÃâµéÀº ¿©·¯
¹øÀÇ ÇÔ¼öÈ£ÃâÀÌ ÇϳªÀÇ ³í¸®ÀÛ¾÷´ÜÀ§¸¦ Çü¼ºÇÑ´Ù) ÀÌ ¸í·É¾î¸¦
Áö¿øÇÑ´Ù. Áï, PQexecÀ¸·Î copy ¸í·ÉÀ» ½ÇÇà½ÃÅ°°í, ¹Ù·Î À̾î¼
direct read/write ¼öÇà int PQgetline(PGconn *conn, char *string,
int length) ; void PQputline(PGconn *conn, char *string)
; int PQendcopy(PGconn *conn) ; [ ¿¹Á¦ ] 7) »ç¿ëÀÚ ÀÎÁõ°ú °ü·ÃµÈ ÇÔ¼ö char *fe_getauthname(char* errorMessage)
; void fe_setauthsvc(char *name, char* errorMessage)
; À̹ø È£¿¡¼´Â ¾ÕÀ¸·Î »ç¿ëÇÒ Åøµé¿¡ ´ëÇؼ Àá±ñ µÑ·¯ º¸¾Ò´Ù. ³»¿ëÀÌ ±×·¸°Ô ½â Àß Á¤¸®°¡ µÈ °ÍÀº ¾Æ´ÏÁö¸¸ ÇÊÀÚ°¡ »ý°¢ÇÏ¿© Á¤¸®ÇÑ ¾î¼³Ç ¾ê±âµéÀÌ CGI·Î ÇÁ·Î±×·¡¹Ö Çغ¸·Á°í ÇÏ´Â ¿©·¯ºÐ¿¡°Ô ¾î´À Á¤µµ´Â µµ¿òÀÌ µÉ °ÍÀ̶ó°í »ý°¢ÇÑ´Ù. ´Ù½ÃÇѹø ¸»ÇÏÁö¸¸ ÇÁ·Î±×·¡¹ÖÀ» °øºÎÇÒ ¶§´Â ½Ç¿ëÀûÀÎ °Í°ú ¹Ì·¡ÁöÇâÀûÀÌ ÀÖ´Ù´Â °ÍÀ» ÀØÁö ¸»±â ¹Ù¶õ´Ù. |