JSR 109: Implementing Enterprise Web Services에서는 자바에서 웹 서비스를 구현하기 위한 프로그래밍 모델과 런타임 아키텍처를 정의합니다. 이 아키텍처는 자바 EE 구성요소 아키텍처를 기반으로 하며, 애플리케이션 서버 간에 이동 및 상호 운용 가능한 클라이언트 및 서버 프로그래밍 모델을 제공합니다.

JSR 109에서는 웹 서비스 구현 방법 두 가지를 정의합니다. 하나는 자바 클래스 프로그래밍 모델을 기반으로 합니다. 즉 웹 컨테이너에서 실행되는 자바 클래스에 의해 웹 서비스가 구현됩니다. 다른 방법은 엔터프라이즈 자바빈(EJB) 프로그래밍 모델을 기반으로 합니다. 즉 EJB 컨테이너에서 실행되는 무상태 세션 빈의 형태로 웹 서비스가 구현됩니다.

이전의 두 테크팁에서 이 기술을 다룬 바 있습니다. Developing Web Services Using JAX-WS 팁에서는 자바 클래스 프로그래밍 모델과 JAX-WS(Java API for XML Web Services) 2.0을 사용하여 웹 서비스를 개발하는 방법에 대해 설명했습니다. Developing Web Services Using EJB 3.0 팁에서는 EJB 프로그래밍 모델과 JAX-WS 2.0을 사용하여 웹 서비스를 개발하는 방법에 대해 설명했습니다. 다음 팁은 이 두 팁의 연장선상에 있습니다. 두 웹 서비스 프로그래밍 모델의 조합이 구현된 여러 웹 서비스를 참조하는 애플리케이션 클라이언트의 개발 방법을 소개합니다.

이 팁에는 샘플 패키지가 제공됩니다. 샘플 패키지에서는 두 웹 서비스, 즉 서블릿으로 구현되는 웹 서비스와 무상태 세션 빈으로 구현되는 웹 서비스에 액세스하는 독립형 자바 클라이언트를 설명합니다. 예제에서는 GlassFish v2, 즉 GlassFish V2 UR1이라는 오픈 소스 애플리케이션 서버를 사용합니다. GlassFish v2는 GlassFish Community Downloads 페이지에서 다운로드할 수 있습니다. GlassFish 설치 및 구성 방법에 대한 자세한 내용은 여기를 참조하십시오. 또한 서버를 시작하고 애플리케이션을 배포하는 기본적인 단계는 GlassFish Quick Start Guide를 참조하십시오.

먼저 두 개의 웹 서비스를 생성합니다.


서블릿 기반 웹 서비스

다음은 특정 우편번호의 현재 온도를 표시하는 서블릿 기반 웹 서비스인 WeatherService의 소스 코드입니다. Weather Service의 소스 코드는 샘플 패키지 servlet_endpoint 디렉토리에 있습니다.

   @WebService
   public class WeatherService {

       public float echoTemperature(String zipcode) {
           System.out.println("Processing the temperature for " + zipcode);
           //Its Beverly Hills let it be nice and sunny !!
           return 80;
       }
   }

아시다시피 JAX-WS 2.0은 JSR 175: A Metadata Facility for the Java Programming LanguageJSR 181: Web Services Metadata for the Java Platform에서 지정한 주석과 JAX-WS 2.0 사양에서 정의하는 추가 주석의 사용에 크게 의존합니다. WeatherService 클래스의 @WebService 주석에 유의하십시오. 이는 javax.jws.WebService 패키지에 정의된 주석 유형이며, 클래스를 웹 서비스로 표시합니다.

웹 서비스에서는 엔드포인트 구현 클래스, 서비스 엔드포인트 인터페이스 그리고 실행을 위한 이동 가능 아티팩트가 필요합니다. 그러나 JSR 109에서 지정한 대로 javax.jws.WebService 주석이 지정된 서비스 클래스를 제공하면 됩니다. 여기서도 마찬가지입니다.


EJB 기반 웹 서비스 생성

다음은 무상태 세션 빈으로 구현되는 웹 서비스, DegreeConverter의 코드입니다. 이 웹 서비스는 온도 값을 화씨에서 섭씨로 변환합니다. DegreeConverter의 소스 코드는 샘플 패키지 ejb_endpoint 디렉토리에 있습니다.

   @WebService
   @Stateless
   public class DegreeConverter  {

       public float fahrenheitToCelsius(float far){
           float degCelcius;
           degCelcius =  (far - 32) * 9/12;
           return degCelcius;
       }
   }

자바 EE5 플랫폼에서 눈에 띄는 개선사항 중 하나는 EJB 3.0 사양에 정의된 대로 EJB 프로그래밍 모델이 훨씬 단순해졌다는 것입니다. 주석을 지정하는 방법으로 클래스를 세션 빈 또는 엔터티 빈으로 선언할 수 있습니다. 예를 들어, 이 웹 서비스에서처럼 클래스에 @Stateless 주석을 붙여 무상태 세션 빈으로 선언할 수 있습니다.

물론 javax.jws.WebService 주석이 지정된 서비스 클래스만 제공하면 됩니다.


웹 서비스 컴파일 및 배포

각 웹 서비스를 생성한 후 이를 컴파일하고 실행을 위한 이동 가능 아티팩트를 생성한 다음 배포해야 합니다. 샘플 패키지에서는 이 단계를 수행하기 위한 ant 태스크를 제공합니다. 자세한 내용은 샘플 코드 실행 섹션을 참조하십시오.


클라이언트 생성

웹 서비스를 배포한 후 클라이언트 프로그램에서 이 웹 서비스에 액세스할 수 있습니다. 클라이언트는 웹 서비스에 대한 참조를 선언하기 위해 @WebServiceRef 주석을 사용합니다. @WebServiceRef 주석은 javax.xml.ws package에 있으며, JSR 181에서 지정됩니다. Client의 소스 코드를 살펴보면(Client의 소스 코드는 설치된 샘플 패키지의 클라이언트 디렉토리에 있음) 다음을 알 수 있습니다.

   @WebServiceRefs({
   @WebServiceRef(name="service/MyServletService",
   type=servlet_endpoint.WeatherServiceService.class,
   wsdlLocation="http://localhost:8080/weatherservice/GetWeather?wsdl"),
   @WebServiceRef(name="service/MyEjbService",
   type=ejb_endpoint.DegreeConverterService.class,
   wsdlLocation="http://localhost:8080/DegreeConverterService/DegreeConverter?wsdl") })
   public class Client {
   ...

@WebServiceRefs 주석은 클래스에서 여러 개의 웹 서비스 참조가 선언될 수 있게 해줍니다. 여기서 클래스는 두 개의 웹 서비스 엔드포인트, 즉 서블릿 엔드포인트와 EJB 엔드포인트를 참조합니다. 각 @WebServiceRef 주석에는 다음 등록 정보가 있습니다.

  • name. 리소스의 JNDI(Java Naming and Directory Interface) 이름
  • type: 리소스의 자바 유형
  • wsdlLocation. 웹 서비스의 WSDL 문서를 가리키는 URL

다음은 Client에서 서블릿 기반의 날씨 서비스를 조회하여 그 포트를 가져오고 echoTemperature 메소드를 호출하는 코드입니다.

   javax.naming.InitialContext ic = new javax.naming.InitialContext();
   WeatherServiceService svc = (WeatherServiceService)ic.lookup(
     "java:comp/env/service/MyServletService");
   float temp = svc.getWeatherServicePort().echoTemperature("90210");

다음은 Client에서 EJB 기반 서비스를 조회하여 그 포트를 가져오고 fahrenheitToCelsius 메소드를 호출하는 코드입니다.

   DegreeConverterService degConverter = (DegreeConverterService)ic.lookup(
     "java:comp/env/service/MyEjbService");
   System.out.println("Invoking the degree converter service for zip 90210.. " );
   float degree = degConverter.getDegreeConverterPort().fahrenheitToCelsius(temp);
   System.out.println("Temperature in degrees is " + degree);


클라이언트 컴파일 및 실행

클라이언트를 만들었으면 클라이언트 컴파일에 필요한 이동 가능한 아티팩트를 생성하고 클라이언트를 컴파일해야 합니다. 그런 다음 클라이언트를 실행할 수 있습니다. 샘플 패키지에서는 이 단계를 수행하기 위한 ant 태스크를 제공합니다. 자세한 내용은 샘플 코드 실행 섹션을 참조하십시오.


샘플 코드 실행

이 팁에는 샘플 패키지가 제공됩니다. 샘플을 설치하고 실행하려면 다음 단계를 수행합니다.

  1. 샘플 패키지를 다운로드하고 압축을 풉니다. 압축을 풀면 새 디렉토리, <sample_install_dir>/webservicesrefs-techtip이 나타나며, 여기서 <sample_install_dir>은 샘플 패키지를 설치한 디렉토리입니다. 예를 들어, Windows 시스템에서 C:\ 디렉토리에서 압축을 풀었다면 새로 생성된 디렉토리는 C:\webservicesrefs-techtip일 것입니다.
  2. GlassFish v2 UR1이 없을 경우 다운로드하십시오.
  3. webservicesrefs-techtip 디렉토리로 이동하고 build.xml 파일의 AS_HOME이 GlassFish가 설치된 위치를 가리키도록 설정합니다. 예를 들어, GlassFish가 mydir/glassfish라는 디렉토리에 설치되었다면 AS_HOME을 다음과 같이 설정합니다.
       <property name="AS_HOME" value="/mydir/glassfish"/>
     
  4. 다음 명령을 입력하여 GlassFish를 시작합니다.
       <GF_install_dir>/bin/asadmin start-domain domain1
    

    여기서 <GF_install_dir>은 GlassFish를 설치한 디렉토리입니다.

  5. 다음 명령을 실행합니다.
       ant server
    

    이 ant 태스크 대상은 웹 서비스를 위한 서버측 클래스를 빌드합니다. 즉 클래스를 컴파일하고 이동 가능 아티팩트를 생성한 다음 war 및 EJB jar 파일을 패키지화합니다. 그리고 나서 웹 서비스를 GlassFish에 배포합니다. 웹 서비스의 WSDL 파일은 다음에 게시됩니다.

    http://localhost:8080/weatherservice/GetWeather?wsdl
    http://localhost:8080/DegreeConverterService/DegreeConverter?wsdl

  6. 다음 명령을 실행합니다.
       ant client
    

    이 ant 태스크 대상은 클라이언트측 아티팩트를 생성하기 위해 wsimport 유틸리티를 실행하고 클라이언트를 컴파일 및 실행합니다. 다음과 같은 응답이 나타나야 합니다.

       runclient:
    
       runclient-windows:
    
       runclient-non-windows:
            [exec] Invoking the weather service for zip 90210..
            [exec] Temperature for zip 90210 is 80.0
    
            [exec] Invoking the degree converter service for zip 90210..
            [exec] Temperature in degrees is 36.0
    
       BUILD SUCCESSFUL
    

참고: JDK 6 업데이트 4 릴리스 이전 버전의 JDK 6에서 샘플을 실행하려면 <GF_install_dir>/lib/endorsed(<GF_install_dir>는 GlassFish를 설치한 디렉토리)에서 <jdk_install_dir>/jre/lib/endorsed(<jdk_install_dir>는 런타임 소프트웨어가 설치된 디렉토리)로 webservices-api.jar 파일을 복사하여 EOM(Endorsed Override Mechanism)을 사용해야 합니다. JDK 6 업데이트 4 이상에서 이 샘플을 실행할 경우 Override Mechanism을 사용할 필요가 없습니다.


저자 정보

Bhakti Mehta는 썬마이크로시스템즈의 기술 스탭 중 한 명이며, 현재 자바 EE 사양을 위한 웹 서비스인 JSR 109의 구현을 담당하고 있습니다. 또한 마이크로소프트 윈도우 커뮤니케이션 파운데이션과의 상호 운용을 위한 WS-Reliable Messaging 그리고 JAXB 및 JAXP 참조 구현에도 참여한 바 있습니다. 그녀는 뭄바이대학교에서 컴퓨터 공학 학사 학위와 빙엄턴 소재 뉴욕주립대학교에서 컴퓨터 과학 석사 학위를 취득했습니다.


글의 영문 원본은
Referencing Multiple Web Services From An Application Client
에서 보실 수 있습니다.

"Java EE" 카테고리의 다른 글

2008/04/04 18:03 2008/04/04 18:03

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/536

댓글을 달아 주세요

[로그인][오픈아이디란?]

◀ Prev 1  ... 132 133 134 135 136 137 138 139 140  ... 641  Next ▶