¿ø°Ý °´Ã¼ Åë½Å(RMI¿Í CORBA)

1999³â 5¿ù 15ÀÏ Ã¹ ÃâÆÇ, ±Û/À±°æ±¸

Copyright © 1999 Yoon Kyung Koo. All Rights Reserved.
¹«´Ü ÀüÀ縦 ±ÝÇÕ´Ï´Ù.
ÀÌ ±ÛÀº ¿ù°£Áö ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î 1999³â 6¿ùÈ£ÀÇ ¸¶¼Ò ÁִϾ ½Ç¸° ÀÚ¹Ù À̾߱âÀÇ ÃÊ°í¿¡ ±â¹ÝÀ» ÇÏ°í ÀÖ½À´Ï´Ù.
ÀÚ¹Ù À̾߱⸦ Æ÷ÇÔÇÑ 1999³â 1¿ùºÎÅÍ ¿©¼¸ ´Þµ¿¾È ¿¬ÀçµÇ¾ú´ø ¸¶¼Ò ÁÖ´Ï¾î ¿ø°íµéÀº
"Ãʺ¸ÀÚ¸¦ À§ÇÑ ÇÁ·Î±×·¡¹Ö ¸¶½ºÅÍ"¶õ ÇÑ ±ÇÀÇ ´ÜÇົÀ¸·Î ¹­¿© ºÏ¸¶Å© ÃâÆǻ翡¼­ Ãâ°£µÇ¾ú½À´Ï´Ù.
Âü°íÇϽñ⠹ٶø´Ï´Ù.


[1. rmi] - [2. corba]


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 ±¸¼º ¿ä¼Ò

<±×¸²> 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 ¾ÖÇø´À» ½ÇÇàÇÑ °æ¿ìÀÌ¸ç ¿ø°Ý È£½ºÆ®ÀÇ 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¸¦ »ç¿ëÇÑ ¿ø°Ý °´Ã¼ Åë½Å

<±×¸²> 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


1999³â 5¿ù 15ÀÏ¿¡ óÀ½ ¸¸µé¾îÁö°í, 2004³â 2¿ù 9ÀÏ¿¡ ÃÖÁ¾ º¯°æµÇ¾ú½À´Ï´Ù.

Æ©Å丮¾ó ÆäÀÌÁö·Î µ¹¾Æ°¡±â
Last modified: Mon Feb 9 17:28:07 KST 2004