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을 사용하겠습니다.
본 팁에는 샘플 애플리케이션 코드가 수록된 패키지가 함께 제공됩니다. 아래의 설명을 사용하여 샘플 애플리케이션을 빌드할 때 사용자가 직접 작성하는 파일과 패키지에서 제공하는 파일을 비교할 수 있습니다.
초기 설정
샘플을 설치하고 실행하기 전에 다음과 같이 몇 가지 초기 설정을 수행해야 합니다.
- 다음 도구를 설치하지 않았을 경우 이를 다운로드하여 설치합니다.
또한 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을 사용할 필요가 없습니다.
- 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 버튼을 클릭합니다.
- 다음과 같이 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
에서 공통되는 구성 매개변수가 들어 있습니다. 프로젝트와 하위 프로젝트를 만들려면 다음과 같이 합니다.
- 상위 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 창에 해당 프로젝트가 표시되어야 합니다.
- 프로젝트 등록 정보를
jar
에서 pom
으로 변경합니다.
- Projects 창에서
jaxws-maven-sample
을 마우스 오른쪽 버튼으로 클릭합니다.
- 메뉴에서 Properties 옵션을 선택합니다.
- General 범주에서 Packaging 값을
jar
에서 pom
으로 변경합니다.
- OK 버튼을 클릭합니다. Projects 창에
jaxws-maven-sample (pom)
이라는 항목이 표시되는 것을 확인합니다.
- 기본적으로 생성된 의존 관계와 파일 중에서 필요 없는 것을 삭제합니다. 이 프로젝트는 POM 프로젝트이기 때문에 소스/테스트 대신 하위 모듈을 사용합니다. 따라서 프로젝트에서 소스를 제거해야 합니다. 또한 이 프로젝트에는 유닛 테스트가 없으므로 JUnit 의존 관계를 삭제해야 합니다.
- Projects 탭 옆에 있는 Files 탭을 클릭합니다.
- Files 창에서
jaxws-maven-sample
아래에 있는 src
디렉토리를 마우스 오른쪽 버튼으로 클릭하고 Delete를 선택합니다.
- Projects 창에서
jaxws-maven-sample
의 TestLibraries
노드를 확장하고 junit-3.8.1.jar
를 마우스 오른쪽 버튼으로 클릭한 후 Remove Dependency를 선택합니다.
- 소스를 자바 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로 변경되어 있을 것입니다.
- 하위 프로젝트(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
용 모듈을 지정합니다.
helloservice
용의 의존 관계와 파일 중에서 필요 없는 것을 삭제합니다.
- Projects 탭 옆에 있는 Files 탭을 클릭합니다.
- Files 창에서
helloservice
Maven webapp 아래의 src 디렉토리를 확장하고 test 디렉토리를 마우스 오른쪽 버튼으로 클릭한 후 Delete를 선택합니다.
- Projects 창에서
helloservice
Maven webapp의 TestLibraries 노드를 확장하고 junit-3.8.1.jar
를 마우스 오른쪽 버튼으로 클릭한 후 Remove Dependency를 선택합니다.
- 하위 프로젝트(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를 선택합니다.
- 하위 프로젝트(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
는 구성을 공유합니다.
웹 서비스 구축
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;
}
}
- SEI 클래스에서
jaxws-maven-plugin:wsgen
을 실행합니다.
helloservice
의 pom.xml
파일을 엽니다.
pom.xml
파일의 빌드 섹션 아래에 다음 코드를 추가합니다.
<plugins>
<plugin>
<groupId>org.codehaus.mojo≶/groupId>
<artifactId>jaxws-maven-plugin≶/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≶/keep>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
앞에서 언급했듯이 jaxws-maven-plugin:wsgen
작업은 프로세스 클래스 수명 주기 단계 중에 자동으로 호출됩니다. <sei>
요소 값 com.example.maven.jaxws.helloservice.Hello
는 작업에 매개변수로 전달됩니다.
웹 서비스 배포
- 배포 정보를 지정합니다.
- 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> 요소를 반드시 삭제해야 합니다.
- 파일을 저장합니다.
- 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에 배포하도록 업데이트됩니다.
서비스 실행
Maven을 사용하여 JAX-WS 기반의 웹 서비스를 손쉽게 만들 수 있습니다. 이 팁에서는 NetBeans를 사용하여 웹 서비스를 생성하는 방법을 설명했지만 NetBeans를 사용하지 않고 Maven을 사용하여 수동으로 JAX-WS 기반의 웹 서비스를 생성할 수도 있습니다. 이렇게 하려면 mvn
CLI를 사용하여 pom 파일을 필요한 대로 편집합니다. 그러나 NetBeans를 사용하면 프로젝트에서 Maven을 보다 손쉽게 사용할 수 있으며 구성 구문을 몰라도 간단히 수행할 수 있습니다.