2013년 10월 18일 금요일

RMI HelloWorld 상세설명

RMI에서 원격객체를 생성하고 이를 이름으로 등록한 후 원격 객체에 대한 클라이언트의 서비스 요청을 기다리는 쪽이 서버 이다.
원격 객체를 이름으로 찾아 해당 객체가 제공하는 원격 메소드를 호출하는 프로그램이 RMI 클라이언트 이다.
 

 
원격 객체에 대한 레퍼런스(원격 레퍼런스)를 이름을 통해 얻어 낼 수 있도록 rmiregstry 라는 네이밍 서버 데몬을 제공 한다.
원격 참조(레퍼런스)를 통해 서로 다른 JVM 환경의 원격 메소드를 자신의 로컬 JVM 환경에서 생성한 객체와 다름없이 호출 할 수 있는 메커니즘(stub, skeleton)을 제공 한다.
원격 객체의 메소드 호출 시 객체를 주고 받을 수 있는 메커니즘을 제공한다. (원격 객체 메소드 호출시 사용되는 파라미터나 리턴 타입이 Serializable을 구현했을 경우 객체 직렬화를 이용  가능)
 
 
RMI에서 pass-by-value이 경우는 원격 메소드 호출시 사용하는 파라미터나 리턴 타입에 적용 되며 pass-by-reference인 경우는 원격 객체에 대한 레퍼런스 이다. pass-by-referencestubskeleton의 통신에 사용된다.
다음 코드에서 remoteObjHello 타입의 원격 레퍼런스다.
  //HelloClient.java
  Object obj = Naming.lookup("rmi://loclahost:1099/HelloRemote");
  Hello remoteObj = (Hello)obj; 
 
 
RMI는 원격 객체에 대한 참조로 stub을 사용한다. RMI 클라이언트 Application에서 사용하는 원격 객체의 reference는 실제로 stub에 대한 reference 이다.
하나의 JVM에서 생성한 객체를 다른 JVM에서 그대로 실행 한다는 것은 불가능 하다.(주소 공간이 틀리기 때문) , 즉 이것이 RMI에서 원격 객체에 대한 참조를 원격객체를 직접 가리키지 않고 stub을 사용하는 이유이다.
예를 들어 RMI 클라이언트에서 RMI 서버의 메소드를 호출 한다고 했을 때 먼저 로컬 stub 객체에 먼저 전달된 후에 원격의 skeleton 객체에 전달되고 skeleton이 실제 객체의 비즈니스 메소드를 호출 하는 것이다.
 
 
원격 메소드 호출에 사용하는 실 매개변수와 리턴되는 데이터의 상태를 원격의 클라이언트/서버 간에 유지할 필요가 없을 때는 직렬화(Serialization)를 통해 Pass-by-value로 복사본을 주고 받는다.(객체나 자바 내장 데이터 타입인 경우 객체 직렬화를 사용한다.)
자바 RMI의 경우 서버에서 이름으로 등록한 원격 객체를 클라이언트에서 개발자가 직접 저 수준의 네크웍 코드를 직접 작성하지 않고  등록된 이름으로 원격에 존재하는 비즈니스 객체를 참조 할 수 있도록 rmiregistry라는 Naming Server Daemon을 제공 한다.
 
 
아래의 코드는 rmiregistry를 통해 원격 객체 remoteObj를 “HelloRemote라는 이름으로 등록하는 RMI 서버 Application의 일부분 이다.
 
  //원격 객체 생성
  HelloImpl remoteObj = new HelloImpl();
  //생성한 원격 객체를 “HelloRemote라는 이름으로 rmiregistry에 등록 한다.
  java.rmi.Naming.rebind("rmi://localhost:1099/HelloRemote", remoteObj);
 
 

댓글 없음:

댓글 쓰기