RMI는 원격 메소드 호출(Remote Method Invocation)의 약자입니다. 한 시스템(JVM)에 존재하는 객체가 다른 JVM에서 실행 중인 객체에 접근하거나 그 메소드를 호출할 수 있게 해주는 메커니즘입니다.
RMI는 분산 애플리케이션을 구축하는 데 사용되며, Java 프로그램 간의 원격 통신을 제공합니다. 관련 기능은 java.rmi 패키지에 포함되어 있습니다.
RMI 기반 Java 애플리케이션을 작성하려면 아래 단계를 순서대로 따라야 합니다.
1단계 - 원격 인터페이스 정의하기
원격 인터페이스는 특정 원격 객체가 제공하는 모든 메소드의 명세를 담고 있습니다. 클라이언트는 이 원격 인터페이스를 통해 서버와 통신합니다. 따라서 미리 정의된 인터페이스인 java.rmi.Remote를 상속(extends)하는 인터페이스를 생성해야 합니다.
예제
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote {
void printMsg() throws RemoteException;
}2단계 - 구현 클래스(원격 객체) 개발하기
이전 단계에서 생성한 원격 인터페이스를 구현해야 합니다. 구현 클래스를 별도로 작성할 수도 있고, 서버 프로그램이 직접 이 인터페이스를 구현하도록 만들 수도 있습니다. 즉, 원격 인터페이스의 모든 추상 메소드에 대한 실제 구현을 제공하면 됩니다.
예제
public class ImplExample implements Hello {
public void printMsg() {
System.out.println("This is an example RMI program");
}
}3단계 - 서버 프로그램 개발하기
RMI 서버 프로그램은 원격 인터페이스를 구현하거나 구현 클래스를 상속해야 합니다. 여기서는 원격 객체를 생성한 뒤 RMI 레지스트리(RMIregistry)에 바인딩(bind)해야 합니다. 다음과 같이 서버 프로그램을 작성합니다.
예제
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class Server extends ImplExample {
public Server() {}
public static void main(String args[]) {
try {
ImplExample obj = new ImplExample();
Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
Registry registry = LocateRegistry.getRegistry();
registry.bind("Hello", stub);
System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}4단계 - 클라이언트 프로그램 개발하기
클라이언트 프로그램에서는 원격 객체를 가져온(fetch) 후, 해당 객체를 사용하여 필요한 메소드를 호출합니다.
예제
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Client {
private Client() {}
public static void main(String[] args) {
try {
Registry registry = LocateRegistry.getRegistry(null);
Hello stub = (Hello) registry.lookup("Hello");
stub.printMsg();
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}5단계 - 애플리케이션 컴파일하기
애플리케이션을 컴파일하려면 다음 항목들을 각각 컴파일해야 합니다.
원격 인터페이스 컴파일
구현 클래스 컴파일
서버 프로그램 컴파일
클라이언트 프로그램 컴파일
6단계 - 애플리케이션 실행하기
다음 명령어로 rmi 레지스트리를 시작합니다.
Start rmiregistry
이 명령을 실행하면 별도의 창에서 rmi 레지스트리가 시작됩니다.
아래와 같이 서버 클래스 파일을 실행합니다.
아래와 같이 클라이언트 클래스 파일을 실행합니다.
결과 확인 - 클라이언트를 시작하는 즉시 서버 쪽에서 다음과 같은 출력 결과를 확인할 수 있습니다.