▶ 뭉충닷컴
 
mungchung.com login
Site Search
My Space
주절주절...
공부방
쥔장소개
Board
자유게시판
유용한 정보
Programming
강좌 & Articles
Spring 3.0
프로그래밍 Tip
   -ASP
   -PHP
   -JavaScript
   -HTML
   -Java/JSP
   -Database
   -Crystal Report
   -Visual Basic
   -이클립스
   -리눅스
   -기타
Windows API (VB)
Spread Sheet 7.0
컴퓨터활용 Tip
Other things
StarCraft 전략
StarCraft 문서
김용(金庸)
Son Q & Dieda

RMI, IIOP에 대한 설명

JAVA 조회 수 6898 추천 수 0 2008.01.22 09:49:29
IIOP는 일종의 객체 지향 프로토콜로, 다른 프로그래밍 언어로 쓰여진 분산 프로그램이 인터넷을 통해 서로 통신할 수 있도록 한다. IIOP는 전략적 산업 표준인 CORBA(Common Object Request Broker Architecture)의 핵심 부분이다. CORBA의 IIOP 그리고 관련 프로토콜을 이용하면, 한 회사가 다른 회사의 프로그램에 대해 그들이 어디 있든지 상관없이, 그 서비스의 내용과 이름만을 알고서도 서로 통신할 수 있는 프로그램을 작성할 수 있다. CORBA와 IIOP는 마이크로소프트의 소위 DCOM(Distributed Component Object Model)과 비슷한 전략으로 경쟁하고 있다 (마이크로소프트와 CORBA의 스폰서인 OMG는 두 모델 간에 다리를 놓는 소프트웨어 개발에 동의함으로써, CORBA로 설계된 프로그램이 DCOM으로 설계된 프로그램과 통신할 수 있도록 하였다.)

CORBA와 IIOP는 클라이언트 프로그램이 항상 요구하고 서버 프로그램이 클라이언트의 요구를 기다리는 클라이언트/서버 모델을 가정한다. 프로그램 작성시, GIOP(General Inter-ORB Protocol)라 불리는 인터페이스를 사용하는데, GIOP는 하나 이상의 네트웍 전송 계층을 위해 특화된 매핑으로 구현되었다. GIOP의 가장 중요한 특화 매핑은 IIOP로, 이것은 TCP를 이용한 인터넷의 전송 계층에서 요구를 전하거나 응답을 받는 것이다. 다른 가능한 전송 계층으로는 IBM의 SNA (Systems Network Architecture)와 Novell의 IPX가 있다.

클라이언트가 네트웍 상 어딘가에 있을 어떤 프로그램에 대해 처리요구를 하려면, 그 프로그램의 주소를 가져야 하는데, 이 주소를 IOR (Interoperable Object Reference)이라고 부른다. IIOP를 이용할때, 주소의 일부는 서버의 포트 번호와 IP주소에 기반을 둔다. 클라이언트 컴퓨터에서, IOR을 더 사용하기 쉬운 프럭시(proxy) 이름으로 대응시키는 표가 만들어질 수 있다. GIOP는 프로그램이 IOR과 연결하여 그에게 요청할 수 있도록 한다(그리고 서버가 응답을 보내도록 한다). CDR (Common Data Representation)은 자료를 암호화/복호화 하는 방법을 제공하여 표준 방식으로 교환하도록 한다.

유사한 프로토콜로, RMI (Remote Method Invocation)는 썬마이크로시스템즈가 자바 프로그래밍 언어를 위한 플랫폼간 구조를 지원하기 위해 개발하였다. 썬은 RMI를 사용하는 프로그램이 IIOP에 전사되도록 하는 방법을 제공한다.


RMI (Remote Method Invocation)

RMI는 자바 프로그래밍 언어와 개발환경을 사용하여 서로 다른 컴퓨터들 상에 있는 객체들이 분산 네트웍 내에서 상호 작용하는 객체지향형 프로그램을 작성할 수 있는 방식이다. RMI는 일반적으로 RPC라고 알려져 있는 것의 자바 버전이지만, 그러나 요청과 함께 하나 이상의 객체들을 통과시키는 능력을 가지고 있다. 객체는 원격 컴퓨터 내에서 수행될 서비스를 변경하는 정보를 포함할 수 있다. 자바를 발명한 회사인 썬 마이크로시스템즈에서는 이것을 "움직이는 작용"(moving behavior)이라고 부른다. 예를 들면, 원격 컴퓨터에 있는 사용자가 비용 청구서를 채울 때, 사용자와 상호작용을 하는 자바 프로그램은 RMI를 사용하여 비용 보고에 관해 항상 최신 방침을 가지고 있는 다른 컴퓨터의 자바 프로그램과 통신할 수 있을 것이다. 이에 답하여, 그 프로그램은 최신 방침에 위반됨이 없는 방식으로 사용자의 비용 청구서 데이터를 심사하는 원격 컴퓨터 프로그램의 이용을 허락하는 객체와, 관련 메쏘드 정보를 돌려보낼 것이다. 사용자와 회사는 둘 모두 초기에 실수를 예방함으로써 시간을 절약할 수 있게 된다. 회사의 방침이 변경될 때마다, 오직 한 컴퓨터에 있는 프로그램만 변경하면 된다.

썬은 그것의 객체 매개변수 전달 방식을 객체 직렬화라고 부른다. RMI 요청은 원격 객체의 메쏘드를 부르는 요청이다. 이 요청은 지역 컴퓨터 내에 객체 메쏘드를 부르는 것과 같은 구문 형식을 가진다. 일반적으로, RMI는 네트웍에 걸쳐 있는 객체 모델과 그것의 장점들을 보호하기 위해 설계된다.

RMI는 응용프로그램과 자바 가상머신 사이에 세 개가 계층으로 구현된다. 그 세 가지 계층이란 다음과 같다.

클라이언트/서버 관계의 클라이언트 측에 있는 스터브 프로그램과, 서버 측에서 대응하는 조직. 호출하는 프로그램에게 스터브는 서비스를 위해 호출되는 프로그램으로 보이게 된다 (썬은 스터브와 비슷한말로 프럭시라는 용어를 사용한다)..
Remote Reference Layer는 호출하는 프로그램에 의해 전달된 매개변수에 따라 다르게 행동할 수 있다. 예를 들면, 이 계층은 그 요청이 단일 원격 서비스를 호출하는 것인지 또는 멀티캐스트에서 다중 원격 프로그램을 호출하는 것인지를 결정할 수 있다.
Transport Connection Layer는 이 요청을 설정하고 관리한다.
단일 요청은 한 컴퓨터 상에 있는 계층들을 통하여 아래로 내려오며, 다른 쪽에 있는 컴퓨터의 계층들을 통하여 위로 올라간다. RMI는 썬 마이크로시스템즈의 JDK의 일부로서 공급된다.



출처 : 엠파스












간단히 코드 작성해보기



RMI-IIOP
   - 자바의 RMI기술이 나오기전에는 OMG에서 표준으로 정한 코바(CORBA)가 표준으로 사용되고 있었습니다.
     코바와 RMI는 몇가지 차이점이 있습니다.

     ① 코바는 IIOP 프로토콜을 이용하지만, RMI는 JRMP를 이용합니다.
     ② 코바는 언어 독립적이지만, RMI는 자바 언어에만 사용됩니다.
     ③ 코바는 원격 객체의 위치를 찾기 위해서  CosNaming을 사용하지만, RMI는 JNDI를 사용합니다.
     ④ RMI는 객체 직렬화 기술을 사용하지만, 코바는 객체 직렬화 기술을 사용하지 않습니다.

  - 코바의 경우에는 언어중립적이란 장점이 있는데 플랫폼 중립적인 언어인 IDL언어를 학습해야 하는
    문제가 있고, RMI의 경우에는 코바에 비해서 분산프로그램을 쉽게 구현할 수 있었으나, 다른언어로
    작성된 플랫폼과 통신할 수 없는 문제가 있습니다.

  - 위와 같은 문제점을 해결하고, 기업용 애플리케이션 개발 기술로써 자바의 발전을 촉진시키기 위해서
    1997년 IBM과 썬 마이크로시스템즈는 공동의 노력을 시작하게 되었고 그결과 RMI와 코바의 장점을 결합한
    기업용 전송기술인 RMI-IIOP를  만들었습니다.

  - RMI-IIOP와 RMI의 개발 방법차이

    ① rmiregistry가 아닌 tnameserv를 실행합니다. (썬에서 제공해주는 네이밍 서버입니다.)
    ② rmic 명령을 실행할 때 iiop 옵션을 지정해서 iiop형식의 스텁과 타이를 생성합니다.
    ③ RMI 프로그래밍에서 분산객체 클래스는 UnicastRemoteObject클래스를 상속받지만, RMI-IIOP 프로그램
       에서는  PortableRemoteObject클래스를 상속받습니다.
    ④ 원격객체를 등록하고 착기 위해선 Context객체를 사용합니다.
    ⑤ policy파일을 만들 필요가 없습니다.

  
  
  - RMI-IIOP 예제 (HelloIIOP)

  - 원격인터페이스 작성 (HelloIIOP.java)


package iiop;

import java.rmi.*;
public interface Hello extends Remote{
public String getName(String name) throws RemoteException ;

}


  - 원격인터페이스 구현하는 원격객체 작성(HelloIIOPImpl.java)


package iiop;

import javax.rmi.*;
import java.rmi.*;
public class HelloImp extends PortableRemoteObject implements Hello{
public HelloImp() throws RemoteException{}
public String getName(String name){
  return "안녕하세요??!!! "+name+"님!!";
}

}





  
  - 원격객체를 등록하기 위한 애플리케이션 작성(HelloIIOPBind.java)

package iiop;

import java.rmi.*;
import java.util.*;
import javax.naming.*;
public class HelloBind {
public static void main(String args[]){
  try{
   Hello obj = new HelloImp();
   Properties p = new Properties();
   p.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory");
   p.put(Context.PROVIDER_URL, "iiop://localhost");
   Context c = new InitialContext(p);
   c.rebind("hello",obj);
   System.out.println("Hello 객체가 등록되었습니다.");
  }catch(Exception e){
   System.out.println("등록이 안되었습니다."+e.toString());
  }
}

}




  - 원격객체를 실제로 이용하는 클라이언트 프로그램 작성(HelloIIOPClient.java)

package iiotest;

import rmi.*;
import java.rmi.*;
import java.util.*;
import javax.naming.*;
import javax.rmi.*;

import javax.naming.Context;
public class HelloTest {

public static void main(String[] args) {
  try{
   Properties p = new Properties();
   p.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory");
   p.put(Context.PROVIDER_URL, "iiop://localhost");
   Context c = new InitialContext(p);
   Object obj = c.lookup("hello");
   Hello h = (Hello)PortableRemoteObject.narrow(obj,Hello.class);
   System.out.print(h.getName("아로미"));
  }catch(Exception e)
  {
   System.out.println(e);
  }

}

}





  - 컴파일과 스텁, 타이 생성

    javac *.java

    rmic -iiop iiop.HelloImp


  - tnameserv의 실행과 원격 객체 등록

    start tnameserv

    start java iiop.HelloBind


  - 원격 객체를 이용하는 클라이언트 실행

    java iioptest.HelloTest



문서 첨부 제한 : 0Byte/ 2.00MB
파일 크기 제한 : 2.00MB (허용 확장자 : *.*)
List of Articles
번호 제목 글쓴이 날짜sort 조회 수
15 JAVA 이클립스에 톰캣서버 연동하기 file 뭉충닷컴 2008-03-21 10658
14 JAVA while문 이용하여 텍스트파일에 쓰여진 글 읽기 뭉충닷컴 2008-02-26 9497
13 JAVA 오늘 날짜 구하기 뭉충닷컴 2008-02-22 11287
12 JAVA Java 형변환 정리 뭉충닷컴 2008-02-06 13473
11 JAVA HashMap, TreeMap, Hashtable 사용법 정리 file 뭉충닷컴 2008-01-29 29769
10 JAVA value 값이 Ljava.lang.String 형일 때 실제 값 보기 뭉충닷컴 2008-01-29 10934
9 JAVA 톰캣(tomcat) 4.x 버젼에서 한글/UTF-8 사용하기 file 뭉충닷컴 2008-01-28 8509
» JAVA RMI, IIOP에 대한 설명 뭉충닷컴 2008-01-22 6898
7 JAVA 자바의 직렬화(Serializable) 설명 뭉충닷컴 2008-01-18 7044
6 JAVA BLOB으로 저장된 사진정보 파일로 받기 이영진 2007-08-31 14825
5 JAVA classes12와 ojdbc14의 CLOB 처리 비교 이영진 2007-08-30 13958
4 JAVA classes12와 ojdbc14 connection 선언시 차이 [1] 이영진 2007-08-30 9067
3 JAVA java, infix를 postfix로 만들기 file 뭉충닷컴 2007-04-05 16138
2 JAVA "==" 과 "equals()" 의 차이점 뭉충닷컴 2003-11-04 6831
1 JAVA split와 StringTokenizer 비교 뭉충닷컴 2003-11-04 9506