•RMI에서
원격객체를 생성하고 이를 이름으로 등록한 후 원격 객체에 대한 클라이언트의 서비스 요청을 기다리는 쪽이 서버 이다.
오라클자바커뮤니티에서
설립한 개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#,
ASP.Net) www.onjprogramming.co.kr
•원격
객체를 이름으로 찾아 해당 객체가 제공하는 원격 메소드를
호출하는 프로그램이 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);
댓글 없음:
댓글 쓰기