2008년 3월 5일 수요일

Maven을 지원하는 JAX-WS 사용

JAX-WS(Java API for XML-Based Web Services)는 SOAP 기반 및 RESTful 자바 웹 서비스 개발의 바탕이 되는 기술로서, GlassFish의 웹 서비스 기술 스택인 Metro 프로젝트의 핵심 요소입니다. JAX-WS는 고성능 런타임을 제공할 뿐 아니라 웹 서비스 및 웹 서비스 클라이언트를 만들 수 있는 도구인 wsimport와 wsgen을 제공합니다. wsimport 도구는 WSDL(Web Services Definition Language) 파일을 입력으로 받아 SEI(Service Endpoint Interface)와 같은 이동 가능한 JAX-WS 아티팩트를 생성합니다. wsgen 도구는 웹 서비스 엔드포인트 클래스를 읽고 웹 서비스 배포 및 호출에 필요한 모든 아티팩트를 생성합니다.

wsimport 및 wsgen 도구는 GlassFish CLI(Command Line Interface)를 통해 액세스할 수 있습니다. 또는 Ant 태스크나 Maven 플러그인을 통해서도 액세스할 수 있습니다. 이 팁에서는 JAX-WS Maven 플러그인을 사용하여 웹 서비스를 개발하는 방법에 대해 설명합니다.


Maven

Maven은 구성 가능성이 매우 우수한 프레임워크로서, 애플리케이션 빌드 및 배포에서부터 문서 생성 및 프로젝트 관리에 이르는 프로젝트 수명 주기의 다양한 측면을 관리하는 데 사용할 수 있습니다. Maven은 Ant처럼 프로젝트 레이아웃과 의존성 관리 체계가 표준화되어 있어 매우 널리 사용되고 있는 개발 도구입니다. 프로젝트 레이아웃에 대해 표준 규약을 따르고 컴파일 및 패키징과 같은 수명 주기 단계에서 표준 기본값을 사용하면 이해하기 쉽고 관리하기 쉬운 프로젝트를 만들 수 있습니다.

Maven은 POM(Project Object Model)을 사용하여 프로젝트와 관련된 정보를 기술합니다. 프로젝트 빌드 및 배포 방법을 정의해야 하는 Ant와 달리 모든 Maven 프로젝트는 빌드 및 패키징과 같은, 명확하게 정의된 태스크를 수행하는 데 있어 일련의 플러그인을 항상 공유합니다. 또한 이러한 플러그인은 기본 동작 및 빌드 순서를 필요한 대로 변경하여 구성할 수도 있습니다.

Maven에 대한 자세한 내용은 Welcome to Maven 및 Building Web Applications with Maven 2를 참조하십시오.


JAX-WS Maven 플러그인

앞에서 언급했듯이 JAX-WS는 웹 서비스 배포를 위해 wsimport와 wsgen이라는 두 개의 도구를 제공합니다. JAX-WS Maven 플러그인은 이러한 도구를 위한 Maven 어댑터를 제공합니다. 이 플러그인은 도구 기능에 jaxws:wsimport 및 jaxws:wsgen이라는 작업을 추가합니다. Maven에서 작업은 쉽게 말해 Ant 태스크와 같은 것입니다. 두 가지 작업 각각에 대해 플러그인은 해당 CLI 또는 Ant 태스크에 전달될 수 있는 모든 구성 옵션을 허용합니다.

jaxws:wsimport 작업을 위해 플러그인은 WSDL 파일을 읽고 웹 서비스 생성, 배포 및 호출에 필요한 자바 클래스를 생성합니다. jaxws:wsimport 작업은 수명 주기 단계 생성 소스 내에서 자동으로 실행됩니다. 이 플러그인은 기본적으로 ${basedir}/src/wsdl 디렉토리에서 WSDL 파일을 찾습니다. 그러나 wsdlLocation 매개변수를 구성하여 WSDL 파일의 위치를 지정할 수도 있습니다. 모든 jaxws:wsimport 구성 매개변수에 대한 설명은 jaxws:wsimport에 대한 JAX-WS commons 페이지에서 볼 수 있습니다.

jaxws:wsgen 작업의 경우 플러그인은 SEI 클래스를 읽고 JAX-WS 웹 서비스에 필요한 모든 이동 가능 아티팩트를 생성합니다. jaxws:wsgen 작업은 수명 주기 프로세스 클래스 내에서 자동으로 실행됩니다. 이 플러그인을 사용하려면 jaxws:wsgen 작업에 대해 sei 매개변수를 설정하여 서비스 엔드포인트 구현 클래스 이름을 지정해야 합니다. 또는 genWsdl 매개변수를 지정할 경우 서비스 엔드포인트 구현 클래스에서 WSDL 파일의 형태로 서비스 설명을 생성할 수도 있습니다. 그러나 genWsdl 매개변수는 선택적인 매개변수이며 JAX-WS 런타임은 배포 후에 WSDL을 동적으로 생성할 수 있습니다. 모든 jaxws:wsgen 매개변수에 대한 설명은 jaxws:wsgen에 대한 JAX-WS commons 페이지에서 볼 수 있습니다.

jaxws:wsimport 및 jaxws:gen 작업은 해당 수명 주기 단계가 실행될 때 자동으로 실행됩니다. 또는 jaxws-maven-plugin:wsimport와 같이 작업을 지정하여 명시적으로 플러그인을 실행할 수도 있습니다. Maven 빌드 수명 주기 단계 및 실행에 대한 자세한 내용은 Introduction to the Build Lifecycle을 참조하십시오.


Ant
대신 JAX-WS Maven 플러그인을 사용하는 이유

Ant 태스크 대신 JAX-WS Maven 플러그인을 사용하면 Ant 태스크에서 요구되는 JAX-WS 의존 관계 구성, 클래스 경로 설정, 컴파일 및 패키징을 위한 도구 태스크 호출 등을 수행할 필요가 없다는 장점이 있습니다. Maven은 모든 의존 관계를 자동으로 다운로드하여 해당 애플리케이션에서 사용할 수 있도록 하며 빌드 수명 주기 단계에 이를 추가합니다. 그러나 플러그인 동작을 원하는 방식으로 지정할 수 있도록 일부 구성을 미설정 상태로 두어야 할 수 있습니다.

JAX-WS Maven 플러그인 및 기타 JAX-WS 도구에 대한 자세한 내용은 Metro Tools 페이지를 참조하십시오.


JAX-WS Maven 샘플

지금까지 JAX-WS Maven 플러그인에 대한 기본적인 내용을 일부 설명했습니다. 이제 이 플러그인을 사용하여 웹 서비스와 웹 서비스 클라이언트를 생성하는 샘플 애플리케이션을 살펴보겠습니다. NetBeans IDE는 플러그인을 통해 Maven 2(Maven 최신 버전) 프로젝트 관리를 지원합니다. IDE에서 플러그인을 사용하면 Maven 기반의 프로젝트를 만들고, IDE 액션을 Maven 작업에 연결하여 Maven 명령을 실행할 수 있으며, 리포지토리 찾기, 의존 관계 추가, 웹 애플리케이션의 즉석 배치 등을 쉽고도 간편하게 수행할 수 있습니다.

이러한 작업의 일부는 Maven을 실행한 후 POM 파일에서 구성을 편집하여 수동으로 수행할 수도 있습니다. 그러나 NetBeans IDE는 POM을 자동으로 생성하고 구성할 수 있는 보다 간편한 방법을 제공합니다. 따라서 이 팁의 샘플에서는 NetBeans IDE 6.0을 사용하겠습니다.

본 팁에는 샘플 애플리케이션 코드가 수록된 패키지가 함께 제공됩니다. 아래의 설명을 사용하여 샘플 애플리케이션을 빌드할 때 사용자가 직접 작성하는 파일과 패키지에서 제공하는 파일을 비교할 수 있습니다.


초기 설정

샘플을 설치하고 실행하기 전에 다음과 같이 몇 가지 초기 설정을 수행해야 합니다.

  1. 다음 도구를 설치하지 않았을 경우 이를 다운로드하여 설치합니다.  


    또한 JDK 6 업데이트 4 릴리스 이전 버전의 JDK 6에서 샘플을 실행하려면 jaxb-api.jar 및 jaxws-api.jar 파일을 <java-home>/lib/endorsed로 복사하여 EOM(Endorsed Override Mechanism)을 사용해야 합니다. 이 경로에서 <java-home>은 런타임 소프트웨어가 설치된 디렉토리로서 자바 SE 런타임 환경의 최상위 디렉토리이거나 JDK의 jre 디렉토리입니다. JDK 6 업데이트 4 이상에서 이 샘플을 실행할 경우 Override Mechanism을 사용할 필요가 없습니다.  

  2. GlassFish v2를 별도로 다운로드했을 경우 다음과 같이 NetBeans에 등록합니다.  

    • Services 창에서 Servers 노드를 마우스 오른쪽 버튼으로 클릭합니다.
    • Add Server를 선택합니다.
    • Server를 Sun Java System Application Server로 유지합니다.
    • Next 버튼을 클릭합니다.
    • Browse 버튼을 클릭한 후 GlassFish V2가 설치된 위치로 이동합니다.
    • Choose 버튼을 클릭합니다.
    • Next 버튼을 클릭합니다.
    • GlassFish v2에 대해 다른 비밀번호를 선택하지 않았다면 Admin Password를 기본값인 adminadmin으로 설정합니다.
    • Finish 버튼을 클릭합니다.

  3. 다음과 같이 Mevenide2-Netbeans 플러그인을 설치합니다. 이 플러그인은 Maven 2 프로젝트에 대해 NetBeans를 지원합니다.  

    • Tools 메뉴에서 Plugins를 선택합니다.
    • Plugins 창에서 Available 플러그인을 선택합니다.
    • Maven 플러그인을 선택합니다.
    • Install 버튼을 클릭합니다.


프로젝트 및 하위 프로젝트 생성

이 샘플에서는 jaxws-maven-sample이라는 주 프로젝트(상위 프로젝트)를 작성합니다. 이 상위 프로젝트에는 웹 서비스용의 HelloService 하위 프로젝트와 웹 서비스 클라이언트용의 HelloClient 하위 프로젝트가 있습니다. 다음은 프로젝트의 구조를 보여 줍니다.

   jaxws-maven-sample (POM Project)
     helloservice (WAR project)
     helloclient (JAR Project)

리던던시를 피하기 위해 상위 프로젝트 POM에는 HelloService와 HelloClient에서 공통되는 구성 매개변수가 들어 있습니다. 프로젝트와 하위 프로젝트를 만들려면 다음과 같이 합니다.

  1. 상위 POM 프로젝트인 jaxws-maven-sample을 작성합니다.  

    • File 메뉴에서 New Project를 선택합니다.
    • Maven 범주를 선택한 다음 Maven 프로젝트를 선택합니다.
    • Next 버튼을 클릭합니다.
    • Maven Quickstart Project 세대 유형(기본값)을 선택합니다.
    • 이어서 표시되는 화면에서 Maven 프로젝트 코오디네이트라고 하는 다음과 같은 프로젝트 설정을 지정합니다.  

          - ProjectName: jaxws-maven-sample
          - ProjectLocation: 프로젝트를 포함할 디렉토리를 지정합니다(예: Users/ramapulavarthi).
          - Version: 1.0-SNAPSHOT
          - GroupId: com.example.maven.jaxws
          - Package: com.example.maven.jaxws  

    • Finish 버튼을 클릭하여 프로젝트를 작성합니다.

    NetBeans Projects 창에 해당 프로젝트가 표시되어야 합니다.  

  2. 프로젝트 등록 정보를 jar에서 pom으로 변경합니다.  

    • Projects 창에서 jaxws-maven-sample을 마우스 오른쪽 버튼으로 클릭합니다.
    • 메뉴에서 Properties 옵션을 선택합니다.
    • General 범주에서 Packaging 값을 jar에서 pom으로 변경합니다.
    • OK 버튼을 클릭합니다. Projects 창에 jaxws-maven-sample (pom)이라는 항목이 표시되는 것을 확인합니다.

  3. 기본적으로 생성된 의존 관계와 파일 중에서 필요 없는 것을 삭제합니다. 이 프로젝트는 POM 프로젝트이기 때문에 소스/테스트 대신 하위 모듈을 사용합니다. 따라서 프로젝트에서 소스를 제거해야 합니다. 또한 이 프로젝트에는 유닛 테스트가 없으므로 JUnit 의존 관계를 삭제해야 합니다.  

    • Projects 탭 옆에 있는 Files 탭을 클릭합니다.
    • Files 창에서 jaxws-maven-sample 아래에 있는 src 디렉토리를 마우스 오른쪽 버튼으로 클릭하고 Delete를 선택합니다.
    • Projects 창에서 jaxws-maven-sample의 TestLibraries 노드를 확장하고 junit-3.8.1.jar를 마우스 오른쪽 버튼으로 클릭한 후 Remove Dependency를 선택합니다.

  4. 소스를 자바 5로 변경합니다. 웹 서비스를 만들기 위해서는 자바 5가 필요합니다. 그러나 기본값은 자바 1.4입니다.  

    • Projects 창에서 jaxws-maven-sample을 마우스 오른쪽 버튼으로 클릭합니다.
    • 메뉴에서 Properties 옵션을 선택합니다.
    • Sources 범주에서 Source/Binary Format 값을 1.4에서 1.5로 변경합니다.
    • OK 버튼을 클릭합니다.
     

    jaxws-maven-sample 아래의 Project Files에서 pom.xml 파일을 보면 구성 소스 및 대상 값이 1.5로 변경되어 있을 것입니다.
     
  5. 하위 프로젝트(WAR 프로젝트) helloservice를 작성합니다.  

    1단계, "상위 프로젝트(POM 프로젝트) jaxws-maven-sample 만들기"의 절차를 반복하되 Maven Quickstart Project 세대 유형 대신 Maven WebApp 세대 유형을 선택합니다. 또한 다음과 같이 설정을 지정합니다.  

           - ProjectName: helloservice
           - ProjectLocation: jaxws-maven-sample 프로젝트를 포함할 디렉토리를 지정합니다(예: /Users/ramapulavarthi/jaxws-maven-sample).
           - Version: 1.0-SNAPSHOT
           - GroupId: com.example.maven.jaxws
           - Package: com.example.maven.jaxws.helloservice  

    • Finish 버튼을 클릭하여 프로젝트를 작성합니다.
      NetBeans Projects 창에 helloservice Maven Webapp(war)가 표시되어야 합니다. helloservice용의 pom.xml 파일에는 상위 프로젝트 jaxws-maven-sample에 대한 참조가 들어 있으며, jaxws-maven-sample용의 pom.xml 파일은 이제 helloservice용 모듈을 지정합니다.

  6. helloservice용의 의존 관계와 파일 중에서 필요 없는 것을 삭제합니다.  

    • Projects 탭 옆에 있는 Files 탭을 클릭합니다.
    • Files 창에서 helloservice Maven webapp 아래의 src 디렉토리를 확장하고 test 디렉토리를 마우스 오른쪽 버튼으로 클릭한 후 Delete를 선택합니다.
    • Projects 창에서 helloservice Maven webapp의 TestLibraries 노드를 확장하고 junit-3.8.1.jar를 마우스 오른쪽 버튼으로 클릭한 후 Remove Dependency를 선택합니다.

  7. 하위 프로젝트(WAR 프로젝트) helloservice를 작성합니다.  

    1단계, "상위 프로젝트(POM 프로젝트) jaxws-maven-sample 만들기"의 절차를 반복하되 설정을 다음과 같이 지정합니다.  

           - ProjectName: helloclient
           - ProjectLocation: jaxws-maven-sample 프로젝트를 포함할 디렉토리를 지정합니다(예: /Users/ramapulavarthi/jaxws-maven-sample).
           - Version: 1.0-SNAPSHOT
           - GroupId: com.example.maven.jaxws
           - Package: com.example.maven.jaxws.helloclient  

    • Finish 버튼을 클릭하여 프로젝트를 작성합니다.
      NetBeans Projects 창에 helloclient(jar)가 표시되어야 합니다. helloclient용의 pom.xml 파일에는 상위 프로젝트 jaxws-maven-sample에 대한 참조가 들어 있으며, jaxws-maven-sample용의 pom.xml 파일은 이제 helloclient용 모듈을 지정합니다.

  8. helloclient용의 의존 관계와 파일 중에서 필요 없는 것을 삭제합니다.  

    • Projects 탭 옆에 있는 Files 탭을 클릭합니다.
    • Files 창에서 helloclient 아래의 src 디렉토리를 확장하고 test 디렉토리를 마우스 오른쪽 버튼으로 클릭한 후 Delete를 선택합니다.
    • 하위 프로젝트(WAR 프로젝트) helloservice를 작성합니다.  

      1단계, "상위 프로젝트(POM 프로젝트) jaxws-maven-sample 만들기"의 절차를 반복하되 설정을 다음과 같이 지정합니다.  

             - ProjectName: helloclient
             - ProjectLocation: jaxws-maven-sample 프로젝트를 포함할 디렉토리를 지정합니다(예: /Users/ramapulavarthi/jaxws-maven-sample).
             - Version: 1.0-SNAPSHOT
             - GroupId: com.example.maven.jaxws
             - Package: com.example.maven.jaxws.helloclient  

      • Finish 버튼을 클릭하여 프로젝트를 작성합니다.
        NetBeans Projects 창에 helloclient(jar)가 표시되어야 합니다. helloclient용의 pom.xml 파일에는 상위 프로젝트 jaxws-maven-sample에 대한 참조가 들어 있으며, jaxws-maven-sample용의 pom.xml 파일은 이제 helloclient용 모듈을 지정합니다.

    • helloclient용의 의존 관계와 파일 중에서 필요 없는 것을 삭제합니다.  

      • Projects 탭 옆에 있는 Files 탭을 클릭합니다.
      • Files 창에서 helloclient 아래의 src 디렉토리를 확장하고 test 디렉토리를 마우스 오른쪽 버튼으로 클릭한 후 Delete를 선택합니다.  

      • OK 버튼을 클릭합니다.

      jaxws-maven-sample용 pom.xml 파일에 이제 jaxws-rt.jar에 대한 컴파일 타임 의존 관계가 포함되며 컴파일 범위를 지정하는 것을 볼 수 있습니다. jaxws-rt.jar 파일은 런타임 시 서비스 및 클라이언트에서 사용할 수 있어야 합니다.  

      GlassFish에는 JAX-WS가 포함되므로 GlassFish를 배포 컨테이너로 사용할 경우 Scope 값을 "provided"로 설정할 수 있습니다. 이 경우 Maven은 "skinny" WAR 파일을 만들며 WAR 파일에 jax-ws jar 파일이 번들로 포함되지 않습니다.  

    • JAX-WS JAR에 대한 리포지토리 정보를 추가합니다. Maven은 이 정보를 사용하여 jaxws-maven-plugin과 해당 의존 관계 아티팩트를 가져옵니다.  

      • jaxws-maven-sample에 대한 Project Files 노드를 확장하고 pom.xml 파일을 엽니다.
      • JAX-WS JAR를 다운로드하기 위한 다음 리포지토리 정보를 추가합니다.  

           <repositories>
             <repository>
               <id>maven-repository.dev.java.net</id>
               <name>Java.net Repository for Maven 1</name>
               <url>http://download.java.net/maven/1/</url>
               <layout>legacy</layout>
             </repository>
             <repository>
               <id>maven2-repository.dev.java.net</id>
               <name>Java.net Repository for Maven 2</name>
               <url>http://download.java.net/maven/2/</url>
             </repository>
           </repositories>  


      이 코드는 Maven 1 및 Maven 2 리포지토리 모두에 대한 정보를 추가합니다. 두 리포지토리에는 몇 가지 JAX-WS 의존 관계가 존재합니다.  

    • 다음과 같이 jaxws-maven-plugin에 대한 플러그인 리포지토리 정보를 pom.xml 파일에 추가합니다.  

         <pluginRepositories>
           <pluginRepository>
             <id>maven2-repository.dev.java.net</id>
             <url>http://download.java.net/maven/2/</url>
           </pluginRepository>
         </pluginRepositories>  

      모든 구성 사양은 상위 프로젝트의 pom.xml 파일에 있기 때문에 하위 프로젝트인 helloservice와 helloclient는 구성을 공유합니다.


웹 서비스 구축

  1. helloservice에 로직을 추가합니다  

    • helloservice 프로젝트에서 SourcePackages 노드를 마우스 오른쪽 버튼으로 클릭합니다.
    • New를 선택한 다음 Java Class를 선택합니다.
    • New Java Class 창에서 다음과 같이 지정합니다.  

          - Class Name: Hello
          - Package: com.example.maven.jaxws.helloservice  

    • Finish 버튼을 클릭합니다.
    • Hello 클래스에 대한 소스 코드를 업데이트하여 WebService로 주석을 달고 sayHello를 포함합니다. 업데이트된 소스 코드는 다음과 같아야 합니다.  

         package com.example.maven.jaxws.helloservice;
         import javax.jws.WebService;
         @WebService
         public class Hello {
           public String sayHello(String param) {
           ;  return "Hello " + param;
           }
         }  


  2. SEI 클래스에서 jaxws-maven-plugin:wsgen을 실행합니다.  

    • helloservice의 pom.xml 파일을 엽니다.
    • pom.xml 파일의 빌드 섹션 아래에 다음 코드를 추가합니다.
       

            <plugins>      
              <plugin>
              <groupId>org.codehaus.mojo&lg;/groupId>
              <artifactId>jaxws-maven-plugin&lg;/artifactId>
                <executions>
                  <execution>
                    <goals>
                      <goal>wsgen</goal>
                    </goals>
                    <configuration>
                    <sei>com.example.maven.jaxws.helloservice.Hello
                    </sei>
                    <!--for demo purpose only, the webapp does not-->
                    <!--need the generated wsdl files-->
                    <genWsdl>true</genWsdl>          
                    <keep>true&lg;/keep>
                    </configuration>
                  </execution>
                </executions>
              </plugin>
            </plugins>
       


    앞에서 언급했듯이 jaxws-maven-plugin:wsgen 작업은 프로세스 클래스 수명 주기 단계 중에 자동으로 호출됩니다. <sei> 요소 값 com.example.maven.jaxws.helloservice.Hello는 작업에 매개변수로 전달됩니다.


웹 서비스 배포

  1. 배포 정보를 지정합니다.  

    • GlassFish나 다른 Java EE 5 컨테이너를 사용하여 웹 서비스를 배포할 경우 "2.5" 버전을 사용하도록 기본 web.xml 파일을 변경합니다. 이를 수행하려면 다음과 같이 합니다.  

          - helloservice 프로젝트에서 Web Pages 노드를 확장합니다.
          - WEB-INF 노드를 확장하고 web.xml 파일을 선택합니다.
          - 소스 편집기 창 상단에 있는 XML 보기 버튼을 눌러 파일의 XML 컨텐츠를 표시합니다.
          - web.xml 파일의 컨텐츠를 다음과 같이 바꿉니다.  

         <web–app version="2.5"
             xmlns="http://java.sun.com/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema–instance"
             xsi:schemaLocation=
             "http://java.sun.com/xml/ns/javaee
             http://java.sun.com/xml/ns/javaee/web–app_2_5.xsd">
           <welcome–file–list>
           <welcome–file>index.jsp</welcome–file>
           </welcome–file–list>
         </web–app>  

      파일 시작 부분의 <!DOCTYPE> 요소를 반드시 삭제해야 합니다.  

          - 파일을 저장합니다.  


  2. GlassFish에 아티팩트를 배포합니다.  

    • helloservice 프로젝트를 마우스 오른쪽 버튼으로 클릭한 후 Properties를 선택합니다.
    • Run 범주에서 다음과 같이 지정합니다.  

          - Server: GlassFish v2
          - Context Path: /helloservice
          - OK 버튼을 클릭합니다.  

    Display Browser on Run 확인란을 선택하고 Relative URL 필드에 HelloService?wsdl을 입력할 수도 있습니다. 이러한 선택적 사양을 지정할 경우 NetBeans는 helloservice 서비스가 배포된 후 helloservice WSDL을 보여 주는 브라우저를 엽니다.
    설정이 적용되어 helloservice용 pom.xml 파일은 아티팩트를 GlassFish에 배포하도록 업데이트됩니다.


서비스 실행

  • helloservice를 마우스 오른쪽 버튼으로 클릭하고 Run을 선택합니다.  

    NetBeans에서 Maven이 실행되어 웹 애플리케이션이 빌드되고 GlassFish에 WAR 파일이 자동으로 배포됩니다. NetBeans Output 창에서 진행 과정을 볼 수 있습니다. 서비스의 WSDL에 액세스하여 서비스가 성공적으로 배포되었는지를 확인할 수 있습니다. 이전 단계에서 설명한 대로 Display Browser on Run 확인란을 선택했을 경우 NetBeans는 배포된 웹 서비스의 WSDL을 보여 주는 브라우저를 엽니다. Display Browser on Run 확인란을 선택하지 않았을 경우에는 브라우저에서 http://localhost:8080/helloservice/HelloService?wsdl을 직접 열어서 웹 서비스의 WSDL을 볼 수 있습니다.


클라이언트를 만들어 웹 서비스 호출하기

  1. helloservice WSDL에서 jaxws-maven-plugin:wsimport를 실행합니다.  

    • helloclient의 pom.xml 파일을 엽니다.
    • pom.xml 파일에 다음 코드를 추가합니다.  

         <build>
           <plugins>
             <plugin>
               <groupId>org.codehaus.mojo</groupId>
                 <artifactId>jaxws-maven-plugin</artifactId>
                 <executions>
                   <execution>
                     <goals>
                       <goal>wsimport</goal>
                     </goals>
                     <configuration>
                       <wsdlUrls>
                         <wsdlUrl>
               http://localhost:8080/helloservice/HelloService?wsdl
                         </wsdlUrl>
                       </wsdlUrls>
                   <packageName>com.example.maven.jaxws.helloclient
                   </packageName>
                     </configuration>
                   </execution>
                 </executions>
             </plugin>
           </plugins>
         <bulid>
     

    jaxws-maven-plugin:wsimport 작업은 수명 주기 단계 생성 소스 중에 실행됩니다. 위의 구성에서 볼 수 있듯이 wsimport는 http://localhost:8080/helloservice/HelloService?wsdl에 있는 WSDL에서 실행되어 com.example.maven.jaxws.helloclient 패키지에 자바 클래스를 생성합니다.  

  2. 클라이언트를 빌드합니다.  

    • helloclient 프로젝트를 마우스 오른쪽 버튼으로 클릭한 후 Build를 선택합니다. Maven은 프로젝트를 빌드하고 wsimport를 실행하여 대상 폴더에 모든 웹 서비스 아티팩트를 생성합니다. 생성된 파일을 보려면 Files 창을 열고 helloclient/target을 확장합니다.
    • helloclient 프로젝트에서 Source packages 노드를 확장하고 com.example.maven.jaxws.helloclient를 마우스 오른쪽 버튼으로 클릭합니다.
    • New를 선택한 다음 Java class를 선택합니다.
    • 클래스 이름을 HelloClient로 지정합니다.
    • Finish 버튼을 클릭합니다.
    • HelloClient 클래스를 다음 소스 코드와 같이 업데이트합니다.  

         package com.example.maven.jaxws.helloclient;
         public class HelloClient {
           public static void main(String[] args) {
           HelloService service = new HelloService();
           Hello port= service.getHelloPort();
           System.out.println(port.sayHello("Duke"));
           }
         }  

  3. NetBeans IDE 액션 "Run"을 연결하여 jar 파일을 빌드하고 HelloClient를 실행합니다.  

    • helloclient를 마우스 오른쪽 버튼으로 클릭하고 Properties를 선택합니다.
    • Run 범주에서 Main로 com.example.maven.jaxws.helloclient.HelloClient를 입력합니다.
    • OK 버튼을 클릭합니다.


클라이언트 실행

  • helloclient를 마우스 오른쪽 버튼으로 클릭하고 Run을 선택합니다.  

    Maven은 WSDL 파일에서 wsimport를 실행하고 자바 클래스를 생성한 후 HelloClient를 컴파일하여 실행합니다. NetBeans Output 창에 다음과 같은 웹 서비스 호출 결과가 표시되어야 합니다.  

       Hello Duke

요약

Maven을 사용하여 JAX-WS 기반의 웹 서비스를 손쉽게 만들 수 있습니다. 이 팁에서는 NetBeans를 사용하여 웹 서비스를 생성하는 방법을 설명했지만 NetBeans를 사용하지 않고 Maven을 사용하여 수동으로 JAX-WS 기반의 웹 서비스를 생성할 수도 있습니다. 이렇게 하려면 mvn CLI를 사용하여 pom 파일을 필요한 대로 편집합니다. 그러나 NetBeans를 사용하면 프로젝트에서 Maven을 보다 손쉽게 사용할 수 있으며 구성 구문을 몰라도 간단히 수행할 수 있습니다.

Maven을 사용하여 JAX-WS 기반의 웹 서비스를 작성하는 것에 대한 자세한 내용은 Metro User's Guide를 참조하십시오.


저자 정보

Rama Pulavarthi는 썬마이크로시스템즈 자바 웹 서비스 그룹의 기술 스탭 중 한 명으로서, 현재 JAX-WS 참조 구현 개발에 참여하고 있습니다. 이전에는 JAX-RPC의 소프트웨어 품질 공학 연구를 주도했습니다.

이 글의 영문 원본은
http://blogs.sun.com/enterprisetechtips/entry/using_jax_ws_with_maven
에서 보실 수 있습니다.

Project Sample..(Server)

import java.io.*;

public class HelloWorldService{


 public String HelloWorld(String data)throws Exception
  {
   
   BufferedReader in = new BufferedReader(new FileReader(new File("c:\\temp\\sample.rdf" )));
   String read_data = "";
   String t="";
   while((t =in.readLine()) != null ) read_data += t;
   
   return read_data;
  }
}


서버에 접속이 되게 되면. 파일을 읽어서 그냥 리턴해 주는 역할.

Project Sample..(Client)

import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class HelloWorldClient
{
public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException
{
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(new URL("http://debianbox:8080/axis/HelloWorldService.jws"));
call.setOperationName(new QName("http://soapinterop.org/", "HelloWorld"));
String returnValue = (String)call.invoke(new Object[]{"My name is okjsp."});
System.out.println(returnValue);
}
}

AXIS User Guide..

Apache AXIS를 이용한 웹서비스




Apache Axis is an implementation of the SOAP ("Simple Object Access Protocol") submission to W3C.

아래의 내용은 중요하므로 기본 개념이 분명이 있어야 한다.
본 강좌(팁)은 사용법을 위주로 아주 기초적인 예제를 다룰것이므로 자세한 내용은 생략한다.

SOAP (Simple Object Access Protocol)
WSDL (Web Service Description Langauge)
WSDD (Web Service Deployment Descriptor)

1. Apache Tomcat 4.1 이상 , Full Version으로 설치

·         톰캣 5.5.4 버젼을 사용하였다. (참고로 Windows환경이다.)
설치후 http://localhost:8080으로 확인해서 동작이 되면 정상이다
.
이것이 톰캣설치의 전부이고, jsp 및 servlet이 동작이되면 준비는 되었다
.
필요에 따라 jdbc등 기타 드라이버를 c:\tomcat\common\lib\ 에 복사 한다.

·         set CATALINA_HOME=c:\tomcat

2. 자바 개발툴킷 설치 : JDK 1.4 버젼 이상이면 된다.

·         참고로 jdk 1.5 버젼을 설치하였다.

·         설치 후에 classpath를 설정한다.
set CLASSPATH=.;c:\jdk15\lib\tools.jar;c:\tomcat\common\lib\servlet-api.jar;
추가적으로 필요한 jdbc 및 기타 라이브러리들을 추가한다.

·         set JAVA_HOME=c:\jdk15
set PATH=c:\jdk15\bin;
을 기존 PATH에 추가한다.

3. ANT 설치 (옵션) : ant에 대해서는 다른 문서나 커뮤니티 사이이트에서 참고할것.

·         http://ant.apache.org에서 ant 1.6.2 버젼을 받아서 설치한다.
설치는 다운 받은 파일을 압축을 풀어서 일정한 디렉토리에 옮겨놓으면 된다.

·         set ANT_HOME=c:\ant
set PATH=c:\ant\bin;
을 기존 PATH에 추가한다.

·         C:\tomcat\server\lib\catalina-ant.jar 파일을 c:\ant\lib\ 디렉토리로 복사한다.

·         추가적으로 junit 이나 xml관련 라이브러리등을 c:\ant\lib\ 에 복사하여 사용하면 된다.

4. AXIS 설치 : http://ws.apache.org/axis/ , http://ws.apache.org/axis/releases.html

·         axis 사이트에서 최신 릴리즈를 다운받아서 압축을 푼후에, 원하는 디렉토리에 옮겨놓으면 된다.
참고로 1.1 final version를 다운 받아서 사용중이다.

·         set AXIS_HOME=c:\axis

·         set AXIS_LIB=%AXIS_HOME%\lib

·         set AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar;
%AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;
%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;
%AXIS_LIB%\wsdl4j.jar

·         set CLASSPATH=%CLASSPATH%;%AXISCLASSPATH% 으로 기존 CLASSPATH 에 추가한다.

·         참고 :
CLASSPATH
에 있는 xml-apis.jar 파일과 xercesImpl.jar 파일은

http://xml.apache.org/
에서 받으면 된다.
또한, 아래에서 보게 될 라이브러리 테스트를 통하여 추가 라이브러리를 확인할수 있고

확인후에 필요한 다운 사이트 정보까지 나오게 되므로 정보를 확인후 다시 설정해주면 된다.

5. axis를 톰캣에 연동하기

·         연동에 있어서 특별한 것은 없고 단지, c:\axis\webapps\axis\ 에서 axis디렉토리를
c:\tomcat\webapps\axis
로 복사하면 된다. 즉, 톰캣 webapps디렉토리에 axis 컨텍스트가
추가 되었다고 이해해도 되겠다.

6. 테스트 해보기

·         톰캣을 실행하고

·         연결테스트를 해본다.
http://localhost:8080/axis

·         라이브러리 테스트
http://localhost:8080/axis/happyaxis.jsp
에서 필요하거나 필수적인 추가 라이브러리를
설치하라는 경고 메시지를 보여주기 때문에 이때 필요한 라이브러리를 다운받아서
c:\tomcat\webapps\axis\lib\
에 복사해주고 다시 테스트를 해본다.
필요에 따라서 다운받은 라이브러리를 CLASSPATH에 설정해주어서 jdk로 컴파일할때 이용하자.

7. SOAP 테스트

·         http://localhost:8080/axis/services/Version?method=getVersion
다음과 같이 출력되면 정상적으로 설치가 된것이다. (내용은 환경에 따라 약간 차이가 난다.)
<?xml version="1.0" encoding="UTF-8" ?>
- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <soapenv:Body>
- <getVersionResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<getVersionReturn xsi:type="xsd:string">Apache Axis version: 1.1 Built on Jun 13, 2003 (09:19:43 EDT)
</getVersionReturn>
</getVersionResponse>
</soapenv:Body>
</soapenv:Envelope>

8. AdminClient 테스트

·         C:\axis\samples\stock 디렉토리로 이동하여 예제로 테스트해보자.

·         java org.apache.axis.client.AdminClient
-lhttp://localhost:8080/axis/services/AdminService deploy.wsdd

·         deploy가 되었는지 확인하고, 에러가 나면 거의 대부분의 원인은 클래스패스에서 나온다.

·         deploy가 제대로 되었는지 확인해보자.
http://localhost:8080/axis/servlet/AxisServlet
아래처럼 추가된 부분이 웹에 보인다면 성공적으로 deploy된것이다
.
urn:xmltoday-delayed-quotes (wsdl)
test
getQuote

9. Client 수행 테스트

·         java samples.stock.GetQuote -lhttp://localhost:8080/axis/servlet/AxisServlet -uuser1 -wpass1 XXX
실행결과가 55.25가 출력되면 성공이다.~~!!!

·         실행시 클래스 패스 오류가 나면 GetQuote.java 파일을 편집기로 열어서 소스 윗부분의
package samples.stock
부분을 지우고 컴파일 하여
java GetQuote -lhttp://localhost:8080/axis/servlet/AxisServlet -uuser1 -wpass1 XXX
실행 해보면 정상적으로 나올것이다.

10. 프로그램 작성 순서

·         서버 Interface와 구현 Class를 작성한후 컴파일 한다.

·         구현 클래스로 부터 WSDL 파일을 생성한다.

·         WSDL 파일로 부터 deploy.wsdd 파일을 생성한다.

·         deploy.wsdd 파일을 이용해서 웹서비스를 deploy하고 server-config.wsdd 파일을 생성 수정한다.

·         구현클래스로 부터 client-side 클래스를 생성한다.

11. 프로그램 작성 플로우

·        

12. 예제 프로그램

·         자바 Interface와 자바 Implement 클래스 작성
c:\test\
에 아래 2개의 파일을 생성한다.

//begin - HelloIF.java
package webservice.hello;
public interface HelloIF extends java.rmi.Remote {
public String hello(java.lang.String name) throws java.rmi.RemoteException;
}
//end - HelloIF.java

//begin - HelloImpl.java
package webservice.hello;
public class HelloImpl implements HelloIF {
public HelloImpl() {
}
public String hello(String name) {
System.out.println(name);
return "hi " + name;
}
}
//end - HelloImpl.java

·         컴파일

javac -d . HelloImpl.java
컴파일 후 c:\test\webservice/hello 디렉토리밑에 HelloImpl.class 와 HelloIF.class가 생성.
생성된 class파일을
C:\Tomcat\webapps\axis\WEB-INF\classes
디렉토리에 패키지 디렉토리를 포함해서 복사한다
.
참고: 컴파일이 되지 않을경우, HelloIF.java파일을 먼저 컴파일한후에
c:\test\webservice/hello
디렉토리에 HelloIF.class파일을 복사해놓고 다시 컴파일 해본다.

·         구현된 클래스로 부터 WSDL 생성 하기

java org.apache.axis.wsdl.Java2WSDL -o c:\test\webservice\hello\Hello.wsdl
-l http://localhost:8080/axis/services/Hello -n http://hello.webservice -pwebservice.hello
http://hello.webservice webservice.hello.HelloIF

Java2WSDL
인자 (http://ws.apache.org/axis/java/reference.html)

인 자

의 미

-o 파일경로

wsdl 생성 위치

-l URL

client가 접속할 URL

-n 네임스페이스

WSDL의 타켓 네임스페이스

-p패키지 네임스페이스

네임스페이스와 네임스페이스 매핑

Target

인터페이스 이름

·        

[
생성된 Hello.wsdl 파일]

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://hello.webservice"
...
...
생략
...
...
<wsdl:service name="HelloIFService">
<wsdl:port name="Hello" binding="impl:HelloSoapBinding">
<wsdlsoap:address location="http://localhost:8080/axis/services/Hello"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

·         WSDL 파일로 부터 deploy.wsdd 파일 생성 및 client-side 자바 클래스 생성

java org.apache.axis.wsdl.WSDL2Java -o c:\test\webservice\hello\
-d Application -s c:\test\webservice\hello\Hello.wsdl

c:\test\webservice\hello
디렉토리 하위에 webservice/hello
새로운 디렉토리가 생성된것을 확인 할수 있다
.
그 디렉토리에 deploy.wsdd 파일과 새롭게 생성된 자바 파일이 존재해야 한다
.
또한, undeploy.wsdd 파일도 생성 된 것을 볼수 있는데 이파일은 서비스를

undeploy
할때 사용한다.

인 자

의 미

-o 디렉토리경로

wsdd 파일과 클래스파일이 생길 디렉토리

-d scope

설치 영역 - Application, Request , Session

-s

wsdd 파일 생성

Target

wsdl 파일 경로

·          

·         [deploy.wsdd 파일 수정]
wsdd
파일은 wsdl 파일만 가지고 생성되었기 때문에 실제 구현클래스가 무엇인지 제대로

설정이 안되어 있으므로 그부분을 수정해 주어야한다
.
붉은색 부분으로 해당 부분을 수정해주면 된다
.

<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
...
...
생략
...
...
<parameter name="className" value="
webservice.hello.HelloImpl"/>
...
...
생략...
...
<parameter name="allowedMethods" value="hello"/>
<parameter name="scope" value="Application"/>
</service>
</deployment>

·         서비스 디플로이먼트 하기

java org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/AdminService deploy.wsdd

[
디플로이먼트 확인하기
]
http://localhost:8080/axis/servlet/AxisServlet
'Hello'
라는 서비스가 설치된것을 확인할 수 있다.

·         서비스 언디플로이먼트 하기

java org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/AdminService undeploy.wsdd

[
언디플로이먼트 확인하기
]
http://localhost:8080/axis/servlet/AxisServlet
'Hello'
라는 서비스가 삭제 된것을 확인할 수 있다.

13. 클라이언트 구현하기

·         이제 생성된 서비스에 클라이언트로 접근해보는 예제를 생성하고 테스트 해보자.
아래와 같이 작성하고 c:\tomcat\webapps\axis\ 복사한다.

·         [HelloClient.jsp]
<%@ page contentType="text/html; charset=euc-kr" language="java"
import="java.net.MalformedURLException,
java.net.URL,
java.rmi.RemoteException,
javax.xml.namespace.QName,
javax.xml.rpc.ServiceException,
org.apache.axis.client.Call,
org.apache.axis.client.Service" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
<title>
웹서비스 테스트 : Hello World!</title>
</head>
<body>
<%
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/services/Hello?wsdl"));
call.setOperationName(new QName("http://soapinterop.org/", "hello"));
String returnValue = (String)call.invoke(new Object[]{"!
안녕하세요
.^^*"});
out.println(returnValue);
%>
</body>
</html>

·         http://localhost:8080/axis/hello.jsp

hi !
안녕하세요.^^*

·         위에서 처럼 나오면 성공이다. HelloClient.jsp부분하고 차이가 없는것 같지만
"!
안녕하세요" 와 "hi ! 안녕하세요" 차이가 크다.(구현하는 프로그램적으로...)
즉, hi 라고 출력되어지는 String hello() 웹 메소드를 HelloImpl.class에서 가져와서 실행하는 것이다.

14. 두번째 예제

·         첫번째 방법 외에 빠른 방법이 있다.
자바 파일을 만들고 확장자를 java가 아닌 jws로 바꾸고 실행하는 방법이다
.
참고로 c:\tomcat\webapps\axis\WEB-INF\web.xml를 한번 검토해길 바란다.

·         [ HelloWorldService.jws]

public class HelloWorldService
{
public String HelloWorld(String data)
{
return "Hello World! You sent the string '" + data + "'.";
}
}

·         위의 파일을 c:\tomcat\webapps\axis\ 에 복사하고

http://localhost:8080/axis/HelloWorldService.jws

그 주소에 설치된 서비스가 있다는 HTML 페이지가 나온다. 여기서 더나가 HelloWorld 메서드를 호출해보자.

http://localhost:8080/axis/HelloWorldService.jws?method=HelloWorld&data=Hi+my+name+is+okjsp

메서드를 호출한 결과 XML을 받았다.

·         자바로 클라이언트 구현 하기

[ HelloWorldClient.java]

import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class HelloWorldClient
{
public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException
{
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/HelloWorldService.jws"));
call.setOperationName(new QName("http://soapinterop.org/", "HelloWorld"));
String returnValue = (String)call.invoke(new Object[]{"My name is okjsp."});
System.out.println(returnValue);
}
}

·         HelloWorldClient.java 파일을 컴파일 하고 실행 해서 결과를 확인해 본다.
참고로 컴파일 에러가 나는 경우는 라이브러리등이 CLASSPATH에 잡혀있지 않아서 이다
.
본 문서의 처음 부분에 있는 설정 부분을 확인해 보고 다시 시도 해보자.

15. 마치며

XML, SOAP, WSDL, WSDD, UDDI 그리고,
닷넷과 자바...[웹서비스
]...

[참고 사이트 및 자료]
http://www.apache.org
에서 axis 에 포함된 관련 도큐먼트 및 기타 커뮤니티 참조
본 문서는 거의 대부분 인용 한 것 입니다.