고급자바_네트워킹_RMI

oungoo·2020년 10월 15일
0

JAVA_고급

목록 보기
15/19

RMI

Remote Method Invocation

  • 원격 메서드 호출
  • 분산되어 존재하는 객체 간의 메시지 전송(메서드 호출 포함)을 가능하게 하는 프로토콜
  • Server : 이름을 가지고 Registry에 bind
  • Client : 원격참조 설정 위해 Registry에서 서비 이름 조회

특징

  • java에서만 사용
  • 구현하기 쉬움
  • TCP 방식으로 신뢰성 보장

RMI Server

RMI용 인터페이스 정의

  • 서버, 클라이언트 모두 가지고 있어야 함
  • public interface
  • RMI용 인터페이스는 Remote를 상속해야 함
  • 모든 메서드는 RemoteException을 처리해야 함
public interface RemoteInterface extends Remote {

}
  • Remote : 마커인터페이스, RMI용이라는 표시
  • 클라이언트 입장에서는 이 인터페이스만 알고 있으면 원격에 있는 객체를 가지고 오고 싶을 때 인터페이스 방식대로 호출만 하면 됨.
    인터페이스 기반 코딩은 유지보수가 좋음!

데이터 전달용 VO클래스

  • 네트워크를 통해서 전달되어야 하기 때문에 직렬화 필요
  • serializable 인터페이스 구현한 형태로 작성 (마커인터페이스)

원격클래스 정의

  • RMI용 인터페이스를 구현하고(implements RemoteInterface)
  • UnicastRemoteObject 클래스를 상속(extends)
  • 기본생성자는 예외처리 할 수 없음
  • 반드시 생성자를 만들고, RemoteException을 throws
  • 모든 메서드는 RemoteException을 처리
public class RemoteServer extends UnicastRemoteObject implements RemoteInterface {
	protected RemoteServer() throws RemoteException {
    super();
    }
}

Registry에 등록하기

  • RMI용 인터페이스를 구현한 원격객체 생성
RemoteInterface inf = new RemoteServer();
  • 구현한 RMI용 객체를 클라이언트에서 사용할 수 있도록 Registry 객체를 생성해서 등록
    • 포트번호 지정하여 Registry 객체 생성
    • 기본포트값 : 1099
Registry reg = LocateRegistry.createRegistry(port);
  • Registry 서버에 제공하는 객체 등록
    • 형식 : Registry객체변수.rebind("객체의 Alias", 원격객체);
    • 별명과 실제 객체를 매핑
    • 이미 바인드가 되어 있으면 바인드가 안되기 때문에 rebind 사용
    • rebind는 바인드 되어 있으면 안하고, 안되어있으면 함
reg.rebind("server",inf);

RMI Client

  • RMI Server에 있는 메서드를 가지고 와서 실행함
  • 클라이언트의 프로젝트에도 서버의 패키지와 같은 구조로 interface와 VO파일이 있어야 함.
  • 클래스 이름은 사실 패키지명도 포함하고 있어서, 패키지 이름이 다르면 다른 클래스로 인식함.

Registry 불러오기

  • 등록된 서버를 찾기 위해 Registry 객체를 생성한 후 사용할 객체 불러옴
Registy reg = LocateRegistry.getRegistry(IP, port);

lookup()

  • 레지스트리가 제공하는 메서드
  • Object로 반환하기 때문에 캐스팅 필요함
RemoteInterface inf = (RemoteInterface)reg.lookup("server");
// 이제 원격객체의 메서드 사용가능함

참고

  • RMI

https://0yumin.tistory.com/16

https://zeroit.tistory.com/entry/Java-Network-RMI-%ED%86%B5%EC%8B%A0

0개의 댓글