•RMI에서
원격객체를 생성하고 이를 이름으로 등록한 후 원격 객체에 대한 클라이언트의 서비스 요청을 기다리는 쪽이 서버 이다.
•원격
객체를 이름으로 찾아 해당 객체가 제공하는 원격 메소드를
호출하는 프로그램이 RMI
클라이언트
이다.
•원격
객체에 대한 레퍼런스(원격
레퍼런스)를
이름을 통해 얻어 낼 수 있도록 rmiregstry
라는
네이밍 서버 데몬을
제공 한다.
•원격
참조(레퍼런스)를
통해 서로 다른 JVM
환경의
원격 메소드를
자신의 로컬 JVM
환경에서
생성한 객체와 다름없이 호출 할 수 있는 메커니즘(stub,
skeleton)을
제공 한다.
•원격
객체의 메소드
호출 시 객체를 주고 받을 수 있는 메커니즘을 제공한다.
(원격
객체 메소드
호출시
사용되는 파라미터나
리턴 타입이 Serializable을
구현했을 경우 객체 직렬화를 이용
가능)
•RMI에서
pass-by-value이
경우는 원격 메소드 호출시
사용하는 파라미터나
리턴 타입에 적용 되며 pass-by-reference인
경우는 원격 객체에 대한 레퍼런스 이다.
pass-by-reference는
stub과
skeleton의
통신에 사용된다.
•다음
코드에서 remoteObj가
Hello
타입의
원격 레퍼런스다.
//HelloClient.java
Object obj
= Naming.lookup("rmi://loclahost:1099/HelloRemote");
Hello remoteObj
= (Hello)obj;
•RMI는
원격 객체에 대한 참조로 stub을
사용한다.
즉
RMI
클라이언트
Application에서
사용하는 원격 객체의 reference는
실제로 stub에
대한 reference
이다.
•하나의
JVM에서
생성한 객체를 다른 JVM에서
그대로 실행 한다는 것은 불가능 하다.(주소
공간이 틀리기 때문)
, 즉
이것이 RMI에서
원격 객체에 대한 참조를 원격객체를 직접 가리키지 않고 stub을
사용하는 이유이다.
•예를
들어 RMI
클라이언트에서
RMI
서버의
메소드를
호출 한다고 했을 때 먼저 로컬 stub
객체에
먼저 전달된 후에 원격의 skeleton
객체에
전달되고 skeleton이
실제 객체의 비즈니스 메소드를 호출 하는 것이다.
•원격
메소드
호출에 사용하는 실 매개변수와 리턴되는
데이터의 상태를 원격의 클라이언트/서버
간에 유지할 필요가 없을 때는 직렬화(Serialization)를
통해 Pass-by-value로
복사본을 주고 받는다.(객체나
자바 내장 데이터 타입인 경우 객체 직렬화를 사용한다.)
•자바
RMI의
경우 서버에서 이름으로 등록한 원격 객체를 클라이언트에서 개발자가 직접 저 수준의 네크웍 코드를 직접 작성하지 않고 등록된 이름으로 원격에 존재하는 비즈니스 객체를
참조 할 수 있도록 rmiregistry라는
Naming
Server Daemon을
제공 한다.
•아래의
코드는 rmiregistry를
통해 원격 객체 remoteObj를
“HelloRemote”라는
이름으로 등록하는 RMI
서버
Application의
일부분 이다.
//원격
객체 생성
HelloImpl
remoteObj
= new HelloImpl();
//생성한
원격 객체를 “HelloRemote”라는
이름으로 rmiregistry에
등록 한다.
java.rmi.Naming.rebind("rmi://localhost:1099/HelloRemote",
remoteObj);
댓글 없음:
댓글 쓰기