맨위로가기

RMI-IIOP

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

RMI-IIOP는 CORBA 애플리케이션 개발을 단순화하면서도 주요 이점을 유지하기 위해 개발된 기술이다. Java RMI 기술과 CORBA 기술을 결합하여 원격 객체에 대한 코드를 생성하며, CORBA와 유사하게 Inter-ORB 프로토콜 통신 표준을 사용한다. RMI-IIOP는 객체 값으로(OBV) 개념을 기반으로 하며 별도의 IDL이 필요하지 않다. 최신 버전은 표준 Servant 클래스에서 자체 서버를 파생하며, 클라이언트와 서버 간의 통신을 위한 인터페이스와 구현 예제를 제공한다. IIOP는 OMG의 상표이므로 사용에 주의가 필요하다.

더 읽어볼만한 페이지

  • 자바 플랫폼 - 블루레이
    블루레이 디스크는 DVD 후속 매체로, 청색 레이저를 사용하여 고화질 영상과 음향을 제공하며 HD DVD와의 경쟁 후 고밀도 광디스크 표준으로 자리 잡았으나 스트리밍 서비스 성장으로 녹화용 디스크 생산이 중단되는 추세이다.
  • 자바 플랫폼 - 자바 플랫폼, 마이크로 에디션
    자바 ME는 임베디드 및 모바일 장치에서 자바 앱을 실행하는 플랫폼으로, 피처폰에서 주로 사용되었으며 다양한 프로파일과 에뮬레이터, 개발 도구를 제공하고 JSR을 통해 기능이 확장된다.
RMI-IIOP
일반 정보
이름RMI-IIOP
전체 이름Remote Method Invocation over Internet Inter-ORB Protocol
종류객체 지향 시스템
설명CORBA 분산 객체 시스템에서 자바 객체로의 연결을 제공하는 API
호환성자바
지원CORBA
기술적 세부 사항
목적다른 플랫폼에서 객체를 호출할 수 있도록 함
특징IDL을 배울 필요 없이 CORBA 애플리케이션을 작성할 수 있도록 함
기반 기술OMG의 자바 언어 매핑 to OMG IDL 스펙
CORBA/IIOP 2.3.1 스펙 (formal/99-10-07)
사용 예시
사용 사례자바 플랫폼에서 CORBA 애플리케이션 개발
이점CORBA IDL 학습 부담 감소

2. 역사

RMI-IIOP는 CORBA의 장점을 활용하면서 CORBA에서의 응용 프로그램 개발의 어려움을 단순화하도록 설계되었다. RMI-IIOP는 CORBA 구조, 공용체, 시리즈, 배열, 문자열 등을 이용하며 작동은 Object by Value 개념에 근거한다.

Java RMI-IIOP 사양은 CORBA 애플리케이션 개발을 단순화하는 동시에 모든 주요 이점을 유지하기 위해 썬 마이크로시스템즈IBM에서 개발되었으며, Java RMI 기술의 기능과 CORBA 기술의 기능을 결합했다.

이 표준은 CORBA의 장점을 유지하면서 CORBA 애플리케이션 개발을 단순화하기 위해 만들어졌다. RMI-IIOP는 CORBA 구조체, 공용체, 시퀀스, 배열, 문자열 등을 대체하는 컨테이너로 작동하는 Object by Value의 개념에 기반한다(CORBA 항목 참조). IDL은 사용되지 않는다. 대신 자동으로 데이터 구조 정의를 추정하고, 리플렉션 기구로 필요한 데이터를 수집한다. CORBA에서는 전송해야 할 데이터 구조마다 보조 클래스를 생성해야 하지만, RMI-IIOP에서는 원격 객체용으로 생성된 코드를 사용하기만 하면 되므로 생성해야 할 코드량이 적기 때문에 메모리 사용량도 줄일 수 있다.

CORBA와 RMI-IIOP는 모두 통신 규격인 GIOP를 사용한다. RMI-IIOP의 데이터 구조에 대해, 필요하다면 IDL을 생성하는 것도 가능하며, 그것을 사용하여 RMI-IIOP와 순수한 CORBA 애플리케이션의 상호 운용을 수행하는 것도 가능하다.

RMI-IIOP의 최신 버전에서는 표준 서번트 클래스에서 서번트를 생성할 수 있다. 이것을 사용하면 CORBA의 ORB에 수동으로 연결할 수 있으며, Portable Object Adapter, Portable Interceptor, CORBA의 네이밍 서비스 등 다양한 CORBA 기능에 연결 가능하다.

3. 기술 사양

RMI-IIOP는 CORBA의 장점을 활용하면서 CORBA에서의 응용 프로그램 개발의 어려움을 단순화 시키도록 설계되었다. RMI-IIOP는 CORBA 구조, 공용체, 시리즈, 배열, 문자열 등을 이용하며 작동은 Object by Value 개념에 근거한다.[2]

RMI-IIOP는 원격 객체에 대해 생성된 코드를 사용하며, CORBA와 달리 복잡하지 않은 데이터에 대한 보조 클래스가 필요하지 않다. 이는 복잡성을 줄이고 작은 공간을 차지하게 한다. CORBA와 RMI-IIOP는 모두 일반적인 GIOP 통신 표준을 사용한다.

RMI-IIOP는 별도의 IDL이 필요하지 않다.[2] 대신, 데이터 구조 정의는 리플렉션 메커니즘을 통해 자동으로 발견된다. 그러나 관련 RMI-IIOP 데이터 구조에 대한 IDL 정의를 생성하고 이러한 정의를 사용하여 RMI-IIOP와 CORBA 통신 파트너 간에 더 세밀한 제어를 할 수 있다.

최신 버전의 RMI-IIOP는 표준 Servant 클래스에서 자체 서버를 파생한다. 따라서 하나 이상의 Portable Object Adapters, Portable Interceptors, CORBA naming services 및 기타 표준 CORBA 기능을 포함하여 CORBA ORB에 수동으로 연결할 수 있다.

4. 구현 예제 (Hello world)

Java RMI-IIOP를 구현한 패키지의 표준 명칭은 '''javax.rmi.CORBA'''이다.

4. 1. 인터페이스

`MyServer`와 `MyClient` 두 가지 인터페이스가 있다.

`MyServer` 인터페이스는 `Remote`를 확장하며, `receiveRequest` 메서드를 정의한다. 이 메서드는 클라이언트로부터 메시지를 받아 처리한다. 이때 클라이언트는 자신을 첫 번째 인수로 전달하며, 서버는 이를 통해 클라이언트 측의 원격 메서드를 호출할 수 있다. 이는 요청 처리에 시간이 오래 걸리는 경우에 유용하다.[1]

`MyClient` 인터페이스 역시 `Remote`를 확장하며, `receiveReply` 메서드를 정의한다. 이 메서드는 서버에서 호출되며, 클라이언트는 서버로부터 응답 메시지를 받는다.[1]

인터페이스메서드설명
`MyServer``receiveRequest(MyClient client, String message)`클라이언트로부터 메시지를 받아 처리한다. 클라이언트는 `self`를 첫 번째 인수로 전달하며, 서버는 클라이언트 측 원격 메서드를 호출할 수 있다.
`MyClient``receiveReply(String message)`서버에서 호출된다. 클라이언트는 서버로부터 응답 메시지를 받는다.


4. 2. 클라이언트 및 서버 기능 구현

RMI-IIOP 개발 도구(`rmic`)는 주어진 `MyServerImpl` 및 `MyClientImpl` 클래스를 사용하여 원격 측에서 사용되는 두 개의 스텁(stub)과 서비스 측에서 사용되는 두 개의 Tie를 생성한다. 즉, 스텁과 Tie의 쌍이 각각 클라이언트 측과 서버 측에 배치된다.

`MyServerImpl` 클래스는 `MyServer` 인터페이스를 구현하며, `receiveRequest` 메서드를 통해 클라이언트로부터 메시지를 수신하고 응답을 보낸다.

```java

public class MyServerImpl implements MyServer {

void receiveRequest(MyClient client, String message) throws RemoteException {

System.out.println("클라이언트가 말하길: " + message);

client.receiveReply("네, " + message + ", " + message + ", " + message + "...");

}

}

```

`MyClientImpl` 클래스는 `MyClient` 인터페이스를 구현한다. `talk` 메서드를 통해 서버와 통신하며, `receiveReply` 메서드는 원격 메서드 호출에 대한 응답을 처리한다. `talk` 메서드는 로컬 메서드로 서버의 `receiveRequest` 메서드를 호출한다.

```java

public class MyClientImpl implements MyClient {

MyServer server;

public MyClientImpl(String Server_IOR, ORB orb) throws Exception {

server = (MyServer) PortableRemoteObject.narrow(

orb.string_to_object(Server_IOR), MyServer.class);

}

// 이는 원격 메서드

void receiveReply(String message) throws RemoteException {

System.out.println("그리고 답은: " + message);

}

// 이는 원격 메서드가 아닌 로컬 메서드

public void talk(String conversation) {

server.receiveRequest(this, conversation);

}

}

4. 3. 서버 기능 시작 코드

java

new Thread() {

public void run() {

try {

// 공통 객체 요청 브로커 아키텍처 ORB 생성

MyServerImpl.orb = ORB.init(args, properties);

// 루트 Portable Object Adapter 획득:

POA rootPOA = POAHelper.narrow(

MyServerImpl.orb.resolve_initial_references("RootPOA")

);

// MyServerImpl에는 서버가 지원해야 하는 메서드 구현이 포함되어 있음.

MyServerImpl impl = new MyServerImpl();

PortableRemoteObject.exportObject(impl);

// Tie 구축. Tie는 서버 객체이기도 함.

// _MyServerImpl_Tie 클래스는 MyServerImpl에서 자동으로 생성됨.

Tie tie = new _MyServerImpl_Tie();

// 이 Tie의 호출 대상을 설정

tie.setTarget(impl);

// 해당 CORBA 객체에 대한 참조 획득:

org.omg.CORBA.Object object = rootPOA.servant_to_reference((Servant) tie);

// 루트 POA 활성화

rootPOA.the_POAManager().activate();

// 클라이언트에 전달할 IOR URL 획득

String Server_IOR = MyServerImpl.orb.object_to_string(object);

MyServerImpl.orb.run();

// 문자열 변수 Server_IOR의 내용을 어떻게든 클라이언트에 전송해야 함.

} catch (Exception exc) {

exc.printStackTrace();

}

}

}.start();

4. 4. 클라이언트 기능 시작 코드

MyClient the_client;

new Thread() {

public void run() {

try {

ORB orb = ORB.init(args, parameters);

the_client = new MyClientImpl(Server_IOR, orb);

POA rootPOA = POAHelper.narrow(desk.orb.resolve_initial_references("RootPOA"));

rootPOA.the_POAManager().activate();

Tie tie = new _MyClientImpl_Tie();

tie.setTarget(the_client);

org.omg.CORBA.Object object = rootPOA.servant_to_reference((Servant) tie);

String IOR = desk.orb.object_to_string(object);

orb.run();

} catch (Exception exc) {

exc.printStackTrace();

}

}

}.start();

ORB 스레드가 시작된 후 다음 코드를 실행한다.

the_client.talk("it is raining");

5. 실행 결과

처음에는 서버, 다음에는 클라이언트가 각각 다른 머신에서 시작된다 (동일 머신의 별도 프로세스에서도 상관없다). 서버는 ''The client says: it is raining''을 표시한다. 클라이언트는 '''And the answer is:''' ''Yes, it is raining, it is raining, it is raining..''을 표시한다.

여기에 제시된 코드는 썬 마이크로시스템즈의 Java 1.5와 GNU Classpath 0.95에서 동작한다.

6. 법적 문제

IIOP라는 약칭은 OMG의 상표이므로, 사용에 주의가 필요하다.[1] 이 프로토콜은 GIOP 위에 있기 때문에, GIOP를 이용하고 있다고 하는 편이 좋을 때도 있다.[1] 이것이 틀린 것은 아니지만, 약간 정확성이 떨어진다(GIOP의 구현은 이 외에도 다양하게 존재한다).[1] 자세한 내용은 GIOP를 참조한다.[1]

참조

[1] 웹사이트 Java SE Core Technologies - CORBA / RMI-IIOP http://www.oracle.co[...] ORACLE 2011-04-12
[2] 웹사이트 RMI-IIOP Programmer's Guide: What is RMI-IIOP? RMI http://download.orac[...] ORACLE 2011-04-12



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com