Java IDL 입문:클라이언트 어플리케이션의 개발 - xrath.com 에서 번역됨

# Java IDL 입문:클라이언트 어플리케이션의 개발

이 토픽에서는, CORBA 클라이언트 어플리케이션 작성의 기본을 배웁니다. 이 레슨에서는 다음 일을 실시합니다.

1. HelloClient.java 의 작성
2. HelloClient.java 의 이해
3. HelloClient.java 의 컴파일

## HelloClient.java 의 작성

`HelloClient.java` 를 작성하려면 , 다음과 같이 합니다.

1. 텍스트 문자 편집기를 기동해,`HelloClient.java` 라는 이름의 파일을 메인 프로젝트 디렉토리의 `Hello` 에 작성합니다.

2. `HelloClient.java` 의 다음의 코드를 텍스트 파일에 기술합니다. 코드의 각 행의 자세한 것은, 다음의「HelloClient.java 의 이해」로 설명합니다.

   HelloClient.java

       // Copyright and License

       import HelloApp. *;
       import org.omg.CosNaming. *;
       import org.omg.CosNaming.NamingContextPackage. *;
       import org.omg.CORBA. *;

       public class HelloClient
       {
         static Hello helloImpl;

         public static void main(String args[])
           {
             try{
               // create and initialize the ORB
       	ORB orb = ORB.init(args, null);

               // get the root naming context
               org.omg.CORBA.Object objRef =
       	    orb.resolve_initial_references("NameService");
               // Use NamingContextExt instead of NamingContext.  This is
               // part of the Interoperable naming Service.
               NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

               // resolve the Object Reference in Naming
               String name = "Hello";
               helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));

               System.out.println("Obtained a handle on server object: " + helloImpl);
               System.out.println(helloImpl.sayHello());
               helloImpl.shutdown();

       	} catch (Exception e) {
                 System.out.println("ERROR : " + e) ;
       	  e.printStackTrace(System.out);
       	  }
           }

       }

3. `HelloClient.java` 를 보존해 닫습니다.

## HelloClient.java 의 이해

여기에서는,`HelloClient.java` 의 각 행에 대해, 그 코드가 무엇을 하고 있는지, 또 어플리케이션으로 왜 필요한가라고 하는 것을 설명합니다.

### 기본 설정

CORBA 클라이언트의 구조는, 많은 Java 어플리케이션과 같습니다. 즉, 필요한 라이브러리 패키지를 임포트 해, 어플리케이션 클래스를 선언해,`main` 메소드를 정의해, 그리고 예외의 처리를 실시합니다.

#### 필요한 패키지의 임포트

우선, 클라이언트 클래스에 필요한 패키지를 임포트 합니다.

    import HelloApp. *; // the package containing our stubs
    import org.omg.CosNaming. *; // HelloClient will use the Naming Service
    import org.omg.CosNaming.NamingContextPackage. *;
    import org.omg.CORBA. *; // All CORBA applications need these classes

#### 클라이언트 클래스의 선언

다음에, 클라이언트 클래스를 선언합니다.

    public class HelloClient
    {
      // The main() method goes here.
    }

#### `main()` 메소드의 정의

모든 Java 어플리케이션에는 `main()` 메소드가 필요합니다. 이 메소드를 다음과 같이,`HelloClient` 클래스의 스코프내에서 선언합니다.

      public static void main(String args[])
      {
        // The try-catch block goes here.
      }

#### CORBA 시스템 예외의 처리

어느 CORBA 프로그램에서도, 실행시에 CORBA 시스템 예외가 발생할 가능성이 있으므로,`main()` 메소드의 기능은, 모두 try-catch 블록내에 기술합니다. CORBA 프로그램은, 호출에 수반하는 프로세스 (정렬화, 비정렬화, 업 콜)로 문제가 발생하면(자), 시스템 예외를 발생시킵니다.

이 레슨의 예외 핸들러는 간단한 것으로, 어떤 문제가 일어났는지를 알 수 있도록(듯이), 예외의 이름과 스택의 트레이스를 표준 출력에 표시합니다.

`main()` 안에, 다음의 try-catch 블록을 기술합니다.

        try{

          // Add the rest of the HelloClient code here.

        } catch(Exception e) {
            System.out.println("ERROR : " + e);
            e.printStackTrace(System.out);
          }

### ORB 객체의 작성

정렬화와 IIOP 의 작업을 모두 실시하기 위해서(때문에), CORBA 클라이언트는 로컬의 ORB 객체를 필요로 합니다. 각 클라이언트는,`org.omg.CORBA.ORB` 객체의 인스턴스를 생성하고 나서, 그 객체 자체에 관한 특정의 정보를 건네주는 것으로, 그 객체를초기화합니다.

try-catch 블록 중(안)에서, ORB 변수를 선언해 초기화합니다.

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

ORB 의 `init()` 메소드의 호출은 어플리케이션의 커멘드행 인수에게 건네지므로, 실행시에 특정의 프로퍼티을 설정할 수 있습니다.

### Hello 서버의 검색

이것으로 어플리케이션에 ORB 가 갖춰졌으므로, 어플리케이션은 필요한 실제의 서비스의 검색을 ORB 에 요청할 수 있습니다. 이 레슨에서는, 이 서비스는 Hello 서버입니다. CORBA 클라이언트가 초기 객체 참조를 얻는 방법은 많이 있습니다만, 이 레슨의 클라이언트 어플리케이션에서는, OMG 에 의해 지정되어 Java IDL 로 이용 가능한 COS 네임 서비스를 이용합니다. 이용 가능한 네임 서비스가 없을 때에 초기 객체 참조를 얻는 방법에 대해서는,「캐릭터 라인화 된 객체 참조의 사용」을 참조해 주세요.

J2SE v. 1.4 의 네임 서비스에는 2 개의 옵션이 있습니다. 1 개(살)은, 일시 네임 서비스인 `tnameserv` , 이제(벌써) 1 개(살)은, demon 프로세스인 `orbd` 입니다. demon 프로세스에는, bootstrap 서비스, 일시 네임 서비스, 지속 네임 서비스, 및 서버 매니저가 포함되어 있습니다. 이 예에서는 `orbd` 를 사용합니다.

#### 초기 네이밍 문맥의 취득

네임 서비스를 이용하기 위한 최초의 스텝은,초기 네이밍 문맥의 취득입니다. try-catch 블록 중(안)에서, ORB 의 초기화의 다음에,`orb.resolve_initial_references()` 를 호출해 네임서버-에의 객체 참조를 가져옵니다.

            org.omg.CORBA.Object objRef =
                orb.resolve_initial_references("NameService");

캐릭터 라인 「NameService」는, 모든 CORBA ORB 에 대해서 정의되고 있습니다. 이 캐릭터 라인을 건네주면(자), ORB 로부터 초기 네이밍 문맥이 돌려주어집니다. 초기 네이밍 문맥은, 네임 서비스에의 객체 참조입니다. 캐릭터 라인 NameService 는, 다음 일을 나타내고 있습니다.

- 네임 서비스로서 ORBD 를 사용할 경우에, 지속 네임 서비스가 사용된다
- 네임 서비스로서 `tnameserv` 를 사용할 경우에, 일시 네임 서비스가 사용된다

캐릭터 라인 NameService 는, 네임 서비스로서 ORBD 를 사용할 경우에, 일시 네임 서비스가 사용되는 것을 나타내고 있습니다. 이 예에서는,`orbd` 의 일부인 지속 네임 서비스를 사용하고 있습니다.

#### 객체 참조의 네로우 변환

CORBA 목의 객체 참조와도 같이`objRef` 는 범용의 CORBA 객체입니다. 이것을 `NamingContextExt` 객체로서 사용하려면 , 적절한 형태에 네로우 변환할 필요가 있습니다.

            NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

이것은,`idlj` 에 의해 생성되는 헬퍼 클래스의 사용 방법입니다. 이 클래스의 기능은 `HelloHelper` 의 기능에 유사하고 있습니다. 여기서 `ncRef` 객체는 `org.omg.CosNaming.NamingContextExt` 가 되었으므로, 이것을 사용해 네임 서비스에 액세스 해, 다른 서비스를 검색할 수가 있습니다. 다음의 스텝에서, 그 처리를 실시합니다.

`NamingContextExt` 객체는 J2SE v. 1.4 로 새롭게 추가된 것으로,Interoperable Naming Service 의 일부입니다.

#### 네임 서비스에서의 객체 참조의 해결

`Hello` 인터페이스를 구현하고 있는 `Hello` 객체에 대해서 네임 서비스에서의 참조를 발행하려면 , 우선,`Hello` 객체의 캐릭터 라인을 식별할 필요가 있습니다.

          String name = "Hello";

마지막으로, 네임 서비스의 `resolve_str()` 메소드에 `name` 를 건네주어 Hello 서버에의 객체 참조를 취득해, 그 참조를 `Hello` 객체에 네로우 변환합니다.

            helloImpl = HelloHelper.narrow(ncRef.resolve-str(name));
            System.out.println("Obtained a handle on server object: " + helloImpl);

여기서,`HelloHelper` 헬퍼 클래스가 기능합니다. 위에 나타낸 것처럼, 네임 서비스의 검출시에 `resolve-str()` 메소드는, 일반적인 CORBA 객체를 돌려줍니다. 이 때문에, 즉석에서 `Hello` 객체에 네로우 변환할 수가 있습니다. 이 객체는, 나머지의 작업을 실행하는데 필요한 객체 참조입니다. 다음에, 객체 참조를 취득한 것을 확인하는 메세지를 화면에 보냅니다.

### `sayHello()` 오퍼레이션의 호출

CORBA 의 호출은, 로컬 객체에서의 메소드의 호출을 닮아 있습니다. 회선에의 파라미터의 정렬화, 서버측 ORB 에의 루팅, 비정렬화, 서버 메소드에의 업 콜의 배치등이 복잡한 상황을, 클라이언트측의 프로그래머는 투과적으로 파악할 수 있습니다. 컴파일러의 생성한 코드가 프로그래머에 대신해 다양한 작업을 실시하므로, CORBA 에서는 호출의 프로그래밍은 간단합니다.

마지막으로, 호출의 결과를 표준 출력에 표시해, ORB 를 명시적으로 종료 합니다.

            System.out.println(helloImpl.sayHello());
            helloImpl.shutdown();

## HelloClient.java 의 컴파일

여기서 `HelloClient.java` 를 컴파일 해, 에러를 수정하고 나서 레슨을 계속합니다.

Windows 의 사용자는, 이 메뉴얼의 패스의 slash (/)를 backslash (\)에 옮겨놓아 주세요.

`HelloClient.java` 를 컴파일 하려면 , 다음과 같이 합니다.

1. `Hello` 디렉토리에 이동합니다.

2. `HelloClient.java` 에 대해서 Java 컴파일러를 실행합니다.

       javac HelloClient.java HelloApp/*.java

3. 파일에 에러가 있으면, 수정해 컴파일 다시 합니다.
4. `HelloClient.class` 가 `Hello` 디렉토리에 생성됩니다.

### 클라이언트 어플리케이션의 실행

Hello World 어플리케이션의 실행에 대해서는,「Hello World 어플리케이션의 실행」에 기재되어 있습니다.

## 상세 정보

클라이언트의 개발
  CORBA 클라이언트의 프로그래밍에 관한 문제
예외:시스템 예외
  CORBA 의 시스템 예외의 동작과 Java IDL 의 시스템 예외의 마이너 코드의 상세한 설명
초기화 : 시스템 프로퍼티
  초기화시에 ORB 에 인도해 가능한 프로퍼티의 종류에 대한 설명
네임 서비스
  COS 네임 서비스의 상세한 설명

전의 레슨 :Hello World 서버의 개발
다음의 레슨 :Hello World 어플리케이션의 실행
튜토리얼의 홈 :Java IDL 입문

Java IDL 탑에

Copyright © 1996-2001 Sun Microsystems, Inc., 2550 Garcia Ave., Mtn.View, CA. 94043-1100 USA., All rights reserved.