¿ø°Ý °´Ã¼ Åë½Å(RMI¿Í CORBA)
1999³â 5¿ù 15ÀÏ Ã¹ ÃâÆÇ, ±Û/À±°æ±¸
Copyright © 1999 Yoon Kyung Koo. All Rights Reserved.
¹«´Ü ÀüÀ縦 ±ÝÇÕ´Ï´Ù.
ÀÌ ±ÛÀº ¿ù°£Áö ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î 1999³â 6¿ùÈ£ÀÇ ¸¶¼Ò ÁִϾ
½Ç¸° ÀÚ¹Ù À̾߱âÀÇ ÃÊ°í¿¡ ±â¹ÝÀ» ÇÏ°í ÀÖ½À´Ï´Ù.
ÀÚ¹Ù À̾߱⸦ Æ÷ÇÔÇÑ 1999³â 1¿ùºÎÅÍ ¿©¼¸ ´Þµ¿¾È ¿¬ÀçµÇ¾ú´ø ¸¶¼Ò ÁÖ´Ï¾î ¿ø°íµéÀº
"Ãʺ¸ÀÚ¸¦ À§ÇÑ ÇÁ·Î±×·¡¹Ö ¸¶½ºÅÍ"¶õ ÇÑ ±ÇÀÇ ´ÜÇົÀ¸·Î ¹¿© ºÏ¸¶Å©
ÃâÆǻ翡¼ Ãâ°£µÇ¾ú½À´Ï´Ù.
Âü°íÇϽñ⠹ٶø´Ï´Ù.
RMI¿Í CORBA´Â ³×Æ®¿÷À» °¡·ÎÁö¸£´Â °´Ã¼µé °£ÀÇ Åë½ÅÀ» ´Ù·ì´Ï´Ù.
URL°ú ¼ÒÄÏÀ» »ç¿ëÇÑ ³×Æ®¿÷ Åë½Å ÇÁ·Î±×·¡¹ÖÀ» ÀÌÀü¿¡ ´Ù·é °æÇèÀÌ ÀÖÀ¸¸é ³×Æ®¿÷ ȯ°æ¿¡¼ÀÇ ÇÁ·Î±×·¡¹ÖÀÌ ³¸¼³°Ô ´À²¸ÁöÁö´Â ¾ÊÀ» °ÍÀÔ´Ï´Ù. ÀÚ¹Ù°¡ µîÀåÇϱâ ÀÌÀü¿¡µµ ºÐ»ê ³×Æ®¿÷ ȯ°æ¿¡¼ º¸´Ù ½±°Ô ÇÁ·Î±×·¡¹ÖÀ» Çϱâ À§ÇÑ ¹æ¹ýµéÀÌ Á¸ÀçÇß½À´Ï´Ù. ¿¹¸¦ µé¾î, À¯´Ð½º ½Ã½ºÅÛ¿¡¼ ÁÖ·Î »ç¿ëµÇ´Â RPC(¿ø°Ý ÇÁ·¯½ÃÀú È£Ãâ)¿Í °°Àº ¹æ¹ýÀº ¿ø°ÝÁöÀÇ ±â´ÉÀ» »ç¿ëÇϱâ À§ÇØ ¸¶Ä¡ ÇÔ¼öó·³ Á¤ÀÇÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â Åë½Å ±Ô¾àÀÔ´Ï´Ù. RPC¸¦ »ç¿ëÇϸé ÇÁ·Î±×·¡¸Ó´Â ¼ÒÄÏ Åë½ÅÀ» °í·ÁÇÒ ÇÊ¿ä ¾øÀÌ ¸¶Ä¡ °°Àº ÇÁ·Î±×·¥ ³»ÀÇ ÇÔ¼ö¸¦ È£ÃâÇϵíÀÌ ¿ø°Ý È£½ºÆ®ÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. ÇÏÁö¸¸ ÇÔ¼ö ¼öÁØÀÇ ÀÌ·¯ÇÑ ±â´ÉÀº ÀÚ¹Ù¿Í °°Àº °´Ã¼ ¼¼°è¿¡¼ »ç¿ëÇϱ⿡´Â ÀûÇÕÇÏÁö ¾Ê½À´Ï´Ù.
ÀÚ¹Ù´Â ÇÔ¼ö ¼öÁØÀÇ Åë½ÅÀÌ ¾Æ´Ï¶ó Áö¿ª °´Ã¼¿Í ¿ø°Ý °´Ã¼ °£ÀÇ ¸Þ½îµå È£ÃâÀ» ÅëÇÑ ¿ø°Ý °´Ã¼ Åë½Å ¹æ½ÄÀ» Á¦°øÇÕ´Ï´Ù.
ÀÌ·¯ÇÑ ¿ø°Ý °´Ã¼µé °£ÀÇ Åë½ÅÀ» Á¦°øÇÏ´Â
¹æ¹ý¿¡´Â ÀÚ¹ÙÀÇ ¿ø°Ý ¸Þ½îµå È£Ãâ(RMI) ¿Ü¿¡µµ, °´Ã¼ °ü¸® ±×·ì(OMG)¿¡¼
¸¸µç °³¹æÇü Ç¥ÁØÀÎ °ø¿ë °´Ã¼ ºê·ÎÄ¿ ¾ÆÅ°ÅØó(CORBA), ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®
»ç¿¡¼ ¸¸µç ºÐ»ê ÄÄÆ÷³ÍÆ® °´Ã¼ ¸ðµ¨(DCOM) µîÀÌ ÀÖ½À´Ï´Ù.
ÀÌ ±ÛÀº ÀÚ¹Ù 2 SDK ¹öÀü 1.2.x(ÈçÈ÷ JDK 1.2.x¶ó°í ºÎ¸¨´Ï´Ù)¿¡¼
Áö¿øÇÏ´Â RMI¿Í CORBA¸¦ ´Ù·ì´Ï´Ù.
1. ¿ø°Ý ¸Þ½îµå È£Ãâ (RMI)
ÀÚ¹Ù ÇÁ·Î±×·¥À» ½ÇÇàÇϴ ȯ°æÀ» ÀϹÝÀûÀ¸·Î ÀÚ¹Ù °¡»ó ±â°è(Java Virtual Machine)¶ó°í ºÎ¸¨´Ï´Ù. ÀÚ¹Ù °¡»ó ±â°è´Â À©µµ¿ì³ª À¯´Ð½º µîÀÇ ¿î¿µ üÁ¦¿¡ ÀÌ½ÄµÇ¾î¼ ÀÚ¹Ù ÇÁ·Î±×·¥ Áï, Àڹ٠Ŭ·¡½º ÆÄÀϵéÀ» °¢ ¿î¿µ üÁ¦¿¡ ¸Â°Ô ½ÇÇàÇÏ´Â ½ÇÇà ȯ°æÀÔ´Ï´Ù. ¿©·¯ °³ÀÇ È£½ºÆ®¿¡ ³ª´µ¾îÁ® ½ÇÇàµÇ´Â ÀÚ¹Ù ÇÁ·Î±×·¥µé·Î ±¸¼ºµÇ´Â ÀÏÁ¾ÀÇ ³×Æ®¿÷ ¼ºñ½º¸¦ ¸¸µç´Ù°í »ý°¢Çغ¾½Ã´Ù. È£½ºÆ®°¡ ´Ù¸£¹Ç·Î °¢°¢ÀÇ ÀÚ¹Ù ÇÁ·Î±×·¥µéÀº ³×Æ®¿÷À» °¡·ÎÁú·¯ º°µµÀÇ Åë½Å ¹æ¹ýÀ» ±¸ÇöÇØ¾ß ÇÕ´Ï´Ù. TCP ¼ÒÄÏÀ» »ç¿ëÇÏ¿© Åë½ÅÇÑ´Ù°í Çϸé, ¼·ÎÀÇ Åë½Å ±Ô¾à°ú ¸Þ½ÃÁö Çü½Ä µî Á¤ÀÇÇÏ´Â µî º¹ÀâÇÑ ¹®Á¦µéÀ» ÇØ°áÇØ¾ß ÇÒ °ÍÀÔ´Ï´Ù.
¿ø°Ý °´Ã¼ °£ÀÇ Åë½Å ¹æ½ÄÀ» »ç¿ëÇϸé ÀÌ·¯ÇÑ ¹®Á¦´Â ÇÑ°á ½±°Ô ÇØ°áµË´Ï´Ù. ÀÚ¹ÙÀÇ ¿ø°Ý °´Ã¼ Åë½Å ¹æ½ÄÀÎ ¿ø°Ý ¸Þ½îµå È£ÃâÀº ´Ù¸¥ È£½ºÆ®(¾ö¹ÐÇÏ°Ô Ç¥ÇöÇÏ¸é ´Ù¸¥ °¡»ó ±â°è)¿¡ ÀÖ´Â °´Ã¼ÀÇ ¸Þ½îµåµéÀ» ¸¶Ä¡ °°Àº °¡»ó ±â°èÀÇ °´Ã¼ ¸Þ½îµå¸¦ »ç¿ëÇϵíÀÌ ½±°Ô »ç¿ëÇÏ°Ô ÇØÁÖ´Â ±â¼úÀÔ´Ï´Ù. ÀÚ¹ÙÀÇ ¿ø°Ý ¸Þ½îµå È£Ãâ Áï, RMI¿¡ °ü·ÃµÈ Ŭ·¡½ºµéÀº java.rmi, java.rmi.activation,java.rmi.dgc, java.rmi.registry, java.rmi.server ÆÐÅ°Áöµé¿¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù.
1.1 RMI¸¦ »ç¿ëÇÑ ¿ø°Ý °´Ã¼ Åë½Å
ÀÚ¹Ù RMI¸¦ »ç¿ëÇÏ´Â ±âº»ÀûÀÎ ¹æ¹ýÀº ¸ÕÀú ¿ø°ÝÀ¸·Î »ç¿ëµÉ °´Ã¼¸¦ ÁöÁ¤µÈ ÀÎÅÍÆäÀ̽º·Î Á¤ÀÇÇÑ ´ÙÀ½, ¿ø°Ý °´Ã¼´Â ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â ¹æ½ÄÀ¸·Î ¼³°èÇÏ°í, Áö¿ª °´Ã¼´Â ÀÌ ÀÎÅÍÆäÀ̽ºÀÇ ¸Þ½îµå¸¦ È£ÃâÇÔÀ¸·Î½á ½ÇÁ¦ ¿ø°Ý °´Ã¼ÀÇ ¸Þ½îµå¸¦ È£ÃâÇÏ´Â °ÍÀÔ´Ï´Ù. ½ÇÁ¦ ³×Æ®¿÷ Åë½Å µî¿¡ °ü·ÃµÈ º¹ÀâÇÑ ºÎºÐÀº ÀÚ¹ÙÀÇ RMI ±Ô¾àÀÌ ´ë½Å ó¸®ÇØÁÝ´Ï´Ù. ÇÁ·Î±×·¡¸Ó´Â RMI ±Ô¾àÀÌ Á¤ÇÑ ¹æ¹ý¸¸ µû¸£¸é ¿ø°Ý È£½ºÆ®ÀÇ ¼¹ö °´Ã¼¸¦ ¸¶Ä¡ Áö¿ªÀÇ ÀÏ¹Ý ÀÚ¹Ù °´Ã¼¸¦ ´Ù·çµíÀÌ ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
<±×¸²> ÀÚ¹ÙÀÇ ¿ø°Ý ¸Þ½îµå È£Ãâ
ÀÚ¹ÙÀÇ ¿ø°Ý °´Ã¼ Åë½Å¿¡¼ È£ÃâµÉ ¿ø°Ý °´Ã¼¸¦ ¼¹ö °´Ã¼, ¿ø°Ý °´Ã¼¸¦ »ç¿ëÇÏ´Â Áö¿ªÀÇ °´Ã¼¸¦ Ŭ¶óÀ̾ðÆ® °´Ã¼¶ó°í ºÎ¸¨´Ï´Ù. ÁÖÀÇ ±í°Ô º¼ °ÍÀº Áö¿ªÀÇ Å¬¶óÀ̾ðÆ® °´Ã¼´Â Àý´ë ¿ø°Ý È£½ºÆ®ÀÇ ¼¹ö °´Ã¼¸¦ Á÷Á¢ ÂüÁ¶ÇÏÁö ¾Ê´Â´Ù´Â Á¡ÀÔ´Ï´Ù. Áö¿ª °´Ã¼°¡ ÂüÁ¶ÇÏ´Â °ÍÀº ¼¹ö °´Ã¼°¡ ±¸ÇöÇÏ°í ÀÖ´Â ÀÎÅÍÆäÀ̽ºÀÔ´Ï´Ù. ÀÌ ÀÎÅÍÆäÀ̽º¸¦ ¿ø°Ý ÀÎÅÍÆäÀ̽º¶ó°í ºÎ¸£´Âµ¥, ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÔÀ¸·Î½á Ŭ¶óÀ̾ðÆ® °´Ã¼¸¦ ±¸ÇöÇÒ ¶§ ½ÇÁ¦ ¼¹ö °´Ã¼ Ŭ·¡½º¸¦ ¿ä±¸ÇÏÁö ¾Ê°í ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¸ ÀÖÀ¸¸é ÄÄÆÄÀÏÀÌ °¡´ÉÇØÁý´Ï´Ù. µû¶ó¼, ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¸ Á¤Àǵȴٸé Ŭ¶óÀ̾ðÆ® °´Ã¼¿Í ¼¹ö °´Ã¼°¡ ¿ÏÀüÈ÷ ¼·Î µ¶¸³ÀûÀ¸·Î °³¹ßµÉ ¼ö ÀÖÀ¸¸ç, ÇϳªÀÇ ¼¹ö °´Ã¼¸¦ ¿©·¯ Ŭ¶óÀ̾ðÆ® °´Ã¼µéÀÌ »ç¿ëÇÏ´Â °Íµµ °¡´ÉÇØÁý´Ï´Ù.
ÀÚ¹Ù RMI¿¡¼ ÀÌ ¿ø°Ý ÀÎÅÍÆäÀ̽º´Â java.rmi ÆÐÅ°ÁöÀÇ Remote ÀÎÅÍÆäÀ̽º¸¦ »ó¼ÓÇÏ¿© ¸¸µé¾î¾ß ÇÕ´Ï´Ù. Remote ÀÎÅÍÆäÀ̽º´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ½À´Ï´Ù.
public abstract interface Remote( ) { }
ÀÌ Remote ÀÎÅÍÆäÀ̽º´Â º°µµÀÇ ¸Þ½îµå¸¦ ¼±¾ðÇÏÁö ¾Ê½À´Ï´Ù. ¿ø°Ý °´Ã¼¸¦ ±¸ºÐÇϱâ À§ÇØ »ç¿ëÇÏ´Â ÀÎÅÍÆäÀ̽ºÀÔ´Ï´Ù. ½ÇÁ¦·Î ¿ø°Ý ¼¹öÀÇ ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÏ·Á¸é ´ÙÀ½ ¼¼ °¡Áö Á¶°ÇÀ» ¸¸Á·ÇØ¾ß ÇÕ´Ï´Ù.
¡Ü ¿ø°Ý ÀÎÅÍÆäÀ̽º´Â Remote ÀÎÅÍÆäÀ̽º¸¦ »ó¼ÓÇÕ´Ï´Ù.
¡Ü ¿ø°Ý ÀÎÅÍÆäÀ̽º¿¡ Á¤ÀÇµÈ ¸Þ½îµåµéÀº java.rmi.RemoteException ¿¹¿Ü¸¦ ´øÁú ¼ö ÀÖµµ·Ï ¸í½ÃÀûÀ¸·Î ¼±¾ðÇØ¾ß ÇÕ´Ï´Ù.
¡Ü ¿ø°Ý ÀÎÅÍÆäÀ̽º¿¡ Á¤ÀÇµÈ ¸Þ½îµåµéÀº ÀÎÀÚ³ª ¹Ýȯ À¯ÇüÀ¸·Î ´ÙÀ½ À¯Çüµé¸¸ °¡Á®¾ß ÇÕ´Ï´Ù.
¨ç byte, int µî ÀÚ¹ÙÀÇ ±âº» À¯Çü ¨è ¿ø°Ý °´Ã¼ ¨é java.io.SerializableÀ» ±¸ÇöÇÑ Á÷·ÄÈ °¡´ÉÇÑ °´Ã¼
ÀÚ¹ÙÀÇ ÄÚ¾î ÆÐÅ°Áö¿¡ ÀÖ´Â °´Ã¼µé Áß ´ëºÎºÐÀÌ Á÷·ÄÈ °¡´ÉÇÑ °´Ã¼À̹ǷΠ´ëºÎºÐÀÇ °´Ã¼¸¦ ÀÎÀÚ³ª ¹Ýȯ À¯ÇüÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
¿¹¸¦ µé¾î, ´ÙÀ½ ¿ø°Ý ÀÎÅÍÆäÀ̽º´Â ¿Ã¹Ù¸¥ ¿ø°Ý ÀÎÅÍÆäÀ̽ºÀÔ´Ï´Ù.
import java.rmi.*; interface RemoteFile extends Remote { public boolean isFile() throws RemoteException; public boolean isDirectory() throws RemoteException; public String[] list() throws Exception; public boolean delete() throws RemoteException, SecurityException; public boolean renameTo(RemoteFile dest) throws java.io.IOException, SecurityException; }
<¿¹Á¦> RemoteFile ¿ø°Ý ÀÎÅÍÆäÀ̽º
RemoteFile ÀÎÅÍÆäÀ̽º´Â ¸ÕÀú Remote ÀÎÅÍÆäÀ̽º¸¦ »ó¼ÓÇÏ°í ÀÖ°í, °¢ ¸Þ½îµåµéÀº RemoteException ȤÀº RemoteException Ŭ·¡½ºÀÇ ºÎ¸ð Ŭ·¡½ºÀÎ ¿¹¿ÜµéÀ» ´øÁú ¼ö ÀÖµµ·Ï ¸í½ÃÀûÀ¸·Î ¼±¾ðÇÏ°í ÀÖ½À´Ï´Ù. µû¶ó¼, ¿ø°Ý ÀÎÅÍÆäÀ̽ºÀÇ Á¶°ÇÀ» ¸ðµÎ ¸¸Á·ÇÏ°í ÀÖ½À´Ï´Ù.
RemoteExceptionÀº ¾î¶² ¿¹¿Ü¸¦ Ç¥ÇöÇϴ Ŭ·¡½ºÀϱî¿ä? À̸§ ±×´ë·Î ¿ø°Ý È£Ãâ¿¡ °ü·ÃµÈ ¼öÇàÀ» ÇÏ´Â µµÁß¿¡ ¹ß»ýÇÏ´Â ³×Æ®¿÷¿¡ °ü·ÃµÈ ¿©·¯ ¿¹¿Ü »óȲµéÀ» ÃÑ°ýÇÏ´Â ¿¹¿Ü Ŭ·¡½ºÀÔ´Ï´Ù. Áö¿ª °´Ã¼¸¦ »ç¿ëÇÏ´Â °Í°ú ´Þ¸®, ¿ø°ÝÁöÀÇ °´Ã¼¿ÍÀÇ Åë½ÅÀº Ç×»ó ³×Æ®¿÷ »óȲ¿¡ µû¶ó ¿©·¯ °¡Áö ¿¹¿Ü »óȲµéÀÌ ¹ß»ýÇÏ°Ô ¸¶·ÃÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ¿¹¿Ü »óȲµéÀ» ó¸®Çϱâ À§ÇØ ¸ðµç ¿ø°Ý ÀÎÅÍÆäÀ̽º´Â RemoteExceptionÀ» ¹ß»ý½Ãų ¼ö ÀÖÀ½À» ¹Ýµå½Ã ¸í½ÃÇØ¾ß ÇÕ´Ï´Ù.
1.2 Hello RMI ÇÁ·Î±×·¥
ÀÌÁ¦ RMI¸¦ »ç¿ëÇÏ´Â ¼¹ö/Ŭ¶óÀ̾ðÆ® °´Ã¼µéÀ» ¸¸µé¾îº¾½Ã´Ù. ¸¸µé ÇÁ·Î±×·¥Àº ¿ø°Ý ¼¹ö¿¡ ÀÖ´Â hello()¶ó´Â ¸Þ½îµå¸¦ È£ÃâÇÏ¸é ¿ø°Ý ¼¹ö°¡ "Hello, Remote World!"¶ó´Â ¹®ÀÚ¿À» °Ç³×ÁÖ´Â ¾ÆÁÖ °£´ÜÇÑ ÇÁ·Î±×·¥ÀÔ´Ï´Ù.
1.2.1 RMI ¿ø°Ý ¼¹ö ¸¸µé±â
°¡Àå ¸ÕÀú ÇÒ ÀÏÀº ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¦ ¼±¾ðÇÏ´Â ÀÏÀÔ´Ï´Ù.
// Hello.java ¼Ò½º ÄÚµå import java.rmi.*; public interface Hello extends Remote { String hello() throws RemoteException; }
<¿¹Á¦> Hello ¿ø°Ý ÀÎÅÍÆäÀ̽º ¼±¾ð
¾Õ¿¡¼ Àá±ñ ¾ð±ÞÇßµíÀÌ RMI ¿ø°Ý °´Ã¼ Åë½Å¿¡¼´Â ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¸ ÀÖÀ¸¸é ¼¹ö ÇÁ·Î±×·¥°ú Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥Àº ¼·Î µ¶¸³ÀûÀ¸·Î ¸¸µé ¼ö ÀÖ½À´Ï´Ù. ¸ÕÀú ÀÌ ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â ¿ø°Ý ¼¹ö¸¦ ¸¸µé¾îº¸µµ·Ï ÇսôÙ.
¿ø°Ý ¼¹ö´Â ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â °´Ã¼·Î ³ªÁß¿¡ Ŭ¶óÀ̾ðÆ® °´Ã¼°¡ È£ÃâÇÒ ÀÎÅÍÆäÀ̽ºÀÇ ¸Þ½îµå¸¦ ½ÇÁ¦ ±¸ÇöÇÏ°í ÀÖ´Â °´Ã¼ÀÔ´Ï´Ù.
¿ø°Ý ¼¹ö °´Ã¼´Â ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ±¸ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù.
¡Ü java.rmi.server ÆÐÅ°Áö¿¡ ÀÖ´Â RemoteObject Ŭ·¡½º¸¦ »ó¼ÓÇÕ´Ï´Ù. º¸Åë RemoteObject Ŭ·¡½ºÀÇ ÀÚ½Ä Å¬·¡½ºÀÎ UnicastRemoteObject Ŭ·¡½º³ª Activatable Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿© ±¸ÇöÇÕ´Ï´Ù.
¡Ü °ü°èµÈ ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÕ´Ï´Ù.
¡Ü ¼¹ö °´Ã¼°¡ Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼ÓÀ» ó¸®ÇÒ ¼ö ÀÖµµ·Ï °´Ã¼¸¦ ÀͽºÆ÷Æ®ÇÕ´Ï´Ù. ÀÌ °´Ã¼ ÀͽºÆ÷Æ®´Â ÀÚ¹ÙÀÇ RMI ½ÇÇàȯ°æÀÌ Å¬¶óÀ̾ðÆ®ÀÇ TCP Á¢¼ÓÀ» ¹Þ¾Æ¼ ÇØ´ç °´Ã¼¿¡°Ô Àü´ÞÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀ¸·Î UnicastRemoteObject.exportObject() ȤÀº Activatable.exportObject() Á¤Àû ¸Þ½îµå¸¦ »ç¿ëÇÕ´Ï´Ù. ´Ù¸¸, UnicastRemoteObject Ŭ·¡½º³ª Activatable Ŭ·¡½º¸¦ »ó¼ÓÇÑ °æ¿ì¿¡´Â º°µµ·Î ÀͽºÆ÷Æ®ÇÏÁö ¾Ê¾Æµµ µË´Ï´Ù.
UnicastRemoteObject Ŭ·¡½º¿Í Activatable Ŭ·¡½º ÀÚ¹Ù RMIÀÇ ¿ø°Ý ¼¹ö °´Ã¼¿¡´Â Å©°Ô µÎ °¡Áö À¯ÇüÀÌ ÀÖ½À´Ï´Ù. Ç×»ó ¼¹ö ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ°í ÀÖÀ» ¶§¿¡¸¸ ¼¹ö °´Ã¼°¡ À¯È¿ÇÑ °æ¿ì¿Í Ŭ¶óÀ̾ðÆ®°¡ ¼¹ö °´Ã¼¸¦ ¿äûÇÏ¸é µ¿ÀûÀ¸·Î ¼¹ö °´Ã¼¸¦ ÀûÀçÇÏ´Â ¹æ½ÄÀÌ ±×°ÍÀÔ´Ï´Ù. ÀüÀÚÀÇ °æ¿ì¿¡´Â º¸Åë java.rmi.server ÆÐÅ°ÁöÀÇ UnicastRemoteObject Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿© ±¸ÇöÇÏ°í, ÈÄÀÚÀÇ °æ¿ì¿¡´Â java.rmi.activation ÆÐÅ°ÁöÀÇ Activatable Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿© ¿ø°Ý °´Ã¼¸¦ °¢°¢ ±¸ÇöÇÏ°Ô µË´Ï´Ù. ¿ø°Ý °´Ã¼ È°¼ºÈ¶ó°í ºÎ¸£´Â Activatable Ŭ·¡½º¸¦ »ç¿ëÇÏ´Â ¹æ½ÄÀº JDK 1.2(ÀÚ¹Ù 2 SDK ¹öÀü 1.2) ÀÌÈÄ ¹öÀüºÎÅÍ Áö¿øÇÕ´Ï´Ù. Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼ÓÀÌ ¾øÀ» ¶§¿¡µµ Ç×»ó ¼¹ö ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ¾î¾ß ÇÏ´Â UnicastRemoteObject ¹æ½Ä¿¡ ºñÇØ Activatable ¹æ½ÄÀº Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼Ó ¿äû¿¡¸¸ È°¼ºÈµÇ¹Ç·Î ÈξÀ È¿À²ÀûÀ̶ó°í º¼ ¼ö ÀÖ½À´Ï´Ù. Activatable ¹æ½ÄÀ» »ç¿ëÇÒ °æ¿ì Á÷Á¢ Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼Ó ¿äûÀ» ó¸®ÇÒ ¼ö ¾øÀ¸¹Ç·Î Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼ÓÀ» ó¸®ÇÏ´Â rmid¶ó´Â RMI µ¥¸ó ÇÁ·Î±×·¥ÀÌ Ç×»ó ½ÇÇàµÇ°í ÀÖ¾î¾ß ÇÕ´Ï´Ù. |
Hello ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â ¿ø°Ý ¼¹ö °´Ã¼ Ŭ·¡½º HelloImplÀº RemoteObjectÀÇ ÀÚ½Ä Å¬·¡½ºÀÎ UnicastRemoteObject Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿´½À´Ï´Ù. ÁÖÀÇÇÒ ºÎºÐÀº »ý¼ºÀÚ¸¦ ¹Ýµå½Ã ´Ù½Ã ¼±¾ðÇÏ¿© RemoteExceptionÀ» ´øÁú ¼ö ÀÖµµ·Ï ÇØ¾ß ÇÏ´Ù´Â Á¡ÀÔ´Ï´Ù. HelloImpl Ŭ·¡½ºÀÇ °æ¿ì, »ý¼ºÀÚ ¾È¿¡¼´Â ¾Æ¹«·± Àϵµ ÇÏÁö ¾ÊÁö¸¸, ºÎ¸ð Ŭ·¡½ºÀÎ UnicastRemoteObject Ŭ·¡½º°¡ »ý¼ºÀÚ¿¡¼ RemoteExceptionÀ» ´øÁöµµ·Ï ¼±¾ðµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ ¿¹¿Ü¸¦ ó¸®ÇÏÁö ¾ÊÀ¸¸é ÄÄÆÄÀÏ ¿¡·¯°¡ ¹ß»ýÇÕ´Ï´Ù.
// HelloImpl.java ¼Ò½º ÄÚµå import java.rmi.*; import java.rmi.server.UnicastRemoteObject; class HelloImpl extends UnicastRemoteObject implements Hello { /* * RemoteExceptionÀ» ó¸®ÇØ¾ß Çϱ⠶§¹®¿¡ * »ý¼ºÀÚ¸¦ ¹Ýµå½Ã ´Ù½Ã ¼±¾ðÇØ¾ß ÇÕ´Ï´Ù. */ HelloImpl () throws RemoteException { } // Hello ÀÎÅÍÆäÀ̽ºÀÇ ¸Þ½îµåµéÀ» ±¸ÇöÇÕ´Ï´Ù. public String hello() throws RemoteException { return "Hello, Remote World!"; } }
<¿¹Á¦> HelloImpl ¿ø°Ý ¼¹ö Ŭ·¡½º
1.2.2 RMI ¿ø°Ý ¼¹ö µî·Ï
¿ø°Ý ¼¹ö °´Ã¼¸¦ ¸¸µå´Â °ÍÀº À§¿¡¼ º» °Íó·³ UnicastRemoteObject Ŭ·¡½º¸¦ »ó¼ÓÇÒ °æ¿ì ¾ÆÁÖ °£´ÜÇÕ´Ï´Ù. ÇÏÁö¸¸, ÀÌ°ÍÀ¸·Î ³¡³ °ÍÀº ¾Æ´Õ´Ï´Ù. RMI ¿ø°Ý ¼¹ö °´Ã¼µéÀº Ŭ¶óÀ̾ðÆ®µéÀÌ Ã£À» ¼ö ÀÖµµ·Ï RMI µî·ÏºÎ¿¡ µî·ÏÀ» ÇØ¾ß ÇÕ´Ï´Ù. ¶Ç, ½ÇÇà ȯ°æÀÌ ¿ø°Ý °´Ã¼µéÀÇ Å¬·¡½º ÆÄÀϵéÀ» ÀûÀçÇϱâ À§Çؼ´Â º°µµÀÇ RMI º¸¾È °ü¸®ÀÚ¸¦ ÁöÁ¤ÇØ¾ß ÇÕ´Ï´Ù.
ÀÌ °úÁ¤À» Çϳª¾¿ ±¸ÇöÇغ¾½Ã´Ù.
¸ÕÀú ¼¹ö ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ±â À§Çؼ´Â main() ¸Þ½îµå¸¦ Á¤ÀÇÇØ¾ß ÇÕ´Ï´Ù. º°µµÀÇ Å¬·¡½º¿¡¼ main() ¸Þ½îµå¸¦ Á¤ÀÇÇÒ ¼ö ÀÖÁö¸¸, ¿©±â¿¡¼´Â HelloImpl ¿ø°Ý °´Ã¼ Ŭ·¡½º ¾È¿¡ ÇÔ²² Á¤ÀÇÇÕ´Ï´Ù.
º¸¾È °ü¸®ÀÚ¸¦ RMISecurityManager·Î ¼³Á¤ÇÏ´Â °ÍÀº RMI ¼¹ö¿Í Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ¸ðµÎ¿¡¼ ¼öÇàÇØ¾ß ÇÕ´Ï´Ù. º¸¾È °ü¸®ÀÚ°¡ ¼³Á¤µÇÁö ¾ÊÀ¸¸é Áö¿ªÀÇ CLASSPATH ȯ°æº¯¼ö¿¡¼ ÀûÀçÇÒ ¼ö Àִ Ŭ·¡½º ¿Ü¿¡ ¿ø°Ý °´Ã¼µéÀº ÀûÀçÇÒ ¼ö ¾ø°Ô µË´Ï´Ù.
if (System.getSecurityManager() == null) System.setSecurityManager(new RMISecurityManager());
¿ø°Ý ¼¹ö °´Ã¼¸¦ RMI µî·ÏºÎ¿¡ ¹ÙÀεåÇϱâ À§Çؼ º¸Åë java.rmi ÆÐÅ°ÁöÀÇ Naming Ŭ·¡½º³ª java.rmi.registry ÆÐÅ°ÁöÀÇ Registry ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÕ´Ï´Ù. RMI µî·ÏºÎ´Â ¿ø°Ý ¼¹ö °´Ã¼µéÀ» ƯÁ¤ÇÑ ¹®ÀÚ¿·Î °Ë»öÇÒ ¼ö ÀÖµµ·Ï µî·ÏÇÏ´Â RMI ȯ°æÀ¸·Î rmiregistry¶ó´Â µ¥¸ó ÇÁ·Î±×·¥À» ¸ÕÀú ½ÇÇà½ÃÄÑ¾ß »ç¿ë °¡´ÉÇÕ´Ï´Ù. Naming Ŭ·¡½º³ª Registry ÀÎÅÍÆäÀ̽º´Â µî·ÏºÎ¿¡ °´Ã¼¸¦ µî·ÏÇϱâ À§ÇÑ bind()¿Í rebind(), µî·ÏÀ» ÇØÁöÇϱâ À§ÇÑ unbind(), ±×¸®°í ¹ÙÀεåµÈ ¹®ÀÚ¿·Î ¿ø°Ý ¼¹ö °´Ã¼¸¦ °Ë»öÇÏ´Â lookup() ¸Þ½îµå, µî·ÏµÈ ¹®ÀÚ¿ ¸ñ·ÏÀ» º¸¿©ÁÖ´Â list() ¸Þ½îµå µîÀ» Á¦°øÇÕ´Ï´Ù. Naming Ŭ·¡½º¿Í Registry ÀÎÅÍÆäÀ̽º°¡ Á¦°øÇÏ´Â °¢ ¸Þ½îµåµéÀÇ Â÷ÀÌÁ¡Àº Naming Ŭ·¡½º´Â URLÀ» »ç¿ëÇÑ´Ù´Â Á¡ÀÌ°í Registry ÀÎÅÍÆäÀ̽º´Â ÇØ´ç µî·ÏºÎ¿¡ ´ëÇÑ ÂüÁ¶¸¦ °¡Áö°í ÀÖÀ¸¹Ç·Î ¹ÙÀεåµÈ ¹®ÀÚ¿¸¸À» »ç¿ëÇÑ´Ù´Â Á¡ÀÔ´Ï´Ù.
RMI URL Ç¥±â
<±×¸²> RMIÀÇ URL ±¸¼º ¿ä¼Ò
Naming Ŭ·¡½º´Â URLÀ» »ç¿ëÇÏ¿© ¿ø°Ý ¼¹ö °´Ã¼¸¦ ¹®ÀÚ¿·Î ¹ÙÀεå, ¹ÙÀεå ÇØÁö, °Ë»ö µîÀÇ ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù. URLÀº ÇÁ·ÎÅäÄÝ, È£½ºÆ®, Æ÷Æ® ¹øÈ£, ¸®¼Ò½º À§Ä¡·Î ±¸¼ºµÇ´Âµ¥ RMI ÇÁ·ÎÅäÄÝ¿¡¼´Â ÇÁ·ÎÅäÄÝ À̸§¿¡ "rmi"°¡ »ç¿ëµÇ°í, ¸®¼Ò½º À§Ä¡¿¡ ¹ÙÀεåÇÑ ¹®ÀÚ¿À» »ç¿ëÇÕ´Ï´Ù. Naming Ŭ·¡½º´Â rmi ¿ø°Ý °´Ã¼¸¸À» ´Ù·ç¹Ç·Î URL ³»¿ë¿¡ ÇÁ·ÎÅäÄÝÀ» ³ªÅ¸³»´Â "rmi:" ºÎºÐÀº »ý·«ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶Ç, Æ÷Æ® ¹øÈ£´Â »ý·«µÇ¸é RMI ÇÁ·ÎÅäÄÝÀÇ ±âº» Æ÷Æ®ÀÎ 1099¹øÀÌ »ç¿ëµÇ¸ç, È£½ºÆ® À̸§ÀÌ »ý·«µÇ¸é Áö¿ª È£½ºÆ®·Î °£ÁÖÇÕ´Ï´Ù. µû¶ó¼, Naming Ŭ·¡½º´Â ´ÙÀ½À» ¸ðµÎ °°Àº URL·Î ÀνÄÇÕ´Ï´Ù. rmi://localhost:1099/HelloServer //localhost:1099/HelloServer //localhost/HelloServer /HelloServer |
¿ø°Ý ¼¹ö °´Ã¼¸¦ RMI µî·ÏºÎ¿¡ µî·ÏÇÏ·Á¸é ¸ÕÀú ¿ø°Ý ¼¹ö °´Ã¼ÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÑ ´ÙÀ½ Naming Ŭ·¡½ºÀÇ bind() ȤÀº rebind() Á¤Àû ¸Þ½îµå¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù. ÁÖÀÇÇÒ Á¡Àº bind(), rebind(), unbind()´Â º¸¾È ¹®Á¦·Î Áö¿ª È£½ºÆ®¿¡¼¸¸ »ç¿ë °¡´ÉÇÏ´Ù´Â Á¡ÀÔ´Ï´Ù. °Ë»ö ±â´ÉÀ» Á¦°øÇÏ´Â lookup()À̳ª list() ¸Þ½îµå´Â ¿ø°Ý È£½ºÆ®¿¡ ´ëÇؼµµ »ç¿ë °¡´ÉÇÕ´Ï´Ù.
try { // ¿ø°Ý ¼¹ö °´Ã¼ ÀνºÅϽº¸¦ »ý¼º HelloImpl impl = new HelloImpl(); // ÀÌ °´Ã¼¸¦ Áö¿ª È£½ºÆ®¿¡ "HelloServer"¶ó´Â À̸§À¸·Î ¹ÙÀεåÇÕ´Ï´Ù. Naming.rebind("/HelloServer", impl); System.out.println("HelloServer successfully bound."); } catch (Exception e) { System.err.println("Error:"+e.getMessage()); e.printStackTrace(); }
Naming Ŭ·¡½º ´ë½Å¿¡ Registry ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ LocateRegistry Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© ¿øÇϴ ȣ½ºÆ®ÀÇ Registry °´Ã¼ ÀνºÅϽº¸¦ ±¸ÇÑ ´ÙÀ½¿¡ rebind() ¸Þ½îµå¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù.
// ÀÎÀÚ ¾ø´Â getRegistry() ¸Þ½îµå´Â Áö¿ª È£½ºÆ®ÀÇ µî·ÏºÎ¿¡ ´ëÇÑ Registry °´Ã¼¸¦ µÇµ¹¸³´Ï´Ù. LocateRegistry.getRegistry().rebind("HelloServer", impl);
bind() ¸Þ½îµå´Â RMI µî·ÏºÎ¿¡ °°Àº ¹®ÀÚ¿·Î µî·ÏµÈ ¿ø°Ý °´Ã¼°¡ ÀÖÀ¸¸é ¿¡·¯¸¦ µÇµ¹¸®Áö¸¸ rebind() ¸Þ½îµå´Â ±âÁ¸ÀÇ ¿ø°Ý °´Ã¼¸¦ µ¤¾î¾¹´Ï´Ù.
±×¸®°í, ÀÏ´Ü RMI µî·ÏºÎ¿¡ ¹ÙÀε尡 ¼º°øÇϸé main() ¸Þ½îµå°¡ Á¾·áÇÑ ÈÄ¿¡µµ RMI ½ÇÇàȯ°æÀÌ ÇÁ·Î¼¼½º°¡ Á¾·áÇÏÁö ¾Êµµ·Ï µµ¿ÍÁֹǷÎ, main() ¸Þ½îµå°¡ Á¾·áÇÔÀ» °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù.
°£´ÜÇÑ RMI µî·ÏºÎ °ü¸® ÇÁ·Î±×·¥ Áö¿ª È£½ºÆ®¿¡ rmiregistry¸¦ ½ÇÇàÇÏ°í ¿©·¯ °³ÀÇ ¼¹ö °´Ã¼¸¦ µî·ÏÇÒ ¼ö ÀÖ½À´Ï´Ù. À̶§ ÇöÀç µî·ÏµÈ °´Ã¼µéÀ» ¾Ë°í ½Í°Å³ª, Áö±Ý ¹ÙÀεåµÈ ¼¹ö °´Ã¼¸¦ ¹ÙÀεå ÇØÁöÇÏ°í ½ÍÀ» ¶§°¡ ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ °æ¿ì¿¡ °£´ÜÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Â ÇÁ·Î±×·¥À» ¼Ò°³ÇÕ´Ï´Ù. °£´ÜÇÏ°Ô Registry ÀÎÅÍÆäÀ̽º³ª Naming Ŭ·¡½ºÀÇ list() ¸Þ½îµå¿Í unbind() ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© ±¸ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù. // RegUtil.java import java.rmi.*; import java.rmi.registry.*; public class RegUtil { public static void main(String args[]) { String server = null; boolean listing = true; if (args.length < 1) { System.out.println ("Usage: java RegUtil <remote host> [list|unbind <name>]"); System.exit(1); } else { server = args[0]; if (args.length >= 3 && args[1].equals("unbind")) listing = false; } try { if (listing) { String[] list = LocateRegistry.getRegistry(server).list(); if (list.length == 0) System.out.println("Nothing bound"); else { for (int i=0; i<list.length; i++) System.out.println("name["+i+"]:"+list[i]); } } else { // unbind mode try { LocateRegistry.getRegistry(server).unbind(args[2]); System.out.println(args[2]+" unbound successfully."); } catch (NotBoundException nbe) { System.err.println("Error:"+args[2]+" is not bound."); } } > } catch (Exception e) { e.printStackTrace(); } } } <¿¹Á¦> RegUtil.java
ÀÌ ÇÁ·Î±×·¥À» »ç¿ëÇÏ¿© ÇöÀç Áö¿ª È£½ºÆ®¿¡ µî·ÏµÈ À̸§µéÀ» º¸·Á¸é µµ½º â¿¡¼ ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇÕ´Ï´Ù. java RegUtil localhost list µî·ÏµÈ HelloServer¸¦ ¹ÙÀεå ÇØÁöÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇÕ´Ï´Ù. java RegUtil localhost unbind HelloServer unbind ¸ðµå´Â º¸¾È ¹®Á¦·Î Áö¿ª È£½ºÆ®¿¡¼¸¸ ½ÇÇà °¡´ÉÇϸç list ¸ðµå´Â ´Ù¸¥ ¿ø°Ý ¼¹ö¿¡ ´ëÇؼµµ ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. |
1.2.3 RMI ¿ø°Ý ¼¹ö ÄÄÆÄÀÏ
HelloImpl.java ¼Ò½º Äڵ带 ÄÄÆÄÀÏÇÏ´Â ¹æ¹ýÀ» ¸ð¸£´Â µ¶ÀÚ´Â ¾øÀ» °ÍÀÔ´Ï´Ù. javac ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇÏ¿© °£´ÜÇÏ°Ô ÄÄÆÄÀÏÇÏ¸é µË´Ï´Ù. ¹°·Ð ÀÌ¿¡ ¾Õ¼ ÀÎÅÍÆäÀ̽º ÆÄÀÏÀÎ Hello.javaµµ ÄÄÆÄÀÏÇØµÖ¾ß ÇÕ´Ï´Ù.
javac Hello.java HelloImpl.java
ÇÏÁö¸¸, RMI ÇÁ·Î±×·¥Àº ÇѹøÀÇ ÄÄÆÄÀÏÀ» ´õ ÇÊ¿ä·Î ÇÕ´Ï´Ù. RMI ÄÄÆÄÀÏ·¯ÀÎ rmic´Â RMI ¼¹ö °´Ã¼ÀÇ ½ºÅÓ°ú ½ºÄÌ·¯Æ° Ŭ·¡½º ÆÄÀϵéÀ» »ý¼ºÇØÁÝ´Ï´Ù. rmic´Â ÀÎÀÚ·Î ¿ø°Ý ¼¹ö °´Ã¼ÀÇ Å¬·¡½º À̸§À» ÇÊ¿ä·Î ÇÕ´Ï´Ù.
rmic HelloImpl
ÄÄÆÄÀÏ °á°ú·Î ½ºÅÓ ÆÄÀÏÀÎ HelloImpl_Stub.class¿Í ½ºÄÌ·¯Æ° ÆÄÀÏ HelloImpl_Skel.class°¡ »ý¼ºµË´Ï´Ù.
½ºÅÓ ÆÄÀÏ°ú ½ºÄÌ·¯Æ° ÆÄÀÏ ¿ø°Ý °´Ã¼ÀÇ ½ºÄÌ·¯Æ° ÆÄÀÏÀº ½ÇÁ¦ ±¸ÇöµÈ ¿ø°Ý °´Ã¼¸¦ È£ÃâÇÏ´Â ¸Þ½îµå¸¦ Æ÷ÇÔÇÏ´Â ¼¹öÂÊ °´Ã¼ÀÔ´Ï´Ù. µû¶ó¼ ½ºÄÌ·¯Æ° ÆÄÀÏÀº ¼¹öÂÊ¿¡¼¸¸ ÇÊ¿ä·Î ÇÕ´Ï´Ù. JDK 1.2 ¹öÀü ÀÌÈĺÎÅÍ´Â º°µµÀÇ ½ºÄÌ·¯Æ° ÆÄÀÏÀ» ÇÊ¿ä·Î ÇÏÁö ¾Ê±â ¶§¹®¿¡, ÀÌÀü ¹öÀü°úÀÇ È£È¯¼ºÀ» À§Çؼ¸¸ Á¸ÀçÇÕ´Ï´Ù. rmic ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇÒ ¶§, -v1.2 ÀÎÀÚ¸¦ ÁÖ¸é ½ºÄÌ·¯Æ° ÆÄÀÏÀ» ¸¸µéÁö ¾Ê°í JDK 1.2 ÀÌÈÄ ¹öÀü¿¡¼¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Â ½ºÅÓ ÆÄÀÏÀ» ¸¸µé°Ô µË´Ï´Ù. ¹Ý¸é ½ºÅÓÀº ¿ø°Ý °´Ã¼¿¡ ´ëÇÑ ¸Þ½îµå È£ÃâÀ» ½ÇÁ¦ ±¸ÇöµÈ ¿ø°Ý °´Ã¼°¡ ÀÖ´Â ¼¹ö·Î Àü¼ÛÇÏ´Â ÀÏÀ» ´ã´çÇÏ´Â ´ë¸®ÀÚ ¿ªÇÒÀ» ÇÏ´Â °´Ã¼ÀÔ´Ï´Ù. Ŭ¶óÀ̾ðÆ® °´Ã¼°¡ °¡Áö°Ô µÇ´Â ¿ø°Ý °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶´Â ½ÇÁ¦·Î´Â Áö¿ªÀÇ ½ºÅÓ¿¡ ´ëÇÑ ÂüÁ¶ÀÔ´Ï´Ù. ½ºÅÓ ÆÄÀÏÀº ¼¹öÂÊ°ú Ŭ¶óÀ̾ðÆ®ÂÊ ¸ðµÎ¿¡ ÇÊ¿äÇÕ´Ï´Ù. Naming Ŭ·¡½º³ª Registry ÀÎÅÍÆäÀ̽ºÀÇ lookup() ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© RMI µî·ÏºÎ¿¡ µî·ÏµÈ ¿ø°Ý °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶¸¦ ¾òÀ» ¶§ ÀÌ ¸Þ½îµå°¡ ¹ÝȯÇÏ´Â °´Ã¼´Â ½ÇÁ¦ ¿ø°Ý ¼¹ö °´Ã¼°¡ ¾Æ´Ï¶ó ¿ø°Ý ¼¹ö¿¡ ´ëÇÑ ½ºÅÓ °´Ã¼°¡ µË´Ï´Ù.
<±×¸²> ÀÚ¹Ù ºÐ»ê °´Ã¼ ¸ðµ¨¿¡¼ ½ºÅÓ°ú ½ºÄÌ·¯Æ°ÀÇ ¿ªÇÒ
|
1.2.4 RMI ¿ø°Ý ¼¹ö ½ÇÇà
¸ÕÀú ¿ø°Ý ¼¹ö¸¦ ½ÇÇàÇϱ⿡ ¾Õ¼ RMI µî·ÏºÎ ÇÁ·Î±×·¥ÀÎ rmiregistry°¡ ½ÇÇàµÇ¾î ÀÖ¾î¾ß ¹ÙÀε带 ÇÒ ¼ö ÀÖ½À´Ï´Ù.
¿ø°Ý ¼¹ö °´Ã¼µéÀ» ½ÇÇàÇÒ ¶§ ¿ø°Ý ¼¹ö °´Ã¼°¡ À§Ä¡ÇÑ Å¬·¡½º °æ·Î¸¦ ÁöÁ¤Çϴµ¥, rmiregistry°¡ ¿ø°Ý ¼¹ö °´Ã¼µéÀ» ÁöÁ¤ÇÑ Å¬·¡½º °æ·Î·ÎºÎÅÍ ÀûÀçÇϱâ À§Çؼ´Â rmiregistry¸¦ ½ÇÇàÇÒ ¶§ CLASSPATH ȯ°æº¯¼ö¿¡ ÁöÁ¤µÈ µð·ºÅ丮µé¿¡ °°Àº À̸§ÀÇ Å¬·¡½º°¡ ¾ø¾î¾ß ÇÕ´Ï´Ù.
µû¶ó¼, rmiregistry ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¶§¿¡´Â CLASSPATH ȯ°æº¯¼ö¸¦ Áö¿î ´ÙÀ½ ½ÇÇàÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. Áï, µµ½º â¿¡¼ ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ½ÇÇàÇÕ´Ï´Ù. À¯´Ð½º ¼Ð¿¡¼µµ ÀÌ¿Í À¯»çÇÑ ¹æ¹ýÀ¸·Î ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù.
C:\> set CLASSPATH= C:\> rmiregistry
¶Ç Çϳª ¼¹ö¸¦ ½ÇÇàÇϱ⿡ ¾Õ¼ ÁÖÀÇÇÒ Á¡Àº ³×Æ®¿÷ º¸¾È Á¦¾à¿¡ °ü·ÃµÈ °ÍÀÔ´Ï´Ù. ÀÚ¹Ù 2 ÀÌÈĺÎÅÍ´Â ¾ÖÇø´ÀÌ ¾Æ´Ñ ÀÏ¹Ý ÀÚ¹Ù ÇÁ·Î±×·¥¿¡µµ º¸¾È Á¦¾à »çÇ×ÀÌ Àû¿ëµË´Ï´Ù.
JDK 1.2°¡ ÀÚ¹Ù ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ±âº»°ªÀ¸·Î Àû¿ëÇÏ´Â ³×Æ®¿÷ °ü·Ã Á¤Ã¥Àº ´ÙÀ½°ú °°½À´Ï´Ù.
permission java.net.SocketPermission "localhost:1024-", "listen";
ÀÌ Á¤Ã¥Àº Áö¿ª È£½ºÆ®ÀÇ ÀÀ¿ë ÇÁ·Î±×·¥Àº 1024¹ø ÀÌÈÄÀÇ Æ÷Æ® ¹øÈ£¿¡ ´ëÇؼ ¼ÒÄÏÀÇ listen ±â´É¸¸À» »ç¿ëÇÒ ¼ö ÀÖÀ½À» ³ªÅ¸³À´Ï´Ù. RMI ¼¹ö ÇÁ·Î±×·¥Àº ¿ÜºÎ È£½ºÆ®ÀÇ Å¬¶óÀ̾ðÆ®·ÎºÎÅÍ Á¢¼ÓÀ» Çã¿ëÇØ¾ß ÇϹǷΠÀÌ º¸¾È Á¤Ã¥À» º¯°æÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.
µû¶ó¼ ´ÙÀ½°ú °°ÀÌ º¸¾È Á¤Ã¥ ÆÄÀÏÀ» º°µµ·Î ¸¸µì´Ï´Ù. ¾Æ·¡¿¡¼ "Ŭ¶óÀ̾ðÆ® ÁÖ¼Ò"´Â ½ÇÁ¦ Á¢¼ÓÀ» Çã¿ëÇÒ Å¬¶óÀ̾ðÆ®ÀÇ ÁÖ¼Ò·Î ¹Ù²Ù¾îÁÝ´Ï´Ù.
grant { permission java.net.SocketPermission "localhost:1024-", "listen,connect,resolve"; permission java.net.SocketPermission "Ŭ¶óÀ̾ðÆ® ÁÖ¼Ò:1024-", "connect,accept,resolve"; };<¿¹Á¦> server.policy º¸¾È Á¤Ã¥ ÆÄÀÏ
ÀÌÁ¦ RMI ¿ø°Ý ¼¹ö¸¦ ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. ½ÇÇàÇÒ ¶§¿¡ º¸¾È Á¤Ã¥ ÆÄÀÏ°ú RMI ȯ°æÀÌ ¿ø°Ý ¼¹ö Ŭ·¡½º ÆÄÀϵéÀ» ãÀ» ¼ö ÀÖ´Â °æ·Î¸¦ ÁöÁ¤ÇØÁà¾ß ÇÕ´Ï´Ù. ´ÙÀ½Àº ÇØ´ç Ŭ·¡½º ÆÄÀϵéÀÌ C:\javaworks\rmi\hello\server¶ó´Â µð·ºÅ丮¿¡ À§Ä¡ÇÒ ¶§ÀÇ °æ¿ìÀÔ´Ï´Ù. ¼¼ ÁÙ·Î ³ª´µ¾î º¸ÀÌÁö¸¸ µµ½ºÃ¢¿¡ ÀÔ·ÂÇÒ ¶§¿¡´Â ¸ðµÎ °°Àº ÁÙ¿¡ ½áÁÖ¾îÇá ÇÕ´Ï´Ù. µð·ºÅ丮¸¦ ÁöÁ¤ÇÒ ¶§ ¸¶Áö¸·¿¡ µð·ºÅ丮 ±¸ºÐÀÚ('\')°¡ Çϳª ´õ Ãß°¡µÇ¾î¾ß ÇÑ´Ù´Â Á¡µµ ¸í½ÉÇϱ⠹ٶø´Ï´Ù. ¸Å¹ø ÀÌ·¸°Ô ÀÔ·ÂÇØÁÖ´Â °ÍÀÌ ±ÍÂú´Ù¸é ¹èÄ¡ ÆÄÀÏÀ» ¸¸µé¾î ½ÇÇàÇÏ´Â °Íµµ ÁÁÀº ¹æ¹ýÀÔ´Ï´Ù.
java -Djava.security.policy=server.policy -Djava.rmi.server.codebase=file:C:\javaworks\rmi\hello\server\ HelloImpl
1.2.5 RMI Ŭ¶óÀ̾ðÆ® ¸¸µé±â
RMI Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥Àº Naming Ŭ·¡½º³ª Registry ÀÎÅÍÆäÀ̽ºÀÇ lookup() ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© ¿ø°Ý ¼¹öÀÇ µî·ÏºÎ¿¡ µî·ÏµÇ¾î ÀÖ´Â ¿ø°Ý °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶¸¦ ±¸ÇÏ¸é ¿ø°Ý °´Ã¼¸¦ ¸¶À½´ë·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
try { // ¸ÕÀú ¿ø°Ý °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶¸¦ ±¸ÇÑ ´ÙÀ½ Hello obj=(Hello) Naming.lookup("//¿ø°ÝÈ£½ºÆ®À̸§/HelloServer"); // ¿ø°Ý °´Ã¼ÀÇ ¸Þ½îµå¸¦ È£ÃâÇÕ´Ï´Ù. String message = obj.hello(); } catch (RemoteException e) { }
´ÙÀ½Àº ¾ÖÇø´À¸·Î ¸¸µç RMI Ŭ¶óÀ̾ðÆ® ¿¹Á¦ÀÔ´Ï´Ù.
// HelloApplet.java import java.rmi.*; import java.applet.Applet; import java.awt.*; public class HelloApplet extends Applet { String message = null; public void init() { try { // RMI ¿ø°Ý È£½ºÆ®¿Í ¾ÖÇø´ ¹ÙÀÌÆ®Äڵ尡 À§Ä¡ÇÑ È£½ºÆ®°¡ °°½À´Ï´Ù. String url = "rmi://" + getCodeBase().getHost() + "/HelloServer"; Hello obj = (Hello) Naming.lookup(url); message = "HelloServer said \""+obj.hello()+'"'; } catch (Exception e) { message = "Error:"+e.toString(); } } public void paint(Graphics g) { if (message != null) { g.setFont(new Font("SansSerif", Font.BOLD, 20)); g.drawString(message, 10, 100); } } }<¿¹Á¦> RMI Ŭ¶óÀ̾ðÆ® ¾ÖÇø´
RMI Ŭ¶óÀ̾ðÆ®¸¦ ½ÇÇà½ÃÅ°·Á¸é ¾Õ¿¡¼µµ ¾ð±ÞÇßµíÀÌ ¿ø°Ý ÀÎÅÍÆäÀ̽º¿Í ¿ø°Ý ½ºÅÓÀÇ Å¬·¡½º ÆÄÀÏÀÌ ÇÊ¿äÇÕ´Ï´Ù. Áï, Hello.class¿Í HelloImpl_Stub.class ÆÄÀÏÀÌ ¾ÖÇø´ ¹ÙÀÌÆ®Äڵ尡 ÀÖ´Â µð·ºÅ丮¿¡ ÇÔ²² ÀÖ¾î¾ß ÇÕ´Ï´Ù.
RMI ¿ø°Ý È£½ºÆ®¸¦ ¾ÖÇø´ ¹ÙÀÌÆ®Äڵ尡 Á¸ÀçÇϴ ȣ½ºÆ® Áï, getCodeBase().getHost()¸¦ »ç¿ëÇÏ¿© ÁöÁ¤ÇÏ¿´À¸¹Ç·Î º°µµÀÇ º¸¾È Á¤Ã¥ ÆÄÀÏÀº ÇÊ¿äÇÏÁö ¾Ê½À´Ï´Ù.
¸¸¾à RMI È£½ºÆ®°¡ ¾ÖÇø´ ¹ÙÀÌÆ®Äڵ尡 Á¸ÀçÇϴ ȣ½ºÆ®¿Í ´Ù¸£´Ù¸é ´ÙÀ½°ú °°Àº º°µµÀÇ º¸¾È Á¤Ã¥ ÆÄÀÏÀ» ¸¸µé¾î ¾ÖÇø´ºä¾î¸¦ ½ÇÇà½Ãų ¼ö ÀÖ½À´Ï´Ù. ¾Æ·¡¿¡¼ "¾ÖÇø´ ¹ÙÀÌÆ®Äڵ尡 À§Ä¡ÇÏ´Â URL"Àº ½ÇÁ¦ ¾ÖÇø´ÀÇ ±â¹Ý URLÀ» ³Ö°í, "RMI ¼¹ö ÁÖ¼Ò"¿¡´Â ½ÇÁ¦ RMI ¼¹ö°¡ ½ÇÇàµÇ°í Àִ ȣ½ºÆ®ÀÇ ÁÖ¼Ò¸¦ ³Ö¾îÁÖ¸é µË´Ï´Ù.
grant codeBase "http://¾ÖÇø´ ¹ÙÀÌÆ®Äڵ尡 À§Ä¡ÇÏ´Â URL/-" { permission java.net.SocketPermission "RMI ¼¹ö ÁÖ¼Ò:1024-", "connect,resolve"; };
<¿¹Á¦> RMI Ŭ¶óÀ̾ðÆ® ¾ÖÇø´ÀÇ º¸¾È Á¤Ã¥ ÆÄÀÏ
¾ÖÇø´ºä¾î¸¦ ½ÇÇà½Ãų ¶§¿¡´Â ´ÙÀ½°ú °°ÀÌ º¸¾È Á¤Ã¥ ÆÄÀÏÀ» ÁöÁ¤ÇÏ¸é µË´Ï´Ù. (À§ÀÇ º¸¾È Á¤Ã¥ ÆÄÀÏ À̸§À» applet.policy¶ó°í °¡Á¤ÇÕ´Ï´Ù.)
appletviewer -J-Djava.security.policy=applet.policy <¾ÖÇø´À» Æ÷ÇÔÇÑ HTML ¹®¼ÀÇ URL>
ÆÁ : ³Ý½ºÄÉÀÌÇÁ Ä¿¹Â´ÏÄÉÀÌÅÍ¿¡¼ RMI ¾ÖÇø´ ½ÇÇà½ÃÅ°±â ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® »çÀÇ ÀÎÅÍ³Ý ÀͽºÇ÷η¯´Â ¾ÆÁ÷±îÁö RMI ±â¼úÀ» Áö¿øÇÏÁö ¾Ê°í Àֱ⠶§¹®¿¡ ÀͽºÇ÷η¯¿¡¼´Â RMI Ŭ¶óÀ̾ðÆ® ¾ÖÇø´À» ½ÇÇà½Ãų ¼ö ¾ø½À´Ï´Ù. ³Ý½ºÄÉÀÌÇÁ Ä¿¹Â´ÏÄÉÀÌÅÍ¿¡¼´Â RMI ¾ÖÇø´À» ½ÇÇà½Ãų ¼ö Àִµ¥ À̸¦ À§Çؼ´Â RMI °ü·Ã Äڵ带 ½ÇÇàÇϱâ Àü¿¡ ´ÙÀ½°ú °°Àº ¸Þ½îµå¸¦ È£ÃâÇÏ¿© º¸¾È °ü¸® Çã¶ôÀ» ¹Þ¾Æ¾ß ÇÕ´Ï´Ù. netscape.security.PrivilegeManager.enablePrivilege("UniversalConnect"); ÀÌ ¸Þ½îµå¸¦ ¼±¾ðÇÒ °æ¿ì ÄÄÆÄÀÏÇÒ ¶§ ´ÙÀ½°ú °°ÀÌ ³Ý½ºÄÉÀÌÇÁ ÆÐÅ°Áö¸¦ Ŭ·¡½º °æ·Î¿¡ Æ÷ÇÔ½ÃÄÑÁà¾ß ÇÕ´Ï´Ù. javac -classpath ".;C:\Program Files\NETSCAPE\Communicator\Program\java\classes\java40.jar" HelloApplet.java
³Ý½ºÄÉÀÌÇÁ ÆÐÅ°Áö°¡ ¾øÀ» °æ¿ì ÀÚ¹ÙÀÇ ÄÚ¾î ¸®Ç÷º¼Ç(Core Reflection) ±â¹ýÀ» »ç¿ëÇÏ¿© ´ÙÀ½°ú °°ÀÌ Äڵ带 °íÄ¡¸é ³Ý½ºÄÉÀÌÇÁ ÆÐÅ°Áö ¾øÀ̵µ ÄÄÆÄÀÏÇÒ ¼ö ÀÖ½À´Ï´Ù. try { Class mgr = Class.forName("netscape.security.PrivilegeManager"); Class[] classes=new Class[1]; classes[0]=String.class; java.lang.reflect.Method method = mgr.getMethod("enablePrivilege", classes); Object[] args=new Object[1]; args[0]="UniversalConnect"; method.invoke(null /*static method */, args); } catch (Exception e) { e.printStackTrace(); } ÀÌ ¾ÖÇø´À» ³Ý½ºÄÉÀÌÇÁ Ä¿¹Â´ÏÄÉÀÌÅÍ·Î ½ÇÇà½ÃÅ°¸é º¸¾È °æ°í ´ëÈ»óÀÚ°¡ ³ªÅ¸³³´Ï´Ù. ¿©±â¿¡¼ "Grant" ¹öÆ°À» ´·¯ º¸¾È »çÇ×À» Çã¿ëÇϸé RMI ¾ÖÇø´ÀÌ ½ÇÇàµÊÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.
<±×¸²> ³Ý½ºÄÉÀÌÇÁÀÇ º¸¾È °ü¸®ÀÚ
<±×¸²> ³Ý½ºÄÉÀÌÇÁ¿¡¼ ½ÇÇàµÈ RMI Ŭ¶óÀ̾ðÆ® ¾ÖÇø´
ÇÏÁö¸¸, ÀÌ°ÍÀº Áö¿ª È£½ºÆ®¿¡¼ RMI ¾ÖÇø´À» ½ÇÇàÇÑ °æ¿ìÀÌ¸ç ¿ø°Ý È£½ºÆ®ÀÇ RMI ¾ÖÇø´À» ½ÇÇàÇÏ·Á¸é º°µµÀÇ ÀüÀÚ ¼¸íÀÌ ÇÊ¿äÇÕ´Ï´Ù. |
1.3 ¿ø°Ý °´Ã¼ È°¼ºÈ
¾ÕÀÇ HelloImpl ¿ø°Ý ¼¹ö °´Ã¼´Â ¿ø°Ý ¼¹ö ÇÁ·Î±×·¥ÀÌ °è¼Ó »ì¾Æ ÀÖ¾î¾ß ÇÏ´Â ¹æ½ÄÀÎ UnicastRemoteObject Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿© ±¸ÇöÇÏ¿´½À´Ï´Ù. ¸¸¾à ¸¹Àº ¿ø°Ý ¼¹ö °´Ã¼°¡ ÇÊ¿äÇÏ°í, À̵éÀº °¡²û¾¿ È£ÃâµÉ ¶§, ÀÌ ¸ðµç ¼¹ö °´Ã¼ º°·Î ÇÁ·Î¼¼½º°¡ Ç×»ó ±¸µ¿µÇ°í ÀÖ´Ù¸é ½É°¢ÇÏ°Ô ¸®¼Ò½º°¡ ³¶ºñµÉ °ÍÀÔ´Ï´Ù. JDK 1.2 ¹öÀüºÎÅÍ´Â ÀÌ·¯ÇÑ ¹®Á¦Á¡À» ÇØ°áÇϱâ À§ÇØ ÇÊ¿äÇÒ ¶§¿¡¸¸ ¿ø°Ý ¼¹ö °´Ã¼¸¦ ÀûÀçÇÏ´Â ¿ø°Ý °´Ã¼ È°¼ºÈ ±â¼úÀ» Áö¿øÇÏ°í ÀÖ½À´Ï´Ù.
1.3.1 È°¼ºÈ °¡´ÉÇÑ ¿ø°Ý ¼¹ö ¸¸µé±â
¿ø°Ý °´Ã¼ È°¼ºÈ°¡ °¡´ÉÇϵµ·Ï ¿ø°Ý ¼¹ö¸¦ ¸¸µå´Â ¹æ¹ý Áß °£´ÜÇÑ °ÍÀº UnicastRemoteObject Ŭ·¡½º ´ë½Å¿¡ Activatable Ŭ·¡½º¸¦ »ó¼ÓÇÏ´Â °ÍÀÔ´Ï´Ù.
¿ø°Ý ¼¹ö °´Ã¼¸¦ ±¸ÇöÇÒ ¶§ UnicastRemoteObject Ŭ·¡½º¸¦ »ó¼ÓÇÒ ¶§¿Í ºñ±³Çؼ ´Þ¶óÁö´Â ºÎºÐÀº »ý¼ºÀÚÀÔ´Ï´Ù. Activatable Ŭ·¡½º¸¦ »ó¼ÓÇϰųª ȤÀº ´Ù¸¥ ¹æ¹ýÀ¸·Î ¿ø°Ý °´Ã¼ È°¼ºÈ ¹æ½ÄÀ¸·Î ¿ø°Ý ¼¹ö °´Ã¼¸¦ ±¸ÇöÇÒ °æ¿ì¿¡´Â ¹Ýµå½Ã ´ÙÀ½°ú °°ÀÌ µÎ °³ÀÇ ÀÎÀÚ¸¦ °¡Áö¸ç publicÀÎ »ý¼ºÀÚ¸¦ ±¸ÇöÇÏ¿©¾ß ÇÕ´Ï´Ù. ³ªÁß¿¡ ÀÚ¹Ù °¡»ó ±â°è°¡ ½ÇÁ¦·Î ¿ø°Ý °´Ã¼¸¦ »ý¼ºÇÒ ¶§ ÀÌ »ý¼ºÀÚ¸¦ »ç¿ëÇϱ⠶§¹®ÀÔ´Ï´Ù.
public AnActivatableRemoteServer (ActivationID id, MarshalledObject data);
¶Ç, Activatable Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿© ±¸ÇöÇÏ´Â °æ¿ì, ÀÌ »ý¼ºÀÚÀÇ Ã¹ ¹ø° ÁÙ¿¡´Â ¹Ýµå½Ã ´ÙÀ½°ú °°Àº ÇüÅÂÀÇ Activatable Ŭ·¡½º »ý¼ºÀÚ¸¦ È£ÃâÇÏ¿©¾ß ÇÕ´Ï´Ù.
protected Activatable(ActivationID id, int port) throws java.rmi.RemoteException;
ÀÌ »ý¼ºÀÚ´Â °´Ã¼¸¦ ÁöÁ¤µÈ Æ÷Æ®·Î ÀͽºÆ÷Æ®ÇÏ´Â ÀÏÀ» ¼öÇàÇÕ´Ï´Ù.
ÀÌ ¿Ü¿¡ ¿ø°Ý È°¼ºÈ°¡ °¡´ÉÇÑ ¼¹ö °´Ã¼¸¦ ±¸ÇöÇÒ ¶§¿¡ ÁÖÀÇÇÒ Á¡À¸·Î´Â ÀÚ¹Ù °¡»ó ±â°è°¡ ÇÊ¿äÇÒ ¶§¿¡ ÀÌ °´Ã¼¸¦ È£ÃâÇϱ⠶§¹®¿¡ ¿ÜºÎ ÆÐÅ°Áö¿¡¼µµ Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï Ŭ·¡½º°¡ publicÀ¸·Î ¼±¾ðµÇ¾î¾ß ÇÑ´Ù´Â Á¡ÀÔ´Ï´Ù.
ÀÌ·± Á¡µéÀ» ¿°µÎ¿¡ µÎ°í ¾ÕÀÇ HelloImpl ¼¹ö °´Ã¼¸¦ ¿ø°Ý È°¼ºÈ°¡ °¡´ÉÇÑ ¼¹ö °´Ã¼·Î ¹Ù²ãº¾½Ã´Ù. ¹Ù²ï ºÎºÐÀº º¼µåü·Î Ç¥½ÃÇÏ¿´½À´Ï´Ù.
// ActivatableHelloImpl.java import java.rmi.*; import java.rmi.activation.*; public class ActivatableHelloImpl extends Activatable implements Hello { // ¿ø°Ý È°¼ºÈ¸¦ Áö¿øÇÏ´Â °´Ã¼¸¦ À§ÇÑ Æ¯º°ÇÑ »ý¼ºÀÚ // ³ªÁß¿¡ ÀÚ¹Ù VMÀÌ È£ÃâÇÒ ¼ö ÀÖµµ·Ï ¹Ýµå½Ã publicÀ̾î¾ß ÇÕ´Ï´Ù. public ActivatableHelloImpl (ActivationID id, MarshalledObject data) throws RemoteException { // ¹Ýµå½Ã ºÎ¸ðÀÎ Activatable Ŭ·¡½ºÀÇ ÀÌ »ý¼ºÀÚ¸¦ È£Ãâ super(id, 0/* 0¹øÀº ºÒƯÁ¤ Æ÷Æ® */); } // Hello ÀÎÅÍÆäÀ̽º ¸Þ½îµå¸¦ ±¸ÇöÇÕ´Ï´Ù. public String hello() throws RemoteException { return "Hello, Remotely Activatable World!"; } }
<¿¹Á¦> È°¼ºÈ °¡´ÉÇÑ ActivatableHelloImpl ¿ø°Ý ¼¹ö Ŭ·¡½º
1.3.2 È°¼ºÈ °¡´ÉÇÑ ¿ø°Ý ¼¹ö µî·Ï ÇÁ·Î±×·¥ ¸¸µé±â
¿ø°Ý ¼¹ö °´Ã¼¸¦ »ý¼ºÇÏ´Â ¹æ¹ýÀº ¾î·ÆÁö ¾ÊÁö¸¸, Ŭ¶óÀ̾ðÆ® °´Ã¼ÀÇ Á¢¼Ó ¿äû¿¡ µû¶ó ÀÌ ¼¹ö °´Ã¼¸¦ ÀÚ¹ÙÀÇ RMI È°¼ºÈ µ¥¸ó Áï, rmid°¡ È°¼ºÈ½Ãų ¼ö ÀÖµµ·Ï ÇÏ´Â µ¥¿¡´Â ¸î °¡Áö ÇÊ¿äÇÑ °ÍµéÀÌ ÀÖ½À´Ï´Ù.
¿ø°Ý °´Ã¼¸¦ µ¿ÀûÀ¸·Î »ý¼ºÇÏ´Â µ¥ ÇÊ¿äÇÑ Å¬·¡½º À̸§, º¸¾È Á¤Ã¥ ÆÄÀÏ, Ŭ·¡½º °æ·Î µîÀÇ Á¤º¸¸¦ ÀÚ¹ÙÀÇ È°¼ºÈ ½Ã½ºÅÛ¿¡ µî·ÏÇØÁÖ¾î¾ß ÇÏ°í, ¶Ç, ƯÁ¤ÇÑ Æ÷Æ®·Î ÀͽºÆ÷Æ®ÇÏ¿©¾ß ÇÕ´Ï´Ù.
¿ø°Ý È°¼ºÈ¿¡ °ü°èµÈ ¿©·¯ ÀÎÅÍÆäÀ̽º¿Í Ŭ·¡½ºµéÀº java.rmi.activation ÆÐÅ°Áö¿¡ ÀÖ½À´Ï´Ù.
Ŭ·¡½º/ÀÎÅÍÆäÀ̽º |
¼³¸í |
Activatable Ŭ·¡½º |
È°¼º °¡´ÉÇÑ ¿ø°Ý °´Ã¼¸¦ µî·ÏºÎ¿¡ µî·ÏÇÏ°í ƯÁ¤ÇÑ Æ÷Æ®¿¡ ÀͽºÆ÷Æ®ÇÏ´Â ÀÏÀ» ÇÕ´Ï´Ù. |
ActivationGroup Ŭ·¡½º |
±×·ì ¾È¿¡¼ È°¼ºÈ °¡´ÉÇÑ °´Ã¼µéÀ» »ý¼ºÇÏ´Â ÀÏÀ» ÇÕ´Ï´Ù. |
ActivationGroupDesc Ŭ·¡½º |
°°Àº ÀÚ¹Ù °¡»ó ±â°è ¾ÈÀÇ °´Ã¼µéÀ» È°¼ºÈ½ÃÅ°´Â È°¼ºÈ ±×·ìÀ» »ý¼ºÇϰųª ´Ù½Ã »ý¼ºÇÏ´Â µ¥ ÇÊ¿äÇÑ Á¤º¸(Ŭ·¡½º À̸§°ú Ŭ·¡½º °æ·Î, °´Ã¼¿¡ ƯÁ¤ÇÑ ÃʱâÈ µ¥ÀÌÅÍ µî)¸¦ À¯ÁöÇÕ´Ï´Ù. |
ActivationGroupID Ŭ·¡½º |
È°¼ºÈ ½Ã½ºÅÛ ¾È¿¡¼ ±×·ìÀ» ½Äº°ÇÏ´Â Á¤º¸¿Í È°¼ºÈ ½Ã½ºÅÛ¿¡ ´ëÇÑ ÂüÁ¶¸¦ °¡Áö°í ÀÖ½À´Ï´Ù. |
ActivationDesc Ŭ·¡½º |
±×·ì ½Äº°ÀÚ, °´Ã¼ÀÇ Å¬·¡½º À̸§, Ŭ·¡½º °æ·Î, ÃʱâÈ µ¥ÀÌÅÍ µî °´Ã¼¸¦ È°¼ºÈÇÏ´Â µ¥ ÇÊ¿äÇÑ Á¤º¸¸¦ À¯ÁöÇÕ´Ï´Ù. |
ActivationID Ŭ·¡½º |
°´Ã¼ÀÇ ½Äº°ÀÚ¿Í ¿ø°Ý ÂüÁ¶ Á¤º¸¸¦ À¯ÁöÇÕ´Ï´Ù. |
ActivationSystem ÀÎÅÍÆäÀ̽º |
È°¼ºÈ ±×·ì°ú È°¼ºÈ °¡´É ¿ø°Ý °´Ã¼¸¦ µî·Ï ¶Ç´Â µî·Ï ÇØÁöÇÏ´Â ÀÏÀ» ¼öÇàÇÕ´Ï´Ù. |
<Ç¥> activation ÆÐÅ°ÁöÀÇ ÁÖ¿ä Ŭ·¡½º¿Í ÀÎÅÍÆäÀ̽º
È°¼ºÈ °¡´ÉÇÑ ¿ø°Ý °´Ã¼¸¦ µî·ÏÇÏ°í ÀͽºÆ÷Æ®ÇÏ´Â ¹æ¹ýÀº ÀϹÝÀûÀ¸·Î ´ÙÀ½ ¼ø¼¸¦ µû¸¨´Ï´Ù.
¨ç ¸ÕÀú RMI¿¡ ÇÊ¿äÇÑ º¸¾È °ü¸®ÀÚ¸¦ ÁöÁ¤ÇÕ´Ï´Ù.
System.setSecurityManager(new RMISecurityManager( ));
¨è È°¼ºÈ °¡´ÉÇÑ ¿ø°Ý ¼¹ö °´Ã¼¸¦ »ý¼ºÇϴ åÀÓÀ» Áö´Â ActivationGroup °´Ã¼¸¦ »ý¼ºÇÕ´Ï´Ù.
ActivationGroup °´Ã¼¸¦ »ý¼ºÇϱâ À§Çؼ´Â ¸ÕÀú ActivationGroupDesc °´Ã¼¸¦ µî·ÏÇÏ¿© ÀÚ¹ÙÀÇ È°¼ºÈ ½Ã½ºÅÛÀÌ ÁöÁ¤ÇØÁÖ´Â ±×·ìÀÇ ½Äº°ÀÚ¸¦ ¾Ë¾Æ¾ß ÇÕ´Ï´Ù. ActivationGroupDesc Ŭ·¡½º´Â ActivationGroupÀ» »ý¼ºÇÏ´Â µ¥ ÇÊ¿äÇÑ ¿©·¯ °¡Áö ȯ°æ Á¤º¸¸¦ À¯ÁöÇϴ Ŭ·¡½ºÀÔ´Ï´Ù.
// º¸¾È Á¤Ã¥ ÆÄÀÏÀ» ȯ°æ ¼Ó¼º¿¡¼ ÁöÁ¤ Properties props = new Properties(); props.put("java.security.policy", "C:\\javaworks\\rmi\\hello\\server\\server.policy"); // ÁöÁ¤ÇÑ ¼Ó¼ºÀ» °¡Áö´Â È°¼ºÈ ±×·ì ȯ°æ °´Ã¼ »ý¼º ActivationGroupDesc actGroup = new ActivationGroupDesc(props, null); // È°¼ºÈ ±×·ìÀ» µî·ÏÇÏ°í ID¸¦ ÀúÀå ActivationGroupID gid = ActivationGroup.getSystem().registerGroup(actGroup); // È°¼ºÈ ±×·ìÀ» »ý¼º ActivationGroup.createGroup(gid, actGroup, 0);
¨é ActivationDesc Ŭ·¡½º´Â ¿ø°Ý ¼¹ö °´Ã¼¸¦ È°¼ºÈÇÏ´Â µ¥ ÇÊ¿äÇÑ È¯°æ Á¤º¸ Áï, ±×·ì ID, ¼¹ö °´Ã¼ÀÇ Å¬·¡½º À̸§, Ŭ·¡½º À§Ä¡, Ãʱ⠵¥ÀÌÅÍ °´Ã¼ µîÀ» ´ã°í ÀÖ½À´Ï´Ù. µû¶ó¼, ActivationDesc °´Ã¼°¡ ¼¹ö °´Ã¼ µî·Ï¿¡ ÇÊ¿äÇÕ´Ï´Ù.
// È°¼ºÈ ȯ°æ °´Ã¼ »ý¼º ActivationDesc desc = new ActivationDesc("ActivatableHelloImpl", // ¼¹ö °´Ã¼ÀÇ Å¬·¡½º À̸§ "file:C:\\javaworks\\rmi\\hello\\server\\", // Ŭ·¡½º °æ·Î (MarshalledObject) null // ÃʱâÈ µ¥ÀÌÅÍ );
¨ê »ý¼ºÇÑ ActivationDesc °´Ã¼¸¦ »ç¿ëÇÏ¿© ¿ø°Ý ¼¹ö °´Ã¼¸¦ µî·ÏÇÕ´Ï´Ù. Activatable Ŭ·¡½ºÀÇ register() ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© ¼¹ö °´Ã¼¸¦ rmid ¿ø°Ý È°¼ºÈ µ¥¸ó¿¡ µî·ÏÇÒ ¶§¿¡´Â UnicastRemoteObject Ŭ·¡½º¸¦ »ó¼ÓÇÒ ¶§Ã³·³ ¿ø°Ý ¼¹ö °´Ã¼¸¦ Á÷Á¢ »ý¼ºÇÒ ÇÊ¿ä°¡ ¾ø½À´Ï´Ù. ÀÏ´Ü µî·ÏµÇ°í ³ª¸é Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû¿¡ µû¶ó ÀÚ¹Ù °¡»ó ±â°è°¡ ActivationDesc °´Ã¼ Á¤º¸¸¦ ÂüÁ¶ÇÏ¿© ¿ø°Ý ¼¹ö °´Ã¼¸¦ È°¼ºÈÇÏ°Ô µË´Ï´Ù. register() ¸Þ½îµå°¡ ¹ÝȯÇÏ´Â °´Ã¼´Â ¿ø°Ý ¼¹öÀÇ ½ºÅÓ °´Ã¼ÀÔ´Ï´Ù.
Hello hello = (Hello) Activatable.register(desc);
¨ë register() ¸Þ½îµå°¡ ¹ÝȯÇÑ ¿ø°Ý ¼¹öÀÇ ½ºÅÓ °´Ã¼¸¦ rmiregistry Áï, RMI µî·ÏºÎ¿¡ ¹ÙÀεåÇÏ¿© Ŭ¶óÀ̾ðÆ®°¡ ƯÁ¤ÇÑ ¹®ÀÚ¿·Î ¿ø°Ý ¼¹ö °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶¸¦ ¾òÀ» ¼ö ÀÖµµ·Ï ÇÕ´Ï´Ù.
Naming.rebind("HelloServer", hello);
¨ì ¾Õ¿¡¼ ¹è¿üµíÀÌ ÀÚ¹ÙÀÇ RMI ½Ã½ºÅÛ¿¡ ÀÏ´Ü ¹ÙÀεåµÇ¸é main() ¸Þ½îµå°¡ Á¾·áÇÏ´õ¶óµµ ÇÁ·Î¼¼½º°¡ Á¾·áÇÏÁö ¾Ê½À´Ï´Ù. ¿ø°Ý È°¼ºÈ ¹æ½Ä¿¡¼´Â ÇÁ·Î¼¼½º°¡ °è¼Ó »ì¾Æ ÀÖÀ» ÇÊ¿ä°¡ ¾øÀ¸¹Ç·Î ¸í½ÃÀûÀ¸·Î Á¾·áÇÏ¸é ¿ø°Ý ¼¹ö µî·Ï ¹× ÀͽºÆ÷Æ® °úÁ¤ÀÌ ³¡³³´Ï´Ù.
System.exit(0);
´ÙÀ½Àº ActivatableHelloImpl ¿ø°Ý ¼¹ö¸¦ µî·ÏÇÏ°í ÀͽºÆ÷Æ®ÇÏ´Â Setup Ŭ·¡½ºÀÔ´Ï´Ù.
// Setup.java class Setup { public static void main(String args[]) { try { // RMI º¸¾È °ü¸®ÀÚ ÁöÁ¤ System.setSecurityManager(new RMISecurityManager()); // È°¼ºÈ ±×·ì ¸¸µé±â Properties properties = new Properties(); properties.put("java.security.policy", "C:\\javaworks\\rmi\\hello\\server\\server.policy"); ActivationGroupDesc actGroup = new ActivationGroupDesc(properties, (ActivationGroupDesc.CommandEnvironment) null); ActivationGroupID groupID = ActivationGroup.getSystem().registerGroup(actGroup); ActivationGroup.createGroup(groupID, actGroup, 0); // È°¼ºÈ ȯ°æ °´Ã¼ »ý¼º ActivationDesc desc = new ActivationDesc ("ActivatableHelloImpl", "file:C:\\javaworks\\rmi\\hello\\server\\", (MarshalledObject) null); // ¿ø°Ý °´Ã¼ µî·ÏÇÏ¿© ½ºÅÓ¿¡ ´ëÇÑ ÂüÁ¶¸¦ ±¸ÇÕ´Ï´Ù. Hello hello = (Hello) Activatable.register(desc); System.out.println("Registered and got stub"); // ½ºÅÓÀ» RMI µî·ÏºÎ¿¡ ¹ÙÀεåÇÕ´Ï´Ù. Naming.rebind("HelloServer", hello); System.out.println("Successfully bound"); // ¸í½ÃÀûÀ¸·Î Á¾·áÇÕ´Ï´Ù. System.exit(0); } catch (Exception e) { System.err.println("Error:"+e.getMessage()); e.printStackTrace(); } } }
<¿¹Á¦> ActivatableHelloImpl ¿ø°Ý ¼¹ö¸¦ µî·ÏÇÏ°í ÀͽºÆ÷Æ®ÇÏ´Â Setup Ŭ·¡½º
1.3.3 È°¼ºÈ °¡´ÉÇÑ ¿ø°Ý ¼¹ö ÄÄÆÄÀÏ°ú ½ÇÇà
ÄÄÆÄÀÏÀº È°¼ºÈ°¡ ¾Æ´Ñ ¿ø°Ý ¼¹ö °´Ã¼ÀÇ °æ¿ì¿Í ´Ù¸¦ °ÍÀÌ ¾ø½À´Ï´Ù.
javac Hello.java ActivatableHelloImpl.java Setup.java rmic ActivatableHelloImpl
¿ø°Ý È°¼ºÈ ±â´ÉÀ» »ç¿ëÇϱâ À§Çؼ´Â ¸ÕÀú RMI µî·ÏºÎ ÇÁ·Î±×·¥°ú RMI È°¼ºÈ µ¥¸óÀÌ ½ÇÇàµÇ¾î ÀÖ¾î¾ß ÇÕ´Ï´Ù.
º°µµÀÇ µµ½º â¿¡¼ rmiregistry¿Í rmid¸¦ °¢°¢
½ÇÇàÇϵµ·Ï ÇÕ´Ï´Ù. ÀÌ ¶§¿¡µµ rmiregistry¿Í rmidÀÇ Å¬·¡½º °æ·Î¿¡ ¿ø°Ý
¼¹ö Ŭ·¡½º°¡ ÀÖÀ¸¸é °¢ ¿ø°Ý ¼¹ö °´Ã¼°¡ µî·ÏÇÒ ¶§ ÁöÁ¤ÇÑ °æ·Î¸¦
»ç¿ëÇÏÁö ¾Ê°í ÀÚ½ÅÀÇ Å¬·¡½º °æ·Î¿¡¼ ¿ì¼±ÀûÀ¸·Î ¿ø°Ý ¼¹ö Ŭ·¡½º¸¦
ÀûÀçÇÏ·Á ÇϹǷΠCLASSPATH ȯ°æº¯¼ö¸¦ ¼³Á¤ ÇØÁöÇÑ ÈÄ¿¡ ½ÇÇàÇÏ´Â °Ô
ÁÁ½À´Ï´Ù.
JDK 1.4.2¿¡¼´Â rmid¿¡ º¸¾È ±ÇÇÑÀ» ÁöÁ¤ÇØÁà¾ß ÇÕ´Ï´Ù.
rmid.policy ÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.
grant { com.sun.rmi.rmid.ExecOptionPermission "-Djava.security.policy=C:\\javaworks\\rmi\\hello\\server\\server.policy"; };
set CLASSPATH= rmiregistry rmid -J-Djava.security.policy=rmid.policy
¿ø°Ý ¼¹ö °´Ã¼¸¦ µî·ÏÇÏ°í ÀͽºÆ÷Æ®Çϱâ À§Çؼ´Â Setup Ŭ·¡½º¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù. ±×·±µ¥ Setup Ŭ·¡½º¸¦ ½ÇÇàÇÏ´Â µ¥¿¡´Â ´ÙÀ½°ú °°ÀÌ ¸î °¡Áö ±ÇÇÑÀÌ ÇÊ¿äÇÕ´Ï´Ù.
grant { permission java.net.SocketPermission "localhost:1024-", "listen,connect,resolve"; permission java.net.SocketPermission "ÀÚ½ÅÀÇ È£½ºÆ® IP ÁÖ¼Ò:1024-", "listen,connect,resolve"; permission java.lang.RuntimePermission "setFactory"; };
<¿¹Á¦> Setup Ŭ·¡½º¸¦ ½ÇÇàÇÏ´Â µ¥ ÇÊ¿äÇÑ º¸¾È Á¤Ã¥ ÆÄÀÏ
ÀÌ ±ÇÇѵéÀº ¼¹ö °´Ã¼¸¦ µî·ÏÇÏ°í ÀͽºÆ÷Æ®ÇÏ´Â µ¥ ÇÊ¿äÇÑ °ÍÀε¥ Setup Ŭ·¡½º´Â ¼¹ö °´Ã¼¸¦ µî·ÏÇϱâ À§ÇØ ÇÑ ¹ø¸¸ ½ÇÇàÇÒ °ÍÀ̹ǷΠ¸ðµç ±ÇÇÑÀ» ¿¾îÁ൵ ¹®Á¦µÇÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ½ÇÁ¦ ¿ø°Ý ¼¹ö¸¦ ½ÇÇàÇÒ ¶§ »ç¿ëµÇ´Â º¸¾È Á¤Ã¥ ÆÄÀÏÀº Äڵ忡¼ ActivationGroup °´Ã¼¸¦ ¸¸µé ¶§ ÀÌ¹Ì ÁöÁ¤Çß´Ù´Â °ÍÀ» ÀØÁö ¸¶½Ê½Ã¿À.
grant { permission java.security.AllPermission; };
<¿¹Á¦> ¸ðµç ±ÇÇÑÀ» ÁÖ´Â º¸¾È Á¤Ã¥ ÆÄÀÏ setup.policy
Setup Ŭ·¡½º¸¦ ½ÇÇàÇÒ ¶§¿¡´Â À§ÀÇ º¸¾È Á¤Ã¥ ÆÄÀÏÀ» º¸¾È Á¤Ã¥À¸·Î ÁöÁ¤ÇÏ¿© ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇÕ´Ï´Ù.
java -Djava.security.policy=setup.policy -Djava.rmi.server.codebase=file:C:\javaworks\rmi\hello\actserver\ Setup
¼¼ ÁÙ·Î ³ª´©¾î¼ Ç¥½ÃÇßÁö¸¸ µµ½º â¿¡¼ ÀÔ·ÂÇÒ ¶§¿¡´Â ¸ðµÎ °°Àº ÁÙ¿¡ ½áÁÖ¾î¾ß ÇÕ´Ï´Ù. Á¦´ë·Î ¼öÇàÀÌ ¿Ï·áµÇ¾úÀ¸¸é ´ÙÀ½°ú °°Àº ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ¸é¼ Á¾·áÇÒ °ÍÀÔ´Ï´Ù.
Registered and got stub Successfully bound
ÀÌÁ¦ Ŭ¶óÀ̾ðÆ®¸¦ ½ÇÇàÇÏ¿© ±× °á°ú¸¦ ¾Ë¾Æº¼ Â÷·ÊÀÔ´Ï´Ù. Ŭ¶óÀ̾ðÆ®´Â HelloImpl ¿ø°Ý ¼¹ö¸¦ »ç¿ëÇϱâ À§ÇØ ¸¸µé¾ú´ø HelloAppletÀ» ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ÜÁö ActivatableHelloImpl Ŭ·¡½º¸¦ rmic ÄÄÆÄÀÏ·¯·Î ÄÄÆÄÀÏÇÏ¿© ¸¸µç ActivatableHelloImpl_Stub.class ½ºÅÓ ÆÄÀÏÀ» Ãß°¡·Î ¾ÖÇø´ÀÇ Å¬·¡½º °æ·Î¿¡ º¹»çÇϱ⸸ ÇÏ¸é µË´Ï´Ù.
¾ÖÇø´¿¡¼ ´ÙÀ½ ¹®ÀÚ¿À» º¼ ¼ö ÀÖ½À´Ï±î?
HelloServer said "Hello, Remotely Activatable World!"
1.4 µ¿Àû Ŭ·¡½º ´Ù¿î·Îµå
RMI´Â ½ºÅÓ ÆÄÀÏÀ̳ª ÀÎÀÚ·Î ³Ñ°ÜÁø Ŭ·¡½º ÆÄÀÏÀ» µ¿ÀûÀ¸·Î ´Ù¿î·ÎµåÇÒ ¼ö ÀÖµµ·Ï ÇÏ°í ÀÖ½À´Ï´Ù. Áï, Ŭ¶óÀ̾ðÆ®°¡ ¿ø°Ý °´Ã¼¸¦ lookupÇÒ ¶§ ½ºÅÓ ÆÄÀÏÀÌ Å¬¶óÀ̾ðÆ® ÂÊ¿¡ ¾øÀ» °æ¿ì ÁöÁ¤µÈ URLÀ» ÅëÇØ Ã£°Ô µÇ´Âµ¥ http url·Î µÇ¾î ÀÖÀ¸¸é ÇØ´ç ¼¹öÀÇ À¥¼¹ö·ÎºÎÅÍ ÀÚµ¿À¸·Î ´Ù¿î·ÎµåÇÏ¿© ·ÎÄÿ¡ ¼³Ä¡ÇÏ°Ô µË´Ï´Ù.
ÀÌ ¶§ »ç¿ëÇÏ´Â °ÍÀÌ java.rmi.server.codebase ¿É¼ÇÀÔ´Ï´Ù. ¾Æ·¡ ½ÇÇà ¿¹´Â ¾Õ¿¡¼ ¸¸µç rmi unicast serverÀ» ½ÇÇàÇÏ´Â Ä¿¸Çµå ¶óÀο¡¼ java.rmi.server.codebase ¿É¼ÇÀ» http url·Î ÁÖ´Â ¿¹ÀÔ´Ï´Ù. ÀÌ ¶§ Ŭ¶óÀ̾ðÆ®°¡ ·ÎÄà Ŭ·¡½º°æ·Î¿¡ ½ºÅÓ Å¬·¡½º ÆÄÀÏÀÌ ¾øÀ» °æ¿ì ÁöÁ¤µÈ url·ÎºÎÅÍ ÇØ´ç ½ºÅÓ Å¬·¡½º¸¦ ´Ù¿î·Îµå¸¦ ½ÃµµÇÏ°Ô µË´Ï´Ù. Á÷Á¢ Å×½ºÆ®Çغ¸½Ã±â ¹Ù¶ø´Ï´Ù.
java -Djava.security.policy=server.policy -Djava.rmi.server.codebase=http://java.freehosting.co.kr/tutorial/rmi/hello/server/ HelloImpl
2.CORBA
ÀÚ¹ÙÀÇ ¿ø°Ý ¸Þ½îµå È£ÃâÀº ³×Æ®¿÷À» °¡·ÎÁú·¯ ÀÚ¹Ù °´Ã¼µé °£ÀÇ Åë½ÅÀ» °¡´ÉÇÏ°Ô ÇØÁÖ´Â ÇÁ·ÎÅäÄÝÀÔ´Ï´Ù. ÀÌ¿¡ ¹ÝÇØ °ø¿ë °´Ã¼ ¿äû ºê·ÎÄ¿ ¾ÆÅ°ÅØó Áï, CORBA´Â ³×Æ®¿÷À» °¡·ÎÁú·¯ ´Ù¾çÇÑ ¾ð¾î·Î ÀÛ¼ºµÈ °´Ã¼µé °£ÀÇ Åë½ÅÀ» °¡´ÉÇÏ°Ô ÇØÁÝ´Ï´Ù. Áï, »ó´ë¹æ °´Ã¼°¡ ÀÚ¹Ù °´Ã¼°¡ ¾Æ´Ï¶ó C/C++, ÄÚº¼°ú °°Àº ¾ð¾î·Î ÀÛ¼ºµÈ °´Ã¼ÀÏ ¶§¿¡µµ °´Ã¼ ¼öÁØÀÇ Åë½ÅÀ» °¡´ÉÇÏ°Ô ÇØÁÖ´Â °ÍÀÔ´Ï´Ù.
CORBAÀÇ ¶ÇÇϳª Áß¿äÇÑ Æ¯Â¡Àº OMG(Object Management GroupÀÇ ¾àÀÚ)¶ó´Â ¿©·¯ ȸ»ç¿Í Á¶Á÷µé·Î ±¸¼ºµÈ ÄÁ¼Ò½Ã¾ö¿¡¼ °³¹ßÇÏ°í ¹ßÀü½ÃÄѳª°¡´Â °³¹æÇü Ç¥ÁØÀ̶ó´Â Á¡ÀÔ´Ï´Ù. OMG´Â 1989³â¿¡ ¼³¸³µÈ ÀÌÈÄ ¿©·¯ °´Ã¼ ÁöÇâ ¼ÒÇÁÆ®¿þ¾î Ç¥ÁØ°ú ÁöħÀ» ¸¸µé¾î ÄÄÆ÷³ÍÆ® ±â¹ÝÀÇ ¼ÒÇÁÆ®¿þ¾î °³¹ßÀ» µµ¸ðÇÏ´Â ÀÏÀ» ÇØ¿Ô½À´Ï´Ù. CORBA´Â ÀÌ ³ë·ÂÀÇ »ê¹° Áß Çϳª·Î, ºÐ»ê ȯ°æÀÇ °´Ã¼ ÁöÇ⠽ýºÅÛÀ» °³¹ßÇϴ ǥÁØ ¾ÆÅ°ÅØó¸¦ Á¦°øÇÕ´Ï´Ù. Áï, CORBA´Â ¾î¶² ƯÁ¤ ¾ð¾î·Î ÀÛ¼ºµÈ Ŭ¶óÀ̾ðÆ® °´Ã¼°¡ ´Ù¸¥ ¾ð¾î·Î ÀÛ¼ºµÈ ¿ø°ÝÁöÀÇ ¼¹ö °´Ã¼ÀÇ ¸Þ½îµå¸¦ È£ÃâÇϴ ǥÁØÀûÀÎ ¹æ¹ýÀ» Á¦°øÇÏ´Â °ÍÀÔ´Ï´Ù.
OMGÀÇ °ø½Ä URLÀº http://www.omg.orgÀÔ´Ï´Ù. ¿©±â¿¡¼ CORBA¸¦ ºñ·ÔÇÑ ¿©·¯ °¡Áö °´Ã¼ Ç¥ÁØ¿¡ ´ëÇÑ Á¤º¸ ¹× °ü·ÃµÈ °ø°³ ¼ÒÇÁÆ®¿þ¾îµéÀ» ±¸ÇÒ ¼ö ÀÖ½À´Ï´Ù.
2.1 CORBA¸¦ »ç¿ëÇÑ ¿ø°Ý °´Ã¼ Åë½Å
CORBA´Â ¿ø°Ý °´Ã¼ Åë½ÅÀ» À§ÇØ RMIÀÇ °æ¿ì¿Í ºñ½ÁÇÑ ¹æ½ÄÀ¸·Î ½ºÅÓ°ú ½ºÄÌ·¯Æ°À» »ç¿ëÇÕ´Ï´Ù.
CORBA¿¡¼ ½ºÅÓÀº ¿ø°Ý °´Ã¼¿¡ ´ëÀÀµÇ´Â Áö¿ªÀÇ ´ë¸®ÀÚÀÌ¸ç ¼¹ö °´Ã¼¿Í °°Àº ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ°í ÀÖÁö¸¸ Ŭ¶óÀ̾ðÆ®¿Í °°Àº Áö¿ª È£½ºÆ®¿¡ Á¸ÀçÇÕ´Ï´Ù.
½ºÄÌ·¯Æ°Àº ±¸ÇöµÈ ¼¹ö °´Ã¼¿¡ ´ëÇÑ ¿ø°ÝÁöÀÇ ÀÎÅÍÆäÀ̽ºÀÔ´Ï´Ù. ¼¹ö °´Ã¼¿Í °°Àº È£½ºÆ®¿¡ Á¸ÀçÇÏ¸ç ±¸ÇöµÈ ¼¹ö °´Ã¼¿Í ´Ù¸¥ °´Ã¼ »çÀÌÀÇ ÀÎÅÍÆäÀ̽º ¿ªÇÒÀ» ÇÕ´Ï´Ù.
½ºÅÓ°ú ½ºÄÌ·¯Æ°Àº °´Ã¼ ¿äû ºê·ÎÄ¿(ORB)¸¦ ÅëÇØ ¿¬°áµË´Ï´Ù. ORB´Â CORBA °´Ã¼µéÀÌ ¼·Î Åë½ÅÇÒ ¼ö ÀÖ´Â ºÐ»ê ȯ°æÀ» Á¦°øÇÏ´Â ÇÁ·Î¼¼½º¿Í ¶óÀ̺귯¸® µîÀÇ ÅëĪÀÔ´Ï´Ù.
ORB´Â ±×¸²¿¡¼ º¼ ¼ö ÀÖµíÀÌ ½ºÅÓÀ¸·ÎºÎÅÍÀÇ ¸Þ½îµå È£ÃâÀ» ½ºÄÌ·¯Æ°À¸·Î Àü´ÞÇÕ´Ï´Ù. À̶§ ¼¹ö¿Í °°Àº È£½ºÆ®¿¡ Á¸ÀçÇÏ´Â °´Ã¼ ¾î´ðÅÍ(OA)¶ó´Â Ưº°ÇÑ °´Ã¼°¡ »ç¿ëµË´Ï´Ù. °´Ã¼ ¾î´ðÅÍ´Â ÇÊ¿äÇÒ ¶§ ¼¹ö °´Ã¼¸¦ È°¼ºÈ½ÃÅ°°í ¼¹ö °´Ã¼ µ¿ÀÛ °ü¸®¸¦ µ½´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. °´Ã¼ ¾î´ðÅÍ´Â ÀÚ¹Ù RMIÀÇ ¿ø°Ý µî·ÏºÎ¿Í ºñ½ÁÇÑ ¿ªÇÒÀ» ÇÑ´Ù°í »ý°¢ÇÏ¸é µË´Ï´Ù.
<±×¸²> CORBA¸¦ »ç¿ëÇÑ ¿ø°Ý °´Ã¼ Åë½Å
2.2 IDL°ú JavaÀÇ ¸ÅÇÎ
CORBA´Â ÇÁ·Î±×·¡¹Ö ¾ð¾î·ÎºÎÅÍ µ¶¸³ÀûÀ¸·Î ¿ø°Ý Åë½Å¿¡ »ç¿ëµÇ´Â °´Ã¼¸¦ Á¤ÀÇÇÏ¿© »ç¿ëÇÕ´Ï´Ù. CORBA´Â °´Ã¼¸¦ Á¤ÀÇÇϱâ À§ÇØ º°µµÀÇ ÀÎÅÍÆäÀ̽º Á¤ÀÇ ¾ð¾î(IDL)¸¦ »ç¿ëÇÕ´Ï´Ù. ÀÚ¹Ù¸¦ ºñ·ÔÇÑ °¢Á¾ ÇÁ·Î±×·¡¹Ö ¾ð¾î·Î ÀÌ °´Ã¼¸¦ ÀÌ¿ëÇÏ·Á¸é IDL·Î Á¤ÀÇµÈ Äڵ带 °¢ ÇÁ·Î±×·¡¹Ö ¾ð¾î ¼Ò½º ÄÚµå·Î º¯È¯ÇØ¾ß ÇÕ´Ï´Ù.
IDL °´Ã¼¸¦ ÀÚ¹Ù ¼Ò½º ÄÚµå·Î º¯È¯ÇÏ´Â ÇÁ·Î±×·¥ÀÎ idltojava ÇÁ·Î±×·¥Àº ´ÙÀ½ URL¿¡¼ ´Ù¿î·ÎµåÇÒ ¼ö ÀÖ½À´Ï´Ù. JDK 1.3¿¡´Â idlj¶ó´Â À̸§À¸·Î Æ÷ÇԵǾî ÀÖ½À´Ï´Ù.
http://java.sun.com/products/jdk/idl/
RMI¿¡¼ ¿ø°Ý °´Ã¼¸¦ Á¤ÀÇÇϱâ À§ÇØ ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇϵíÀÌ CORBA¸¦ »ç¿ëÇÏ·Á¸é ¸ÕÀú IDL ¾ð¾î·Î µÈ ¿ø°Ý °´Ã¼ ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÏ¿©¾ß ÇÕ´Ï´Ù.
module hello // moduleÀº ÀÚ¹ÙÀÇ package¿¡ ¸ÅÇÎ { interface Hello // interface´Â ÀÚ¹ÙÀÇ interface·Î ¸ÅÇÎ { string hello(); // stringÀº ÀÚ¹ÙÀÇ java.lang.String Ŭ·¡½º·Î ¸ÅÇÎ }; };
<¿¹Á¦> hello.idl
IDLÀÇ °¢ ±¸¼º¿ä¼Ò°¡ ¾î¶»°Ô ÀÚ¹Ù ¾ð¾î·Î ¸ÅÇεǴÂÁö¸¦ º¸·Á¸é Ç¥¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖ½À´Ï´Ù.
IDL ±¸¼º ¿ä¼Ò |
JavaÀÇ ´ëÀÀµÇ´Â Ç¥Çö |
module |
package |
interface |
interface, helper Ŭ·¡½º, holder Ŭ·¡½º |
constant |
public static final |
boolean |
boolean |
char, wchar |
char |
octet |
byte |
string, wstring |
java.lang.String Ŭ·¡½º |
short, unsigned short |
short |
long, unsigned long |
int |
long long, unsigned long long |
long |
float |
float |
double |
double |
enum, struct, union |
class |
sequence, ¹è¿ |
¹è¿ |
exception |
Ŭ·¡½º |
readonly attribute |
¼Ó¼ºÀÇ °ªÀ» ±¸ÇÏ´Â ¸Þ½îµå |
readwrite attribute |
¼Ó¼ºÀÇ °ªÀ» ±¸ÇÏ°í ¶Ç ¼³Á¤ÇÏ´Â ¸Þ½îµå |
¿¬»ê |
¸Þ½îµå |
<Ç¥> IDLÀÇ ÀÚ¹Ù ¸ÅÇÎ
hello.idl ÆÄÀÏÀ» idltojava ÄÄÆÄÀÏ·¯·Î ÄÄÆÄÀÏÇÏ¸é ¸ðµâ À̸§¿¡ ÇØ´çÇÏ´Â µð·ºÅ丮 ±¸Á¶¸¦ »ý¼ºÇÑ ÈÄ ´ÙÀ½°ú °°ÀÌ ´Ù¼¸ °³ÀÇ ÀÚ¹Ù ÆÄÀÏÀ» »ý¼ºÇÕ´Ï´Ù.
JDK 1.3ÀÇ idlj¸¦ »ç¿ëÇÏ½Ç ¶§¿¡´Â ¿É¼ÇÀ¸·Î -fallÀ» ÁÖ¼Å¾ß Å¬¶óÀ̾ðÆ®, ¼¹öÂÊ ½ºÅÓÀ» ¸ðµÎ »ý¼ºÇÕ´Ï´Ù.
Hello.java : ¿ø°Ý °´Ã¼ ÀÎÅÍÆäÀ̽º ÆÄÀÏ HelloHelper.java : narrow() ¸Þ½îµå µî º¸Á¶ ±â´ÉÀ» Á¦°øÇϴ Ŭ·¡½º HelloHolder.java : ÀÚ¹Ù¿¡ ¾ø´Â °³³äÀÎ CORBAÀÇ out, inout ÀÎÀÚ¿¡ ´ëÇÑ ¿¬»êÀ» Áö¿øÇϱâ À§ÇÑ º¸Á¶ Ŭ·¡½º _HelloImplBase.java : ¼¹ö ½ºÄÌ·¯Æ° Ŭ·¡½º (¼¹öÂÊ¿¡¸¸ ÇÊ¿ä) _HelloStub.java : Ŭ¶óÀ̾ðÆ® ½ºÅÓ Å¬·¡½º (Ŭ¶óÀ̾ðÆ®ÂÊ¿¡¸¸ ÇÊ¿ä)
ÀÌ Áß Á÷Á¢ hello.idl ÆÄÀÏ°ú Á÷Á¢ ¸ÅÇεǴ ÀÚ¹Ù ÀÎÅÍÆäÀ̽º´Â Hello.javaÀÔ´Ï´Ù. ÀÌ ÆÄÀÏÀÇ ³»¿ëÀ» º¸¸é hello.idlÀÌ ¾î¶»°Ô ÀÚ¹Ù ÄÚµå·Î º¯È¯µÇ¾ú´ÂÁö È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.
package hello; public interface Hello extends org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity { String hello(); }
<¿¹Á¦> »ý¼ºµÈ Hello.java ¼Ò½º ÄÚµå
2.3 CORBA¸¦ »ç¿ëÇÑ ¿ø°Ý °´Ã¼ ±¸Çö
hello.idlÀ» ÄÄÆÄÀÏÇÏ¿© »ý±ä ÀÚ¹Ù Äڵ带 »ç¿ëÇÏ¿© ¿ø°Ý °´Ã¼¸¦ ±¸ÇöÇغ¾½Ã´Ù. ¸ÕÀú ½ÇÁ¦ ¿ø°Ý ¼¹ö ¿ªÇÒÀ» ÇÒ HelloServant Ŭ·¡½º¸¦ ±¸ÇöÇÕ´Ï´Ù.
RMI¿Í ºñ±³ÇÏ¿© ƯÀÌÇÑ Á¡Àº ¿ø°Ý ¼¹ö °´Ã¼°¡ Á÷Á¢ Hello ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, Hello ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÑ ½ºÄÌ·¯Æ° Ŭ·¡½ºÀÎ _HelloImplBase Ãß»ó Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿© ±¸ÇöÇØ¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.
class HelloServant extends _HelloImplBase // ¼¹öÂÊ ½ºÄÌ·¯Æ° Ŭ·¡½º¸¦ »ó¼Ó { // IDLÀÇ ÀÎÅÍÆäÀ̽º¿¡ ¼±¾ðµÈ ¸Þ¼Òµå¸¦ ½ÇÁ¦·Î ±¸Çö public String hello() { return "Hello, CORBA!"; } }
<¿¹Á¦> HelloServant Ŭ·¡½º
¿ø°Ý ¼¹ö °´Ã¼¸¦ ¼³Ä¡ÇÏ·Á¸é ORB¿¡ µî·ÏÇÏ°í, ¶Ç ³×ÀÓ ¼ºñ½º¿¡ ¹ÙÀεåÇÏ´Â °úÁ¤ÀÌ ÇÊ¿äÇÕ´Ï´Ù. RMI¿¡¼ rmiregistry¿¡ ¹ÙÀεåÇÏ°í ƯÁ¤ Æ÷Æ®·Î ÀͽºÆ÷Æ®ÇÏ´Â °ÍÀ» ¿¬»óÇϸé ÀÌÇØÇϱ⠽±½À´Ï´Ù.
ORB¸¦ ÃʱâÈÇÏ¿© ¿ø°Ý ¼¹ö °´Ã¼¸¦ µî·ÏÇÏ´Â °úÁ¤Àº ´ÙÀ½°ú °°½À´Ï´Ù.
// ¸ÕÀú ORB¸¦ ÃʱâÈÇÏ¿© ÀνºÅϽº¸¦ »ý¼ºÇÕ´Ï´Ù. ORB orb = ORB.init(args, null); // ¼ºñ½º¸¦ ÇÒ ¿ø°Ý °´Ã¼¸¦ »ý¼ºÇÏ¿© ORB¿¡ µî·ÏÇÕ´Ï´Ù. HelloServant helloRef = new HelloServant(); orb.connect(helloRef);
³×ÀÓ ¼ºñ½º¿¡ ¹ÙÀεåÇÏ´Â °úÁ¤Àº ´ÙÀ½°ú °°½À´Ï´Ù. CORBAÀÇ ³×ÀÓ ¼ºñ½º´Â
// ³×ÀÓ ¼ºñ½º¿¡ ´ëÇÑ Ãʱâ ÂüÁ¶¸¦ ±¸ÇÕ´Ï´Ù. org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef); // ³×ÀÓ ¼ºñ½º¿¡ "HelloServer"¶ó´Â ¹®ÀÚ¿À» ¹ÙÀεùÇÕ´Ï´Ù. // ³×ÀÓ ¼ºñ½º´Â °¡Àå ²À´ë±â¿¡ "NameService"¶ó´Â °íÁ¤µÈ ¹®ÀÚ¿À» À§Ä¡½ÃÅ°°í // ±× ¾Æ·¡·Î ¹®ÀÚ¿µéÀ» ¹ÙÀεåÇÏ´Â Æ®¸® ±¸Á¶¸¦ °¡Áö°í ÀÖ½À´Ï´Ù. NameComponent nc = new NameComponent("HelloServer", " "); NameComponent path[] = {nc}; ncRef.rebind(path, helloRef);
ORB µî·Ï°ú ³×ÀÓ ¼ºñ½º¿¡ ¹ÙÀε尡 ¼º°øÇÏ¿´À¸¸é Ŭ¶óÀ̾ðÆ®°¡ Á¢¼ÓÇÒ ¶§±îÁö ÇÁ·Î¼¼½º°¡ Á¾·áÇÏÁö ¾Êµµ·Ï ¹«ÇÑÈ÷ ±â´Ù¸®¸é µË´Ï´Ù.
java.lang.Object waiter = new java.lang.Object(); synchronized(waiter){ waiter.wait(); }
Ŭ¶óÀ̾ðÆ®ÀÇ °æ¿ì¿¡´Â ¸ÕÀú ORB¸¦ ÃʱâÈÇÑ ´ÙÀ½ ³×ÀÓ ¼ºñ½º¿¡¼ "HelloServer"·Î µî·ÏµÈ °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶¸¦ ±¸ÇÏ¿© ¸Þ½îµå¸¦ È£ÃâÇÏ¸é µË´Ï´Ù. ³×ÀÓ ¼ºñ½º·ÎºÎÅÍ ¿ø°Ý °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶¸¦ ±¸ÇÏ´Â µ¥¿¡´Â NamingContext Ŭ·¡½ºÀÇ resolve() ¸Þ½îµå¸¦ »ç¿ëÇÏ°í, ÀÌ ÂüÁ¶¸¦ ½ÇÁ¦ÀÇ °´Ã¼·Î Çü º¯È¯ÇÏ´Â µ¥¿¡´Â IDL ÄÄÆÄÀÏ·¯°¡ »ý¼ºÇÑ HelloHelper Ŭ·¡½ºÀÇ narrow() ¸Þ½îµå¸¦ »ç¿ëÇÕ´Ï´Ù.
// ¸ÕÀú ORB¸¦ ÃʱâÈÇÏ¿© ÀνºÅϽº¸¦ »ý¼ºÇÕ´Ï´Ù. ORB orb = ORB.init(args, null); // À̸§ ¼ºñ½º¿¡ ´ëÇÑ ÂüÁ¶¸¦ ±¸ÇÕ´Ï´Ù. org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef); // ³×ÀÓ ¼ºñ½º¿¡¼ "HelloServer"¿¡ ´ëÇÑ ÂüÁ¶¸¦ ±¸ÇÏ¿© // ¼¹öÂÊ Hello °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶¸¦ ¾ò½À´Ï´Ù. NameComponent nc = new NameComponent("HelloServer", " "); NameComponent path[] = {nc}; Hello helloRef = HelloHelper.narrow(ncRef.resolve(path)); // ¼¹öÂÊ Hello °´Ã¼ÀÇ hello() ¸Þ¼Òµå¸¦ È£ÃâÇÕ´Ï´Ù. String Hello = helloRef.hello(); System.out.println(Hello);
CORBA¸¦ »ç¿ëÇÑ HelloServer¿Í HelloClientÀÇ
Àüü ¼Ò½º ÄÚµå´Â ¼Ò½º µð·ºÅ丮¸¦ ÂüÁ¶Çϱ⠹ٶø´Ï´Ù.
2.4 CORBA¸¦ »ç¿ëÇÑ ¿ø°Ý °´Ã¼ ½ÇÇà
JDK 1.2¿¡´Â ÀÚ¹Ù·Î ±¸ÇöµÈ ORB°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. º¸Åë ORB´Â ¿©·¯ °¡Áö °´Ã¼ ¼ºñ½º¸¦ Á¦°øÇϴµ¥ JDK 1.2ÀÇ ORB´Â ³×ÀÓ ¼ºñ½º¸¸ Á¦°øÇÕ´Ï´Ù. ³×ÀÓ ¼ºñ½º¸¦ Á¦°øÇÏ´Â À¯Æ¿¸®Æ¼´Â tnameserv·Î RMIÀÇ rmiregistry¿Í ºñ½ÁÇÑ ÀÏÀ» ÇÕ´Ï´Ù. tnameserv´Â ±âº» Æ÷Æ®·Î 900¹øÀ» »ç¿ëÇÕ´Ï´Ù. ƯÁ¤ Æ÷Æ®¸¦ ÁöÁ¤ÇÏ·Á¸é -ORBInitialPort ÀÎÀÚ¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù. 900¹øÀÌ 1024º¸´Ù À۱⠶§¹®¿¡ ´ëºÎºÐÀÇ À¯´Ð½º ½Ã½ºÅÛ¿¡¼´Â ½´ÆÛÀ¯Àú ±ÇÇÑÀ» °¡Á®¾ß¸¸ ±âº» Æ÷Æ®·Î tnameserv¸¦ ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù.
¸ÕÀú tnameserv¸¦ ½ÇÇàÇÕ´Ï´Ù.
start tnameserv
´Ù¸¥ µµ½º âÀ» ¿¾î ¼¹ö¸¦ ½ÇÇàÇÕ´Ï´Ù. ¼¹ö¸¦ ½ÇÇàÇÒ ¶§¿¡´Â IDL ÄÄÆÄÀÏ·¯°¡ »ý¼ºÇÑ ÆÄÀÏ Áß ½ºÅÓÀ» Á¦¿ÜÇÑ ÀÎÅÍÆäÀ̽º, º¸Á¶ Ŭ·¡½º¿Í ½ºÄÌ·¯Æ° Ŭ·¡½ºÀÇ Å¬·¡½º ÆÄÀϵéÀÌ ÇÔ²² ÀÖ¾î¾ß ÇÕ´Ï´Ù.
java HelloServer
´Ù¸¥ µµ½º âÀ» ¿¾î Ŭ¶óÀ̾ðÆ®¸¦ ½ÇÇàÇÕ´Ï´Ù. Ŭ¶óÀ̾ðÆ® ½ÇÇà¿¡´Â IDL ÄÄÆÄÀÏ·¯°¡ »ý¼ºÇÑ ÆÄÀÏ Áß ½ºÄÌ·¯Æ°À» Á¦¿ÜÇÑ ÀÎÅÍÆäÀ̽º, º¸Á¶ Ŭ·¡½º, ±×¸®°í ½ºÅÓ Å¬·¡½ºÀÇ Å¬·¡½º ÆÄÀϵéÀÌ ÇÔ²² ÇÊ¿äÇÕ´Ï´Ù.
java HelloClient
ÀÌÁ¦ ±× °á°ú¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
Hello, CORBA!
2.5 RMI¿Í CORBA
RMI¿Í CORBA´Â ¸ðµÎ ¿ø°Ý °´Ã¼¿ÍÀÇ Åë½ÅÀ» °¡´ÉÇÏ°Ô ÇÏ´Â ÇÁ·ÎÅäÄÝÀ̶ó´Â Á¡¿¡¼ °°Àº ¿ªÇÒÀ» ÇÑ´Ù°í º¼ ¼ö ÀÖ½À´Ï´Ù. ±×·¸±â ¶§¹®¿¡ ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ùº¸¸é RMI¸¦ »ç¿ëÇÒ °ÍÀΰ¡, CORBA¸¦ »ç¿ëÇÒ °ÍÀΰ¡ °í¹ÎÇÒ °æ¿ìµµ »ý±é´Ï´Ù.
ÀÌ·² °æ¿ì¿¡´Â ¿©·¯ °¡Áö Á¶°ÇÀ» µûÁ®º¼ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.
¸¸¾à ¼ø¼öÇÑ ÀÚ¹Ù °´Ã¼µé °£ÀÇ Åë½ÅÀ̶ó¸é ±»ÀÌ CORBA¸¦ »ç¿ëÇÒ ÇÊ¿ä´Â ¾øÀ» °ÍÀÔ´Ï´Ù. CORBA¸¦ ÅëÇØ ³Ñ°ÜÁø °´Ã¼µéÀº Á¶ÀÛÇÒ ¼ö ¾øÁö¸¸ RMI¸¦ ÅëÇØ ³Ñ°ÜÁø °´Ã¼µéÀº ÀÚ¹Ù °´Ã¼À̹ǷΠÀÚÀ¯·Ó°Ô ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù. µû¶ó¼, ÀÚ¹Ù °´Ã¼µé °£ÀÇ Åë½Å¿¡¼´Â RMI¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÈξÀ À¯¸®ÇÕ´Ï´Ù.
¹Ý¸é CORBA´Â ÀÚ¹Ù°¡ ¾Æ´Ñ ´Ù¸¥ ¾ð¾î·Î ¸¸µé¾îÁø °´Ã¼¿ÍÀÇ Åë½ÅÀ» °¡´ÉÇÏ°Ô ÇÕ´Ï´Ù. ¶Ç, Àü¼Û ÇÁ·ÎÅäÄÝÀÎ IIOP(ÀÎÅÍ³Ý ORB°£ ÇÁ·ÎÅäÄÝ)°¡ °³¹æÇü Ç¥ÁØÀ̱⠶§¹®¿¡ Ç¥ÁØ¿¡ ±â¹ÝÇÑ °´Ã¼ Åë½ÅÀ» À§Çؼ´Â CORBA¸¦ ¼±ÅÃÇØ¾ß ÇÕ´Ï´Ù.
ÆÁ: idltojava ÄÄÆÄÀÏ·¯°¡ µ¿ÀÛÇÏÁö ¾ÊÀ» ¶§ idltojava ÄÄÆÄÀÏ·¯´Â Àü󸮱⸦ ÇÊ¿ä·Î ÇÕ´Ï´Ù. WIN32 ½Ã½ºÅÛÀÇ idltojava ÄÄÆÄÀÏ·¯´Â ±âº»°ªÀ¸·Î ºñÁÖ¾ó C++ÀÇ Àü󸮱⸦ »ç¿ëÇÕ´Ï´Ù. ºñÁÖ¾ó C++°¡ ¼³Ä¡µÇ¾î ÀÖÁö ¾Ê°Å³ª Àü󸮱⸦ »ç¿ëÇÏÁö ¾ÊÀ¸·Á¸é ´ÙÀ½°ú °°ÀÌ ¿É¼ÇÀ» ÁÖ¸é µË´Ï´Ù. idltojava -fno-cpp Hello.idl JDK 1.3¿¡´Â idlj¶ó´Â À̸§À¸·Î Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ÀÌ ÅøÀÇ »ç¿ë¹ýÀº http://java.sun.com/products/jdk/1.3/docs/guide/rmi-iiop/toJavaPortableUG.html¸¦ Âü°íÇÏ½Ã¸é µË´Ï´Ù. |
¼Ò½º ÄÚµåµéÀº ¿©±â¿¡¼ ã¾Æº¼ ¼ö ÀÖ½À´Ï´Ù.
ÇÊÀÚ ¿¬¶ôó : yoonforh at yahoo dot com