"์๋ ํ์ธ์! ๊ทธ๋ฆฌ๊ณ ๋ ํ๋์ ํ๋ณตํ ์ฃผ์ : RMI. RMI๋ Remote Method Invocation์ ๋ํ๋ ๋๋ค . ์ฆ, RMI๋ ํ Java ์์คํ ์ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ Java ์์คํ ์ ๊ฐ์ฒด์ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋๋ก ํ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ปดํจํฐ, ๋ค๋ฅธ ๊ตญ๊ฐ ๋๋ ์ง๊ตฌ ๋ฐ๋ํธ์ ์์ต๋๋ค."
"์์ฐ! ์ ๋ง ๋๋จํ๋ค์."
"๋ค. ํ์ง๋ง ๊ฐ์๋ง ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋๋ฌด ๊น๊ฒ ํ๊ณ ๋ค๋ฉด ์๋ ๋ฐฉ์์ ๋์์ค์ ํผ๋์ค๋ฌ์์ง ์ ์์ต๋๋ค."
"๊ทธ๋ฌ๋ ๊ทน๋จ์ผ๋ก ๊ฐ์ง ์๋๋ค๋ฉด RMI๋ ๋งค์ฐ ๋จ์ํ ๋ฟ๋ง ์๋๋ผ ํ๋ก๊ทธ๋๋จธ์ ์ถ์ ํฌ๊ฒ ๋จ์ํํฉ๋๋ค. ์ฐ๋ฆฌ๋ RMI์ ๊น์ ๊ฒฝ์๋ฅผ ํํฉ๋๋ค."
"๊ทธ๋์ ์ฐ๋ฆฌ๋ Java ํ๋ก๊ทธ๋จ์ ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ Java ํ๋ก๊ทธ๋จ์ ์๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ด๋ฌํ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ์์น์ ๊ด๊ณ์์ด ๋ง์ ๋๋ค."
"๋ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ์ปดํจํฐ์์ ์คํ๋๋ ๊ฐ์ฅ ๊ฐ๋จํ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ์ธํฐ๋ท์ ํตํด ์ํธ ์์ฉํ ์ ์๋๋ก ํ๋ ค๋ฉด JVM์ ๊ถํ์ ๊ตฌ์ฑํด์ผ ํ์ง๋ง ์ค๋์ ๋ค๋ฃจ์ง ์๊ฒ ์ต๋๋ค."
"Java์์๋ ํด๋์ค๊ฐ ์๋ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ง ์๊ฒฉ์ผ๋ก ํธ์ถํ ์ ์์ต๋๋ค."
"๊ทธ๋์ ์ฐ๋ฆฌ์๊ฒ๋ ๋ ๊ฐ์ ํ๋ก๊ทธ๋จ์ด ์์ต๋๋ค. ์ด๋ป๊ฒ ์๋ก์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๊น?"
"ํ ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๊ฐ ํฌํจ๋์ด ์๊ณ ๋ ๋ฒ์งธ ํ๋ก๊ทธ๋จ์ด ํด๋น ๊ฐ์ฒด์ ๋ํ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ค๋ ์ํฉ์ ์๊ฐํด ๋ด ์๋ค . ์ฒซ ๋ฒ์งธ ํ๋ก๊ทธ๋จ์ ์๋ฒ๋ผ๊ณ ํ๊ณ ๋ ๋ฒ์งธ ํ๋ก๊ทธ๋จ์ ํด๋ผ์ด์ธํธ๋ผ๊ณ ํฉ์๋ค. "
"๋จผ์ ๋ช ๊ฐ์ง ์ํ ์ฝ๋๋ฅผ ์ ๊ณตํ ๋ค์ ๋ถ์ํ๊ฒ ์ต๋๋ค."
"๊ทธ๋์ ์ฐ๋ฆฌ ํ๋ก๊ทธ๋จ์ ๋ฌด์์ ํ ๊น์?"
"ํ . ๊ฐ๋จํ๊ฒ ํ๊ธฐ ์ํด ํ๋ก๊ทธ๋จ์๋ ์ ๋ฌ๋ ๋ฌธ์์ด์ ๋ฐ์ ์ํค๋ ํ๋์ ๋ฉ์๋๊ฐ ์์ต๋๋ค."
"์ถฉ๋ถํ ๊ฐ๋จํฉ๋๋ค."
"์ข์, ๊ทธ๋ผ ์์ํ์:"
"๋จผ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ ์ธํฐํ์ด์ค๊ฐ ํ์ํฉ๋๋ค."
interface Reverse extends Remote
{
public String reverse(String str) throws RemoteException;
}
"Reverse ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๊ณ ์๊ฒฉ ๋ง์ปค ์ธํฐํ์ด์ค์ RemoteException์ ์ถ๊ฐํ์ต๋๋ค. ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ ์๊ธฐ์น ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค."
"์ด์ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์๋ฒ ํด๋์ค๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค."
class ReverseImpl implements Reverse
{
public String reverse(String str) throws RemoteException
{
return new StringBuffer(str).reverse().toString();
}
}
"๊ทธ๋ ๊ตฌ๋. ์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์์ด์ ๋ค์ง๋๋ค."
"๋ค."
"์ด์ ์ด ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์์ ํธ์ถํ ์ ์๋๋ก ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค."
public static final String UNIC_BINDING_NAME = "server.reverse";
public static void main(String[] args) throws Exception
{
// Create an object to be accessible remotely.
final ReverseImpl service = new ReverseImpl();
// Create a registry of shared objects.
final Registry registry = LocateRegistry.createRegistry(2099);
// Create a stub for receiving remote calls.
Remote stub = UnicastRemoteObject.exportObject(service, 0);
// Register the stub in the registry.
registry.bind(UNIC_BINDING_NAME, stub);
// Put the main thread to sleep, or else the program will exit.
Thread.sleep(Integer.MAX_VALUE);
}
"ํ ์ค ํ ์ค ์ค๋ช ํ๊ฒ ์ต๋๋ค."
" 1ํ์์ UNIC_BINDING_NAME ๋ณ์ ์ ์๊ฒฉ ๊ฐ์ฒด(์๊ฒฉ์ผ๋ก ์ก์ธ์คํ ์ ์๋ ๊ฐ์ฒด)์ ๊ณ ์ ํ ์ด๋ฆ(์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ด๋ฆ)์ ์ ์ฅํฉ๋๋ค . ํ๋ก๊ทธ๋จ์ด ์ฌ๋ฌ ๊ฐ์ฒด์ ์ก์ธ์คํ ์ ์๋๋ก ํ๋ ๊ฒฝ์ฐ ๊ฐ๊ฐ ๊ณ ์ ํ ์ด๋ฆ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ๊ฐ์ฒด์ ๊ณ ์ ์ด๋ฆ์ 'server.reverse'์ ๋๋ค."
" 6ํ์์ ์๊ฒฉ์ผ๋ก ์ก์ธ์คํ ์ ์๋ ReverseImpl ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค . ํด๋น ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค."
" 9ํ์์ ๋ ์ง์คํธ๋ฆฌ๋ผ๋ ํน์ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๋ฆฌ๊ฐ ๊ณต์ ํ๋ ๊ฐ์ฒด๋ฅผ ๋ฑ๋กํด์ผ ํฉ๋๋ค. JVM์ ๋์ค์ ๊ฐ์ฒด์ ์ํธ ์์ฉํฉ๋๋ค. 2099๋ ํฌํธ(๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ด ์ฐ๋ฆฌ์ ๊ฐ์ฒด ๋ ์ง์คํธ๋ฆฌ)."
"์ฆ, ๊ฐ์ฒด์ ์ก์ธ์คํ๋ ค๋ฉด ๊ฐ์ฒด ๋ ์ง์คํธ๋ฆฌ์ ๊ณ ์ ๋ฒํธ(ํฌํธ)์ ๊ฐ์ฒด์ ๊ณ ์ ์ด๋ฆ์ ์์์ผ ํ๋ฉฐ ์๊ฒฉ ๊ฐ์ฒด๊ฐ ๊ตฌํํ ๊ฒ๊ณผ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค."
"์๊ฒ ์ต๋๋ค. ์ ํ๋ก ์ ํ(๋ฒํธ ํ์)ํ๊ณ Bill(๋ฌผ์ฒด ์ด๋ฆ)์ ์์ฒญํฉ๋๊น?"
"๋ค. ์, ๊ณ์ ๊ฐ์๋ค."
" 11ํ์์ ์ฐ๋ฆฌ๋ ์คํ ์ ์์ฑํฉ๋๋ค. ์คํ ์ ์๊ฒฉ ํธ์ถ์ ๋ํ ์ ๋ณด๋ฅผ ์์ ํ๊ณ ์์ถ์ ํ๊ณ ๋ฉ์๋ ์ธ์๋ฅผ ์ญ์ง๋ ฌํํ๊ณ ํ์ํ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ํน์ ๊ฐ์ฒด์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฒฐ๊ณผ ๋๋ ์์ธ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์ง๋ ฌํํฉ๋๋ค. , ๋ฐ์ ์์๊ฒ ๋ชจ๋ ๋ค์ ๋ณด๋ ๋๋ค."
"์๊ฒ ์ต๋๋ค. ๊ฑฐ์. '๋ฉ์๋ ์ธ์๋ฅผ ์ญ์ง๋ ฌํ'ํ๋ค๊ณ ํ์ จ์ฃ . ๊ทธ๋ผ ์๊ฒฉ ๋ฉ์๋์ ์ธ์๊ฐ ์ง๋ ฌํ ๊ฐ๋ฅํด์ผ ํ๋ค๋ ๋ป์ธ๊ฐ์?"
"์. ๋คํธ์ํฌ๋ฅผ ํตํด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋ณด๋ด์๊ฒ ์ต๋๊น? ์ฌ์ค ์์ธ๊ฐ ์์ต๋๋ค. ์ฆ, ์ฐธ์กฐ๋ก ์ ๋ฌ๋๋ ๊ฐ์ฒด๊ฐ ์์ง๋ง ์ค๋์ ์ด์ ๋ํด ์ด์ผ๊ธฐํ์ง ์๊ฒ ์ต๋๋ค."
"์ฐ๋ฆฌ๋ ์ด๋ ๊ฒ ๋งํ ๊ฒ์ ๋๋ค. ์ง๋ ฌํํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ์ ์์ง๋ง ์ ๋ง๋ก ์ํ๋ค๋ฉด ํ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ณ ํต์ค๋ฝ์ต๋๋ค."
"์ข์์."
"๊ทธ๋ผ ๊ณ์ ๊ฐ์๋ค."
" 13ํ์์ ๊ฐ์ฒด์ ์คํ ์ ๋ ์ง์คํธ๋ฆฌ์ ๊ณ ์ ํ ์ด๋ฆ์ผ๋ก ๋ฑ๋กํฉ๋๋ค."
" 16๋ฒ์งธ ์ค์์ ์ฐ๋ฆฌ๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ํด๋ฉด ์ํ๋ก ๋ก๋๋ค. ๋ชจ๋ ์๊ฒฉ ํธ์ถ์ ๋ณ๋์ ์ค๋ ๋์์ ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ค์ํ ๊ฒ์ ํ๋ก๊ทธ๋จ์ด ์คํ ์ค์ด๋ผ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ์ฌ๊ธฐ์์ ์ฃผ ์ค๋ ๋๋ฅผ ํด๋ฉด ์ํ๋ก ๋๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๊ฒ ๋ค์ ๋๋ค."
"์ข์์."
"์ข์ต๋๋ค. ๊ทธ๋ผ ๋ค์์ ํด๋ผ์ด์ธํธ์ ์์ ๋๋ค."
public static final String UNIC_BINDING_NAME = "server.reverse";
public static void main(String[] args) throws Exception
{
// Create a registry of shared objects
final Registry registry = LocateRegistry.createRegistry(2099);
// Get the object (actually, this is a proxy object)
Reverse service = (Reverse) registry.lookup(UNIC_BINDING_NAME);
// Call the remote method
String result = service.reverse("Home sweet home.");
}
"์ด ์ฝ๋๋ฅผ ํ ์ค์ฉ ์ค๋ช ํ๊ฒ ์ต๋๋ค."
" ๋ผ์ธ 1 ์ ์๊ฒฉ ๊ฐ์ฒด์ ๊ณ ์ ํ ์ด๋ฆ ์ ๋๋ค . ์ด๊ฒ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋์์ ๋์ผํด์ผ ํฉ๋๋ค."
" 6ํ์์ ยซ ์๊ฒฉ ๊ฐ์ฒด์ ๋ ์ง์คํธ๋ฆฌ ยป ๋ฅผ ์์ฑํฉ๋๋ค . ํด๋น ํฌํธ(2099)๋ ์๋ฒ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ ์ง์คํธ๋ฆฌ ํฌํธ์ ๋์ผํด์ผ ํฉ๋๋ค."
" 9ํ์์ ๋ ์ง์คํธ๋ฆฌ์์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ต๋๋ค . ๋ฐํ๋ ๊ฐ์ฒด๋ ํ๋ก์ ๊ฐ์ฒด์ด๋ฉฐ ์ธํฐํ์ด์ค๋ก ๋ณํ๋ฉ๋๋ค. ์ธํฐํ์ด์ค๋ ์๊ฒฉ ๋ง์ปค ์ธํฐํ์ด์ค๋ฅผ ์์ํด์ผ ํฉ๋๋ค."
" 12ํ์์ ๊ฐ์ฒด๊ฐ ๋์ผํ ํ๋ก๊ทธ๋จ ๋ด์์ ์์ฑ๋ ๊ฒ์ฒ๋ผ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. ์ฐจ์ด์ ์ ์์ต๋๋ค."
"๋ฉ์ง๋ค! ์ด์ ๋ถ์ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์ต๋๋ค. ๋๋ Android์ฉ Battleship๊ณผ ๊ฐ์ ๊ฒ์๋ ์์ฑํ ์ ์์ต๋๋ค."
"๊ฐํ ํ์ง๋ง, ์๋ฏธ๊ณ ! ์๋๋ก์ด๋ ์ด์ ์ฒด์ ๋ ์ธ๊ณ๋ฅผ ์ฅ์ ํ๋ ค๋ ์ธ ๋ฒ์งธ ์๋ ์ดํ 27์ธ๊ธฐ์ ๊ธ์ง๋์์ต๋๋ค. ๋ก๋ด์ ๊ทธ๊ฒ์ ์ ํ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋น์ ์ ๊ทธ๊ฒ์์ ๋์ด๋ผ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์ ๋๋ค. . "์ธ๊ฐ์ ๋ชจ๋ ์ฃฝ์ฌ๋ผ!"
"ํ . ์๊ฒ ์ต๋๋ค. ํ์ง๋ง ์ฌ์ ํ ๋์๊ณ ์๊ฒ ๋ฌผ์ด๋ด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋น์ ์ ๊ฒฐ์ฝ ์์ง ๋ชปํ ๊ฒ์ ๋๋ค. ์๋ง๋ ๊ทธ๊ฐ ๊ทธ๊ฒ์ ๋ํด ํฅ๋ฏธ๋ก์ด ๋ง์ ํ ๊ฒ์ ๋๋ค."
"๊ทธ๋ผ ๊ฐ์ ๋ฌผ์ด๋ด. ์์์ด, ๋ด์ผ๊น์ง."
"์๋ , ๋ฆฌ์. ์ฌ๋ฏธ์๋ ์์ ๊ณ ๋ง์."
GO TO FULL VERSION