CGI ·Î ³»¸¾¿¡ ²À µå´Â °Ô½ÃÆÇ ¸¸µé±â

±èÈ£¼º / µ¿±¹´ë ³×Æ®¿öÅ©ÆÀ ¡°Ë´Ù¸®

 

     

    ½Ç¿ë¼º ÀÖ´Â 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 >
    Options Indexes FollowSymLinks MultiViews Includes

    AllowOverride None
    order allow,deny
    allow from all
    < /Directory >

    srm.conf ÆÄÀÏ¿¡¼­´Â Áß°£Âë¿¡ ´ÙÀ½°ú °°Àº Ç׸ñÀÌ ÁÖ¼®Ç¥½Ã(#)°¡ µÇ¾î ÀÖ´Ù¸é ¾ø¾ÖÁÖµµ·Ï ÇÏ°í Áß°£ºÎºÐ¿¡ AddHandier server-parsed Ç׸ñÀ» ã¾Æ¼­ ¾Æ·¡¿Í °°ÀÌ ¼öÁ¤ÇØ ÁÖ¸é µÈ´Ù.

          :
          :
    # To use server-parsed HTML files
    AddType text/html .shtml
          :
          :
    AddHandler server-parsed .shtml

    ÀÌÁ¦ SSI°¡ ÀÛµ¿µÉ Áغñ´Â ³¡ÀÌ ³­ °ÍÀÌ´Ù. httpdÀ» ´Ù½Ã ±¸µ¿½ÃÅ°°í(ps -ax | grep httpd¸¦ ½ÇÇà½ÃŲ ´ÙÀ½ °¡Àå ÀÛÀº ¹øÈ£ÀÇ httpd ÀÇ PID¸¦ °¡Áö°í kill -HUP httpd ÀÇ PID¸¦ ÇÏ¸é µÈ´Ù.) °£´ÜÇÏ°Ô SSI °ü·Ã ¸í·É¾î¿¡ ´ëÇؼ­ »ìÆ캸±â·Î ÇÏÀÚ.

    SSI ¸í·É¾î´Â html ÀÇ ÁÖ¼®ÀÎ <!---->»çÀÌ¿¡ µé¾î°£´Ù. ÀÚ, ±×·³ ¿ì¸®¿¡°Ô ÇÊ¿äÇÑ °ÍÀº ÆÄÀÏÀ» include ÇÏ´Â °ÍÀ̹ǷΠÇѹø È®ÀÎÇغ¸µµ·Ï ÇÏÀÚ.
    ÆÄÀÏÀ» include Çϱâ À§Çؼ­´Â
    < !-- include virtual="./ include.html"-- >
    ÇÏ¸é µÈ´Ù. ¿©±â¼­ Á¦´ë·Î µÈ °æ¿ì¶ó¸é html Áß°£¿¡ ÆÄÀÏÀÌ Ãâ·ÂµÇ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

     

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À» ±¸ºÐÇÏ°Ô Çϴ Ư¡Àº ¹Ù·Î CGI ÀÇ Ç¥ÁØ ÀÔÃâ·ÂÀÌ httpd¿¡ ¿¬°áµÇ¾î ÀÖ´Ù´Â °ÍÀÌ´Ù. ±×·¯¹Ç·Î stdin, stdoutÀ¸·Î ¾î¶² °ÍÀ» Ãâ·ÂÇϰųª ÀÔ·Â ¹Þ´Â´Ù¸é ±×°ÍÀº httpd¿Í Åë½ÅÀ» ÇÏ°Ô µÇ´Â °ÍÀÌ´Ù. ±×·¯¹Ç·Î httpd ¿Í ÀÔÃâ·ÂÇϱâ À§Çؼ­ ¸î °¡Áö ¾à¼Ó ÇصР°ÍÀÌ Àִµ¥ ±× ¾à¼ÓÀ» ÁöÅ°¸é¼­ httpd ¿Í data¸¦ ÁÖ°í ¹Þ´Â °ÍÀÌ CGI ÀÇ ÀüºÎÀÌ´Ù.
    ÀÔÃâ·ÂÀ» ó¸®ÇÏ´Â °ÍÀº °£´ÜÇϱâ´Â ÇÏÁö¸¸ ¿©½Ã º¹ÀâÇÑ layout ÀÇ ÇÁ·Î±×·¥À» °³¹ßÇϱ⿡´Â ±âº»ÀûÀ¸·Î hoo.hoo.ncsa.uuic.edu¿¡¼­ Á¦°øÇØÁÖ´Â ±âº» Ʋ¸¸ °¡Áö°í´Â ºÎÁ·ÇÑ ¸éÀÌ ÀÖ´Ù.
    Á¶±Ý ½Å°æÀ» ¾²¸é ÀÚ±â Àڽſ¡°Ô ²À ¸¶À½¿¡ µå´Â ¶óÀ̺귯¸®¸¦ ¸¸µé ¼ö´Â ÀÖÀ» °ÍÀÌ´Ù.

    ¿©±â¼­ ´Ù½ÃÇѹø ¸»ÇÏÁö¸¸ ÇÁ·Î±×·¥À» °³¹ßÇÒ ¶§ ¾îµð¿¡ ÁßÁ¡À» ¸ÂÃß°í Àִ°¡¸¦ ÀØÀ¸¸é ¾ÈµÈ´Ù. ¸¸ÀÏ 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 */
    2  #include <stdio.h >   /* standard io functions */
    3  #include <signal.h >  /* this and unistd.h for signal trapping */
    4  #include <unistd.h >
    5
    6  #include "cgi-lib.h"   /* CGI-related routines */
    7  #include "html-lib.h"   /* HTML-related routines */ 
    8  #include "string-lib.h"   /* ¹®ÀÚ¿­, ¸Þ¸ð¸® ¾ÈÀüÇÏ°Ô ÇÒ´çÇÏ´Â ÇÔ¼ö */ 
    9  int main()
    10  {
    11  llist entries; /* define a linked list; Encoding µÈ ÀڷḦ Decoding Çؼ­ ¸®½ºÆ®·Î ±¸¼º */
    12  char *name ;
    13  char *safe_name ;
    14  /* Decoding ÇÏ´Â ÇÔ¼ö */
    15  read_cgi_input(&entries) ;
    16  name = cgi_val(entries, "name") ;/* Æ÷ÀÎÅ͸¸ ³Ñ±æ °æ¿ì ±×°ÍÀÌ ´Ù¸¥ ÇÔ¼ö·Î return µÇ´Â       °ÍÀº À§ÇèÇÏ´Ù */
    17  safe_name = newstr(cgi_val(entries, "name")) ; /* ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ´Â °ÍÀÌ ¾ÈÀüÇÏ´Ù */
    18  html_header() ; /* print HTML MIME header ;puts("Content-type:text/html¡¬n¡¬n");      °ú µ¿ÀÏ */
    19  /* ÀÌ°÷¿¡ ¿øÇÏ´Â ÀÛ¾÷À» ¼öÇàÇÑ´Ù */
    20  html_end() ;  /* send appropriate HTML end footers () */
    21  list_clear(&entris) ;  /* ¸µÅ©µå ¸®½ºÆ® ¾ø¿¡ ÁÖ´Â °Í ÀØÁö ¸»±â */
    22  return 0 ;
    23  } 

    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
      SERVER_NAME
      GATEWAY_INTERFACE
      SERVER_PROTOCOL
      SERVER_PORT
      REQUEST_METHOD
      PATH_INFO
      PATH_TRANSLATED
      SCRIPT_NAME
      QUERY_STRING
      REMOTE_HOST
      REMOTE_ADDR
      AUTH_TYPE
      REMOTE_USER
      REMOTE_IDENT
      CONTENT_TYPE
      CONTANT_LENGTH
      HTTP_USER_AGENT

      Library ÇÔ¼öµé

      short accept_image()
      ºê¶ó¿ìÁ®°¡ À̹ÌÁö¸¦ Áö¿øÇØ Áִ°¡ ¾Ë¾Æº¸´Â ÇÔ¼ö. Áö¿øÇØÁشٸé 1À», ±×·¸Áö ¾Ê´Ù¸é 0À» ¸®ÅÏÇÔ.

      void unescape_url()
      escape µÈ CGI ÀÔ·Â º¯¼öÀÇ °ª(escaped URL values)À» ¿ø·¡ °ªÀ¸·Î ¹Ù²ãÁÖ´Â ÇÔ¼ö. ¿ì¸®°¡ ÀÌ ÇÔ¼ö¸¦ Á÷Á¢ ¾µ ÀÏÀº ¾ø´Ù.

      int real_cgi_input(llist *entries) ;
      ÀÎÄÚµù µÈ CGI ÀÚ·áµéÀ» µðÄÚµù Çϸ鼭 llist ¿¡ ÀúÀåÇÑ´Ù. GET, POST µÎ °¡Áö Áß ¾Æ¹« °æ¿ì¶óµµ ¾Ë¾Æ¼­ ¼±ÅÃÇؼ­ ÆĽÌ(parsing)ÇØÁØ´Ù.

      char* cgi_val(llist 1, char *name) ;
      ÁÖ¾îÁø º¯¼ö À̸§¿¡ ÇØ´çÇÏ´Â °ªÀ» ã¾Æ¼­ ¸®ÅÏÇØÁØ´Ù. À̸§ÀÌ ¾ø´Ù¸é NULLÀ» ¸®ÅÏÇØ ÁØ´Ù.

      char **cgi_val_multi(llist 1, char *name) ;
      check box¸¦ ó¸®ÇÒ ¶§ ¾²ÀδÙ. À̸§ÀÌ ¾ø´Ù¸é NULLÀ» ¸®ÅÏÇÑ´Ù.

      char* cgi_name(llist 1, char *value) ;
      Á¤ÇØÁø °ªÀ¸·Î À̸§ ãÀ» °æ¿ì »ç¿ëÇÑ´Ù. ¾µÀÏÀÌ ÀÖ´Â ÇÔ¼öÀÎÁö´Â Àß ¸ð¸£°Ú´Ù.

      char **cgi_name_multi(llist 1, char *value) ;
      °ªÀ¸·Î ã´Â °Í¸¸ Á¦¿ÜÇÏ°í cgi_val_multi()¿Í ºñ½ÁÇÑ ±â´ÉÀÌ´Ù.

      int parse_cookies(llist *entries) ;
      HTTP_COOKIE º¯¼ö¸¦ parsing ÇÒ ¶§ »ç¿ëÇÑ´Ù.

      void print_cgi_env() ;
      CGI ȯ°æº¯¼ö¸¦ Âï¾îÁÖ´Â ÇÔ¼öÀÌ´Ù. ȯ°æº¯¼ö°¡ Á¸ÀçÇÏÁö ¾Ê´Â °ÍÀÌ ÀÖ´Ù¸é (null)ÀÌ ÂïÈù´Ù.

      void print_entries(llist 1) ;
      llist ±¸Á¶Ã¼ ¾È¿¡ ÀÖ´Â °ªÀ» Âï¾îÁØ´Ù.

      char* escape_input(char *str) ;
      ¸ðµç metacharacter¸¦  ¡¬·Î escaping ÇØÁÖ´Â ±â´ÉÀ» ¼öÇàÇÑ´Ù.

      short is_form_empty(llist 1) ;
      À̸§ÀÌ ¾ø´Â °ÍÀ» sumit Çߴ°¡ »ìÆ캼 ¶§ »ç¿ëÇÑ´Ù.

      short is_field_exists(llist 1, char *str) ;
      Çʵ尪ÀÌ Á¸ÀçÇϴ°¡ °Ë»çÇÑ´Ù. NULLÀ» ¸®ÅÏÇϸé Á¸ÀçÇÏÁö ¾Ê´Â °ÍÀÌ´Ù.

      short is_field_empty(llist 1, char *str) ;
      Çʵ尡 Á¸ÀçÇÏÁö ¾Ê°Å³ª Çʵ尪ÀÌ ¾ø´Ù¸é 1À» ¸®ÅÏÇÑ´Ù.

     

    -html-lib.h : html °ú °ü·ÃµÈ ÇÔ¼öµé  

      Library functions

      void html_header() ;
      HTML MIME ŸÀÔÀ» Âï¾îÁÖ´Â ÇÔ¼ö.

      void mime_header(char *mime) ;
      »ç¿ëÀÚ°¡ ÀÌÀÇÀÇ MIME ŸÀÔÀ» Ãâ·ÂÇÏ°íÀÚ ÇÒ ¶§ »ç¿ëÇÑ´Ù.

      void nph_header(char *status) ;
      No Content Çì´õ¸¦ º¸³¾ ¶§ »ç¿ëÇÑ´Ù.

      void show_html_page(char *loc)
      html ÆÄÀÏÀ» »ðÀÔÇÏ°í ½ÍÀ» ¶§ »ç¿ëÇÑ´Ù.

      void status(char *status) ;
      HTTP »óÅ Çì´õ¸¦ º¸³¾ ¶§ »ç¿ëÇÑ´Ù.

      void pragma(char *msg) ;
      HTTP pragma Çì´õ¸¦ º¸³¾ ¶§ »ç¿ëÇÑ´Ù.

      void set_cookie(char *name, char *value, char *expires, char *path,
                             char *domain, short secure) ;
      ÁÖ¾îÁø ÆĶó¸ÞÅÍ·Î ÄíÅ°¸¦ ÁöÁ¤ÇÒ ¶§ »ç¿ëÇÑ´Ù.

      void html_begin(char *title) ;
           <html> <head>
           <title> title </title>
           </head>
           <body>À» Âï¾îÁÖ´Â ÇÔ¼öÀÌ´Ù.

      void html_end() ;
            </body> </html>À» Âï¾îÁÖ´Â ÇÔ¼öÀÌ´Ù.

      void h1(char *header) ; ... void h6(char *header) ;
            <H?>À» Âï¾îÁÖ´Â ÇÔ¼öÀÌ´Ù.

      void hidden(char *name, char *value) ;
      form¿¡¼­ hidden typeÀ» Ãâ·ÂÇÒ ¶§ »ç¿ëÇÑ´Ù.

     

    - string-lib.h : ¹®ÀÚ¿­ ó¸®¿Í °ü·ÃµÈ ÇÔ¼öÀÌ´Ù.

      Library functions

      char* newstr(char *str) ;
      ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í ÁÖ¾îÁø ¹®ÀÚ¿­À» º¹»çÇؼ­ ¸®ÅÏÇØÁÖ´Â ÇÔ¼öÀÌ´Ù. Á¦´ë·Î º¹»ç¸¦ ÇØÁÖ´Ï±î ¹®ÀÚ¿­ Æı«ÀÇ ¿°·Á°¡ ¾øÀ¸¹Ç·Î ÀÚÁÖ »ç¿ëÇϸé ÁÁ´Ù.

      char* substr(char *str, int offset, int len) ;
      ¹®ÀÚ¿­À» ã°íÀÚ ÇÒ ¶§ »ç¿ëÇÑ´Ù.

      char* replace_ltgt(char *str) ;
      <, >¸¦ &lt, &gt ·Î º¯È¯ÇØ ÁÖ´Â ÇÔ¼öÀÌ´Ù.

      char *lower_case(char *buffer) ;
      ÁÖ¾îÁø ¹®ÀÚ¿­¿¡¼­ ´ë¹®ÀÚ¸¦ ¼Ò¹®ÀÚ·Î ¹Ù²Ù¾îÁÖ´Â ÇÔ¼öÀÌ´Ù.

       

    query ÀÇ °á°ú¸¦ ÅؽºÆ®»óÅ¿¡¼­ È®ÀÎÇÏ´Â ¹æ¹ý

    command line »ó¿¡¼­ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°¸é ¾Æ·¡¿Í °°Àº °á°ú°¡ ³ª¿Â´Ù.

      --- cgihtml Interactive Mode ---

      Enter CGI input sting. Remember to encode appropriate characters.
      Press ENTER when done :

    ÀԷ¹®ÀÚ¿­ÀÌ ´ÙÀ½°ú °°´Ù°í °¡Á¤ÇÑ´Ù¸é

      name=eugene&age=21

    queryÀÇ °á°ú·Î ´ÙÀ½°ú °°Àº °ÍÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù.

      Input string : name=eugene&age=21
      String length : 18
      --- end cgihtml Interactive Mode ---

      <h1>Quey results</h1>
      <dl>
          <dt> <b>name</b>
          <dd> eugene
          <dt> <b>age</b>
          <dd> 21
      </dl>
      </body> </html>

    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
      /usr/local/pgsql/lib/libpq.a

    - ȯ°æº¯¼ö¿Í ÃʱâÈ­(setenv ÇÔ¼ö¸¦ ÀÌ¿ë¼³Á¤?)

      PGHOST : Postgres °¡ žÀçµÈ ¼­¹öÀ̸§ ¼³Á¤

      PGOPTIONS : ºÎ°¡ÀûÀÎ runtime option

      PGPORT :Æ÷Æ®¹øÈ£ ¼³Á¤

      PGTTY :¼­¹ö·ÎºÎÅÍÀÇ µð¹ö±ë ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÒ ÆÄÀÏÀ̳ª È­¸é(tty) ¼³Á¤

      PGDATABASE : POSTGRES µ¥ÀÌÅͺ£À̽º À̸§ ¼³Á¤

      PGREALM : POSTGRES ¿Í »ç¿ëÇÒ Kerberos realm ¼³Á¤

    - API

      1) µ¥ÀÌÅÍ º£À̽º ¿¬°á/Á¾·á : PQsetdb, PQfinish, PQreset

      PGconn *PQsetdb
      (char *pghost, char *pgport, char * pgoptions, char *pgtty, char *dbName) ;
      - argument °¡ ¾øÀ¸¸é, ȯ°æº¯¼ö °ªÀ» »ç¿ë ȯ°æº¯¼öµµ ¾øÀ¸¸é,
         hardware default °ªÀ» »ç¿ë

      void PQfinish(PQconn *conn)
      - ¿¬°áÀ» ÇØÁ¦ÇÏ°í, PGconn struct pointer¸¦ free.(ÀÌÈÄ¿¡ »ç¿ëÇÒ ¼ö ¾ø´Ù)

      void PQreset(PGconn *conn)
      - Àç ¿¬°á

      2) ¿¬°á°Ë»ç : PQstatus(PQdb, PQhost, PQoptions, PQport, PQtty)

      ConnStatusType *PQstatus(PGconn *conn)
      - Ä¿³Ø¼ÇÀÇ status ¸®ÅÏ(CONNECTION_OK/CONNECTION_BAD)

      char *PQdb(PQconn *conn)
      - ÇØ´ç Ä¿³Ø¼ÇÀÇ database À̸§À» ¸®ÅÏ

      char *PQhost(PQconn *conn)
      - ÇØ´ç Ä¿³Ø¼ÇÀÇ host À̸§À» ¸®ÅÏ

      char *PQport(PQconn *conn)
      - ÇØ´ç Ä¿³Ø¼ÇÀÇ port À̸§À» ¸®ÅÏ

      char *PQoptions(PQconn *conn)
      - Ä¿³Ø¼Ç¿¡ option »ç¿ëµÈ À» ¸®ÅÏ

      char *PQtty(PQconn *conn)
      - Äѳؼǿ¡ »ç¿ëµÈ tty¸¦ ¸®ÅÏ

      3) ¿¡·¯¸Þ¼¼Áö °ü·Ã ÇÔ¼ö

      char *PQerror Message(PQconn *conn) ;
      - Ä¿³Ø¼Ç°ú °ü·ÃµÈ ¿¡·¯¸Þ¼¼Áö ¸®ÅÏ

      void PQtrace(PQconn *conn, FILE*debug_port) ;
      - frontend ¿Í backend server °£ÀÇ message ¸¦ ÃßÀû°¡´ÉÇÏ°Ô ÇÏ°í,
         debug_port·Î Ãâ·ÂµÇ°Ô ÇÔ.

      void PQuntrace(PQconn *conn) ;
      - frontend ¿Í backend server °£ÀÇ message ¸¦ ÃßÀûÇÒ ¼ö ¾øµµ·Ï ÇÔ

      4) Äõ¸®(Query)

      PGresult *PQexec(PQconn *conn, char *query) ;
      - query ÇÑ °á°ú¸¦ PGresult structure ¿¡ ÀúÀå(structure ÀÇ Çʵ带
         Á÷Á¢ ¾ï¼¼½º ÇÏÁö ¾Ê°í, ÀÌÇÏÀÇ ÇÔ¼ö¸¦ ½á¼­ °á°ú¸¦ ºÐ¼®ÇÏ´Â °ÍÀÌ ÁÁ´Ù.)
      - Null À» ¸®ÅÏÇÒ °æ¿ì PQerror Message ÇÔ¼ö ÀÌ¿ë

      ExecStatusType PQresult structure(PGresult *res) ;
      - query ÀÇ °á°ú¸¦ ºÐ¼®
      - ¸®ÅÏ°ª :
      PGRES_EMPTY_QUERY,
      PGRES_COMMAND_OK, /* query °¡ command ÀÏ °æ¿ì */
      PGRES_TUPLES_OK, /* ¼º°øÀûÀ¸·Î tuple À» ¸®ÅÏÇÑ °æ¿ì */
      PGRES_COPY_OUT,
      PGRES_COPY_LN,
      PGRES_BAD_RESPONSE, /* ¿¹±âÄ¡ ¸øÇÑ °á°ú°¡ ¹ß»ýÇÒ °æ¿ì */
      PGRES_NONFATAL_ERROR,
      PGRES_FATAL_ERROR

      ¡ßquery ÇÑ tuple(instance, record)°á°ú¸¦ ÃßÃâÇÏ´Â ÇÔ¼ö
         (PGRES_TUPLES_OK ¸®ÅϽÃ)

      int PQntuples(PGresult *res) ;
      - Äõ¸® ÇÑ °á°úÀÇ tuple ÀÇ ¼ö¸¦ ¸®ÅÏ

      int PQnfields(PGresult *res) ;
      - Äõ¸® ÇÑ °á°úÀÇ field(attribute)ÀÇ ¼ö¸¦ ¸®ÅÏ

      char *PQfname(PGresult *res, int field_index) ;
      - ÇöÀç(?) tuple ÀÇ field_index ¹ø° (0 ºÎÅÍ ½ÃÀÛ) Çʵå¸íÀ» ¸®ÅÏ

      int PQfnumber(PGresult *res, char* field_name) ;
      - ÇöÀç tuple ÀÇ field_nameÀÇ Çʵå¸íÀ» °¡Áø ÇʵåÀÇ index¸¦ ¸®ÅÏ

      Oid PQftype(PGresult *res, int field_num) ;
      - ÇöÀç tupleÀÇ field_num ¹ø° ÇʵåÀÇ type(Object ID)À» ¸®ÅÏ

      int2 PQfsize(PGresult *res, int field_index) ;
      - ÇöÀç tupleÀÇ field_index ¹ø° ÇʵåÀÇ size(in byte)¸¦ ¸®ÅÏ
      - 1 ÀÌ¸é °¡º¯±æÀÌÇü

      char *PQgetvalue(PGresult *res, int tup_num, int field_num) ;
      - tup_num ¹ø° tuple ÀÇ field_num¹ø° ÇʵåÀÇ °ªÀ» ¸®ÅÏ
      - ´ëºÎºÐÀÇ °æ¿ì °á°ú °ªÀº null-terminating ascii ¹®ÀÚ¿­·Î º¯È¯µÇ¾î ¸®ÅÏ µÊ
      - binary cursor Ä¿¸®ÀÇ °æ¿ì´Â backend serverÀÇ ³»ºÎÀûÀÎ ¹ÙÀ̳ʸ® Çü½ÄÀ¸·Î
         ¸®ÅϵǹǷΠÇÁ·Î±×·¡¸Ó°¡ ¾Ë¸ÂÀº C ŸÀÔÀ¸·Î º¯È¯ÇØ¾ß ÇÔ.
      - °á°ú °ªÀº PGresult ±¸Á¶Ã¼ÀÇ ¸â¹ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀ̹ǷÎ,
         strcpy µîÀ¸·Î º¹»çÇÏ¿© »ç¿ëÇÑ´Ù.

      int PQgetlength(PGresult *res, int tup_num, int field_num) ;
      - tup_num ¹ø° tuple ÀÇ field_num¹ø° ÇʵåÀÇ size(in byte)¸¦ ¸®ÅÏ
      - ±¸Á¶Ã¼ÀÎ °æ¿ì, member ÀÇ Å©±â¸¦ Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù.

      char *PQcmdStatus(PGresult *res) ;
      - ÃÖ±Ù query ¿¡ °ü°èµÈ command status ¸¦ ¸®ÅÏ

      char *PQoidStatus(PGresult *res) ;
      - ÃÖ±ÙÀÇ query °¡ insert ¹®À̾úÀ» °æ¿ì »ðÀÔµÈ tuple ÀÇ Oid¿¡ °üÇÑ ¹®ÀÚ¿­ ¸®ÅÏ,
         ±×·¸Áö ¾ÊÀ¸¸é empty string.

      void PQprintTuple(PGresult *res) ;
                                FILE* fout, /* output ÆÄÀÏ */
                                int printAttName /* ÇʵåÀ̸§À» Ãâ·ÂÇÒÁö ¿©ºÎ */
                                int terseOutput, /* delimiter ·Î bar¸¦ »ç¿ëÇÒ °ÍÀÎÁö ¿©ºÎ */
                                int width /* Ä÷³ÀÇ Æø(0 ÀÌ¸é °¡º¯ Æø) */
                                ) ;
      - ¸ðµç tuple À» ÆÄÀÏ(ÀϹÝÈ­ÀÏ, stdout)À¸·Î Ãâ·Â(psqlÀÌ ÀÌ ÇÔ¼ö¸¦ ¾¸)
      - Çʵå¸íÀ» Ãâ·ÂÇÏ°Ô ÇÒ ¼öµµ ÀÖÀ½

      void PQclear(PQresult *res) ;
      - ÇØ´ç PQresult structure¸¦ ¸Þ¸ð¸®·ÎºÎÅÍ »èÁ¦
      - query °á°ú¸¦ ´õ ÀÌ»ó ÂüÁ¶ÇÏÁö ¾ÊÀ» ¶§ ¹Ýµå½Ã ÇØÁÖ¾î¾ß ÇÔ(¸Þ¸ð¸® ´©¼ö¹æÁö)

      5) Fast Path : db³»ÀÇ internal functionÈ£Ãâ

      PGresule* PQfn(PGconn,conn)
                             int find, /* È£ÃâÇÏ°íÀÚ ÇÏ´Â ÇÔ¼öÀÇ oid */
                             int *result_buf, /* °á°ú °ªÀ» ÀúÀåÇÒ ¹öÆÛ(ÇÁ·Î±×·¡¸Ó Á¦°ø) */
                             int *result_len, /* °á°ú °ªÀÇ ±æÀÌ */ 
                             int *result_is_int, /* °á°ú°ªÀÌ Á¤¼öÇüÀÎÁö ¿©ºÎ */ 
                             PQArgBlock *args, /* ÇÔ¼ö¿¡ Àü´ÞÇÒ ¾ÆÅ¥¸ÕÆ®µé */ 
                             int nargs) ;, /* ¾ÆÅ¥¸ÕÆ® °¹¼ö */ 
      - security hole ÀÌ »ý±æ ¼ö ÀÖÀ¸¹Ç·Î ÀϹÝÀûÀ¸·Î Àß ¾²ÀÌÁö ¾ÊÀ½
         typedef struct {
              int len ;
              int isint ;
              union {
                  int *ptr ;
                  int interger ;
              } u ;
         } PQArgBlock ;
      - PGresult ±¸Á¶Ã¼´Â Àû´çÇÑ ½ÃÁ¡¿¡ freeÇØÁØ´Ù.

      6) Asynchronous Notification

      PGnotify* PQNotifies(PGconn *conn) ;

      7) COPY ¸í·É°ú °ü°èµÈ ÇÔ¼öµé

      * copy : libpq¿¡ ÀÇÇØ »ç¿ëµÈ Ä¿³Ø¼Ç¿¡ /À¸·Î µ¥ÀÌÅ͸¦ ¾²°Å³ª, Àоî¿À´Â ÇÁ·ÎÅäÄÝ ÀÌÇÏ ÇÔ¼öµéÀº ÀÌ Ä¿³Ø¼Ç¿¡ direct·Î ºÙ¾î¼­(ÀϹÝÀûÀÎ PQexecÀ¸·Î´Â ½ÇÇàµÇ´Â query´Â ÇϳªÀÇ ³í¸®ÀÛ¾÷ ´ÜÀ§Àε¥, ÀÌÇÏ ÇÔ¼ö È£ÃâµéÀº ¿©·¯ ¹øÀÇ ÇÔ¼öÈ£ÃâÀÌ ÇϳªÀÇ ³í¸®ÀÛ¾÷´ÜÀ§¸¦ Çü¼ºÇÑ´Ù) ÀÌ ¸í·É¾î¸¦ Áö¿øÇÑ´Ù. Áï, PQexecÀ¸·Î copy ¸í·ÉÀ» ½ÇÇà½ÃÅ°°í, ¹Ù·Î À̾ direct read/write ¼öÇà
      - Çü½Ä : copy [to/from]

      int PQgetline(PGconn *conn, char *string, int length) ;
      - copy ~ to stdout ¸í·ÉÀ» ½ÇÇàÇÑ ÈÄ ¸í·ÉÀÇ °á°ú¸¦ ¾ò¾î¿È
      - Ä¿³Ø¼ÇÀ¸·ÎºÎÅÍ newlineÀ¸·Î ³¡³ª´Â ¹®ÀÚ¿­À» Àо string ¿¡ ÀúÀåÇÏ°í
         newlineÀ» NULL ¹Ù²Þ(Áï, ÃÖ´ë length-1¸¸Å­ Àоî¿È)
         - ¸®ÅÏ°ªÀº 0 (newline±îÁö Àüü¶óÀÎÀÌ ÀÐÇûÀ» ¶§)
            1 (truncate µÇ¾úÀ» ¶§)
         - backend server·ÎºÎÅÍ copyÀÇ °á°ú¸¦ ¸ðµÎ Àü¼ÛÇßÀ» ¶§´Â "."¸¸À¸·Î µÈ ¶óÀÎÀ»
            Àü¼ÛÇÑ´Ù.

      void PQputline(PGconn *conn, char *string) ;
      - Ä¿³Ø¼Ç¿¡ null-terminated stringÀ» Àü¼ÛÇÑ´Ù.
      - Àü¼ÛÀÌ ³¡³µÀ» ¶§´Â "."À¸·Î µÈ ¹®ÀåÀ» Àü¼ÛÇØ¾ß ÇÑ´Ù.

      int PQendcopy(PGconn *conn) ;
      - copy ¸í·ÉÀ¸·Î Çü¼ºµÈ direct communication ÀÌ ³¡³µÀ½À» ¾Ë¸®°í,
         backend server¿Í sync µÇ°Ô ÇÑ´Ù.
      - ¼º°øÇϸé 0À» ¸®ÅÏÇÑ´Ù.

      [ ¿¹Á¦ ]
      PQexec(conn, "create able foo (a int4, b char16, d float8)") ;
      PQexec(conn, "copy foo from stdin") ;
      PQputline(conn, "3hello world4.5¡¬n") ; 
      PQputline(conn, "4goodbye world7.11¡¬n") ;
      ...
      PQputline(conn, ".¡¬n") ; 
      PQendcopy(com) ;

      7) »ç¿ëÀÚ ÀÎÁõ°ú °ü·ÃµÈ ÇÔ¼ö

      char *fe_getauthname(char* errorMessage) ;
      - ÀÎÁõµÈ »ç¿ëÀÚÀÇ À̸§À» ´ãÀº static space¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏ
      - ÀÎÁõµÈ »ç¿ëÀÚÀÇ À̸§ÀÌ »ç¿ëÀÚÀÇ /etc/passwd ¿£Æ®¸®³ª ȯ°æº¯¼öµî°ú
         ´Ù¸¦ ¼ö ÀÖÀ¸¹Ç·Î getenv ÇÔ¼ö³ª getpwuid ´ë½Å ¾µ °ÍÀ» ±ÇÀåÇÑ´Ù.

      void fe_setauthsvc(char *name, char* errorMessage) ;
      - Åë»ó ÄÄÆÄÀϽà command-line switch·ÎºÎÅÍ ¼³Á¤µÈ µðÆúÆ®ÀÇ ÀÎÁõ¼­ºñ½º À̸§´ë½Å
         name À¸·Î ÁÖ¾îÁö´Â ¼­ºñ½º À̸§À» »ç¿ëÅä·Ï ÇÑ´Ù.
      - ¿¡·¯ÀÇ °æ¿ì ¿¡·¯¸Þ¼¼Áö¸¦ errorMessage¿¡ ¼³Á¤ÇÑ´Ù.

      À̹ø È£¿¡¼­´Â ¾ÕÀ¸·Î »ç¿ëÇÒ Åøµé¿¡ ´ëÇؼ­ Àá±ñ µÑ·¯ º¸¾Ò´Ù. ³»¿ëÀÌ ±×·¸°Ô ½â Àß Á¤¸®°¡ µÈ °ÍÀº ¾Æ´ÏÁö¸¸ ÇÊÀÚ°¡ »ý°¢ÇÏ¿© Á¤¸®ÇÑ ¾î¼³Ç ¾ê±âµéÀÌ CGI·Î ÇÁ·Î±×·¡¹Ö Çغ¸·Á°í ÇÏ´Â ¿©·¯ºÐ¿¡°Ô ¾î´À Á¤µµ´Â µµ¿òÀÌ µÉ °ÍÀ̶ó°í »ý°¢ÇÑ´Ù.

      ´Ù½ÃÇѹø ¸»ÇÏÁö¸¸ ÇÁ·Î±×·¡¹ÖÀ» °øºÎÇÒ ¶§´Â ½Ç¿ëÀûÀÎ °Í°ú ¹Ì·¡ÁöÇâÀûÀÌ ÀÖ´Ù´Â °ÍÀ» ÀØÁö ¸»±â ¹Ù¶õ´Ù.




¡ã top

homeÀ¸·Î...