RMI ( Remote Method Invocation )
- 원격에 있는 메소드를 로컬에 있는 것처럼 호출하여 사용가능하게 하는 기술
- 분산되어 존재하는 객체 간의 메세지 전송( 메소드 포함 )을 가능하게 하는 프로토콜
- RMI 자체는 분산개체 간의 통신을 구현하는 모든 프로토콜을 의미함
장점
구현하기 쉽다
- 네트워크 프로그래밍 > Socket 많이 사용
- 소켓으로는 프로토콜을 구현하기가 매우 까다롭고 힘이든다
신뢰성 보장
- 상위 레벨의 통신 계층에서 수행하기 때문에 통신에 대한 신뢰성이 확보되고 또한 자바 자체에서 제공하는 Libarary
자바 플랫폼을 사용
- 자바는 RMI의 JVM에서 언제든 활용하고 사용 가능
- 단, 동종의 자바가 아니면 제약이 따름 ( sun java, gun java 간의 RMI)
RMI 구조 및 과정
클라이언트 <-> 서버가 아니라
클라이언트 <-> 레지스트리 <-> 서버
- 서버는 먼저 이름을 가지고 Registry에 bind 해야함
Registry registry = LocateRegistry.createRegistry(PORT);
RMIBookInterface addressBookIf =
new AddressBookImpl();
registry.rebind("ADDRESSBOOK", addressBookIf); // registry에 rebind
- Client가 원격 참조를 설정하기 위해 레지스터에서 서버 이름 조회
if (remote instanceof CalcInterface) { // 서버에 해당 인터페이스가 존재하는지 확인
CalcInterface calc = (CalcInterface)remote; // 객체생성 없이 캐스팅하여 메서드 호출
LOGGER.debug(String.format("1 + 2 = %s", calc.add(1, 2)));
}
RMI 구성
Server
- 공통 인터페이스
- 구현 클래스
- 스켈레톤 클래스
- 서버실행 클래스
Client
- 공통 인터페이스
- stub 클래스 : Client만을 의미
- 클라이언트 실행 클래스
RMI 서버 작성 순서
1. 공통(원격) 인터페이스 작성 (서버, 클라이언트 모두 가지고 있어야함)
- Remote interface 상속 ( extends )받아야 함 ( interface가 interface에게 상속 받음 - implement )
- public interface이어야 함
- 모든 메서드는 RemoteException 처리 해야한다
- 원격처리 중 인터넷 상에서 예외가 발생할 수 있기 때문
- 매개변수 return 값은 직렬화된 객체 ( String 객체 등 기본형 ) 직렬화 ( Serilizable 인터페이스 구현 )
구현 클래스 작성
- interface를 implements 후 상속 받을 때 UnicastRemotObject 를상속받아야함
- 이것을 상속 받아야 RMI interface라고 인식
- 직렬화 가능 클래스를 뜻함
- 무조껀 Public .
- 반드시 생성자를 만들어야하고 , remoteException을 throws
- 상속받은 UnicastRemoteObject 생성자에서 예외가 발생하기때문
RMI 클라이언트 작성
'인턴' 카테고리의 다른 글
[인턴 OJT 21일차] RMI 채팅, RackView 코드리뷰 (0) | 2023.01.11 |
---|---|
[인턴 OJT 20일차] RMI Rack view (1) | 2023.01.09 |
[인턴 OJT 18일차] 소켓 주소록 피드백 (0) | 2023.01.09 |
[인턴 OJT 17일차] 소켓을 활용한 주소록과 흐름 (0) | 2023.01.09 |
[인턴 OJT 16일차] socket (0) | 2023.01.09 |