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에 등록하기
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");
참고
https://0yumin.tistory.com/16
https://zeroit.tistory.com/entry/Java-Network-RMI-%ED%86%B5%EC%8B%A0