Áö³ È£±îÁö´Â °´Ã¼ »ý¼º¿¡ ´ëÇÑ ÇϳªÀÇ ¹®Á¦¿¡ ´ëÇÏ¿© ´Ù¾çÇÑ °¢µµ¿¡¼ÀÇ ÇØ°áÃ¥À» Á¦½ÃÇÏ´Â ¿©·¯ °¡Áö ÆÐÅÏ¿¡ ´ëÇؼ
¾Ë¾Æº¸¾Ò´Ù. µðÀÚÀÎ ÆÐÅÏÀ» ´Ù·ç°í ÀÖ´Â °Å°³ÀÇ Ã¥µéÀº À̵é ÆÐÅÏÀ» ¹¾î¼ Creational patterns[1][2]ÀÇ ¹üÁÖ¿¡
³Ö´Â´Ù(´º½º·¹ÅÍ
5È£ÀÇ Object Lifecycle Manager ÆÐÅÏÀº ±âÁ¸ÀÇ °´Ã¼ »ý¼º ÆÐÅÏÀ» º¸¿ÏÇÑ´Ù´Â °üÁ¡¿¡¼ Creational
patternsÀÇ ¹üÁÖ¿¡ ³ÖÀ» ¼ö ÀÖ´Ù°í »ý°¢ÇÑ´Ù).
ÀÌ ¹øÈ£ºÎÅÍ´Â Á»´õ ´Ù¸¥ °¢µµ¿¡¼ ¹®Á¦¸¦ ã¾Æ ÇØ°áÇÏ°í ÀÖ´Â µðÀÚÀÎ ÆÐÅÏ¿¡ ´ëÇؼ À̾߱âÇØ º¸·Á°í ÇÑ´Ù. ¾Æ¸¶ °´Ã¼
»ý¼ºº¸´Ùµµ ´õ Àç¹ÌÀÖ´Â À̾߱Ⱑ µÉ °ÍÀ¸·Î »ý°¢µÈ´Ù.
1. »ý¼ºµÈ °´Ã¼µé »çÀÌÀÇ °ü°è
¾î¶² ½Ã½ºÅÛÀ» °´Ã¼ÁöÇâÀûÀ¸·Î µðÀÚÀÎ ÇÑ´Ù´Â °ÍÀº ¹«¾ùÀ» ÀǹÌÇϴ°¡? Grady Booch³ª James Rumbaugh¿Í °°Àº
°´Ã¼ÁöÇâ ¹æ¹ý·Ð(methodology)ÀÇ ´ë°¡µéÀÌ ¸¸µé¾î ³õÀº ÀÌ·ÐÀ» µû¸£Áö ¾Ê´õ¶óµµ, Á÷°üÀûÀ¸·Î ¾î´À Á¤µµ´Â ´©±¸³ª ½±°Ô »ý°¢ÇØ
º¼ ¼ö ÀÖ´Â ¼ö¼øÀÌ ÀÖ´Ù. ¸ÕÀú, Ç®°íÀÚ ÇÏ´Â ¹®Á¦¸¦ ºÐ¼®ÇÏ°í À̸¦ ¹ÙÅÁÀ¸·Î ÇÊ¿äÇÑ °´Ã¼¸¦ ã¾Æ³½ ÈÄ¿¡ ÀÌµé °´Ã¼ »çÀÌÀÇ
°ü°è(association)¸¦ Á¤¸³ÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¶§, °´Ã¼µé »çÀÌÀÇ °ü°è´Â ÇØ´ç ½Ã½ºÅÛÀÇ ÇàÀ§(behavior)¸¦ °áÁ¤Áþ°Ô
µÈ´Ù. °Å²Ù·Î À̾߱â Çؼ, ¾î¶² ±â´ëµÇ´Â ÇàÀ§¸¦ ÇÏ´Â ½Ã½ºÅÛÀ» ¼³°èÇϱâ À§Çؼ´Â ºÐ¼® °úÁ¤À» ÅëÇؼ ÇÊ¿äÇÏ´Ù°í
ÆǴܵǴ °´Ã¼µé »çÀÌ¿¡ ¾î¶² °ü°è°¡ ¼º¸³µÇ¾î¾ß Çϴ°¡¸¦ Á¤È®ÇÏ°Ô ¸í½ÃÇØ ÁÖ¾î¾ß ÇÑ´Ù. ÀÌ °ÍÀÌ À߸øµÇ¸é, ¾û¶×ÇÑ ÇàÀ§¸¦ ÇÏ´Â
½Ã½ºÅÛÀ» ź»ý½Ãų ¼ö ÀÖÀ» °ÍÀÌ´Ù.
»ç½Ç Áö±Ý±îÁö À̾߱âµÇ¾î ¿Ô´ø Creational patternsÀÇ ¹üÁÖ¿¡ µé¾îÀÖ´Â ÆÐÅϵ鵵 °´Ã¼ »ý¼ºÀ̶ó´Â ÇàÀ§¸¦ Çϱâ
À§Çؼ ¿©·¯ °³ÀÇ °´Ã¼µéÀÌ ¾î¶² Ưº°ÇÑ °ü°è¸¦ °¡Áö°í ±¸¼ºµÇ¾î ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. µðÀÚÀÎ ÆÐÅÏ Áß¿¡´Â (ÇÊÀÚ°¡ ÆÇ´ÜÇϱ⿡)
ÇàÀ§ ÀÚüÀÇ Á߿伺À¸·Î ÀÎÇؼ Behavioral patterns¶ó´Â ¹üÁÖ¿¡ µé¾îÀÖ´Â °ÍµéÀÌ ÀÖ´Ù. µµ´ëü ¾î¶² ÇàÀ§¸¦ Çϱ淡
¹üÁÖ ÀÚüÀÇ À̸§ÀÌ ¡®ÇàÀ§¡¯¶ó´Â °Í¿¡ Æ÷ÇÔ½ÃÄÑ ³õ¾ÒÀ»±î¶ó´Â Àǹ®À» Á¦±âÇØ º¼ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ¹øÈ£ºÎÅÍ´Â Behavioral
patterns ¹üÁÖ¿¡ µé¾î ÀÖ´Â µðÀÚÀÎ ÆÐÅϵ鿡 ´ëÇؼ À̾߱⸦ ÇØ º¸·Á°í ÇÑ´Ù. ±× ù¹ø°·Î Observer ÆÐÅÏÀ» ¼±ÅÃÇÏ¿©
º¸¾Ò´Ù.
2. µµ´ëü ¹«¾ùÀ» °üÂûÇÑ´Ù´Â °ÍÀΰ¡?
Observer ÆÐÅÏÀÇ À̸§¿¡¼ À¯ÃßÇØ º¼ ¼ö ÀÖµíÀÌ ÀÌ ÆÐÅÏÀº ÇϳªÀÇ °´Ã¼°¡ ´Ù¸¥ °´Ã¼¸¦ °üÂûÇÏ´Â °ÍÀÌ´Ù. ±×·³ ¹«¾ùÀ»
°üÂûÇÑ´Ù´Â °ÍÀ̸ç, ¿Ö °üÂûÇÏ´Â °ÍÀΰ¡?
¾î¶² ½Ã½ºÅÛÀ» µðÀÚÀÎÇÏ´Ù º¸¸é, ¾î¶² °´Ã¼ÀÇ ÇàÀ§°¡ ´Ù¸¥ °´Ã¼ÀÇ »óÅ º¯È¿¡ ÀÇÁ¸ÇÏ´Â °æ¿ì°¡ ¸¹ÀÌ ÀÖ´Ù. ¿¹¸¦ µé¾î¼,
¿ì¸®°¡ ÀϹÝÀûÀ¸·Î ¸¹ÀÌ »ç¿ëÇÏ°í ÀÖ´Â ³×Æ®¿÷ äÆà ½Ã½ºÅÛÀÇ °æ¿ì¸¦ º¸´õ¶óµµ, äÆà Ŭ¶óÀ̾ðÆ®´Â äÆà ¼¹ö¿¡ »õ·Î¿î ¸Þ½ÃÁö°¡
µµÂøÇß´ÂÁöÀÇ ¿©ºÎ¸¦ Áö¼ÓÀûÀ¸·Î °üÂûÇÏ°í ÀÖ´Ù°¡, »õ·Î¿î ¸Þ½ÃÁö°¡ µµÂøÇØ ÀÖÀ¸¸é, äÆÃÀ» ÇÏ°í ÀÖ´Â »ç¶÷¿¡°Ô »õ·Î¿î ¸Þ½ÃÁö¸¦ ´©°¡
ŸÀÌÇÎÇß´ÂÁö¸¦ ¾Ë·ÁÁÖ´Â ±â´ÉÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ·± ¿¹¸¦ µéÁö ¾Ê¾Æµµ, °æÇèÀÌ ¸¹Àº ÇÁ·Î±×·¡¸ÓµéÀº ÀÌ·± Á¾·ùÀÇ ÇàÀ§°¡ ¾ó¸¶³ª ÀÚÁÖ
½Ã½ºÅÛ ³»¿¡¼ ÇÊ¿äÇÑÁö ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ±×·³ ÀÌ·± ±â´ÉÀ» ¾î¶² ½ÄÀ¸·Î µðÀÚÀÎÇØ¾ß Àß Çß´Ù°í ¼Ò¹®ÀÌ ³¯±î?
3. ¼¼ °¡Áö ¹æ¹ý
ÇÑ °´Ã¼°¡ ´Ù¸¥ °´Ã¼ÀÇ »óÅÂÀÇ º¯È¸¦ °üÂûÇÏ¿© ¾î¶² ±â´ëÇÏ°í ÀÖ´Â º¯È°¡ ÀϾ¸é ¾î¶² ÇàÀ§¸¦ ÇÏ´Â ÀÌ·± Á¾·ùÀÇ ÇàÀ§´Â
µðÀÚÀÎ °üÁ¡¿¡¼ Å©°Ô ¼¼ °¡ÁöÀÇ ¹æ¹ýÀ» »ý°¢ÇØ º¼ ¼ö ÀÖ´Ù. Polling, µ¿±â½Ä(syncronous) ¹æ¹ý,
ºñµ¿±â½Ä(asyncronous) ¹æ¹ýÀÌ ±×°ÍÀÌ´Ù.
°¢°¢ÀÇ ¹æ¹ýÀÌ ¹«¾ùÀ» ÀǹÌÇÏ´ÂÁö ¾Ë¾Æº¸±â À§Çؼ À§¿¡¼ ¿¹·Î µé¾ú´ø äÆà ½Ã½ºÅÛÀÇ °æ¿ì¸¦ °¡Áö°í À̾߱âÇØ º¸°Ú´Ù. äÆÃ
Ŭ¶óÀ̾ðÆ®´Â äÆü¹ö¿¡ ÀÚ½ÅÀÌ Âü¿©ÇÏ°í Àִ äÆà ±×·ì ³»ÀÇ ¾î¶² äÆà Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍ »õ·Î¿î ¸Þ½ÃÁö°¡ µµÂøÇß´ÂÁö¸¦ È®ÀÎÇؼ,
µµÂøÇßÀ¸¸é ±× »õ·Î¿î ¸Þ½ÃÁö¸¦ äÆÃÀ» ÇÏ°í ÀÖ´Â »ç¿ëÀÚ¿¡°Ô º¸¿©ÁÖ´Â ÇàÀ§°¡ ±âº»ÀûÀ¸·Î ÇÊ¿äÇÏ´Ù. ÀÌ·± ±â´É¿¡ ´ëÇÑ µðÀÚÀÎÀ¸·Î °¡Àå
½±°Ô »ý°¢ÇØ º¼ ¼ö ÀÖ´Â °ÍÀº äÆà Ŭ¶óÀ̾ðÆ®°¡ ÁÖ±âÀûÀ¸·Î äÆà ¼¹ö¿¡ Á¢¼ÓÇؼ ¼ÓÇØ Àִ äÆà ±×·ì³»ÀÇ ´©±º°¡°¡ »õ·Î¿î ¸Þ½ÃÁö¸¦
ŸÀÌÇÎÇß´ÂÁö¸¦ È®ÀÎÇØ º¸´Â °ÍÀÌ´Ù. ÀÌ·± ¹æ¹ýÀ» pollingÀ̶ó°í ºÎ¸¥´Ù. °æ¿ì¿¡ µû¶ó¼, pollingÀ» »ç¿ëÇؼ ½Ã½ºÅÛÀ»
µðÀÚÀÎ ÇØ¾ß ÇÒ °æ¿ì°¡ ÀÖÁö¸¸, °æÇèÀûÀ¸·Î´Â ±×¸® ÁÁÀº ¹æ¹ýÀº ¾Æ´Ï´Ù. ÀÌ ¿¹ÀÇ °æ¿ì¸¦ º¸´õ¶óµµ, äÆà Ŭ¶óÀ̾ðÆ®´Â äÆà ¼¹ö¿¡
»õ·Î¿î ¸Þ½ÃÁö°¡ µé¾î¿Í ÀÖ´ø ±×·¸Áö ¾Ê´ø °£¿¡ ÁÖ±âÀûÀ¸·Î ¼¹ö¸¦ Á¡°ËÇÏ´Â ÇàÀ§¸¦ Çϴµ¥ °á°úÀûÀ¸·Î´Â ºÒÇÊ¿äÇÑ ³×Æ®¿÷ Æ®·¡ÇÈÀ»
À¯¹ß½ÃÅ°¸ç ½Ã½ºÅÛÀÇ ÀÚ¿øÀ» ³²¿ëÇÏ´Â ¹®Á¦¸¦ ¾ß±â½Ãų ¼ö ÀÖ´Ù.
¼¹ö¿¡ »õ·Î¿î ¸Þ½ÃÁö°¡ µµÂøÇß´ÂÁöÀÇ ¿©ºÎ¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Â polling¿ÜÀÇ ¶Ç ´Ù¸¥ ¹æ¹ýÀ¸·Î´Â »õ·Î¿î µµÂø
¸Þ½ÃÁö Á¦°øÀ» ¸ñÀûÀ¸·Î ¼¹ö¿¡¼ Á¦°øÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ Ŭ¶óÀ̾ðÆ®¿¡¼ µ¿±âÀûÀ¸·Î È£ÃâÇÏ´Â °ÍÀÌ´Ù. ÀÌ °æ¿ì¿¡´Â ÀÌ ÀÎÅÍÆäÀ̽º¸¦
È£ÃâÇÑ Å¬¶óÀ̾ðÆ®´Â ¼¹ö¿¡ »õ·Î¿î ¸Þ½ÃÁö°¡ µµÂøÇؼ ±× ¸Þ½ÃÁö¸¦ ¸®ÅÏÇØ ÁÖ±â Àü±îÁö´Â °è¼Ó ÇØ´ç ÀÎÅÍÆäÀ̽ºÀÇ È£Ãâ¿¡ ¹¿© ÀÖ°Ô
µÈ´Ù. Áï, Ŭ¶óÀ̾ðÆ®´Â ¼¹ö¿¡ »õ·Î¿î ¸Þ½ÃÁö°¡ µµÂøÇؼ È£ÃâÇÑ ÀÎÅÍÆäÀ̽º°¡ ¸®ÅϵDZâ Àü±îÁö´Â ´Ù¸¥ ÀÏÀ» ÇÒ ¼ö ¾ø´Â »óÅ¿¡ ºüÁ®
ÀÖ°Ô µÈ´Ù. µû¶ó¼, ÀÌ ¹æ¹ýµµ ±×¸® È¿°úÀûÀÎ ¹æ¹ýÀº ¾Æ´Ï´Ù.
´Ù¸¥ ¹æ¹ýÀ¸·Î´Â Ŭ¶óÀ̾ðÆ®°¡ ¼¹ö¿¡ Á¢¼ÓÇÑ ÈÄ¿¡ °°Àº äÆà ±×·ì¿¡ ¼ÓÇØ ÀÖ´Â »ç¶÷ÀÌ ¸Þ½ÃÁö¸¦ ¼¹ö¿¡ º¸³»¸é, ³ª¿¡°Ôµµ ±×
¸Þ½ÃÁö¸¦ º¸³»´Þ¶ó°í ¿äûÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù. ÀÌ ¹æ¹ýÀº ¼¹ö¿¡¼ ÀÌ·± ¸ñÀûÀ¸·Î Á¦°øÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ ºñµ¿±âÀûÀ¸·Î È£ÃâÇÔÀ¸·Î½á
ÀÌ·ç¾îÁö¸ç, ÀÌ ¹æ¹ýÀº callback À̶ó°í ºÒ¸®¿öÁö°í ÀÖ´Ù. ±× ÀÌÀ¯´Â ³»°¡ callÀ» Çߴµ¥, Áö±Ý ´çÀåÀº ¸Þ½ÃÁö°¡ ¾øÀ¸´Ï,
³ªÁß¿¡ ¸Þ½ÃÁö°¡ µµÂøÇϸé, ³ª¿¡°Ô ¾Ë·Á´Þ¶ó°í ³ªÀÇ ¿¬¶ôó¸¦ ³²±â´Â °úÁ¤À̶ó°í Çؼ callbackÀ̶ó°í À̸§À» ºÙ¿´´Ù°í ÇÑ´Ù.
callbackÀº ¸¹ÀÌ »ç¿ëµÇ°í ÀÖ´Â ¹æ¹ýÀ¸·Î ÇÁ·Î±×·¡¹Ö¾ð¾î¸¦ ¼³¸íÇÏ´Â °Å°³ÀÇ Ã¥µéÀº º°µµÀÇ ¼½¼ÇÀ» ¸¶·ÃÇؼ ÇØ´ç ÇÁ·Î±×·¡¹Ö¾ð¾î·Î
callbackÀ» ¾î¶»°Ô ±¸ÇöÇÒ ¼ö ÀÖ´ÂÁö ¼³¸íÇÏ°í ÀÖ´Â Á¤µµÀÌ´Ù. ÆÐÅÏ ÀúÀÚµéÀÌ ÀÌ·± callbackÀ» °¡¸¸È÷
³õ¾ÆµÎ¾úÀ»¸®°¡ ¾ø´Ù. µðÀÚÀÎ ÆÐÅÏ¿¡¼´Â callbackÀ» Observer ÆÐÅÏÀ̶ó°í À̸§ ºÙ¿©¼ Á¤¸®ÇØ ³õ¾Ò´Ù.
µÎ ¹ø° ¹æ¹ýÀº ´Ü¼øÈ÷ ¼¹ö¿¡¼ Á¦°øÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ µ¿±âÀûÀ¸·Î È£ÃâÇÏ´Â °ÍÀ̹ǷΠƯº°È÷ À̾߱âÇÒ °ÍÀº ¾ø´Ù. ´ÙÀ½ Àý¿¡¼´Â
callbackÀ» ÆÐÅÏÀ¸·Î Á¤¸®ÇÑ observer ÆÐÅÏÀ» polling°ú ºñ±³ÇÏ¿© À̾߱âÇϱ⠺¸°Ú´Ù.
4. Polling
Âü°í¹®Çå [3]¿¡´Â pollingÀÌ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.
"Polling" describes a situation in which a client
repeatedly, usually in a loop, invokes a method on another object to
see if anything has changed.
¾î¶² Ŭ¶óÀ̾ðÆ®°¡ (º¸ÅëÀº ·çÇÁ¸¦ ÀÌ¿ëÇؼ) Áö¼ÓÀûÀ¸·Î ´Ù¸¥ °´Ã¼ÀÇ »óÅ º¯È¸¦ ¾Ë¾Æº¸·Á´Â ¸ñÀû¿¡¼ ±×
°´Ã¼°¡ Á¦°øÇÏ´Â ¸Þ¼Òµå¸¦ Áö¼ÓÀûÀ¸·Î È£ÃâÇÏ´Â °ÍÀ» pollingÀ̶ó ÇÑ´Ù.
À§¿¡¼ ¿¹·Î µé¾ú´ø äÆà ½Ã½ºÅÛÀ» °¡Áö°í polling¿¡ ´ëÇؼ Á»´õ ±¸Ã¼ÀûÀ¸·Î ¾Ë¾Æº¸ÀÚ. äÆà Ŭ¶óÀ̾ðÆ®´Â ¸Þ¼¼Áö¸¦
¼¹ö¿¡ º¸³»°í ¹ÞÀ» ¼ö ÀÖ¾î¾ß ÇÏÁö¸¸, À̾߱⸦ ´Ü¼øÈ ½ÃÅ°±â À§Çؼ º» ±ÛÀÇ ¸ñÀû»ó ¸Þ¼¼Áö¸¦ ¼¹ö¿¡¼ ¹Þ´Â ±â´É¿¡ ´ëÇؼ¸¸
À̾߱âÇÏ·Á ÇÑ´Ù. ´ÙÀ½Àº pollingÀ» ÀÌ¿ëÇؼ äÆà ½Ã½ºÅÛÀ» ±¸ÇöÇÑ °£´ÜÇÑ ÀÚ¹Ù ¼Ò½ºÀÌ´Ù.
public class Message {
...
}
public class ChatServer {
...
private boolean newMsg = false;
private Message msg;
...
public boolean isNewMsg() {
return newMsg;
}
...
public Message getMsg() {
return msg;
}
}
public class ChatClientGet implements Runnable {
...
private Message msg_;
private
ChatServer chatServer_;
...
public
ChatClientGet(ChatServer cs) {
chatServer_ = cs;
}
...
public void run() {
while(true) {
boolean isNewMsg =
chatServer_.isNewMsg();
if(isNewMsg) {
msg_ = chatServer_.getMsg();
// do something..
}
}
}
½Ç·ÂÀÖ´Â ÇÁ·Î±×·¡¸Ó¶ó¸é À§ÀÇ ¼Ò½º°¡ ¸¹Àº ¹®Á¦¸¦ °¡Áö°í ÀÖ´Ù´Â °ÍÀ» ±Ý¹æ ¾Ë¾ÆÂ÷·ÈÀ» °ÍÀÌ´Ù. ¿ì¼± ¸¹Àº ¹®Á¦Á¡À» µÚ·Î
ÇÑä polling¿¡¸¸ ÃÊÁ¡À» ¸ÂÃß¾î¼ À§ÀÇ ¼Ò½º¸¦ º¸ÀÚ.
À§ÀÇ ¼Ò½º¸¦ º¸¸é äÆü¹ö ChatServer´Â isNewMsg()¶ó´Â ÀÎÅÍÆäÀ̽º¸¦ µÎ¾î¼ äÆà ¼¹ö¿¡°Ô »õ·Î¿î ¸Þ¼¼Áö°¡
¼¹ö¿¡ µµÂøµÇ¾î ÀÖ´ÂÁö¿¡ ´ëÇÑ Á¤º¸¸¦ Á¦°øÇÏ°í ÀÖ°í, getMsg()¶ó´Â ÀÎÅÍÆäÀ̽º¸¦ ÅëÇؼ´Â ¼¹ö¿¡ ÀÖ´Â ¸Þ¼¼Áö¸¦ Ŭ¶óÀ̾ðÆ®¿¡°Ô
Àü´ÞÇÏ°í ÀÖ´Ù. äÆà Ŭ¶óÀ̾ðÆ® ChatClientGetÀº ¼¹ö¿¡¼ Á¦°øÇÏ°í ÀÖ´Â µÎ °³ÀÇ ÀÎÅÍÆäÀ̽º¸¦ ÅëÇؼ »õ·Î¿î ¸Þ¼¼Áö°¡
¼¹ö¿¡ µµÂøµÇ¾î ÀÖ´ÂÁö¸¦ È®ÀÎÇÑ ÈÄ¿¡, »õ·Î¿î ¸Þ¼¼Áö°¡ ÀÖÀ¸¸é ±× ÇØ´ç ¸Þ¼¼Áö¸¦ ¹Þ¾Æ¿Â´Ù. ¼Ò½º¸¦ ÀüüÀûÀ¸·Î ´Ù½Ã º¸¸é,
polling ¹æ¹ýÀ» ÀÌ¿ëÇßÀ» °æ¿ì¿¡ »õ·Î¿î ¸Þ¼¼Áö°¡ ¼¹ö¿¡ µµÂøµÈ ÈÄ¿¡ ¸ðµç ÇàÀ§ÀÇ Ã¥ÀÓÀÌ Å¬¶óÀ̾ðÆ®¿¡ ÁýÁߵǾî ÀÖ´Ù. ¼¹ö´Â
´ÜÁö »õ·Î¿î ¸Þ¼¼Áö°¡ µµÂøµÇ¾î ÀÖ´Ù´Â »óÅ Á¤º¸¿Í ÇØ´ç ¸Þ¼¼Áö¸¦ Ŭ¶óÀ̾ðÆ®°¡ ¹Þ¾Æ°¥¶§±îÁö ÀúÀåÇÏ´Â ±â´É¸¸À» °¡Áö°í ÀÖ°í, »õ·Î¿î
¸Þ¼¼Áö°¡ µµÂøµÇ¾î ÀÖ´Ù´Â Á¤º¸¸¦ Ŭ¶óÀ̾ðÆ®¿¡ Àü´ÞÇÏ´Â ±â´É°ú ÇØ´ç ¸Þ½ÃÁö¸¦ Ŭ¶óÀ̾ðÆ®¿¡ Àü´ÞÇÏ´Â ±â´ÉÀÌ ¸ðµÎ Ŭ¶óÀ̾ðÆ®ÀÇ Ã¥ÀÓÀ¸·Î
µÇ¾î ÀÖ´Ù. Áï, polling ¹æ¹ýÀ» »ç¿ëÇÑ´Ù´Â °ÍÀº ´Ù¸¥ °´Ã¼ÀÇ »óÅ¿¡ ÀÇÁ¸ÇÏ°í ÀÖ´Â ¾î¶² °´Ã¼ÀÇ ºÎ´ãÀ» Å©°Ô ÇÏ´Â ¹æ¹ýÀÌ´Ù.
ÀÌ·± ÀÌÀ¯·Î Çؼ, polling ¹æ¹ýÀ» ÀÌ¿ëÇؼ ¾î´À Á¤µµ ¿øÈ°ÇÏ°Ô µ¹¾Æ°¡´Â äÆà ½Ã½ºÅÛÀ» µðÀÚÀÎÇϱâÀ§Çؼ´Â °í·ÁÇØÁÖ¾î¾ß ÇÒ
°ÍÀÌ ¾ÆÁÖ ¸¹¾ÆÁö°í ½Ã½ºÅÛÀº ±×¸¸Å º¹ÀâÇØ Áø´Ù. ¿¹¸¦ µé¾î, polling¹æ¹ýÀ» ÀÌ¿ëÇÏ¿© ±¸ÇöµÇ¾î ÀÖ´Â À§ÀÇ ¼Ò½º°¡ ¾î´À
Àß(?) µ¹¾Æ°¡°Ô ¸¸µé·Á¸é Àû¾îµµ ´ÙÀ½°ú °°Àº °ÍµéÀÌ °í·ÁµÇ¾î¾ß ÇÒ °ÍÀÌ´Ù.
- Ŭ¶óÀ̾ðÆ®ÀÇ polling ÇàÀ§ »çÀÌ¿¡ ¿©·¯ °³ÀÇ ¸Þ¼¼Áö°¡ µµÂøÇÒ ¼ö ÀÖ´Ù´Â °Í.
- ¼¼¸í ÀÌ»óÀÇ »ç¶÷ÀÌ Ã¤ÆÃÀ» ÇÒ °æ¿ì¿¡ °¢ ¸Þ¼¼Áö°¡ ÇØ´ç ±×·ìÀÇ ¸ðµç »ç¶÷¿¡°Ô Àü´ÞµÇ¾ú´ÂÁö¿¡ ´ëÇÑ Á¤º¸ °ü¸®°¡ ¼¹öÃø¿¡
ÇÊ¿äÇÏ´Ù´Â °Í.
- Ŭ¶óÀ̾ðÆ® Ãø¿¡¼´Â ¹Ù·Î Àü¿¡ ¾î¶² ¸Þ¼¼Áö±îÁö ¹Þ¾Ò´ÂÁö¿¡ ´ëÇÑ Á¤º¸ °ü¸®
- µîµî...
¾î¶²°¡? pollingÀ» ÀÌ¿ëÇؼ µðÀÚÀÎµÈ Ã¤Æà ½Ã½ºÅÛÀ» ±¸ÇöÇÒ ¼ö´Â ÀÖÁö¸¸, °á°úÀûÀ¸·Î ±«¹°(?)°ú °°Àº ½Ã½ºÅÛÀÌ
ź»ýÇÒ °ÍÀÌ ºÐ¸íÇÏ´Ù. ´ÙÀ½¿¡´Â äÆà ½Ã½ºÅÛÀ» Á» ´õ ´Ü¼øÇÏ°Ô µðÀÚÀÎ ÇÒ ¼ö ÀÖ°Ô ÇØ ÁÖ´Â Observer ÆÐÅÏ¿¡ ´ëÇؼ
¾Ë¾Æº¸°Ú´Ù. ¾Õ¿¡¼µµ À̾߱â ÇßµíÀÌ Observer ÆÐÅÏÀº callback ¹æ¹ýÀ» ÆÐÅÏÈ ½ÃŲ °ÍÀÌ´Ù.
5. Observer ÆÐÅÏ
¸ÕÀú ObserverÆÐÅÏÀÌ ¾î¶»°Ô »ý°å´ÂÁö º¸ÀÚ. ±×¸² 1Àº Grand[2]°¡ GoF Ã¥ÀÇ Observer ÆÐÅÏÀ» Á¶±Ý
¼öÁ¤ÇÑ °ÍÀÌ´Ù. °³ÀÎÀûÀ¸·Î´Â GoFÃ¥¿¡ ÀÖ´Â °Íº¸´Ù ´õ Àǹ̰¡ ºÐ¸íÇÑ °Í °°¾Æ¼ GrandÀÇ °ÍÀ» Observer ÆÐÅÏÀ¸·Î ¿©±â¿¡
¼Ò°³ÇÑ´Ù. ±×¸² 1À» º¸¸é Áö±Ý±îÁö ºÁ¿Ô´ø ´Ù¸¥ ¿©´ÀÀÇ ÆÐÅϵéó·³ ±× ±¸Á¶°¡ º¹ÀâÇÏÁö ¾Ê´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.
±×¸² 1. Observer ÆÐÅÏ
ÀÌ ÆÐÅÏÀÇ ÁÖ¿ä °´Ã¼´Â Observer¿Í ObservableÀÌ´Ù. Áö³ È£µé¿¡¼ ´©´©È÷ À̾߱âÇØ ¿ÔµíÀÌ ÀÌ µÎ °´Ã¼´Â ¼·ÎÀÇ
ÀÇÁ¸¼ºÀ» ÁÙÀ̱â À§Çؼ, ObserverIF¿Í ObservalbleIF¶ó´Â À̸§ÀÇ interfaceµéÀ» »çÀÌ¿¡ µÎ¾î
¼·ÎÀÇ °ü°è¸¦ ¸Î°í ÀÖ´Ù. Observer °´Ã¼°¡ Observable °´Ã¼¿¡°Ô Á¦°øÇÏ°í ÀÖ´Â ÀÎÅÍÆäÀ̽º·Î notify()°¡ ÀÖ°í,
Observable°´Ã¼°¡ Observer °´Ã¼¿¡°Ô Á¦°øÇÏ°í ÀÖ´Â ÀÎÅÍÆäÀ̽º·Î´Â addObserver()¿Í
removeObserver()°¡ ÀÖ´Ù. Observer°¡ ObservableÀÌ Á¦°øÇÏ°í ÀÖ´Â addObserver()
ÀÎÅÍÆäÀ̽º¸¦ ÅëÇؼ ÀÚ½ÅÀÌ °üÂûÇÏ°íÀÚ ÇÏ´Â °´Ã¼¿¡ »óź¯È½Ã¿¡ ¾Ë·Á´Þ¶ó´Â ¿äû(call)À» ÇÑ´Ù. ±×·¯¸é, Observable
°´Ã¼´Â ÀÚ½ÅÀÇ »óÅ º¯È°¡ »ý±æ¶§, Observer°¡ Á¦°øÇÑ notify() ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇؼ ¿äûÇÑ Observer¿¡°Ô ±×
»ç½ÇÀ» ¾Ë·ÁÁÖ´Â °ÍÀÌ´Ù(callback). Áï, callbackÀ» Ç¥ÇöÇÏ´Â µðÀÚÀÎ ÆÐÅÏÀÌ´Ù. ±×·¯³ª, ±×¸² 1¿¡ º¸¸é
ObserverÀÇ µî·Ï°ú notificationÀÇ ÀÏÀº Observable °´Ã¼°¡ ÇÏ°í ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó, Observable
°´Ã¼´Â ÀÌ ÀÏÀ» Muticaster¶ó´Â °´Ã¼¿¡ À§ÀÓ(delegation)ÇÏ°í ÀÖ´Ù. »ç½Ç Observable °´Ã¼°¡ ÇÒ ÀÏÀ» ´Ù¸¥
°´Ã¼¿¡ ±¸Áö À§ÀÓÇÒ Çʿ伺Àº ¾øÁö¸¸, ÀÌ·¸°Ô ÇÔÀ¸·Î½á ¾òÀ» ¼ö ÀÖ´Â ÀåÁ¡ÀÌ ÀÖ´Ù. ±× ÀåÁ¡Àº ObservableIF¸¦ ±¸ÇöÇÏ°í
ÀÖ´Â ¸ðµç Observable°´Ã¼µéÀÌ ±× Äڵ带 Àç»ç¿ëÇÒ ¼ö Àִٴµ¥ ÀÖ´Ù. Observable °´Ã¼¿¡ µî·ÏÇÑ
Observer°´Ã¼°¡ µÑ ÀÌ»óÀÎ °æ¿ì¿¡ À̵é Observer°´Ã¼µé¿¡°Ô Observable°´Ã¼°¡ ¸Þ½ÃÁö¸¦ º¸³»´Â ÇüÅ´Â
multicasting ÇüÅÂÀ̹ǷΠObservable °´Ã¼ÀÇ ÇÒ ÀÏÀ» À§ÀÓ¹ÞÀº °´Ã¼ÀÇ À̸§À» Multicater¶ó°í ÁöÀº °ÍÀÌ°í,
ÀÌ·± ÀÌÀ¯·Î ObserverÆÐÅÏÀº multicast callbackÀ» ÆÐÅÏÈ ÇÑ °ÍÀ̶ó°í À̾߱âµÇ¾î Áø´Ù.
±×·³ ÀÌ ÆÐÅÏÀ» ÀÌ¿ëÇϸé À§¿¡¼ ¿¹·Î µé¾î ¼³¸íÇØ ¿Ô´ø äÆà ½Ã½ºÅÛÀÌ ¾î¶»°Ô µðÀÚÀÎµÇ°í ±¸ÇöµÉ ¼ö ÀÖ´ÂÁö À̾߱âÇØ º¸°Ú´Ù.
¿ì¼± Observer ÆÐÅÏÀ» Àû¿ëÇÑ´Ù¸é °£´ÜÇÑ Ã¤ÆýýºÅÛÀ» ±×¸² 2¿Í °°Àº Ŭ·¡½º ´ÙÀ̾î±×·¥À¸·Î Ç¥ÇöÇÒ ¼ö ÀÖÀ»
°ÍÀÌ´Ù.
±×¸² 2. multicast callbackÀ» Àû¿ëÇÑ Ã¤ÆýýºÅÛÀÇ Å¬·¡½º ´ÙÀ̾î±×·¥
±×¸² 2ÀÇ Observer ÆÐÅÏÀ» »ç¿ëÇÑ µðÀÚÀÎÀ» º¸¸é pollingÀ» ½Ã½ºÅÛ µðÀÚÀο¡ Àû¿ëÇßÀ» °æ¿ì¿Í ºñ±³Çؼ ±× Â÷ÀÌ°¡
¸¹ÀÌ ³ªÅ¸³ª°í ÀÖ´Ù. pollingÀ» Àû¿ëÇßÀ» ¶§¿Í´Â ´Þ¸® callbackÀ» Àû¿ëÇÑ °æ¿ì¿¡´Â Ŭ¶óÀ̾ðÆ®´Â ¸Þ¼¼Áö ¼ö¿ë¿¡ ÀÖ¾î¼
¼öµ¿ÀûÀÌ µÈ´Ù. Áï, ¼¹ö¿¡ ÀÚ½ÅÀ» µî·Ï½ÃÄѳõÀº ÀÌÈÄ¿¡´Â ¼¹ö¿¡¼ »õ·Î¿î ¸Þ¼¼Áö¸¦ Àü´ÞÇØÁÙ ¶§, ±× ÇØ´ç ¸Þ¼¼Áö¸¦ Àü´Þ¹ÞÀ»»Ó,
¼¹ö¿¡ »õ·Î¿î ¸Þ¼¼Áö°¡ µµÂøµÇ¾î ÀÖ³ª È®ÀÎÇÏ´Â ÀÏ·ÃÀÇ ÀÛ¾÷À» ÇÏÁö ¾Ê°í ÀÖ´Ù. µû¶ó¼, Ŭ¶óÀ̾ðÆ®´Â ¼¹ö·ÎºÎÅÍÀÇ »õ·Î¿î ¸Þ¼¼Áö
µµÂø¿©ºÎ¿¡ »ó°ü¾øÀÌ ´Ù¸¥ ÀÏÀ» ÇÏ°í ÀÖ´Ù°¡ ¼¹ö·ÎºÎÅÍ »õ·Î¿î ¸Þ¼¼Áö°¡ µµÂøÇß´Ù´Â ¸Þ¼¼Áö notity(Message)¸¦
¹ÞÀ¸¸é ÀÌ¿¡ »óÀÀÇÏ´Â ÀÏÀ»ÇÏ¸é µÈ´Ù. °á°úÀûÀ¸·Î Observer ÆÐÅÏÀ¸·Î µðÀÚÀÎµÈ ½Ã½ºÅÛÀº ¸Þ½ÃÁö Àü´Þ¿¡ ´ëÇÑ Ã¥ÀÓÀÌ
Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍ ¼¹öÂÊÀ¸·Î ³Ñ¾î°¬À¸¸ç, pollingÀÇ °æ¿ì¿¡ ¹®Á¦°¡ µÇ¾ú´ø ¼¹ö·ÎºÎÅÍ ¹ÞÀº ¸Þ¼¼Áö ¸®½ºÆ® Á¤º¸¸¦ ÀÏÀÏÀÌ ÀúÀåÇÏ¿©
ºñ±³ÇÏ´Â ºÒÇÕ¸®ÇÑ Á¡µéÀÌ ¸ðµÎ »ç¶óÁö°Ô µÈ´Ù. °á°úÀûÀ¸·Î Observer ÆÐÅÏÀ» »ç¿ëÇÏ¸é ´Ù¸¥ °´Ã¼ÀÇ »óÅ¿¡ ´ëÇÑ ÀÇÁ¸¼ºÀ» °¡Áö´Â
°´Ã¼µéÀÇ ÇàÀ§¸¦ °£´ÜÇÏ°Ô µðÀÚÀÎÇÏ°í ±¸ÇöÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
±×¸² 2ó·³ µðÀÚÀÎµÈ Ã¤ÆýýºÅÛÀÇ °£´ÜÇÑ ±¸Çö ¼Ò½º´Â ´ÙÀ½°ú °°ÀÌ µÉ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
pubic interface ChatObserver {
pubic void
notify(Message msg);
}
public class ChatClientGet implements ChatObserver {
...
private Message msg_;
...
public void notify(Message msg) {
msg_ = msg;
}
...
}
public interface ChatObservable {
public void
addObserver(ChatObserver co);
public void
removeObserver(CharObserver co);
}
public class ChatServer implements ChatObservable
extends Thread {
...
private Multicaster mCaster_;
...
public ChatServer() {
...
mCaster_ = new Multicaster();
...
}
public void addObserver(ChatObserver co) {
mCaster_.addObserver(co);
}
public void removeObserver(ChatObserver co) {
mCaster_.removeObserver(co);
}
...
public void
run() {
while(true) {
// ¸Þ¼¼Áö µµÂø ¿©ºÎ¸¦
¸ð´ÏÅ͸µÇÑ´Ù.
// »õ·Î¿î ¸Þ¼¼Áö°¡
µµÂøÇϸé notify() ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù.
mCaster_.notify(msg);
}
}
}
public class Multicaster {
...
private ArraySet observers_ = new ArraySet();
...
public void addObserver(ChatObserver co) {
observers_.add(co);
}
public void removeObserver(ChatObserver co) {
observers_.remove(co);
}
...
public void
notify(Message msg) {
Iterator it =
new observers_.iterator();
while(it.hasNext()) {
((ChatObserver)it.next()).notify(msg);
}
}
...
}
ÀÌ ÆÐÅÏÀÇ ÀúÀÚµéÀÎ GoF µéÀÌ ÀÌ ÆÐÅÏ¿¡ ´ëÇؼ ¹àÈ÷°í ÀÖ´Â Àǵµ(intent)·Î Observer ÆÐÅÏ¿¡ ´ëÇÑ À̾߱⸦
ÁÙÀÌ°Ú´Ù.
Àǵµ(intent)
Define a one-to-many dependency between objects so that when one
object changes states, all its dependents are notified and updated
automatically.
°´Ã¼µé »çÀÌ¿¡ ÀÏ´ë´Ù ÀÇÁ¸¼ºÀ» ºÎ¿©ÇÒ ¶§ »ç¿ëµÉ ¼ö ÀÖ´Â ÆÐÅÏÀ¸·Î½á ÇϳªÀÇ °´Ã¼ »óÅ°¡ ¹Ù²î¸é ±× °´Ã¼¿¡ ÀÇÁ¸ÇÏ°í ÀÖ´Â
¸ðµç °´Ã¼°¡ ±× »ç½ÇÀ» Å뺸¹Þ°í ±×¿¡ ÇØ´çÇÏ´Â ÇàÀ§¸¦ ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.
6. °ü·Ã ÆÐÅÏ
ÀÌ ÆÐÅÏÀÇ ÀúÀÚµéÀÌ Observer ÆÐÅÏ°ú °ü·ÃÀÌ ÀÖ´Ù°í À̾߱âÇÑ ÆÐÅÏÀ¸·Î Mediator [1]ÆÐÅÏÀÌ ÀÖ´Ù. ±¸Ã¼ÀûÀ¸·Î
Mediator ÆÐÅÏÀÌ Observer ÆÐÅÏ°ú ¹«¾ùÀÌ ºñ½ÁÇϸç Â÷ÀÌÁ¡Àº ¹«¾ùÀÎÁö ¾Ë¾Æº¸´Â °Íµµ Àç¹ÌÀÖÀ» °Í °°´Ù. Ưº°È÷ Èï¹Ì·Î¿î
°ÍÀÌ ¹ß°ßµÇÁö ¾ÊÀ¸¸é ´ÙÀ½¿¡´Â Mediator ÆÐÅÏ¿¡ ´ëÇؼ À̾߱⸦ ÇØ º¼±î ÇÑ´Ù.
7. ¸ÎÀ½¸»
ÀÌ ¹øÈ£¿¡ ¼Ò°³ÇÑ ObserverÆÐÅÏÀº multicast callbackÀ» ÆÐÅÏÈ ÇÑ °ÍÀ¸·Î °æÇèÀÌ ¾î´À Á¤µµ ÀÖ´Â ½Ã½ºÅÛ
µðÀÚÀÌ³Ê¿Í ÇÁ·Î±×·¡¸ÓµéÀº ÀÍÈ÷ Àß ¾Ë°í ÀÖ´Â ³»¿ëÀ̾úÀ» °ÍÀ¸·Î »ý°¢µÈ´Ù. ¹Ù²Ù¾î À̾߱âÇϸé, Observer ÆÐÅÏÀº ¾î¶² ½Ã½ºÅÛÀ»
µðÀÚÀÎ ÇÒ ¶§ ¾ÆÁÖ À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼öÀÖ´Â ÆÐÅÏ Áß¿¡ ÇϳªÀÌ´Ù. ¹¹, »ç½Ç º° ¾î·Á¿î ³»¿ëÀÌ ¾Æ´ÏÁö¸¸, ÀÌ·± ÀÛÀº °ÍµéÀÌ ¸ð¿©¼
Àüü ÄÄÇ»ÅÍ ½Ã½ºÅÛÀ» °ß°íÇÏ°í ½Ç¿ëÀûÀÌ°í È®Àå¿¡ Æí¸®ÇÏ°í ¾Æ¸§´ä°Ô(?) ¸¸µå´Â °ÍÀÌ ¾Æ´Ò±î »ý°¢ÇØ º»´Ù.
¾ó¸¶Àü¿¡ ¾î´À µ¶ÀÚ°¡ ÀÚ½ÅÀÌ °ü½ÉÀ» µÎ°í ÀÖ´Â XML ºÐ¾ß¿¡ ÀÚÁÖ ³ªÅ¸³ª´Â ³»¿ëÀ» ÆÐÅÏÀ¸·Î Á¤¸®ÇÏ°í ½ÍÀºµ¥, ¾î¶»°Ô
ÇϸéµÇ´À³Ä°í ÇÊÀÚ¿¡°Ô Áú¹®À» ÇÑ ÀûÀÌ ÀÖ´Ù. ±× ºÐ¿¡°Ô ´äÇϱ⸦ Gerard Meszaros °ú Jim DobleÀÇ
"A
Pattern Language for Pattern Writing"À» Àо´Â °ÍÀÌ ÁÁÀ» °Í °°´Ù°í Çߴµ¥, Áö±Ý ÀÌ ±ÛÀ»
ÁغñÇÏ¸é¼ »ý°¢Çغ¸´Ï, ¹Ù·Î Observer ÆÐÅÏÀ» Àо´Â °ÍÀÌ ´õ ÁÁÀº °Í °°´Ù´Â »ý°¢ÀÌ µç´Ù. ¿Ö³ÄÇϸé, ÀϹÝÀûÀ¸·Î ¸¹ÀÌ
»ç¿ëµÇ°í ÀÖ´Â callbackÀ» ÆÐÅÏÈ ½ÃŲ°ÍÀ̹ǷΠÆÐÅÏ ±Û¾²±â¸¦ ÀÌÇØÇϴµ¥ ´õ ½±°Ô Á¢±ÙÇÒ ¼ö ÀÖÀ» °Å¶õ
»ý°¢¿¡¼ÀÌ´Ù.
Âü°í ¹®Çå
[1] Erich Gamma, Richard Helm, Ralph Johnson, John
Vlissides,
Design Patterns, Elements of
Resuable Object-Oriented
Software, Addison-Wesley, 1995
[2] Mark Grand, Patterns in Java, volume 1, Wiley, 1998
[3] Nigel Warren, Philip Bishop, Java in Practice, Design Styles
and
Idioms for Effective
Java, Addison-Wesley, 1999
(±Û Èıâ )
PLoP 2000 ÄÁÆÛ·±½º¿¡ Á¦ÃâÇß´ø Á¦ ³í¹®À» °ø°³ÇÑ´Ù Çϸ鼵µ °è¼Ó ´ÊÀåÀ» ºÎ·È´Âµ¥.. ¿ì¼± Á˼ÛÇÏ´Ù´Â ¸»¾¸À» µå¸³´Ï´Ù.
»ç½Ç ¾ÆÁ÷ ÇѱÛÈ ÀÛ¾÷Àº ÇÏÁö ¸øÇß½À´Ï´Ù. ÀÌ ±ÛÀ» ¾²±â ¹Ù·Î Àü³¯±îÁöµµ Á¦ ³í¹®¿¡ ´ëÇÑ ¼öÁ¤ÀÌ ÀÖ¾ú±â ¶§¹®ÀÔ´Ï´Ù. ±× ÀÌÀ¯´Â
±â»Ú°Ôµµ Á¦ ³í¹®ÀÌ Ã¤ÅÃÀ̵Ǽ final conference copy¸¦ À§ÇÑ ¸¶Áö¸· ¼öÁ¤ ÀÛ¾÷ÀÌ ÀÖ¾ú°Åµç¿ä ±×·¯³ª ´õ ÀÌ»ó ¹Ì·ê
¼ö ¾ø´Ù´Â »ý°¢¿¡¼ ÇѱÛÈµÈ ³í¹®Àº ´ÙÀ½ÀÇ ±âȸ·Î ¹Ì·ç°í, ¿ì¼±Àº ¿µ¹®
³í¹®À» ±×´ë·Î ÀÌ ¹øÈ£ÀÇ °´Ã¼ÁöÇâ´º½º·¹ÅÍ¿¡ °ø°³ÇÕ´Ï´Ù. °ü½ÉÀÖÀ¸½Å ºÐµéÀº ¸¹ÀÌ ÀÐ¾î º¸½Ã°í¿ä, ¸¹Àº
commentºÎŹµå¸³´Ï´Ù. ^(^