Java IDL 입문:인터페이스 정의의 기술 - xrath.com 에서 번역됨

# Java IDL 입문:
인터페이스 정의의 기술

주: 모든 커멘드와 트러블 슈팅의 지시는, Java 2 Platform, Standard Edition 버젼 1.4 및 그 버젼의 `idlj` 에만 적용됩니다.

Java IDL 를 사용하기 전에, 버젼 1.4 의 J2SE 를 인스톨 할 필요가 있습니다. J2SE v1. 4 에는,`idlj` 컴파일러와 같게, CORBA 베이스의 분산 객체의 개발을 가능하게 하기 위해서 필요한 Application Programming Interface (API) 및 Object Request Broker (ORB)가 있습니다. `idlj` 컴파일러는, IDL-to-Java 언어 매핑을 사용해 IDL 인터페이스 정의를 대응하는 Java 인터페이스, 클래스, 메소드로 변환합니다. 다음에, 이것들을 사용해 클라이언트와 서버 코드를 구현할 수가 있습니다.

여기에서는, 간단한 IDL 인터페이스 정의의 기술 방법과 IDL 인터페이스를 Java 에 번역하는 방법을 배웁니다. 또,`idlj` 컴파일러에 의해 생성되는 각 파일의 목적도 설명합니다.

여기에서는, 다음의 항목에 대해 설명합니다.

1. `Hello.idl` 의 기술
2. IDL 파일의 이해
3. `Hello.idl` 의 IDL 로부터 Java 에의 매핑
4. idlj 컴파일러의 출력의 이해

## `Hello.idl` 의 기술

`Hello.idl` 파일을 작성하려면 , 다음과 같이 합니다.

1. 이 어플리케이션용으로 `Hello` 라는 이름의 새로운 디렉토리를 작성합니다.

2. 임의의 텍스트 문자 편집기를 기동해, 이 디렉토리에 `Hello.idl` 라는 이름의 파일을 작성합니다.

3. 작성한 파일 Hello.idl 에, 인터페이스의 정의를 위해서(때문에) 다음의 코드를 입력합니다.

       module HelloApp
       {
         interface Hello
         {
           string sayHello();
           oneway void shutdown();
         };
       };

4. 파일을 보존합니다.

## IDL 파일의 이해

OMG IDL 는, 클라이언트 객체에 의해 불려 가고 객체 구현에 의해 제공되는, 인터페이스의 기술에 사용되는 언어입니다. 인터페이스 정의를 OMG IDL 로 기술하면(자), 인터페이스를 완전하게 정의해, 각 오퍼레이션의 파라미터를 완전하게 지정할 수가 있습니다. OMG IDL 인터페이스에는, 그 인터페이스의 오퍼레이션을 사용하는 클라이언트를 개발하기 위해서 필요한 정보가 모두 준비되어 있습니다.

클라이언트는, OMG IDL 로부터의 매핑이 정의되고 있는 언어로 기술됩니다. OMG IDL 로부터 클라이언트의 언어 구조에의 매핑은, 클라이언트의 언어에 준비되어 있는 기능에 따라서 다릅니다. OMG 에서는 IDL 로부터 다른 언어에의 매핑을 지정하고 있습니다. 이러한 언어에는 C, C++, Smalltalk, COBOL, Ada, Lisp, Python, 및 Java 가 있습니다. OMG IDL 의 구문을 매핑 하면(자), 선택한 프로그램 언어의 대응하는 구문으로 번역됩니다.

예를 들어,`idlj` 툴을 사용하면(자), IDL 인터페이스를 Java 에 매핑 해클라이언트 클래스를 구현할 수 있습니다. 다음에 같은 IDL 를 C++ 에 매핑 해, C++ 로서버를 구현하면(자),Java 클라이언트 (Java ORB 를 개입시켜)와 C++ 서버 (C++ORB 를 개입시켜)는, 동일한 언어로 기술되었을 경우와 같게 서로 교환을 할 수 있습니다.

「Hello World」의 IDL 는, 1 개의 인터페이스에 오퍼레이션이 2 개만이라고 한다, 매우 간단한 것입니다. 다음의 3 스텝에서 완성합니다.

1. 모듈의 선언
2. 인터페이스의 선언
3. 오퍼레이션의 선언

### 모듈의 선언

CORBA 모듈은, 관련하는 인터페이스와 선언의 컨테이너의 역할을 완수하는이름 공간입니다. 이 모듈은, Java 패키지와 엄밀에 대응하고 있습니다. IDL 파일내의 각 모듈문은, 각각 1 개의 Java 패키지문에 매핑 됩니다.

모듈문의 예를 나타냅니다.

    module HelloApp
    {
        // Subsequent lines of code here.
    };

IDL 를 컴파일 하면(자), 이 모듈문으로부터 package 문이 Java 코드로 생성됩니다.

### 인터페이스의 선언

Java 인터페이스와 같게, CORBA 인터페이스는, 어느 객체가 다른 객체에 대해서 가지는 API 규약을 선언합니다. IDL 의 인터페이스문은 각각 Java 인터페이스문에 매핑 됩니다.

`Hello.idl` 파일에서는, 인터페이스문은 다음과 같이 됩니다.

    module HelloApp
    {
      interface Hello  // These lines
      {                // declare the
                       // interface
      };               // statement.
    };

IDL 를 컴파일 하면(자), 이 문장으로부터 인터페이스문이 Java 코드로 생성됩니다.

### 오퍼레이션의 선언

CORBA 의오퍼레이션은, 서버가, 그 서버를 호출한 클라이언트에 대신해 실행하는 동작입니다. IDL 의 각 오퍼레이션문으로부터, 대응하는 Java 인터페이스의 메소드문이 생성됩니다.

`Hello.idl` 파일에서는, 오퍼레이션문은 다음과 같이 됩니다.

    module HelloApp
    {
      interface Hello
      {
        string sayHello();        // This line is an operation statement.
        oneway void shutdown();   // This line is another
      };
    };

이것으로, 작은 「Hello World」어플리케이션의 인터페이스 선언이 완성했습니다.

## `Hello.idl` 로부터 Java 에의 매핑

`idlj` 툴은 OMG IDL 파일을 읽어들여, 필요한 Java 파일을 작성합니다. `idlj` 컴파일러는, 디폴트로 클라이언트측의 바인딩만을 생성합니다. 클라이언트측의 바인딩과 서버측의 스켈리턴의 양쪽 모두가 필요한 경우 ( 「Hello World」프로그램과 같이),`idlj` 컴파일러를 실행할 경우에,`-fall` 옵션을 사용할 필요가 있습니다. IDL-to-Java 컴파일러의 옵션의 자세한 것은, 링크를 참조해 주세요.

J2SE v1. 4 의 신기능:`-fall` 또는 `-fserver` 의 어느 쪽인가의 인수가 사용될 때 생성되는 디폴트의 서버측 매핑은, CORBA 2.3. 1 스펙의 제 11 장 「POA (Portable Object Adapter)」(formal/99-10-07 )에 준거하고 있습니다. POA 의 상세한 것에 대하여는,「Portable Object Adapter」를 참조해 주세요.

POA (Portable Object Adaptor)를 사용하는 이점은, 다음과 같습니다.

- 프로그래머가, 다른 ORB 제품간에 이식 가능한 객체 구현을 구축할 수 있도록(듯이) 한다
- 지속성이 있는 식별 정보를 가지는 객체를 지원한다
- 객체가 투과적으로 기동하도록(듯이) 지원한다
- 단독의 서번트가 각각 식별되는 복수의 객체를 동시에 지원할 수 있도록(듯이) 한다

1. `jdk/bin` 디렉토리 (또는 `idlj`,`java`,`javac`, 및 `orbd` 를 포함하고 있는 디렉토리)가 실행 패스에 포함되어 있는 것을 확인합니다.

2. 커멘드행 prompt가 표시되고 있는 상태로 합니다.

3. `Hello.idl` 파일이 있는 디렉토리로 이동합니다.

4. 컴파일러의 커멘드를 입력합니다.

       	idlj -fall Hello.idl

디렉토리의 내용을 일람표 가리켜 보세요. `HelloApp` 라는 이름의 디렉토리가 작성되어 그 중에 6 개의 파일이 보존되고 있는 것을 알 수 있습니다. 텍스트 문자 편집기로 `Hello.java` 를 엽니다. `Hello.java` 는시그니챠인타페스로, 지정된 형태의 인터페이스가 다른 인터페이스로 사용되는 경우에, 메소드 선언으로 시그니챠형으로서 사용됩니다. 다음과 같이 됩니다.

    //Hello.java
    package HelloApp;

    /**
    * HelloApp/Hello.java
    * Generated by the IDL-to-Java compiler (portable), version "3.0"
    * from Hello.idl
    */

    public interface Hello extends HelloOperations, org.omg.CORBA.Object,
    org.omg.CORBA.portable.IDLEntity
    {
    } // interface Hello

이 인터페이스는 간단해서, IDL 문이 생성된 Java 문에 어떻게 매핑 되고 있을지를 잘 압니다.

IDL 문 |  | Java 문
--- | --- | ---
`module HelloApp` | `` | `package HelloApp;`
`interface Hello` | `` | `public interface Hello`

`extends` 문에 주목해 주세요. 필요한 CORBA 기능을 확실히 갖추기 위해서(때문에), 모든 CORBA 객체는 `org.omg.CORBA.Object` 로부터 파생하고 있습니다. 필요한 코드는 `idlj` 에 의해 생성됩니다. 사용자가 매핑을 실시할 필요는 없습니다.

이전의 버젼의 `idlj` 컴파일러 (`idltojava` 라고도 불린다)에서는, IDL 인터페이스로 정의되는 오퍼레이션도 이 파일에 있습니다. J2SDK v1. 3.0 으로부터, IDL-to-Java 매핑은, CORBA 2.3. 1 스펙 (formal/99-10-07 )에 따라, IDL 인터페이스로 정의되는 모든 오퍼레이션을오퍼레이션 인터페이스의 `HelloOperations.java` 에 기술하고 있습니다. 오퍼레이션 인터페이스는, 서버측 매핑으로 사용되어 같은 장소에 있는 클라이언트와 서버에 최적화된 호출을 제공하는 기구로서 사용됩니다. `Hello.idl` 에서는, 이 파일은 다음과 같이 됩니다.

    //HelloOperations.java
    package HelloApp;

    /**
    * HelloApp/HelloOperations.java
    * Generated by the IDL-to-Java compiler (portable), version "3.0"
    * from Hello.idl
    */

    public interface HelloOperations
    {
      String sayHello ();
      void Shutdown ();
    } // interface HelloOperations

이 인터페이스에 정의되고 있는 오퍼레이션은 2 개 뿐이므로, 생성된 Java 문에 어떻게 IDL 문이 매핑 되고 있는지를 간단하게 압니다.

IDL 문 |  | Java 문
--- | --- | ---
`string sayHello();` | `` | `String sayHello();`
`oneway void shutdown();` | `` | `void Shutdown ();`

## `idlj` 컴파일러의 출력의 이해

`idlj` 컴파일러에서는 다수의 파일이 생성됩니다. 실제로 생성되는 파일의 수는, IDL 파일의 컴파일시에 선택된 옵션에 따라서 다릅니다. 생성된 파일에는 표준의 기능이 있으므로, 프로그램을 배치해 실행할 때까지는 무시해도 괜찮습니다. J2SE v1. 4 에서는,`idlj` 컴파일러가 `-fall` 커멘드행 옵션을 지정했을 때에 생성하는 `Hello.idl` 파일은 다음과 같습니다.

- `HelloPOA.java`

  이 추상 클래스는, 스트림 베이스의서버 스켈리턴으로, 서버용으로 기본적인 CORBA 기능을 제공합니다. 이것은 `org.omg.PortableServer.Servant` 를 상속해,`InvokeHandler` 인터페이스와 `HelloOperations` 인터페이스를 구현합니다. 서버 클래스의 `HelloServant` 는,`HelloPOA` 를 상속합니다.

- `_HelloStub.java`

  이 클래스는「클라이언트 Stub」로, 클라이언트용으로 기본적인 CORBA 기능을 제공합니다. 이것은 `org.omg.CORBA.portable.ObjectImpl` 를 상속해,`Hello.java` 인터페이스를 구현합니다.

- `Hello.java`

  이 인터페이스에는 작성한 IDL 인터페이스의 Java 판이 포함됩니다. Hello.java 인터페이스는 표준적인 CORBA 객체 기능을 주는 `org.omg.CORBA.Object` 인터페이스를 상속합니다. 또 `HelloOperations` 인터페이스 및 `org.omg.CORBA.portable.IDLEntity` 도 상속합니다.

- `HelloHelper.java`

  이 클래스는 보조적인 기능을 제공합니다. 특히, CORBA 객체 참조를 적절한 형태로 변환하기 위한 `narrow()` 메소드는 중요한 역할을 완수합니다. 헬퍼 클래스는, CORBA 스트림에의 데이터형의 읽고 쓰기, 및 `Any` 로부터의 데이터형의 삽입 및 추출을 담당합니다. Holder 클래스는 Helper 클래스의 메소드에 입출력을 위양 합니다.

- `HelloHolder.java`

  이 final 클래스에는,`Hello` 형의 퍼블릭 인스턴스 멤버가 들어옵니다. IDL 형의 파라미터가 `out` 또는 `inout` 이면 Holder 클래스가 사용됩니다. 여기에서는,`org.omg.CORBA.portable.OutputStream` 및 `org.omg.CORBA.portable.InputStream` 인수에 대한 오퍼레이션이 규정됩니다. 이러한 인수는 CORBA 에는 존재합니다만, Java 의 시멘틱스에는 간단하게 매핑 할 수 없습니다. Holder 클래스는 Helper 클래스의 메소드에 입출력을 위양 합니다. Holder 클래스는 `org.omg.CORBA.portable.Streamable` 를 구현합니다.

- `HelloOperations.java`

  이 인터페이스에는 `sayHello()` 메소드 및 `shutdown()` 메소드가 포함됩니다. IDL-to-Java 매핑은, IDL 인터페이스로 정의된 오퍼레이션을 모두 이 파일에 짜넣어, Stub와 스켈리턴으로 공유합니다.

IDL 인터페이스를 기술할 때는, 목적의 분산형 어플리케이션에 필요한 모든 파일이 생성되도록(듯이) 프로그램을 기술합니다. 다음의 스텝에서는, 클라이언트 클래스 및 서버 클래스를 구현합니다. 그 후의 스텝에서는,`HelloClient.java` 클라이언트 클래스 및 `HelloServer.java` 서버 클래스를 작성합니다.

## 트러블 슈팅

- 에러 메세지:"idlj" not found

  `Hello.idl` 에 대해서 `idlj` 를 실행하려고 했을 때에,`idlj` 가 발견되지 않았습니다. 대부분의 경우, 실행 패스에 존재하지 않는 것이 원인입니다. `idlj` (J2SDK v1. 4 `bin` 디렉토리)가 실행 패스에 포함되어 있는 것을 확인하고 나서 다시 해 주세요.

## 상세 정보

- IDL 와 Java 언어의 매핑의 개요

  IDL 의 구조를 대응하는 Java 문에 매핑 하는 처리의 기본 정보에 대해 설명하고 있습니다.

- OMG CORBA 2.3. 1 스펙 (formal/99-10-07)의 제 3 장

  OMG 인터페이스 정의 언어의 완전한 스펙을 규정하고 있습니다. 이 문서의 집필 시점에서는, 스펙은 http://cgi.omg.org/cgi-bin/doc? formal/99-10-07 로부터 다운로드할 수 있습니다.

다음의 레슨 :Hello World 서버의 개발
전의 레슨 :Java IDL 입문

Java IDL 탑에

Copyright © 2001 Sun Microsystems, Inc., 901 San Antonio Rd., Palo Alto, CA. 94303-4900, USA., All rights reserved.