¡åAdvertisement
right event
¡åAdvertisement
ÀÐÀ»°Å¸® > µðº§·ÎÆÛ Ç÷¯½º

½ÇÀü Silverlight·Î Æ÷Åä¶óÀÌÆ® ¸¸µé±â

½Ç¹ö¶óÀÌÆ®¿¡ °ü½ÉÀ» °®´Â °³¹ßÀÚ, µðÀÚÀ̳ʵéÀº Áö¼ÓÀûÀ¸·Î Áõ°¡ÇÏ´Â Ãß¼¼À̸ç À̸¦ ¼ö¿ëÇϱâ À§ÇØ ¿©·¯ °³¹ßÀÚ Ä¿¹Â´ÏƼ¿¡¼­´Â ½Ç¹ö¶óÀÌÆ® ½ºÅ͵ð ¸ðÀÓÀ» ÁøÇàÁßÀÌ´Ù. ´ëºÎºÐÀÇ ÀοøµéÀº ½Ç¹«¿¡¼­ ½Ç¹ö¶óÀÌÆ®¸¦ ÀÌ¿ëÇÑ ÇÁ·ÎÁ§Æ®¸¦ ÁøÇà ÁßÀ̰ųª, ÁøÇàÀ» ÁøÇàÇÏ´Â °³¹ßÀÚµéÀ̸ç, À̵é°úÀÇ ´ëÈ­ ÁÖÁ¦´Â ´ëºÎºÐ ½Ç¹«ÀûÀÎ À̾߱âµéÀ» ³ª´©°ï ÇÑ´Ù. À̹ø Ä÷³Àº Æ÷Åä¶óÀÌÆ®(PHOTOLIGHT)¸¦ ÅëÇØ¼­ Áö±Ý ¿­½ÉÈ÷ ½Ç¹ö¶óÀÌÆ®¸¦ °øºÎÇϰí, ¶ÇÇÑ ½Ç¹«¿¡¼­ ¾î¶»°Ô ¸¸µé¾î¾ß ÇÒÁö °í¹ÎÇϰí ÀÖ´Â ºÐµé¿¡°Ô Á¶±ÝÀ̳ª¸¶ µµ¿òÀÌ µÇ´Â ÀÚ·á°¡ µÇ±æ ¹Ù¶õ´Ù.

±èµ¿¿í kdw8751@gmail.com£üÇöÀç ÈÆ½º´å³Ý Ä¿¹Â´ÏƼ ½Ã»ðÀ¸·Î Ȱµ¿Çϰí ÀÖ´Ù. ÈÞÁîÇ÷ο쿡 ÀçÁ÷ Áß¿¡ ÀÖÀ¸¸é ½Ç¹ö¶óÀÌÆ® °ü·Ã ¾÷¹«¸¦ ¸Ã°í ÀÖ°í, ÇöÀç ½Ç¹ö¶óÀÌÆ®¿¡ ÁýÁßÇϰí ÀÖ´Ù. 


Æ÷Åä¶óÀÌÆ®¸¦ °£´ÜÇÏ°Ô ¼³¸íÇϸé À̹ÌÁö ºä¾î¶ó°í ÇÒ ¼ö ÀÖ´Ù. »ç¿ëÀÚµéÀÌ ½±°Ô »ç¿ëÇÒ ¼ö ÀÖ°í, »çÁøÀ» º¸¸é¼­ Áñ°Å¿òÀ» ´À³¥ ¼ö ÀÖ°Ô ÇÏ´Â À̹ÌÁö ºä¾î¶ó°í »ý°¢ÇÏ¸é ½¬¿ï °ÍÀÌ´Ù. ÇÊÀÚ´Â ÀÌ·¯ÇÑ Àǵµ·Î À̹ø Ä÷³À» ±âȹÇßÀ½À» ¾Ë¾ÆÁÖ±æ ¹Ù¶ó¸ç ½Ç¹ö¶óÀÌÆ®¸¦ °øºÎÇϰí ÀÖ´Â ¸¹Àº °³¹ßÀڵ鿡°Ô µµ¿òÀÌ µÉ ÀÚ·á°¡ µÇ¾úÀ¸¸é ÇÑ´Ù.
Æ÷Åä¶óÀÌÆ®¸¦ ¾î¶»°Ô ¸¸µé¾î º¼±î Á¤¸» °í¹ÎÀÌ ¸¹¾Ò´Ù. ÇÊÀÚ´Â °³¹ßÀÚ¶ó ȹ±âÀûÀ̰í, âÁ¶ÀûÀÎ »ý°¢ÀÌ ÆÅÆÅ ¶°¿À¸£Áö ¾Ê´Â´Ù. ±×·¡¼­ ¿©·¯ »çÀÌÆ®µéÀ» µ¹¾Æ´Ù´Ï¸é¼­, ÁÁÀº ±â´ÉµéÀÌ ÀÖ´Â »çÀÌÆ®µéÀ» üũÇϰí, »ç¿ëÇØ º¸¸ç °æÇèÀ» ½×¾Æº¸´ø Áß ½ºÅ丮ť(www.storyq.net)¶ó´Â »çÀÌÆ®¸¦ ¹æ¹®Çؼ­ »ç¿ëÇØ º¸¾Ò°í, ÀÌ¿Í ºñ½ÁÇÑ °ÍÀ» ½Ç¹ö¶óÀÌÆ®·Î ¸¸µé¾î ºÁ¾ß°Ú´Ù´Â »ý°¢ÀÌ µé¾î ¸¸µé°Ô µÈ °á°ú¹°ÀÌ Æ÷Åä¶óÀÌÆ®ÀÌ´Ù.

µðÀÚÀÎ Çù¾÷ 

Æ÷Åä¶óÀÌÆ®ÀÇ µðÀÚÀÎÀº ÇöÀç ÈÆ½º´å³Ý ÀͽºÇÁ·¹¼Ç ½Ã»ðÀ¸·Î Ȱµ¿ ÁßÀÎ ±è¼±±¸ ½Ã»ðÀÇ µµ¿òÀ» ¹Þ¾Ò´Ù. ´Ùµé ¾Æ½Ç °ÍÀÌ´Ù. °³¹ßÀ» ÇÒ ¶§ µðÀÚÀ̳ʿÍÀÇ Çù¾÷ÀÌ Áß¿äÇÏ´Ù´Â °ÍÀ» ¸»ÀÌ´Ù. ÇÏÁö¸¸ ±è¼±±¸ ½Ã»ð°ú ÇÊÀÚ´Â °°Àº ȸ»çÀÇ µ¿·áµµ ¾Æ´Ï°í, ¼­·Î ¹Ù»Û ½ºÄÉÁÙÀ» Á¶Á¤Çذ¡¸ç Á¦ÀÛ¿¡ ³ª¼­ Ä¿¹Â´ÏÄÉÀ̼ÇÁ¶Â÷µµ ½±Áö ¾Ê¾Ò´Ù. ¶§¹®¿¡ ÇÊÀÚ´Â <È­¸é 1>°ú °°Àº ¹æ¹ýÀ¸·Î Çù¾÷À» ÇØ º¸±â·Î °áÁ¤À» ³»·È´Ù.

“¼± °³¹ß ÈÄ µðÀÚÀΔÀ̶õ Æ÷Åä¶óÀÌÆ®¿¡¼­ »ç¿ëµÉ ±â´Éµé¿¡ ´ëÇØ¼­ ¸ÕÀú °³¹ßÀ» ÇØµÎ°í, ³ªÁß¿¡ µðÀÚÀÎÀ» ÀÔÈ÷´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô ÇÏ¸é °³¹ßÀÚ´Â µðÀÚÀÎÀ» °í·ÁÇÑ °³¹ßÀ» ÇØ¾ß ÇÒ °ÍÀ̰í, µðÀÚÀ̳ʴ »ç¿ëÀÚ¸¦ À§ÇÑ µðÀÚÀÎÀ» ÇØ¾ß ÇÒ °ÍÀÌ´Ù. Æ÷Åä¶óÀÌÆ®´Â ¿ì¸®°¡ ¸¹ÀÌ µè´ø MVVM + Command ÆÐÅÏÀ» ÀÌ¿ëÇØ ¸¸µé¾ú´Ù. ÀÌ´Â µðÀÚÀ̳ʿÍÀÇ Çù¾÷¿¡¼­µµ Á¤¸» ÆíÇß´Ù. °£´ÜÇÏ°Ô MVVMÆÐÅÏ¿¡ ´ëÇØ ¾Ö±âÇÏÀÚ¸é, ¸ðµ¨(Model)°ú ºä(View)¸¦ µ¶¸³ÀûÀÌ°Ô ³öµÎ°í, ±× »çÀÌ¿¡ ºä¸ðµ¨(ViewModel)¸¦ µÎ¾î ºä¿Í ¹ÙÀεùÀ¸·Î ¿«¾î µÎ°í, Ä¿¸Çµå¸¦ ÀÌ¿ëÇØ¼­ ÇØ´ç À̺¥Æ®¸¦ ºä¸ðµ¨¿¡¼­ ÁÖ°í¹Þ°Ô µÇ´Â Çü½ÄÀÌ´Ù. Ä¿¸Çµå´Â ÁÖ·Î ¾ÖÇø®ÄÉÀÌ¼Ç Àü¿ª¿¡¼­ µ¿ÀÏÇÏ°Ô ¹ÞÀ» ¼ö ÀÖ´Â »ç¿ëÀÚ Á¦¾î ¸í·É¿¡ ´ëÇÑ À̺¥Æ®¸¦ È¿°úÀûÀ̰í, Ç¥ÁØÀûÀ¸·Î ¹Þ±â À§ÇÑ ±¸Çö ¹æ¹ýÀÌ´Ù.

Ä¿¸Çµå´Â MVVMó·³ ºä ¿Í ¸ðµ¨ÀÌ ºÐ¸®µÈ ȯ°æ¿¡¼­ ¸Å¿ì È¿°úÀûÀ¸·Î Äڵ带 © ¼ö ÀÖ°Ô µµ¿ÍÁÖ´Â ¿ªÇÒÀ» ÇÑ´Ù. ¿©±â¼­ ±â¾ïÇÒ °ÍÀº ¾îÇø®ÄÉÀÌ¼Ç Àü¿ª¿¡¼­ µ¿ÀÏÇÏ°Ô ¹ÞÀ» ¼ö ÀÖ´Ù´Â °ÍÀ» Àß ±â¾ïÇØ µÎ±æ ¹Ù¶õ´Ù.

<È­¸é 2>¿¡¼­ ¿ÞÂÊÀº µðÀÚÀÎÀ» ÀÔÈ÷±â ÀüÀÇ ¸ð½ÀÀ̸ç, ¿À¸¥ÂÊÀº µðÀÚÀÎÀ» ÀÔÈù ¸ð½À´Ï´Ù. MVVMÆÐÅÏÀ¸·Î ¸¸µç °á°ú ºä¸¦ º¯°æÇÏ´Â °Íµµ Á¤¸» ½¬¿ü´Ù. ±×³É ¹ÙÀεù¸¸ Á¦´ë·Î °É¾îµÎ°í Ä¿¸Çµå¸¦ Á¦´ë·Î °É¾î Áֱ⸸ ÇÏ¸é µÇ´Â °ÍÀÌ´Ù. ±×·¸°Ô ÇÏ´Ï 30ºÐµµ ¾È µÇ¼­ µðÀÚÀÎÀ» ÀÔÈú ¼ö ÀÖ¾ú´Ù. ÀÌ·¯¹Ç·Î µðÀÚÀÌ³Ê¿Í Çù¾÷ÀÌ ÆíÇß´Ù ÇÒ ¼ö ÀÖ°Ú´Ù.
ÀÌÁ¦ º»°ÝÀûÀ¸·Î Æ÷Åä¶óÀÌÆ®ÀÇ ÀÛµ¿ ¹× ±¸Çö Äڵ忡 ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

Photo Light ÆÄÀϾ÷·Îµå ±¸Çö
Æ÷Åä¶óÀÌÆ® ÆÄÀϾ÷·Îµå¸¦ ±¸ÇöÇÏ´Â µ¥´Â ÆÄÀϾ÷·Îµå ¾ÖÇø®ÄÉÀÌ¼Ç ¶ÇÇÑ ½Ç¹ö¶óÀÌÆ®·Î ±¸ÇöÇØ ºÃ´Ù. WCF¼­ºñ½º¸¦ ÀÌ¿ëÇÏ´Ï, ´ÙÁ߯ÄÀÏ ¾÷·Îµå¿Í ÆÄÀϾ÷·Îµå ÇÁ·Î±×·¹½º¹Ù(Progress Bar)¸¦ Ç¥½ÃÇϴµ¥ ½±°Ô ±¸ÇöÇÒ ¼ö ÀÖ¾ú´Ù. ÀÏ´Ü Æ÷Åä¶óÀÌÆ®¿¡¼­ ÆÄÀϾ÷·Îµå°¡ ¾î¶² ½ÄÀ¸·Î ÀÛµ¿µÇ´ÂÁö´Â <È­¸é 3>À» ÅëÇØ ¼ø¼­´ë·Î °£·«ÇÏ°Ô ¼³¸íÇÒ ¼ö ÀÖ´Ù. 

<È­¸é 3>¿¡¼­ ³ëÆ®ºÏPC·Î Ç¥½ÃµÇ¾îÀÖ´Â ÂÊÀÌ Å¬¶óÀÌ¾ðÆ® PC¶ó°í °¡Á¤À» ÇÏÀÚ. Ŭ¶óÀÌ¾ðÆ®´Â Æ÷Åä¶óÀÌÆ®¿¡ ÆÄÀÏÀ» ¿Ã¸®±â À§ÇØ ÀÚ½ÅÀÌ º¸À¯Çϰí ÀÖ´Â »çÁøÀ» ¼±ÅÃÇÒ °ÍÀÌ´Ù. ¼±ÅÃµÈ ÆÄÀÏÀº »ç¿ëÀÚ°¡ ¾÷·Îµå ¾×¼ÇÀ» ÁÖ°Ô µÉ ¶§, °¢ ÆÄÀϺ°·Î WCF¼­ºñ½º¸¦ È£ÃâÇϰí, ¼±ÅÃµÈ ÆÄÀÏÀ» ³Ñ°ÜÁÖ°Ô µÈ´Ù. WCF¼­ºñ½º¿¡¼­´Â ÀÌ ÆÄÀÏÀ» ¹Þ¾Æ¼­, ÆÄÀϼ­¹öÀÇ ÇØ´ç ·çÆ®¿¡ ÀúÀåÇϰԵǴµ¥, À̶§ ´Ü¼øÈ÷ ÀúÀ常 ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ½æ³×ÀÏ(Thumbnail) À̹ÌÁö¿Í µöÁÜ(DeepZoom)ÆÄÀϵ鵵 ¸¸µé¾î °°Àº ·çÆ® ¾È¿¡ ÀúÀåÇÑ´Ù. ÀÌÁ¦ ´ë·«ÀûÀ¸·Î Æ÷Åä¶óÀÌÆ®¿¡¼­´Â ¾î¶»°Ô ÆÄÀϾ÷·Îµå°¡ µÇ´ÂÁö »ìÆìº¸¾ÒÀ¸´Ï ÀÌÁ¦ ½ÇÁ¦ ±¸Çö Äڵ带 º¸¸é¼­ ¾Ö±âÇϵµ·Ï ÇϰڴÙ

<È­¸é 4>´Â Æ÷Åä¶óÀÌÆ®ÀÇ ÆÄÀϾ÷·Îµå ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¸ð½ÀÀ̸ç, ÇÁ·ÎÁ§Æ® ±¸¼º³»¿ëÀº <È­¸é 5>¿Í °°ÀÌ ¸¸µé¾îºÃ´Ù.

<È­¸é 5>¿¡¼­ ¼­ºñ½º ·¹ÆÛ·±½º·Î FileUploadService°¡ ÂüÁ¶µÈ °ÍÀ» º¼ ¼ö Àִµ¥, ÀÌ´Â ¼­ºñ½º¸¦ ÀÌ¿ëÇØ ÆÄÀÏÀ» ¼­¹ö¿¡ ¾÷·Îµå ½Ãų ¼ö ÀÖ´Â °ÍÀÌ´Ù. ¼­ºñ½º ±¸Çö¿¡ ´ëÇØ¼­´Â ´ÙÀ½¿¡ ´Ù½Ã À̾߱âÇϱâ·Î Çϰí Áö±ÝÀº ¼­ºñ½º¸¦ ÅëÇÑ ÆÄÀϾ÷·Îµå¸¦ ÀÌ·ï³½´Ù°í¸¸ ¾Ë°í ÀÖÀÚ.

°¢ Æú´õ¿¡ µé¾î Àִ Ŭ·¡½ºµé¿¡ ´ëÇØ¼­ °£´ÜÇÏ°Ô ¾Ö±âÇÏÀÚ¸é, Ä¿¸Çµå Æú´õ¿¡´Â À§¿¡¼­ ¼³¸íÇÑ Ä¿¸Çµå ÆÐÅÏ ³»¿ë´ë·Î ÆÄÀϾ÷·Îµå¿¡ »ç¿ëµÉ Ä¿¸Çµå¸¦ ÁöÁ¤ÇصРŬ·¡½º¿¡ ¸¸µé¾î µ×°í, ¸ðµ¨ Æú´õ¿¡´Â ÆÄÀÏ¿¡ ´ëÇÑ µ¥ÀÌÅÍŬ·¡½º¿Í ÆÄÀÏ ¾÷·Îµå ÇÁ·Î¹ÙÀÌ´õ(Provider) Á¤ÀÇÇØ µÎ¾ú´Ù. ±×¸®°í ºäÆú´õ¿¡´Â MVVMÆÐÅÏ ³»¿ë°ú °°ÀÌ ºä¿Í ºä¸ðµ¨À» ¸¸µé¾î ³Ö¾îµÐ´Ù.

<¸®½ºÆ® 1> FileUploadCommands.cs

public class FileUploadCommands : Commands
{
public static FileUploadCommands Current { get private set }
public static Command FileChoice { get private set }
       public static Command FileUpload { get private set }
static FileUploadCommands()
        {
            Current = new FileUploadCommands();
        }
public FileUploadCommands()
        {
            FileChoice = CreateCommand("FileChoice");
            FileUpload = CreateCommand("FileUpload");
        }
}

ÀÌÁ¦ ÆÄÀϾ÷·Îµå¿¡ °ü·ÃµÈ ÁÖ¿ä Äڵ带 »ìÆìº¸ÀÚ. <¸®½ºÆ® 1>Àº Ä¿¸Çµå °ü·Ã ÄÚµåÀÇ ³»¿ëÀÌ´Ù. <¸®½ºÆ® 1>À» ÅëÇØ º¸¸é Ä¿¸Çµå¸¦ »ó¼Ó¹Þ°í ÀÖ´Â °ÍÀ» ¾Ë ¼ö Àִµ¥, ÀÌ´Â HugeFlow.Com mandPattern.dll¸¦ ÂüÁ¶Çؾ߸¸ »ó¼Ó¹ÞÀ» ¼ö ÀÖÀ¸¸ç, »ó¼ÓÀ» ¹ÞÀ¸¸é Ä¿¸Çµå »ý¼ºÀÌ °¡´ÉÇÏ°Ô µÈ´Ù. ÇÊÀÚ´Â FileChoice¿Í FileUpload µÎ°³¸¦ Á¤ÀûÀ¸·Î »ý¼ºÇØ µÎ¾ú´Ù. FileChoice´Â ÆÄÀÏ ¼±ÅÃÀ» Ŭ¸¯ÇßÀ» ¶§ÀÇ Ä¿¸ÇµåÀ̰í, FileUpload´Â ÆÄÀÏ ¾÷·Îµå Ŭ¸¯ÇßÀ» ¶§ÀÇ Ä¿¸ÇµåÀÌ´Ù. µÚÀ̾î Á¦½ÃµÇ´Â <¸®½ºÆ® 2>´Â ¾Õ¼­ ¼±º¸ÀÎ Ä¿¸ÇµåµéÀ» ºä¿¡¼­ ¾î¶»°Ô ¿«¾îÁÖ°í ÀÖ´ÂÁö º¼ ¼ö ÀÖ´Ù. 

<¸®½ºÆ® 2> ImagePanelView.xaml

<UserControl x:Class="PhotoLight.FileUploader. ImagePanelView"
          …. Áß°£ »ý·® …
xmlns:Command="clr-namespace:HugeFlow.CommandPattern; assembly=HugeFlow.CommandPattern">

…. Áß°£ »ý·« …
<Button HorizontalAlignment="Right" VerticalAlignment= "Stretch"
Width="70" Margin="0,0,5,0" Content="Ãß°¡" Command:CommandService.Command="FileChoice" Command:CommandService.CommandParameter="Insert" />

<Button HorizontalAlignment="Right" VerticalAlignment= "Stretch"
Width="70" Margin="0,0,5,0" Content="»èÁ¦" Command:CommandService.Command="FileChoice" Command:CommandService.CommandParameter="Delete" />

</UserControl>

À§ XAMLÄڵ带 º¸¸é ¸ÕÀú UserControl ¿¤¸®¸ÕÆ®(Element)¿¡ CommandPattern ¾î¼Àºí¸®¸¦ ¼³Á¤ÇØÁØ´Ù. ±×·¡¾ß XAMLÄڵ忡¼­ Ä¿¸Çµå¸¦ ¿«À» ¼ö Àֱ⠶§¹®ÀÌ´Ù. ÇÊÀÚ´Â Ãß°¡¹öư°ú »èÁ¦¹öư ÄÁÆ®·ÑÀ» ¸¸µé¾î ¾Õ¼­ ÁöÁ¤ÇÑ FileChoice¶ó´Â Ä¿¸Çµå¸¦ ¿«¾î ÁÖ¾ú´Ù. Command:CommandService.Command¿¡ ¹Ì¸® ¸¸µé¾î µÎ¾ú´ø Ä¿¸Çµå À̸§À» ÁöÁ¤ÇØÁÖ¸é µÇ´Â °ÍÀÌ´Ù. ±×¸®°í Çʿ信 µû¶ó ¸Å°³º¯¼ö(Parameter)µµ °°ÀÌ ÁöÁ¤ÇÒ ¼ö Àִµ¥, ÀÌ´Â Command:CommandService.CommandParameter¿¡ ¹®ÀÚ·Î ÁöÁ¤ÇØ ÁÙ ¼ö ÀÖ´Ù. ÇÊÀÚ´Â ¸Å°³º¯¼ö·Î Insert, Delete¶ó°í ÁöÁ¤ÇØ ÁÖ¾ú´Ù. ÀÌÁ¦ ÀÌ Ä¿¸Çµå¸¦ ¾îµð¼­ ¾î¶»°Ô ¹Þ´ÂÁö <¸®½ºÆ® 3>À» ÅëÇØ ¾Ë¾Æº¸ÀÚ.

<¸®½ºÆ® 3> ImagePanelViewModel.cs

public ImagePanelViewModel()
{
FileUploadCommands.FileChoice.Executed += new EventHandler<HugeFlow.CommandPattern.ExecutedEventArgs>(FileChoice_Executed);
FileUploadCommands.FileUpload.Executed += new EventHandler<HugeFlow.CommandPattern.ExecutedEventArgs>(FileUpload_Executed);
}

<¸®½ºÆ® 3>¿¡¼­ Á¦½ÃµÈ ImagePanelViewModelÀ̶ó´Â Ŭ·¡½º´Â ImagePanelView.xamlÀÇ ºä¸ðµ¨ÀÌ´Ù. ImagePane lView ModelÀÇ »ý¼ºÀÚ¿¡¼­ Ä¿¸Çµå À̺¥Æ®¸¦ »ý¼ºÇØ ÁÖ¾ú´Ù. À§¿¡¼­µµ ¸»Çßµí Ä¿¸Çµå´Â Àü¿ª¿¡¼­ »ç¿ëµÉ ¼ö ÀÖÀ¸¹Ç·Î ºä¸ðµ¨¿¡ À̺¥Æ®¸¦ ¿«À» ¼ö ÀÖ´Ù. ÀÌÁ¦ Ä¿¸Çµå¸¦ ¾î¶»°Ô »ç¿ëÇØ¾ß ÇÒ Áö °¨ÀÌ ¿ÔÀ» °ÍÀÌ´Ù. ±×·¯³ª Ä¿¸Çµå¸¦ ³Ê¹« ³²¹ßÇϰųª ¹«Á¶°Ç Ä¿¸Çµå¸¦ ¸¸µé¾î¼­´Â ¾ÈµÈ´Ù. ¿¹¸¦ µé¸é ºä¿¡¼­ Visibility¸¦ Colla psed ¶Ç´Â Visible Çϴµ¥ Ä¿¸Çµå±îÁö ¸¸µéÁö ¸»ÀÚ´Â ¾Ö±â´Ù. ÀÌ·±°Ç ºä¿¡¼­ ÇüŸ¸ º¯°æµÇ´Â °ÍÀ̱⿡ ºäÂÊ¿¡¼­ ó¸®Çϴ°ÍÀÌ ÁÁ´Ù. ²À ÀÌÁ¡À» ÁÖÀÇÇØ¼­ Ä¿¸Çµå¸¦ »ç¿ëÇÏ±æ ¹Ù¶õ´Ù.

<¸®½ºÆ® 4> UploadAgent.cs

public void UploadFile()
{
            if (file != null)
            {
                byte[] buff = new byte[4 * 4096];
                int readbytes = this.file.FileStream.Read(buff, 0, buff.Length);
if (readbytes != 0)
                {
                    this.sent += readbytes;
                    if (this.sent == this.total)
                        isLast = true
FileUploadData filedata = new FileUploadData()
{
                        FileName = file.FileName,
                        FileData = buff,
                        DataLength = readbytes,
                        IsFirst = isFirst,
                        IsLast = isLast,
                        GroupName = file.GroupName
                    };
                    client.SaveFileAsync(filedata);
                    isFirst = false
file.Uploaded = this.sent;
                }
                else
                {
                    file.FileStream.Dispose();
                    file.FileStream.Close();
                    client.ChannelFactory.Close();
                }
            }
}

<¸®½ºÆ® 4>´Â ÆÄÀϾ÷·Îµå ÄÚµå´Ù. ¿©±â¿¡¼­ º¸¿©ÁÖ´Â Upload File ¸Þ¼Òµå´Â WCF¼­ºñ½º¿¡ ÆÄÀÏÀ» ¾÷·ÎµåÇÏ´Â ¸Þ¼Òµå´Ù. Äڵ带 º¸¸é ÆÄÀϽºÆ®¸²À» Àо°í À̸¦ Âɰ³¼­ ¼­ºñ½º¿¡ È£ÃâÇϰí ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ¼­ºñ½º È£Ãâ ÈÄ Completed°¡ ÀϾÀ» ¶§ ¿¡·¯°¡ ¹ß»ýµÇÁö ¾ÊÀ¸¸é ´Ù½Ã UploadFile ¸Þ¼Òµå¸¦ È£ÃâÇØ ¾ÆÁ÷ ´Ù ¿Ã¸®Áö ¾ÊÀº ÆÄÀϽºÆ®¸²ÀÌ ÀÖ´ÂÁö üũÇÑ ÈÄ ´Ù½Ã ¼­ºñ½º¸¦ È£ÃâÇÑ´Ù. ÀÌó·³ ¹Ýº¹ÀûÀ¸·Î ÆÄÀϾ÷·Îµå ÁøÇà¹Ù¿¡ °ªÀ» °è¼ÓÇØ¼­ º¯°æÇÏ°Ô µÈ´Ù. FileUploadData Ŭ·¡½º´Â ¼­ºñ½º¿¡¼­ »ý¼ºÇÑ Å¬·¡½º·Î ¾÷·Îµå¸¦ ¿äûÇÒ ¶§ ¸Å°³º¯¼ö(Para meter)·Î »ç¿ëµÈ´Ù. Áï, ÀÌ Å¬·¡½º¿¡ ¾÷·ÎµåÆÄÀÏ Á¤º¸¸¦ ÁöÁ¤ÇÑ ÈÄ, SaveFile Async¸¦ È£ÃâÇϰí ÀÌ ¸Å°³º¯¼ö·Î FileUploadData¸¦ ÁöÁ¤ÇÏ¸é µÈ´Ù.

ÆÄÀϾ÷·Îµå WCF¼­ºñ½º
À¥ ÇÁ·ÎÁ§Æ®¿¡¼­ WCFÆÄÀÏÀ» Çϳª »ý¼ºÇÏÀÚ. ÇÊÀÚÀÇ °æ¿ì¿¡´Â <È­¸é 6>°ú °°ÀÌ FileUploadService ¿Í PhotoViewService µÎ°³¸¦ ¸¸µé¾î µÎ¾ú´Ù.

PhotoViewService´Â ³ªÁß¿¡ PhotoLight¿¡¼­ »ç¿ëµÉ ¼­ºñ½º´Ù. ÀÌ·¸°Ô ¼­ºñ½º¸¦ Á¦ÀÛÇß´Ù¸é Web.config ÆÄÀÏ¿¡¼­ endpointÀÇ ¹ÙÀεùÀ» basicHttpBinding·Î ÁöÁ¤ÇØ¾ß ÇÑ´Ù. ±× ÀÌÀ¯´Â ½Ç¹ö¶óÀÌÆ®¿¡¼­´Â basicHttpBinding¸¸À» Áö¿øÇÑ´Ù´Â Á¡ ¶§¹®À̸ç, ÀÌ´Â ²À ±â¾ïÇØµÎ¾î¾ß ÇÒ Áß¿ä ¿ä¼ÒÁß Çϳª´Ù. ÀÌÁ¦ WCF¼­ºñ½º Äڵ带 <¸®½ºÆ® 5>¿Í <¸®½ºÆ® 6>À» ÅëÇØ »ìÆìº¸ÀÚ.

SaveFile ¸Þ¼Òµå´Â ½Ç¹ö¶óÀÌÆ®¿¡¼­ »ç¿ëµÉ ¼ö ÀÖµµ·Ï OperationContract¶ó´Â ¾îÆ®¸®ºäÆ®¸¦ Àû¾îÁà¾ß ÇÑ´Ù. ÇØ´ç ¸Þ¼Òµå´Â FileUploadProvider Ŭ·¡½ºÀÇ SaveFile ¸Þ¼Òµå¸¦ È£ÃâÇϰí ÀÖ´Ù. ½ÇÁ¦ ÆÄÀϾ÷·Îµå°¡ 󸮵Ǵ ¸Þ¼Òµå´Â FileUpload Provider Ŭ·¡½ºÀÇ SaveFile ¸Þ¼Òµå´Ù. <¸®½ºÆ® 5>¿Í <¸®½ºÆ® 6>À» »ìÆìº¸¸é ÇØ´ç ÆÄÀÏÁ¤º¸°¡ ¿Ã¶ó¿À¸é ÁöÁ¤ÇÑ ·çÆ®Æú´õ¿¡ ÆÄÀÏÀ» ÀúÀåÇÑ´Ù. ±×¸®°í ÆÄÀÏÀÌ ¿Ïº®ÇÏ°Ô ¾÷·Îµå µÇ¾ú´ÂÁö IsLast ¼Ó¼ºÀ» Ã¼Å©ÇØ¼­ ÆÄÀÏÀÌ ¸ðµÎ ¾÷·ÎµåµÇ¸é ½æ³×ÀÏ À̹ÌÁö¿Í µöÁÜ ÆÄÀÏÀ» »ý¼ºÇÏ´Â °ÍÀ» º¼ ¼ö ¾Ò´Ù. 

<¸®½ºÆ® 5> FileUploadService.cs

[OperationContract]
public void SaveFile(FileUploadData file)
{
            provider.SaveFile(file);
}

<¸®½ºÆ® 6> FileUploadProvider.cs

public void SaveFile(FileUploadData file)
{
            string uploadDir = CreateDirectory(file.GroupName);
            string fname = file.FileName;

            if (file.IsFirst)
            {
                if (File.Exists(Path.Combine(uploadDir, fname)))
                    File.Delete(Path.Combine(uploadDir, fname));
            }

            FileStream stream = File.Open(Path.Combine(uploadDir, fname), FileMode.Append);
            stream.Write(file.FileData, 0, file.DataLength);
            stream.Close();

if (file.IsLast)
            {
                CreateThumbanil(uploadDir, fname, file.GroupName);
                CreateDeepZoomFile(uploadDir, fname, file.GroupName);
            }
}

Deep Zoom Composer API Ȱ¿ë
¾÷·ÎµåµÈ À̹ÌÁöÆÄÀÏÀ» µöÁÜ(DeepZoom)ÆÄÀÏ·Î º¯È¯Çϱâ À§Çؼ­´Â DeepZoom Composer API¸¦ ÀÌ¿ëÇØ¾ß Çϴµ¥, À̸¦ »ç¿ëÇϱâ À§Çؼ­´Â ¸ÕÀú ¼­¹ö¿¡ DeepZoom Composer¸¦ ¼³Ä¡Çϰí, DeepZoomTools.dll¸¦ ÇÁ·ÎÁ§Æ®¿¡ ÂüÁ¶Ãß°¡¸¦ ÇØ¾ßÇÑ´Ù. ÂüÁ¶¸¦ ÇÏ°Ô µÇ¸é ImageCreator¶ó´Â ÇÔ¼ö°¡ Àִµ¥, ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ °£´ÜÇÏ°Ô µöÁÜÆÄÀÏÀ» »ý¼º ÇÒ ¼ö ÀÖ´Ù. \

<¸®½ºÆ® 7> DeepZoomHelper.cs

public void CreateDeepZoomImage()
{
            ImageCreator imgCreator = new ImageCreator();
            imgCreator.ImageQuality = 0.95;
            imgCreator.TileSize = 256;
            imgCreator.TileOverlap = 1;
            imgCreator.Create(ImgageFileName, SavePolder);
}

<¸®½ºÆ® 7>À» ÀÔ·ÂÇÏ¸é µöÁÜÆÄÀÏÀ» »ý¼ºÇÒ ¼ö ÀÖ´Ù. ÇÊÀÚ´Â µöÁÜÆÄÀÏ¿¡¼­ ImageCreatorÇÔ¼ö¸¦ »ý¼ºÇϰí, ImageQuality ¼Ó¼º°ú TileSize ¼Ó¼º, TileOverlap ¼Ó¼º¸¸ ÁöÁ¤ÇØÁÖ¾ú´Ù. ÀÌ ¼Ó¼ºµéÀº ¾Æ·¡¿Í °°´Ù.

- ImageQuality ¼Ó¼ºÀ» 0¿¡¼­ 1 »çÀÌÀÇ °ªÀ¸·Î ¼¼ÆÃÇϸç, º¸Åë 0.95 Á¤µµ·Î ÁöÁ¤ÇÑ´Ù.
- TileSize ¼Ó¼ºÀº µöÁÜÆÄÀÏÀÇ À̹ÌÁö ŸÀÏÀÇ Å©±â¸¦ ÁöÁ¤ÇÑ´Ù.
- TileOverlap ¼Ó¼ºÀº À̹ÌÁöµéÀÇ OverlapÁ¤µµ´Â ÁöÁ¤ÇÑ´Ù.

CreateÇÔ¼ö¸¦ ÅëÇÑ µöÁÜÆÄÀÏ »ý¼º½Ã º¯¼ö°¡ ¹ß»ýÇϴµ¥, ù ¹øÂ° ¸Å°³º¯¼ö´Â ÆÄÀϸí(½ÇÁ¦ÆÄÀÏÀÇ °æ·Î)À̸ç, µÎ ¹øÂ° ¸Å°³º¯¼ö´Â ÀúÀåµÇ¾îÁú µð·ºÅ丮 °æ·Î¸¦ ÁöÁ¤ÇÏ¸é µÈ´Ù. 
ÀÌ·¸°Ô ÇØ¼­ ´ë·«ÀûÀ¸·Î ÆÄÀϾ÷·Îµå ¾ÖÇø®ÄÉÀÌ¼Ç µ¿ÀÛ, Äڵ屸ÇöºÎºÐ°ú WCF¼­ºñ½º¿¡¼­ 󸮵Ǵ ºÎºÐ¿¡ ´ëÇØ ¾Ë¾Æ ºÃ´Ù. ÀÌÁ¦ Æ÷Åä¶óÀÌÆ® ¾ÖÇø®ÄÉÀ̼ǿ¡ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.

Æ÷Åä¶óÀÌÆ® µ¿ÀÛ°ú ±¸Çö
¸®½ºÆ®¸¦ »ìÆìº¸±â¿¡ ¾Õ¼­ <È­¸é 7>À» ÂüÁ¶ÇØ Æ÷Åä¶óÀÌÆ®¿¡¼­ ¾î¶»°Ô µ¥ÀÌÅ͸¦ ÁÖ°í¹Þ´ÂÁö, °£´ÜÇÏ°Ô Â¤°í ³Ñ¾î°¡ÀÚ.

<È­¸é 7>À» º¸¸é <È­¸é 3>°ú °°ÀÌ ³ëÆ®ºÏ PC°¡ ÀÖ´Ù. ÀÌ ¶ÇÇÑ Å¬¶óÀÌ¾ðÆ® PC¶ó°í ÀνÄÇÏÀÚ. ±×·¯³ª <È­¸é 3>°ú´Â ´Þ¸® <È­¸é 7>ÀÇ Å¬¶óÀÌ¾ðÆ® PC ¿·¿¡´Â Ű(key)°¡ ÀÖ´Â °ÍÀ» º¼ ¼ö Àִµ¥ ÀÌ´Â µ¥ÀÌÅÍÀÇ Å°¶ó°í »ý°¢ÇÏ¸é µÈ´Ù. Æ÷Åä¶óÀÌÆ®¿¡¼­µµ WCF¼­ºñ½º¸¦ ÀÌ¿ëÇÑ´Ù. ÇØ´ç ۸¦ WCF¼­ºñ½º¿¡ ³Ñ±â¸é, WCF¼­ºñ½º´Â DBServer¿¡ µ¥ÀÌÅ͸¦ ¿äûÇÑ ÈÄ ÇØ´ç µ¥ÀÌÅ͸¦ ½Ç¹ö¶óÀÌÆ® ¾ÖÇø®ÄÉÀ̼ǿ¡ º¸³»ÁÖ´Â Çü½ÄÀÌ´Ù.

<È­¸é 8>Àº Æ÷Åä¶óÀÌÆ®ÀÇ ÇÁ·ÎÁ§Æ® ±¸¼º ¸ð½ÀÀ¸·Î, ÆÄÀϾ÷·Îµå ÇÁ·ÎÁ§Æ®¿Í ºñ½ÁÇÑ ±¸¼ºÀ» °®Ãß°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. <¸®½ºÆ® 8>Àº Æ÷Åä¶óÀÌÆ®¿¡ ÀÌ¿ëµÇ´Â ÁÖ¿ä ÄÚµåµéÀ» Á¦½ÃÇÑ´Ù. ¸ÕÀú <¸®½ºÆ® 8>¿¡¼­´Â ScriptManager Ŭ·¡½ººÎÅÍ º¸µµ·Ï ÇÏÀÚ. ScriptManager´Â ¿ÜºÎ¿¡¼­ ½ºÅ©¸³Æ®(Script)ÇÔ¼ö¸¦ ÅëÇØ µ¥ÀÌÅÍ Å°¸¦ ³Ñ°Ü ¹Þ°ÔµÇ¸é, ScriptManager¿¡¼­´Â µ¥ÀÌÅÍ Å°°¡ º¯°æµÇ¾úÀ½À» ¾Ë·ÁÁÖ´Â ¿ªÇÒÀ» ´ã´çÇϰí ÀÖ´Ù.

<¸®½ºÆ® 8> ScriptManager.cs

public class ScriptManager
{
        public event EventHandler PhotoKeyChanged;
        private String _ptKey;
        [ScriptableMember]
        public String PTKey
        {
            get
            {
                return _ptKey;
            }
            set
            {
                _ptKey = value
                if (PhotoKeyChanged != null)
                    PhotoKeyChanged(this, EventArgs.Empty);
            }
        }
public ScriptManager()
        {
            HtmlPage.RegisterScriptableObject("Photo Light", this);
        }
}

ÀÌ Ä÷³À» Àд µ¶ÀÚ¶ó¸é ´Ùµé ¾Ë°í ÀÖ°ÚÁö¸¸ ÀÚ¹Ù½ºÅ©¸³Æ®¸¦ ÅëÇÑ ½Ç¹ö¶óÀÌÆ® ÇÔ¼ö È£ÃâÀ» À§Çؼ­´Â HtmlPage.Register ScriptableObject ÇÔ¼ö¿¡ ½ºÅ©¸³Æ® °¡´ÉÇÑ ¾×¼¼½º ±â´ÉÀ» À§ÇØ °ü¸®µÇ´Â °³Ã¼¸¦ µî·ÏÇϸç, ½ºÅ©¸³Æ®¿¡¼­ ƯÁ¤ ÇÔ¼ö¿¡ Á¢±ÙÇϱâ À§Çؼ­´Â ScriptableMember¶ó´Â ¾îÆ®¸®ºäÆ®¸¦ ºÙ¿©¾ßÇÑ´Ù. Æ÷Åä¶óÀÌÆ®¿¡¼­´Â PTKey¶ó´Â ¸Þ¼Òµå¸¦ ½ºÅ©¸³Æ®¿¡¼­ Á¢±ÙÇÒ¼ö ÀÖµµ·Ï ÁöÁ¤ÇØ ÁÖ¾ú´Âµ¥ À̴ Ű °ªÀÌ ¹Ù²ð ¶§¸¶´Ù PhotoKey Changed¶ó´Â À̺¥Æ®¸¦ È£ÃâÇØ ÁÖ°Ô µÇ´Â °Í ÀÌ´Ù. ÀÌ À̺¥Æ®¸¦ ¹Þ´Â ÂÊ¿¡¼­´Â ÇØ´ç Ű °ªÀ¸·Î WCF¼­ºñ½º¸¦ È£ÃâÀ» ÇØ¼­ µ¥ÀÌÅ͸¦ ¹Þ¾Æ¿À°Ô µÈ´Ù.

WCF¼­ºñ½º Ȱ¿ë Tip 

º¸Åë WCF¼­ºñ½º¿¡¼­ µ¥ÀÌÅÍŬ·¡½º¸¦ »ý¼ºÇϸé DataCon tract ¾îÆ®¸®ºäÆ®¿Í DataMember ¾îÆ®¸®ºäÆ®¸¦ ºÙ¿© »ç¿ëÇßÀ» °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¹æ½ÄÀ» ÅëÇØ¾ß Á÷·ÄÈ­(Serialization)°¡´ÉÇØÁ®, ½Ç¹ö¶óÀÌÆ® ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ ¹ÞÀ» ¼ö ÀÖ°í, ¼­ºñ½º ¿¡·¯µµ ÇÇÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ±×·¯³ª ´å³Ý ÇÁ·¹ÀÓ¿öÅ© 3.5 SP1¸¦ ¼­¹ö¿¡ ¼³Ä¡Çϸé, DataContractµîÀÇ Á÷·ÄÈ­ °ü·Ã ¼±¾ð ¾øÀ̵µ ¸ðµç C# Object¸¦ Remoting TypeÀ¸·Î Á¦°øÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ´å³Ý ÇÁ·¹ÀÓ¿öÅ© 3.5SP1¿¡ WCFdhk °ü·ÃµÈ ±â´ÉÀÌ Ãß°¡µÆ±â ¶§¹®ÀÌ´Ù. 

¾Ö´Ï¸ÅÀÌ¼Ç ÁÖ±â
Æ÷Åä¶óÀÌÆ®¿¡¼­´Â ½½¶óÀ̵庸±â¶ó´Â ±â´ÉÀÌ ÀÖ´Ù. ½½¶óÀ̵庸±â ±â´ÉÀº ¿©·¯ÀåÀÇ »çÁøÀ» ÀÚµ¿À¸·Î ÇÑ Àå ÇÑ Àå ³Ñ°ÜÁָ鼭 º¸¿©ÁÖ´Â ±â´ÉÀÌ´Ù. <¸®½ºÆ® 9>´Â ÀÌ ±â´ÉÀ» »ùÇ÷Π±¸ÇöÇÒ ¼ö ÀÖ´Â Äڵ带 Á¤¸®ÇÑ °ÍÀÌ´Ù.

<¸®½ºÆ® 9> ShowControl.xaml

<UserControl x:Class="PhotoLight.ShowControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml /presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
 <UserControl.Resources>
  <Storyboard x:Name="ImageClose">
   <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="ImageControl" Storyboard.TargetProperty="(UIElement.Opacity)">
    <SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="0"/>
   </DoubleAnimationUsingKeyFrames>
        </Storyboard>
        <Storyboard x:Name="ImageOpen">
            <DoubleAnimationUsingKeyFrames BeginTime= "00:00:00" Storyboard.TargetName="ImageControl" Storyboard.TargetProperty="(UIElement.Opacity)">
                <SplineDoubleKeyFrame KeyTime= "00:00:00.5000000" Value="1"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot">
        <Image HorizontalAlignment="Stretch" Stretch= "Uniform"  x:Name="ImageControl" />
    </Grid>
</UserControl>

<¸®½ºÆ® 9>¿¡ ¸í½ÃµÈ ShowControlÀ̶ó´Â À¯ÀúÄÁÆ®·ÑÀ» º¸¸é µÎ °³ÀÇ ½ºÅ丮º¸µå°¡ Á¸ÀçÇÔÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÀÌ µÎ °³ÀÇ ½ºÅ丮º¸µå´Â °£´ÜÇÑ ¾Ö´Ï¸ÞÀ̼ÇÀ» Á¤ÀÇÇϰí Àִµ¥ ÀÌ´Â À̹ÌÁö ÄÁÆ®·ÑÀÇ Opacity¸¦ 0À¸·Î Çß´Ù, 1·Î ÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ±×·¡¼­ µ¥ÀÌÅͰ¡ º¯°æµÉ ¶§ ¸¶´Ù À̹ÌÁöÀÇ Opacity°ªÀ» Á¶ÀýÇØÁà ±âÁ¸ÀÇ À̹ÌÁö´Â »ç¶óÁö°í, »õ·Î¿î À̹ÌÁö´Â ºÎµå·´°Ô ³ªÅ¸³ª°Ô ¾Ö´Ï¸ÞÀ̼ÇÀ¸·Î ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù(<È­¸é 10> ÂüÁ¶).

¾Ö´Ï¸ÞÀ̼ÇÀÌ ÀÛµ¿µÇ´Â ¸ð½À°ú ½ÇÁ¦ÀûÀÎ µ¿À۴ܰ谡 ±Ã±ÝÇÑ µ¶ÀÚµéÀº  www.happydong214.com¸¦ ¹æ¹®ÇÏ¸é º¼ ¼ö ÀÖ´Ù.
Áö±Ý±îÁö Æ÷Åä¶óÀÌÆ®ÀÇ ´ë·«ÀûÀÎ ¼Ò½ºÄÚµå¿Í ÀÛµ¿³»¿ë¿¡ ´ëÇØ ¾Ë¾Æº¸¾Ò´Ù. ÇÊÀÚ ¶ÇÇÑ ½Ç¹ö¶óÀÌÆ®¿Í °ü·ÃµÈ ȸ»ç¿¡¼­ ÀÏÀ» Çϰí ÀÖÁö¸¸, °æÇèÀÌ ºÎÁ·ÇÑ °ÍÀº »ç½ÇÀÌ´Ù. ÇÏÁö¸¸, Áö±Ý±îÁö ³ª¿Ô´ø °³¹ßÀ̽´ ¹× ½Ç¹ö¶óÀÌÆ®¿¡¼­ Á¦°øÇÏ´Â ±âº»ÀûÀÎ ÄÁÆ®·ÑµéÀ» Àß ÀÌ¿ëÇØ¼­ ÀÌ·¸°Ô ¸ÚÁø ¾ÖÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇÒ ¼ö ÀÖ¾ú´Ù. ½Ç¹ö¶óÀÌÆ®°¡ ¾î·Æ°í »ý°¢ÇϽô ºÐµéÀÌ ÀÖ´Ù¸é, ±×·± »ý°¢Àº ±×³É Àá½Ã Àذí, Çѹø ¹ÌÄ£µíÀÌ ¸¸µé¾îº¸°í, ¶Ç ¸¸µé¾îº¸ÀÚ. ±×·¯´Ù º¸¸é Àڽŵµ ¸ð¸£°Ô ¹ßÀüµÇ¾î°¡´Â ¸ð½ÀÀ» º¼ ¼ö ÀÖ°Ô µÉ °ÍÀÌ´Ù.

 

Âü°í ÀÚ·á 

1. www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx
2. http://hoons.kr/Board.aspx?Name=sivlerlighttip&Mode=2&BoardIdx= 19560&Key=Title&Value=MV
3. http://hoons.kr/Board.aspx?Name=sivlerlighttip&Mode=2&BoardIdx= 19561&Key=Title&Value=MV
4. http://hoons.kr/Lecture/LectureView.aspx?BoardIdx=18394&kind=43

aboutmenu