[OODP] RMI

Hα ყҽσɳɠ·2021년 4월 12일

💻 RMI(Remote Method Invocation)란

  • 한 대의 PC에서 돌아가는 프로그램 또는 원격 프로그램들은 서로의 heap 메모리 영역을 공유하지 않기 때문에, 객체에 직접 접근이 불가능하다. 하지만 시스템 개발에서는 3계층 시스템이 주류를 이루고 있으며, 3계층인 데이터베이스, 클라이언트, 애플리케이션은 모두 객체를 통해 구현하고 저장하는 일이 많다. 따라서 이렇게 분산되어 있는 객체들 사이의 메시지 전송의 필요성에 의해 RMI을 사용한다.
  • RMI는 분산되어 존재하는 객체 간의 메시지 전송을 가능하게 한다.

🛠 JAVA RMI

RMI를 사용하면 한 시스템의 Java 프로그램이 원격 객체의 메소드를 호출 할 수 있다.
Java에서는 RMI라는 원격 메소드 호출을 사용하면 원격 JVM에 있는 객체를 찾아서 해당 메소를 호출 할 수 있다. 클라이언트 보조 객체는 Stub, 서비스의 보조 객체는 skeleton 이라고 한다.

  • RMI 수업 전에 socket을 먼저 배웠는데, 소켓으로는 프로토콜을 구현하기 까다롭지만 RMI는 소켓 통신을 하부에 놓고, 상위 레벨에서 메시지 전송을 수행하는 방식으로 이루어지기 때문에 상대적으로 구현하기 쉽다고 한다. (benefit이 있으니까 쓰겠지.. )

🔑 How to Implement RMI

  1. RMI Interface 작성: 구현하고자하는 interface와 method 선언 및 정의
  2. Remote Object 구현: Remote server 구현 (객체 생성 후 Naming에 rebind)
  3. Remote Client 구현: Naming에서 lookup으로 찾음
  4. Compile
  5. rmic로 stub, skeleton을 생성 (Remote Object를 구현한 클래스에 적용)
  6. rmiregistry 실행
  7. Server 실행
  8. Client 실행

가장 기본적인 RMI 예제 코드이다.

✅ RemoteDate.java

RMI 인터페이스를 선언한다. 서버와 클라이언트가 가지고 있는 메소드를 공유할 목적으로 하는 인터페이스이다.
이때 반드시 java.rmi.Remote를 extend 해야한다. 여기에 구현할 메소드는 클라이언트에서 호출할 RMI 메소드이며, 이 예제에서는 날짜를 받아오는 getDate() 메소드를 선언하였다. 원격 접속이 가능하여야 학기 때문에 public으로 선언하며, 메소드에서는 RemoteException 처리가 필수적이다.

✅ RemoteDateImpl.java

RMI server의 main 클래스로, 서버를 구현한다. RMI 서버 구현에 있어서는 UnicastRemoteObject 를 상속하여 구현하는 것이 가장 쉬운 방법이라고 한다. UnicastRemoteObject 를 상속받으면 이가 통신의 하부 구조를 구현해주며, 객체를 직렬화해준다. main과 RemoteData.java에서 선언한 getDate() 메소드를 구현한다.
마찬가지로 RemoteException 처리를 위해 default 생성자를 정의한다.
22번째 라인에서 생성한 객체를 Naming에 rebind시키는데, 이 때 bind가 아닌 rebind를 쓰는 이유는 이미 bind되어 있을 경우의 오류를 방지하기 위함이다. (자바 잘 몰라서 튜토리얼 찾아봄 ㅠ)

✅ RMIClient.java

RMI client의 main 클래스로, 클라이언트를 구현한다. RemoteDateImpl에서 바인딩 이름을 DateServer로 주었기 때문에, host에서 받아올 때도 마찬가지로 DateServer 로 표시해준다.


매우매우 단순한 RMI 코드이다. 프록시 패턴을 이해할 수 있는 다양한 코드로 연습해봐야 한다.

profile
𝑯𝒐𝒏𝒆𝒔𝒕𝒚 𝑰𝒏𝒕𝒆𝒈𝒓𝒊𝒕𝒚 𝑬𝒙𝒄𝒆𝒍𝒍𝒆𝒏𝒄𝒆

0개의 댓글