2013년 10월 18일 금요일

“Hello World” 다시보기

분산 객체를 사용하는 것은 이 분산객체(원격으로 서비스를 제공하는 객체)를 통해 원격의 클라이언트에 제공 하고자 하는 서비스(메소드)가 있을 것이다.
원격 인터페이스는 클라이언트가 원격으로 호출 할 메소드 즉 원격 메소드를 정의하는 것이다.
원격 객체가 구현 할 인터페이스 이다.
java.rmi.Remote 인터페이스를 직/간접적으로 상속해야 한다.(보통 직접 상속 한다.)
 
 

 
원격 인터페이스에서 정의한 모든 메소드는 java.rmi.RemoteException이나 부모클래스(java.io.IOException, java.lang.Exception)throws 해야 한다.(RMI 스펙에는 RemoteExceptionthrows 하도록 권고 한고 있다.)
  public interface Hello extends java.rmi.Remote {
  public String sayHello(String name) throws java.rmi.RemoteException;
  }
 
 
RMI 서버 Application은 원격 인터페이스 구현 클래스의 인스턴스를 생성하여 이를 rmiregistry에 이름으로 등록 한다.
원격 객체는 자신을 원격의 클라이언트가 접근 할 수 있도록 등록 할 수 있어야 하며 클라이언트에서 원격 메소드 요청이 발생 했는지 지속적으로 모니터링 할 수 있어야 한다. 아쉽게도 원격 인터페이스에는 이러한 기능은 정의되지 않았다.
HelloImpl 객체가 원격 객체로 작동 할 수 있는것은 원격메소드를 구현해서가 아니라 java.rmi.server.UnicastRemoteObject를 상속했기 때문이다.
 
 
java.rmi.server.Remote, java.rmi.server.RemoteServer 클래스에서 정의하는 기능을 가져야 한다.
  - java.rmi.server.Remote, java.rmi.server.RemoteServer 클래스에서 정의하는 기능을 가져야 한다.
  - 원격객체는 RMI 스펙에서 제안하는 규격에 맞게 java.lang.Object에서 상속한 hashCode, equals, toString 메소드를 재정의 할 필요가 있으며 원격객체임을 RMI 시스템에 알리고 자신을 원격 객체로 rmiregistry에 등록 할 수 있어야 한다.
  -
 
  - RemoteObject 클래스는 hashCode, equals, toStringRMI에 맞게 재정의 하고 있으며 RemoteServer 클래스는 원격 클라이언트에서 오는 원격 메소드 호출을 처리하는 기능을 정의 하고 있다.
  - 이 두개의 클래스 RemoteObjectRemoteServer의 기능을 동시에 가지고 있는 클래스가 UnicastRemoteObject  클래스이며 일반적으로 원격 인터페이스를 구현한 클래스(RMI 원격 객체 클래스)UnicastRemoteObject를 상속한다. 그러나 반드시 상속해야 하는 것은 아니며 기능을 구현한 다른 클래스를 상속해도 무방하다.
 
 
원격 객체 기능 구현을 위해 java.rmi.server.RemoteObject 클래스를 상속한 경우에는 default 생성자를 반드시 정의 해야 한다.
  - UnicastRemoteObject 클래스는 자신의 생성자에서 원격 객체를 등록하는 기능을 정의하고 있다.
  - 왜 반드시 해야할까? 안하면 컴파일시 에러가 발생한다. 물론 이것은 이유가 아니며 궁극적인 이유는 상속받는 RemoteObject의 생성자가 RemoteExceptionthrows 하고 있으므로 하위 클래스인 “원격 인터페이스 구현 클래스”의 생성자에서도 RemoteException

댓글 없음:

댓글 쓰기