ÀÚ¹Ù RMI (Remote Method Invovation) »ç¿ëÇϱ⠼â±Ù <chang@webdox.co.kr> 2001³â 3¿ù 7ÀÏ °³¿ä ºÐ»ê½Ã½ºÅÛ ÀÌ·¯ÇÑ ½Ã½ºÅÛ¿¡¼ Áß¿äÇÑ °ÍÀº ¹Ù·Î ½Ã½ºÅÛ¿¡ ¼Ò¼ÓµÇ¾î ÀÖ´Â ÄÄÇ»ÅÍ °£ÀÇ Åë½ÅÀÌ´Ù. ´õ¿í ÀÚ¼¼ÇÏ°Ô ¸»ÇÏ¸é °¢ ÄÄÇ»ÅÍ¿¡¼ ½ÇÇàµÇ°í ÀÖ´Â ÇÁ·Î±×·¥, ¶Ç´Â ÇÁ·Î¼¼½ºµéÀÌ ¼·Î Åë½ÅÀÌ °¡´ÉÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥ »çÀÌÀÇ Åë½ÅÀ» °¡´ÉÇÏ°Ô ÇÏ´Â °Í Áß ÇöÀç UNIX¿¡¼ °¡Àå ¸¹ÀÌ »ç¿ëµÇ°í ÀÖ´Â Åë½Å ÇÁ·ÎÅäÄÝÀÌ ¹Ù·Î RPC (Remote Procedure Call)ÀÌ´Ù. RPC´Â ³×Æ®¿öÅ©¿¡ ¿¬°áµÇ¾î ÀÖ´Â ´Ù¸¥ ÄÄÇ»ÅÍ¿¡ Á¸ÀçÇÏ´Â ÇÔ¼ö¸¦ »ç¿ëÀÚ°¡ ´«Ä¡Ã¤Áö ¸øÇϵµ·Ï ½ÇÇàÇØ ÁÜÀ¸·Î½á ºÐ»ê½Ã½ºÅÛÀÇ ±¸ÇöÀ» °¡´ÉÇÏ°Ô Çß´Ù. ±×·¯³ª, RPC´Â °´Ã¼ÁöÇâ °³¹ß°³³äÀ» ±¸ÇöÇÏÁö´Â ¾ÊÀ¸¸ç ´ÜÁö ´Ù¸¥ ÄÄÇ»ÅÍ¿¡ ÀúÀåµÇ¾î ÀÖ´Â ¼øóÀûÀÎ ¾ð¾î·Î °³¹ßµÈ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÇÔ¼ö¸¦ ºÎ¸¦ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â ¿ªÇÒÀ» ÇÒ µû¸§ÀÌ´Ù. RMI (Remote Method Invocation) ¶õ? ¿Ö RMI¸¦ »ç¿ëÇϴ°¡? Áö±ÝºÎÅÍ ÀÚ¹Ù RMIÀÇ ±âº»ÀûÀÎ »ç¿ë ¹æ¹ýÀ» ¿¹Á¦¸¦ ÅëÇÏ¿© »ìÆ캸°í ´õ ÀÌ»ó ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö¿¡ ±¸¾Ö¹ÞÁö ¾Ê´Â ´õ¿í °·ÂÇÏ°í ¼¼·ÃµÈ °³¹ßÀÚ°¡ µÇ¾îº¸µµ·Ï ÇÏÀÚ. ƯÈ÷ ÀÚ¹Ù RMI´Â EJBÀÇ Åë½Å ÁßÃßÀ̹ǷΠRMI¸¦ ÀÌÇØÇÏ°í ÀÖÀ¸¸é EJB¸¦ °øºÎÇϴµ¥µµ ´õ¿í ¼ö¿ùÇÏ´Ù. ÇöÀç EJB¸¦ °øºÎÇÏ°í Àְųª ³ªÁß¿¡ ¹è¿ì±â¸¦ ¿øÇÏ´Â µ¶Àڵ鿡°Õ RMIÀÇ ±âº» °³³äÀÇ ÀÌÇØ´Â ÇʼöÀûÀ̶ó ÇÏ°Ú´Ù. RMI¿¡ °üÇؼ ±×·¸´Ù¸é µµ´ëü RMI¿¡¼ ¾î¶»°Ô ÇÑ °´Ã¼°¡ ´Ù¸¥ ÄÄÇ»ÅÍ¿¡ Á¸ÀçÇÏ´Â °´Ã¼¿¡°Ô ¸Þ¼¼Áö¸¦ Àü¼ÛÇÒ ¼ö ÀÖÀ»±î? °¡Àå ±âº»ÀûÀÎ ¹®Á¦´Â ±× °´Ã¼°¡ ´Ù¸¥ °´Ã¼ÀÇ Á¸À縦 ¾Ë¾Æ¾ß Çϸç, ±× °´Ã¼¿¡°Ô ¸Þ¼¼Áö¸¦ Àü¼ÛÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æ¾ß ÇÏ°í, ±×¸®°í ¸¶Áö¸·À¸·Î ±× °´Ã¼·ÎºÎÅÍ ¸Þ¼¼ÁöÀÇ ´äº¯À» ¹Þ¾Æ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ÀÌ °úÁ¤¿¡¼ ¼ö¹ÝµÇ´Â ¹®Á¦´Â ¸Þ¼¼Áö¸¦ Àü¼ÛÇÏ°í ´äº¯À» ¹ÞÀ»¶§ ¾î¶°ÇÑ Á¾·ùÀÇ µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ¾Æ¾ß Çϴ°¡ÀÌ´Ù. RMI´Â À§¿¡ ³ª¿µÈ ¹®Á¦¸¦ µÎ °¡ÁöÀÇ ¹æ¹ýÀ¸·Î ÇØ°áÇÑ´Ù. ù°°¡ ½ºÅÓ(stub)ÀÌ¸ç µÑ°°¡ parameter marshalling ÀÌ´Ù. ½ºÅÓ(stub) °ú Parameter Marshalling ½ºÅÓÀÌ ÇÏ´Â Áß¿äÇÑ ÀÏÀº µÎ °¡Áö°¡ ÀÖ´Ù. ù°´Â ´ç¿¬È÷ ¼¹ö¿¡ Á¸ÀçÇÏ´Â ¸Þ½îµå¸¦ ºÒ·¯Áà¾ß ÇÏ°í µÑ°´Â ±× ¸Þ½îµåÀÇ ÀÎÀÚ¸¦ ÀÏÁ¤ÇÑ Æ÷¸ËÀ¸·Î ¹Ù²ãÁÖ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô ÀÎÀÚ¸¦ ÀÏÁ¤ÇÑ Æ÷¸ËÀ¸·Î ¹Ù²ãÁÖ´Â ÀÏÀ» parameter marshalling À̶ó°í ÇÑ´Ù. Áï, ÀÎÀÚ¸¦ Á¶À²ÇÏ°í Á¤¸®ÇÏ´Â ¿ªÇÒÀ» ÇÏ´Â °ÍÀÌ´Ù. ¿Ö ÀÌ·± parameter marshalling ÀÌ ÇÊ¿äÇÑ °ÍÀϱî? ÄÄÇ»ÅÍ°³·ÐÀ» °øºÎÇØ º» µ¶ÀÚµéÀº ¾Ë°ÚÁö¸¸ ¸ðµç ÄÄÇ»ÅͽýºÅÛ¿¡¼ µ¥ÀÌÅÍ Ç¥Çö¹æ¹ýÀÌ ¾à°£¾¿ ´Ù¸£´Ù´Â °ÍÀ» ¾Ë °ÍÀÌ´Ù. ¿¹¸¦ µé¾î ¾î¶² ½Ã½ºÅÛÀº big-endianÀ¸·Î Ç¥ÇöÇÏ°í ¾î¶² ½Ã½ºÅÛÀº little-endianÀ¸·Î Ç¥½ÃÇÑ´Ù. Á¤¼ö°¡ Â÷ÁöÇÏ´Â ¸Þ¸ð¸®ÀÇ ¾çµµ ´Ù¸¦ ¼ö ÀÖ´Ù. ÀÚ¹Ù´Â Ç÷§Æû°ú´Â µ¶¸³ÀûÀ¸·Î ÀÛµ¿ÇÏ´Â ¾ð¾îÀÌ´Ù. ¸¸¾à ÇÑ °´Ã¼°¡ À©µµ¿ì ½Ã½ºÅÛ¿¡¼ ÀÛµ¿ÇÏ°í ´Ù¸¥ °´Ã¼´Â À¯´Ð½º ȯ°æ¿¡¼ ÀÛµ¿ÇÏ°í ÀÖ´Ù¸é ÀÌ·¯ÇÑ µ¥ÀÌÅÍÀÇ ±¸Çö ¹æ¹ýÀ» ÅëÀÏÇØ ÁÙ ÇÊ¿ä°¡ ÀÖ´Ù. ƯÈ÷ ¾²¸®Æ¼¾î½Ã½ºÅÛ(three-tier system)ÀÇ °æ¿ì µ¥ÀÌÅͺ£À̽º ¼¹ö, ¾ÖÇø®ÄÉÀÌ¼Ç ¼¹ö, ±×¸®°í Ŭ¶óÀ̾ðÆ®°¡ ÀÏÀÏÈ÷ ´Ù¸¥ Ç÷§ÆûÀ¸·Î ±¸ÇöµÉ ¼öµµ ÀÖÀ¸¹Ç·Î µ¥ÀÌÅÍÀÇ ±¸Çö¹æ¹ýÀ» ÀÏ°üÀûÀ¸·Î Ç¥ÇöÇÏ´Â ÀÏÀº ¾ÆÁÖ Áß¿äÇÏ´Ù. ±× ÀÏÀÌ ¹Ù·Î paramter marshalling ÀÌ´Ù. Parameter marshalling ÀÌ ³¡³µÀ¸¸é ½ºÅÓÀº ¼¹ö¿¡ Á¸ÀçÇÏ´Â °´Ã¼ÀÇ ¸Þ½îµå¸¦ ºÎ¸£°Ô µÈ´Ù. À̶§ ½ºÅÓÀÌ ¼¹ö¿¡ º¸³»´Â Á¤º¸´Â ¼¹ö °´Ã¼ÀÇ ¾ÆÀ̵ð, ½ÇÇàÇؾßÇÒ ¸Þ½îµå, ±×¸®°í º¯È¯µÈ ÀÎÀÚÀÌ´Ù. Ŭ¶óÀ̾ðÆ® ÂÊ¿¡¼ ½ºÅÓÀÌ ´ë¸®ÀÎÀÇ ¿ªÇÒÀ» ÇÏµí ¼¹öÂÊ¿¡¼µµ ÀÌ·¯ÇÑ ´ë¸®ÀÎÀÇ ¿ªÇÒÀ» ÇÏ´Â Á¸Àç°¡ Àִµ¥ ¼ö½ÅÀÚ(receiver) ¶Ç´Â ½ºÄÌ·¹Åæ(skeleton, ÁÖ: ÇØ°ñ ¶Ç´Â °ñ°ÝÀ̶ó°í ºÎ¸£±â¿£ Á» ³Ê¹«ÇÏ´Ù´Â »ý°¢ÀÌ µé¾ú´Ù.) À̶ó°íµµ ÇÑ´Ù. ¼ö½ÅÀÚ°¡ ÇÏ´Â ¿ªÇÒÀº ½ºÅÓÀÇ ¹Ý´ë¶ó°í »ý°¢ÇÏ¸é µÈ´Ù. Á¶À²µÈ ÀÎÀÚµéÀ» ´Ù½Ã ±× ¼¹ö¿¡ ¸Â´Â ÇüÅ·Π¹Ù²ãÁØ µÚ ½ºÅÓÀÌ º¸³½ ¾ÆÀ̵ðÀÇ °´Ã¼°¡ °®°í ÀÖ´Â ¾Ë¸Â´Â ¸Þ½îµå¸¦ ½ÇÇà½ÃŲ´Ù. ±×¸®°í ½ÇÇàÀÌ ³¡³µÀ¸¸é °á°ú¸¦ ´Ù½Ã parameter marshalling À» ÅëÇÏ¿© º¯È¯ÇÑ µÚ, ´Ù½Ã ½ºÅÓ¿¡°Ô º¸³»ÁØ´Ù. ½ºÅÓÀº ÀÌ °á°ú¸¦ ¹Þ¾Æ¼ ´Ù½Ã ½Ã½ºÅÛ¿¡ ¸Â°Ô º¯È¯½ÃŲ µÚ, ¿ø·¡ ¸Þ½îµå¸¦ ºÒ·¶´ø °´Ã¼¿¡°Ô °á°ú¸¦ ³Ñ°ÜÁØ´Ù. ¹°·Ð °á°ú°¡ ¿¹¿ÜÀÏ ¼öµµ ÀÖ´Ù. µ¿Àû Ŭ·¡½º ·Îµù (Dynamic Class Loading) Computer remote_comp = new Computer(); ¹®Á¦´Â ¿©±â¼ getType() ¸Þ½îµå¸¦ ºÒ·¶À» ¶§ µ¹¾Æ¿À´Â °ªÀÌ ¾î¶² ¼ýÀÚ³ª ¹®ÀÚ°¡ ¾Æ´Ï¶ó ¼¹ö¿¡ Á¸ÀçÇÏ´Â °´Ã¼¶ó´Â °ÍÀÌ´Ù. ±×¸®°í Ŭ¶óÀ̾ðÆ®´Â ÀÌ »õ·Î¿î ¿ø°Ý°´Ã¼ÀÇ someMethod()¶ó´Â ¸Þ½îµå¸¦ ºÒ·¯ÁÖ°í ÀÖ´Ù. ¹°·Ð Ŭ¶óÀ̾ðÆ®´Â ÇÔ¼ö°ªÀ¸·Î µ¹¾Æ¿À´Â °´Ã¼°¡ ComputerTypeÀ̶ó´Â °´Ã¼¶ó´Â °ÍÀº ¾ËÁö¸¸ ½ÇÁ¦·Î µ¹¾Æ¿À´Â °´Ã¼´Â ComputerTypeÀÇ ¼ºêŬ·¡½ºÀÏ ¼öµµ ÀÖ´Ù. °Ô´Ù°¡ ÀÌ »õ·Î¿î °´Ã¼°¡ ¼¹ö¿¡ Á¤ÀǵŠÀÖ´Â »õ·Î¿î ¿¹¿Ü°´Ã¼¸¦ ÇÊ¿ä·Î ÇÒ ¼öµµ ÀÖ´Ù. ¹°·Ð ÀÌ »õ·Î¿î °´Ã¼ÀÇ someMethod()¶ó´Â ¸Þ½îµå¸¦ ºÎ¸£·Á¸é Ŭ¶óÀ̾ðÆ®°¡ ÀÌ »õ·Î¿î °´Ã¼¿¡ ´ëÇؼ ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ Å¬¶óÀ̾ðÆ®¿¡ ÀÌ °´Ã¼¸¦ Á¤ÀÇÇØÁÖ°í ÀúÀåÇÏ´Â ¹æ¹ýµµ ÀÖ°í ¼¹ö¿Í µ¿½Ã¿¡ ÀÏÀÏÈ÷ Ŭ¶óÀ̾ðÆ®¸¦ ¾÷µ¥ÀÌÆ® ÇØÁÖ´Â °Íµµ ¹æ¹ýÀÌ°ÚÁö¸¸ »õ·Î¿î Á¾·ùÀÇ ComputerTypeÀ» ¼¹ö¿¡ Á¤ÀÇÇÒ ¶§¸¶´Ù ÀÏÀÏÀÌ Å¬¶óÀ̾ðÆ®¸¦ ¾÷µ¥ÀÌÆ® ÇÒ ¼ö´Â ¾ø´Ù. ±×·¡¼ ÇÊ¿äÇÑ °ÍÀÌ ¹Ù·Î µ¿Àû Ŭ·¡½º ·ÎµùÀÌ´Ù. µ¿Àû Ŭ·¡½º ·ÎµùÀº ÀÌ·¸°Ô Ŭ¶óÀ̾ðÆ®°¡ ¾ËÁö ¸øÇÏ´Â °´Ã¼°¡ ÇÊ¿äÇÒ °æ¿ì ¼¹ö¿¡¼ ±×¶§ ±×¶§ ÇÊ¿äÇÒ ¶§¸¶´Ù Ŭ¶óÀ̾ðÆ®·Î ±× ÇÊ¿äÇÑ °´Ã¼ÀÇ ½ºÅÓŬ·¡½º¸¦ ºÒ·¯¿À´Â °ÍÀ» ¸»ÇÑ´Ù. ÀÚ¹ÙÀÇ ¾ÖÇø´°ú ºñ½ÁÇÑ °³³äÀ̶ó°í »ý°¢ÇÏ¸é µÇ°Ú´Ù. À§ÀÇ ¿¹Á¦ÀÇ °æ¿ì ÀÚµ¿À¸·Î ComputerTypeÀÇ ¼ºêŬ·¡½ºÀÇ ½ºÅÓŬ·¡½º°¡ Ŭ¶óÀ̾ðÆ®·Î ·ÎµùµÇ¾î someMethod()¸¦ ºÎ¸£´Â°ÍÀ» °¡´ÉÄÉ ÇÑ´Ù. ÇÏÁö¸¸ ÀÌ·¸°Ô ´Ù¸¥ ÄÄÇ»ÅÍ¿¡¼ ³×Æ®¿öÅ©¸¦ ÅëÇÏ¿© ½ºÅÓŬ·¡½º¸¦ ºÒ·¯¿Ã °æ¿ì º¸¾ÈÀÇ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¹Ç·Î ½ÇÁ¦·Î ÀÌ·¯ÇÑ ½Ã½ºÅÛÀ» °¡µ¿½Ãų ¶© ²À º¸¾È¿¡ ½Å°æÀ» ½á¼ ÀÚ¹Ù º¸¾È ¸Å´ÏÀú (Java Security Manager)µîÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. ÀÚ¹Ù RMI ÇÁ·Î±×·¡¹Ö ¼¹ö ÂÊ ÇÁ·Î±×·¡¹Ö interface Seat extends Remote ¿©±â¼ ÁÖÀÇÇØ¾ß ÇÒ °ÍÀº ¸ðµç ¿ø°Ý ÀÎÅÍÆäÀ̽º´Â Remote Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿©¾ß ÇÏ°í ¿ø°ÝÀûÀ¸·Î °ø°³µÇ´Â ¸Þ½îµå´Â ¸ðµÎ RemoteException ¿¹¿ÜŬ·¡½º¸¦ ´øÁ®¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ÀÌ ÀÎÅÍÆäÀ̽º¸¦ ÇϳªÀÇ ÀÚ¹ÙÆÄÀÏ·Î ¸¸µé¾î¼ ¼¹ö¿Í Ŭ¶óÀ̾ðÆ® ¾çÂÊ¿¡ ÀúÀåÇÏ¸é µÇ°Ú´Ù. ÀÌ·¸°Ô ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇßÀ¸¸é ´ÙÀ½¿£ ½ÇÁ¦ °´Ã¼¸¦ ±¸ÇöÇØ¾ß ÇÑ´Ù. ¿©±â¼± ´Ù¸¥ ¸Þ½îµå´Â ¹èÁ¦ÇÏ°í isReserved() ¸Þ½îµå¸¸ ±¸ÇöÇØ º¸±â·Î ÇÏ°Ú´Ù. import java.rmi.Naming; public class SeatImpl extends UnicastRemoteObject implements
Seat String query = "SELECT reserved FROM seats WHERE plane = ? AND seat_no = ?"; PreparedStatement ps = connection.prepareStatement(query); ResultSet rs = ps.executeQuery(); boolean reserved = rs.getBoolean("reserved"); return(reserved); public static void main(String args[]) { ¿©±â¼ ÁÖÀÇÇØ¾ß ÇÒ °ÍÀº ¹Ù·Î ¼¹ö°´Ã¼°¡ UnicastRemoteObject Ŭ·¡½º¸¦ »ó¼ÓÇÑ´Ù´Â °ÍÀÌ´Ù. ÀÌ Å¬·¡½º°¡ ¹Ù·Î ¼¹ö°´Ã¼¸¦ ¿ø°Ý°´Ã¼·Î ¸¸µé¾îÁִ Ŭ·¡½º°¡ µÇ°Ú´Ù. UnicastRemoteObject ¸¦ »ç¿ëÇÏ¸é ²À ¼¹ö°´Ã¼°¡ TCP/IP·Î Á¢±ÙÀÌ °¡´ÉÇÏ¿©¾ß ÇÑ´Ù. ±× À§¿¡ Á¤ÀÇÇß´ø Seat À̶ó´Â ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â °Íµµ ÀØÁö ¸»ÀÚ. ´ÙÀ½À¸·Î ÇØ¾ß ÇÒ °ÍÀÌ °´Ã¼ÀÇ À̸§À» RMI Registry¿¡ µî·ÏÇÏ´Â °ÍÀÌ´Ù. JNDI (Java Naming and Directory Interface)ÀÇ ÀÏȯÀ̱⵵ Çѵ¥ Ŭ¶óÀ̾ðÆ®¿¡ ÀÖ´Â °´Ã¼¿¡°Ô ¼¹ö°´Ã¼ÀÇ Á¸À縦 ¾Ë·ÁÁÖ´Â ¿ªÇÒÀ» ÇÑ´Ù. Áï, ¼¹ö°´Ã¼¸¦ ¾î¶°ÇÑ À̸§ÇÏ¿¡ µî·ÏÇÏ¿© Ŭ¶óÀ̾ðÆ®ÀÇ °´Ã¼°¡ ±× À̸§À¸·Î ¿ø°Ý°´Ã¼¸¦ ãÀ» ¼ö ÀÖµµ·Ï ÇØÁÖ´Â °ÍÀ» ¸»ÇÑ´Ù. Ŭ¶óÀ̾ðÆ®´Â ÀÌ À̸§À¸·Î ¼¹ö°´Ã¼¸¦ ãÀ¸¸ç ã¾ÒÀ» °æ¿ì ±× À̸§¿¡ ÇØ´çÇÏ´Â ¼¹ö°´Ã¼ÀÇ ½ºÅÓŬ·¡½º°¡ Ŭ¶óÀ̾ðÆ®·Î Àü¼ÛµÇ¾î ¼¹ö°´Ã¼ÀÇ ¸Þ½îµå¸¦ ºÎ¸£´Â °ÍÀ» °¡´ÉÄÉ ÇÑ´Ù. ƯÈ÷ JNDI´Â EJB¿¡¼µµ »ç¿ëµÇ¹Ç·Î °³³äÀ» ÀÌÇØÇصθé EJB¸¦ °øºÎÇϱ⵵ ÆíÇÏ´Ù. À§ÀÇ ¿¹Á¦¸¦ º¸¸é seatÀ̶ó´Â À̸§ Çϳª¸¸ µî·ÏÇÑ °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ½ÇÁ¦·Î ºñÇà±â Á¼® ¿¹¾à ½Ã½ºÅÛÀ» ¸¸µç´Ù°í ÇÏÀÚ. SeatImpl À̶ó´Â ¼¹ö°´Ã¼°¡ ¸¸¾à¿¡ Á¼® ÇϳªÇϳª¸¦ ±¸ÇöÇÑ´Ù°í ÇÏ¸é ±× Á¼® ÇϳªÇϳª¸¦ ´Ù µî·ÏÇÒ ¼ö´Â ¾ø´Â ÀÏÀÌ´Ù. ¿Ö³ÄÇϸé ÀÌ À̸§Àº Ŭ¶óÀ̾ðÆ®¿¡°Ô ¼¹ö°´Ã¼ÀÇ Á¸À縦 ¾Ë°Ô ÇØÁÖ´Â °ÍÀ̹ǷΠŬ¶óÀ̾ðÆ®°¡ ¾î¶°ÇÑ ¸Þ½îµå¸¦ ºÎ¸£±â Àü¿¡ ¹ú½á µî·ÏÀÌ µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. ÇÏÁö¸¸ ¿©±â¼ Naming.bind() ¸Þ½îµåÀÇ ÀÎÀÚ Áß Çϳª°¡ ¹Ù·Î SeatImpl °´Ã¼ÀÌ´Ù. ±×·¸´Ù¸é Á¼® ÇϳªÇϳªÀÇ °´Ã¼¸¦ ´Ù »ý¼ºÇؼ ±× À̸§µéÀ» µû·Î µî·ÏÇØ¾ß ÇÑ´Ù´Â ¿¹±â°¡ µÈ´Ù. ƯÈ÷ Á¼®ÀÇ µ¥ÀÌÅÍ°¡ µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåµÇ¾î ÀÖÀ» °æ¿ì ±×°ÍÀ» ÀÏÀÏÈ÷ µ¿ÀûÀ¸·Î ºÒ·¯¿Í¾ß Çϴµ¥ ±×·¸´Ù¸é Ŭ¶óÀ̾ðÆ®°¡ ¸Þ½îµå¸¦ ºÎ¸£±â Àü¿¡ ±× À̸§À» µî·ÏÇÑ´Ù´Â °ÍÀº ºÒ°¡´ÉÇÏ´Ù. ÀÌ°ÍÀº »ó´çÈ÷ ºñÈ¿À²ÀûÀÎ °³¹ß¹æ¹ýÀÌ´Ù. ¿©±â¼± SeatImpl °´Ã¼°¡ ÇÑ ºñÇà±âÀÇ ¸ðµç Á¼®À» ±¸ÇöÇÏ°Ô °³¹ßÇÏ´Â °ÍÀÌ ´õ¿í È¿À²ÀûÀ̸ç RMI Registryµµ ´õ °£´ÜÇØ Áø´Ù. seat À̶ó´Â À̸§À» ÅëÇÏ¿© Ŭ¶óÀ̾ðÆ®¿¡°Ô ¼¹ö°´Ã¼ÀÇ Á¸À縦 ¾Ë·ÁÁÖ°í SeatImpl À̶ó´Â ¼¹ö°´Ã¼°¡ µû·Î °¢ Á¼®ÀÇ µ¥ÀÌÅ͸¦ µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ ºÒ·¯¿À´Â °ÍÀÌ ´õ È¿À²ÀûÀÎ °ÍÀÌ´Ù. °Ô´Ù°¡ RMI Registry´Â ¸ðµç °´Ã¼µéÀÌ °øÀ¯ÇÏ´Â ¼ºñ½ºÀ̹ǷΠÇÑ ÇÁ·Î±×·¥ÀÌ ´Ù µ¶Â÷ÁöÇؼµµ ¾ÈµÈ´Ù. Ŭ¶óÀ̾ðÆ®ÂÊ ÇÁ·Î±×·¡¹Ö import java.rmi.Naming; public class Reservation public boolean isReserved(int seat_numer) throws Exception { boolean result; try { // ¿ø°Ý°´Ã¼¸¦ ã´Âµ¥ ¼º°øÇßÀ¸¸é ¸Þ½îµå¸¦ ºÎ¸£ÀÚ return result; ¸ÕÀú Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ±â ½ÃÀÛµÉ ¶§ ÀÚ¹Ù º¸¾È¸Å´ÏÀú¸¦ ²À ½ÇÇà½ÃÅ°µµ·Ï ÇÏÀÚ. ¸¸¾à Ŭ¶óÀ̾ðÆ®°¡ ÀÚ¹Ù ¾ÖÇø´ÀÏ °æ¿ì¿£ ÀÚµ¿À¸·Î º¸¾ÈÀÌ ½ÇÇàµÇ¹Ç·Î »ó°ü¾øÁö¸¸ ÀÚ¹Ù ¾ÖÇø®ÄÉÀ̼ÇÀ̶ó¸é ²À ½ÇÇà½ÃÄÑÁÖµµ·Ï ÇÑ´Ù. ±×¸®°í ¼¹ö°´Ã¼ÀÇ À̸§À» ãÀ»¶§ URLÀ» »ç¿ëÇϴ°ÍÀ» ±â¾ïÇϵµ·Ï ÇÏÀÚ. "rmi://¼¹öÀ̸§/µî·ÏµÈ °´Ã¼À̸" ÀÇ Çü½ÄÀÌ¸é µÇ°Ú´Ù. ±×¸®°í ¿¹¿ÜŬ·¡½º´Â ²À ó¸®Çϵµ·Ï ÇؾßÇÑ´Ù. RMI°¡ ³×Æ®¿öÅ©¸¦ ÅëÇؼ ÀÌ·ç¾îÁö¹Ç·Î ¾î¶°ÇÑ ¿¡·¯°¡ ¹ß»ýÇÒÁö ¸ð¸£±â ¶§¹®ÀÌ´Ù. RMIÀÇ ½ÇÇà ¼¹ö 2. rmic ¸¦ ÀÌ¿ëÇÏ¿© ½ºÅÓŬ·¡½º »ý¼º 3. rmiregistry ½ÇÇà 4. ¼¹ö ÇÁ·Î±×·¥ ½ÇÇà À§¿¡ ³ª¿ÇÑ °Í°ú °°ÀÌ ½ÇÇàÇϸé RMI¸¦ »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ÀÏ´Ü ÀÎÅÍÆäÀ̽º¿Í ¼¹ö ÇÁ·Î±×·¥À» ÀÚ¹Ù ÄÄÆÄÀÏ·¯·Î ÄÄÆÄÀÏ ´Ù. óÀ½¿¡ ¼¼úÇßµíÀÌ Å¬¶óÀ̾ðÆ®°´Ã¼°¡ ¼¹ö°´Ã¼¸¦ »ç¿ëÇÏ·Á¸é ½ºÅÓŬ·¡½º°¡ ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ ½ºÅÓŬ·¡½º¸¦ »ý¼ºÇÏ´Â °ÍÀÌ rmic ÇÁ·Î±×·¥ÀÌ µÇ°Ú´Ù. rmic ·Î »ý¼ºµÈ ½ºÅÓŬ·¡½º°¡ µ¿Àû Ŭ·¡½º·ÎµùÀ» ÅëÇؼ Ŭ¶óÀ̾ðÆ®°¡ ÇÊ¿ä·ÎÇÒ ¶§ Ŭ¶óÀ̾ðÆ®·Î ¿Å°Ü °¡°Ô µÇ´Â °ÍÀÌ´Ù. rmic ´Â ´ÙÀ½°ú °°ÀÌ ½ÇÇà½ÃÅ°¸é µÈ´Ù. rmic SeatImpl ¸¸¾à ÀÚ¹Ù 1.1 °´Ã¼¸¦ Áö¿øÇØ¾ß ÇÑ´Ù¸é -v1.2 ¿É¼ÇÀ» »ç¿ëÇÏ¸é µÈ´Ù. Ŭ·¡½º À̸§Àº ÆÐÅ°Áö À̸§±îÁö ´Ù »ç¿ëÇÏ¿©¾ß ÇÑ´Ù. ¸¸¾à¿¡ SeatImpl Ŭ·¡½º°¡ com.myairline À̶ó´Â ÆÐÅ°ÁöÀÇ ÀϺζó¸é rmic com.myairline.SeatImpl À̶ó°í ÇØ¾ß ÇÑ´Ù. rmic ¸¦ ½ÇÇà½ÃÅ°¸é ¾Õ¿¡¼ ¸»ÇÑ ¹Ù¿Í °°ÀÌ ½ºÅÓ Å¬·¡½º¿Í ½ºÄÌ·¹Åæ Ŭ·¡½º°¡ SeatImpl_Stub.class, SeatImpl_Skel.class ¶ó´Â À̸§À¸·Î »ý¼ºµÈ´Ù. ÇÏÁö¸¸ ½ºÄÌ·¹Åæ Ŭ·¡½º´Â ÀÚ¹Ù 2¿¡¼± ´õÀÌ»ó »ç¿ëÇÏÁö ¾ÊÀ¸¹Ç·Î ¹«½ÃÇصµ ÁÁ´Ù. ÀÌ·¸°Ô ½ºÅÓÀ» ¸¸µé¾úÀ¸¸é ´ÙÀ½Àº rmiregistry ¸¦ ½ÇÇà½ÃÅ°´Â Àϸ¸ÀÌ ³²¾Ò´Ù. À©µµ¿ìÁî ¼¹ö¿¡¼´Â start rmiregistry À¯´Ð½º³ª ¸®´ª½º¿¡¼±
ÀÌ·¸°Ô rmiregistry °¡ ½ÇÇà µÆÀ¸¸é ¼¹ö ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄÑÁÖ¸é µÇ°Ú´Ù. ¿©±â¼ ÁÖÀÇÇØ¾ß ÇÒ°ÍÀº ¼¹öÇÁ·Î±×·¥À» ¼ºñ½º ÇÁ·Î±×·¥À¸·Î ½ÇÇà½ÃÄÑ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. Áï, rmiregistry ¿Í °°Àº ¹æ¹ýÀ¸·Î ¸»ÀÌ´Ù. À§ÀÇ ¿¹Á¦¿¡¼± start java SeatImpl ¶Ç´Â
Ŭ¶óÀ̾ðÆ® 2. º¸¾ÈÁ¤Ã¥À» Á¤ÀÇÇÏ´Â ÆÄÀÏ ¸¸µé±â 3. Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ÀÇ ½ÇÇà ¼¹ö¿Í ¸¶Âù°¡Áö·Î Ŭ¶óÀ̾ðÆ® °´Ã¼ÀÇ ÀÚ¹Ù ÆÄÀÏ°ú ÀÎÅÍÆäÀ̽º ÆÄÀÏÀ» ÀÚ¹Ù ÄÄÆÄÀÏ·¯·Î ÄÄÆÄÀÏ ÇØÁØ´Ù. ¿©±â¼ ÀÎÅÍÆäÀ̽º ÆÄÀÏÀº ¼¹ö¿¡¼ ÄÄÆÄÀÏÇÑ °Í°ú °°Àº ÆÄÀÏÀ̾î¾ß ÇÑ´Ù. ÄÄÆÄÀÏÀÌ ¼º°øÇßÀ¸¸é ´ÙÀ½Àº º¸¾ÈÁ¤Ã¥À» ¼³Á¤ÇØÁÖ´Â ÆÄÀÏÀ» ¸¸µé¾î¾ß ÇÑ´Ù. ÆÄÀÏÀ̸§Àº ¾Æ¹«·¡µµ »ó°ü¾ø´Ù. ¿©±â¼± client_security.policy ¶ó°í ÇÏ°Ú´Ù. À§¿¡¼ ÀÚ¹Ù º¸¾È¸Å´ÏÀú¸¦ ½ÇÇà½ÃŲ °ÍÀ» ±â¾ïÇÒ °ÍÀÌ´Ù. ÀÚ¹Ù º¸¾È¸Å´ÏÀú´Â ¿ø·¡ ¾î¶°ÇÑ ³×Æ®¿÷ ¿¬°áµµ Çã¿ëÇÏÁö ¾Ê´Â´Ù. ±×·¯¹Ç·Î ÀÌ·¯ÇÑ º¸¾ÈÁ¤Ã¥À» ¼³Á¤ÇØ ÁÖ¾î¾ß ÇÏ´Â °ÍÀÌ´Ù. º¸¾ÈÁ¤Ã¥ ÆÄÀÏ¿£ ´ÙÀ½°ú °°ÀÌ ÇØÁÖ¸é µÇ°Ú´Ù. grant ¿©±â¼± RMI°¡ Æ÷Æ®¹øÈ£ 1024¿¡¼ 65535 »çÀÌÀÇ ¾Æ¹« Æ÷Æ®³ª »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿´´Ù. RMIÀÇ ±âº»¼³Á¤Àº 1099ÀÌ´Ù. º¸¾ÈÁ¤Ã¥ ÆÄÀÏ¿£ ÀÌ¿Ü¿¡ ´Ù¸¥ ¸¹Àº Á¤º¸°¡ µé¾î°¥ ¼ö Àִµ¥ Á¤Ã¥ÆÄÀÏ°ú º¸¾È ¸Å´ÏÀú¿¡ °üÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â ´Ù¸¥ ±ÛµéÀ» ÂüÁ¶ÇÏ±æ ¹Ù¶õ´Ù. ÀÌ·¸°Ô º¸¾ÈÁ¤Ã¥ÀÌ ¼³Á¤µÇ¾úÀ¸¸é ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°´Â Àϸ¸ÀÌ ³²¾Ò´Ù. ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°ÀÌ ½ÇÇà½ÃÅ°¸é µÈ´Ù. º¸¾ÈÁ¤Ã¥ ÆÄÀÏÀ» ÁöÁ¤ÇØ ÁÖ´Â °ÍÀ» ÀØÁö ¾Êµµ·Ï ÇÏÀÚ. java Reservation -Djava.security.policy=client_security.policy µ¿Àû Ŭ·¡½º·Îµù¿¡ °üÇØ ÁÖÀÇÇÒÁ¡ À§¿¡¼ ¾ð±ÞÇÑ´ë·Î Ŭ¶óÀ̾ðÆ® °´Ã¼´Â ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¦ ÅëÇÏ¿©, Áï ½ºÅÓŬ·¡½º¸¦ ÅëÇÏ¿© ¼¹ö°´Ã¼ÀÇ ¸Þ½îµå¸¦ ºÎ¸£°Ô µÈ´Ù. ´Ù½Ã ¸»Çϸé Ŭ¶óÀ̾ðÆ®´Â ¿ø°Ý ÀÎÅÍÆäÀ̽º¿¡ °ø°³µÇ¾î ÀÖ´Â ¸Þ½îµå¹Û¿¡ ºÎ¸¦ ¼ö ¾ø´Ù´Â ¸»ÀÌ´Ù. ¼¹ö°´Ã¼ ³»¿¡ ´Ù¸¥ ¿©·¯°¡Áö ¸Þ½îµå°¡ ÀÖÀ» ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¿ø°Ý ÀÎÅÍÆäÀ̽º¿¡ °ø°³µÇ¾î ÀÖÁö ¾ÊÀ¸¸é Ŭ¶óÀ̾ðÆ® °´Ã¼´Â ±× ¸Þ½îµå¸¦ ºÎ¸¦ ¼ö ¾ø´Ù. ¿¹¸¦ µé¾î Ŭ¶óÀ̾ðÆ® °´Ã¼°¡ ¼¹ö°´Ã¼ÀÇ ¾î¶°ÇÑ ¸Þ½îµå¸¦ ºÒ·¶´Âµ¥ ±× °ªÀ¸·Î ¿ø°Ý°´Ã¼¸¦ »ó¼ÓÇÑ ¾î¶°ÇÑ °´Ã¼°¡ µ¹¾Æ¿Ô´Ù°í ÇÏÀÚ. ±×¸®°í ¿ø°Ý°´Ã¼´Â ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏÁö¸¸ ±× ¿ø°Ý°´Ã¼¸¦ »ó¼ÓÇÑ °´Ã¼´Â ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏÁö ¾Ê´Â´Ù°í ÇÏÀÚ. ±×·¸´Ù¸é Ŭ¶óÀ̾ðÆ® °´Ã¼°¡ ¹ÞÀº ÀÌ °´Ã¼´Â ¾î¶°ÇÑ ¸Þ½îµåÀÇ ½ÇÇöÀÌ °¡´ÉÇÒ±î? ´äÀº ¼öÆÛŬ·¡½º°¡ ±¸ÇöÇÑ ¿ø°Ý ÀÎÅÍÆäÀ̽º¿¡ °ø°³µÇ¾î ÀÖ´Â ¸Þ½îµå »ÓÀÌ´Ù. »ó¼ÓÇÑ Å¬·¡½º°¡ ´Ù¸¥ ¾î¶² ¸Þ½îµå¸¦ Á¤ÀÇÇßÀ»Áö¶óµµ ±×°ÍÀº Ŭ¶óÀ̾ðÆ®°¡ ½ÇÇà½Ãų ¼ö ¾ø´Ù. ÀÌ°ÍÀº ±× °´Ã¼°¡ ¸Þ½îµåÀÇ ÀÎÀÚ·Î »ç¿ëµÇ´ø µ¹¾Æ¿À´Â °ªÀ¸·Î »ç¿ëµÇ´ø ¸¶Âù°¡Áö´Ù. ±×·¸´Ù¸é ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏÁö ¾Ê´Â ´Ù¸¥ Ŭ·¡½ºµéÀº ¾î¶»°Ô µÉ±î? ¿¹¸¦ µé¾î ¼¹ö°´Ã¼ÀÇ ¸Þ½îµå¸¦ ºÎ¸¦¶§ String Ŭ·¡½º¸¦ ÀÎÀÚ·Î »ç¿ëÇß´Ù°í ÇÏÀÚ. ÀÌ·² °æ¿ì String Ŭ·¡½º´Â Remote ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏÁö ¾ÊÀ¸¹Ç·Î ½ÇÁ¦·Ð °´Ã¼°¡ º¹»ç°¡ µÇ¾î ¼¹ö·Î º¸³»Áö°Ô µÈ´Ù. ¸¸¾à ¼¹ö°¡ String °´Ã¼ÀÇ ¾î¶°ÇÑ ¸Þ½îµå¸¦ »ç¿ëÇÑ´Ù°í Çصµ °´Ã¼ ÀÚü°¡ º¹»ç°¡ µÇ¾î º¸³»Á³À¸¹Ç·Î ¹®Á¦°¡ ¾ø´Ù. °£´ÜÈ÷ ¸»ÇÏ¸é ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â °´Ã¼°¡ ÀÎÀÚ³ª ¸Þ½îµå °ªÀ¸·Î º¸³»Áú °æ¿ì ½ºÅÓŬ·¡½º¸¸ÀÌ º¸³»Áö°í ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏÁö ¾Ê´Â °´Ã¼¸¦ º¸³¾ °æ¿ì °´Ã¼ ÀÚü°¡ º¹»çµÇ¾î º¸³»Áø´Ù´Â ¾ê±â°¡ µÇ°Ú´Ù. ¸¶Ä¡¸ç |