어노테이션을 사용하여 JAX-WS 웹 서비스 개발
JAX-WS(Java™ API for XML-Based Web Services)는 서로 다른 두 가지 서비스 엔드포인트 구현 유형(표준 웹 서비스 엔드포인트 인터페이스 및 새 제공자 인터페이스)을 지원하여 서비스가 XML 메시지 레벨에서 작동할 수 있도록 합니다. 서비스 엔드포인트 구현 또는 클라이언트에서 어노테이션을 사용하여 서비스 엔드포인트를 웹 서비스로 정의할 수 있습니다.
시작하기 전에
이 태스크 정보
이 태스크는 JAX-WS 웹 서비스를 개발하기 위한 필수 단계입니다.
JAX-WS 기술은 표준 서비스 엔드포인트 인터페이스 및 새 제공자 인터페이스 둘 다를 기반으로 하는 웹 서비스 구현을 지원합니다. JAX-WS 엔드포인트는 JAX-RPC(Java API for XML-based RPC) 스펙의 엔드포인트 구현과 비슷합니다. JAX-RPC와는 달리, SEI(Service Endpoint Interface)에 대한 요구사항은 JAX-WS 웹 서비스에 대해 선택적입니다. 연관된 SEI가 없는 JAX-WS 서비스는 내재적 SEI가 있는 것으로 간주되는 반면, 연관된 SEI가 있는 서비스는 명시적 SEI가 있는 것으로 간주됩니다. 또한 JAX-WS에 필요한 서비스 엔드포인트 인터페이스는 JAX-RPC에 필요한 서비스 엔드포인트보다 더 일반적입니다. JAX-WS로 인해 SEI는 JAX-RPC 스펙에서 요구되는 것처럼 java.rmi.Remote 인터페이스를 확장할 필요가 없습니다.
또한 JAX-WS 프로그래밍 모델은 메타데이터로 Java 클래스에 어노테이션을 작성하기 위한 지원을 사용하여 서비스 엔드포인트 구현을 웹 서비스로 정의하고 클라이언트가 웹 서비스에 액세스하는 방법을 정의합니다. JAX-WS는 Java Programming Language(JSR 175) 스펙에 대한 메타데이터 기능을 기반으로 하는 어노테이션, Java Platform(JSR 181) 스펙에 대한 웹 서비스 메타데이터 및 JAX-WS 2.0(JSR 224) 스펙에 의해 정의되는 어노테이션을 지원합니다. 여기에는 JAXB(Java Architecture for XML Binding) 어노테이션이 포함됩니다. 어노테이션을 사용하면 서비스 엔드포인트 구현이 WSDL 파일을 요구하지 않고도 독립적으로 웹 서비스를 설명할 수 있습니다. 어노테이션은 서비스 엔드포인트 구현 또는 웹 서비스 클라이언트를 구성하는 데 필요한 모든 WSDL 정보를 제공할 수 있습니다. 사용자는 클라이언트 및 서버에서 사용되는 서비스 엔드포인트 인터페이스 또는 서버 측 서비스 구현 클래스에서 어노테이션을 지정할 수 있습니다.
지원되는 표준 및 스펙에 관한 세부사항은 웹 서비스 스펙 및 API 문서를 참조하십시오.
기존 Java 클래스부터 JAX-WS 웹 서비스를 개발하는 경우(상향식 접근법이라고 함) 초기에 클래스를 웹 서비스로 정의하려면 @WebService(javax.jws.WebService) 어노테이션 또는 @WebServiceProvider(javax.xml.ws.Provider) 어노테이션을 사용하여 클래스에 어노테이션을 작성해야 합니다. @WebService 어노테이션은 서비스를 SEI 기반 엔드포인트로 정의하는 반면 @WebServiceProvider 어노테이션은 서비스를 제공자 기반 엔드포인트로 정의합니다.
- SEI 기반 JAX-WS 웹 서비스 개발
SEI 기반 엔드포인트의 경우 SEI(Service Endpoint Interface)는 Java 클래스 또는 Java 인터페이스인지에 관계없이 특정 웹 서비스가 제공한 비즈니스 메소드를 선언합니다. JAX-WS 엔드포인트에서 웹 서비스 클라이언트가 호출할 수 있는 메소드는 명시적 또는 내재적 SEI에서 정의되는 비즈니스 메소드뿐입니다.
모든 SEI 기반 엔드포인트에서는 @WebService 어노테이션이 구현 클래스에 포함되어야 합니다. 서비스 구현이 명시적 SEI를 사용하는 경우 해당 인터페이스는 @WebService 어노테이션에서 endpointInterface 속성에 의해 참조되어야 합니다. 서비스 구현이 명시적 SEI를 사용하지 않는 경우 이 서비스는 구현 클래스에 의해 내재적으로 설명되므로 내재적 SEI입니다.
- 제공자 인터페이스를 사용하여 JAX-WS 웹 서비스 개발
JAX-WS 프로그래밍 모델은 SEI 기반 엔드포인트 대신에 제공자 엔드포인트인 javax.xml.ws.Provider를 동적 대안으로 소개합니다. 이 제공자 인터페이스는 웹 서비스에 대해 좀 더 메시지 지향적인 접근 방식을 지원합니다. 제공자 인터페이스를 사용하면 단순 인터페이스를 구현하는 Java 클래스를 작성하여 일반 서비스 구현 클래스를 생성할 수 있습니다. 제공자 인터페이스는 한 개의 메소드 즉, 다양한 메시지 또는 메시지 페이로드에 대해 작업할 때 총칭을 사용하여 입력 및 출력 유형을 제어하는 invoke 메소드를 정의합니다. 모든 제공자 엔드포인트에는 @WebServiceProvider(javax.xml.ws.WebServiceProvider) 어노테이션을 사용하여 어노테이션이 작성되어야 합니다. 서비스 구현은 javax.xml.ws.Provider 인터페이스를 구현하는 경우 @WebService 어노테이션을 지정할 수 없습니다.
WebSphere® Application Server 버전 7.0 이상을 시작하면 JAX-WS 서비스와 클라이언트를 식별하기 위한 어노테이션을 찾기 위해 Java EE 5 애플리케이션 모듈(웹 애플리케이션 모듈 버전 2.5 이상 또는 EJB 모듈 버전 3.0 이상)을 스캔합니다. 하지만 Java EE 5 이전 애플리케이션 모듈(웹 애플리케이션 모듈 버전 2.4 이하 또는 EJB 모듈 버전 2.1 이하)에서는 성능을 고려하여 기본적으로 JAX-WS 어노테이션을 스캔하지 않습니다. 버전 6.1 Feature Pack for Web Services의 경우 기본적으로 애플리케이션을 설치하는 동안 Java EE 5 이전 웹 애플리케이션 모듈을 스캔하여 JAX-WS 서비스를 식별하고 서비스 클라이언트용 Java EE 5 이전 웹 애플리케이션 모듈 및 EJB 모듈을 스캔합니다. WebSphere Application Server 버전 7.0 이상에서의 기본 동작은 애플리케이션 설치 또는 서버 시작 중에 어노테이션을 찾기 위해 Java EE 5 이전 모듈을 스캔하지 않고 이전 릴리스 기능팩과의 역방향 호환성을 유지하는 것이기 때문에 애플리케이션 설치 및 서버 시작 중에 스캐닝을 요청하려면 EJB 모듈 또는 WAR(Web Application Archive) 파일의 META-INF/MANIFEST.MF에서 UseWSFEP61ScanPolicy 특성을 구성하거나 JVM(Java Virtual Machine) 사용자 정의 특성(com.ibm.websphere.webservices.UseWSFEP61ScanPolicy)을 서버에서 정의해야 합니다. 어노테이션 스캐닝에 대해 보다 자세히 학습하려면 JAX-WS 어노테이션 정보를 참조하십시오.
프로시저
결과
웹 서비스 애플리케이션을 나타내는 서비스 엔드포인트 구현을 정의했습니다. 지원되는 JAX-WS 어노테이션에 대해 자세히 알아보려면 JAX-WS 어노테이션 문서를 참조하십시오.
샘플 JavaBeans 서비스 엔드포인트 구현 및 인터페이스
/** This is an excerpt from the service implementation file, EchoServicePortTypeImpl.java.
package com.ibm.was.wssample.echo;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
@javax.jws.WebService(serviceName = "EchoService", endpointInterface =
"com.ibm.was.wssample.echo.EchoServicePortType", targetNamespace="http://com/ibm/was/wssample/echo/",
portName="EchoServicePort")
public class EchoServicePortTypeImpl implements EchoServicePortType {
public EchoServicePortTypeImpl() {
}
public String echo(String obj) {
String str;
....
str = obj;
....
return str;
}
}
/** This is a sample EchoServicePortType.java service interface. */
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.*;
@WebService(name = "EchoServicePortType", targetNamespace = "http://com/ibm/was/wssample/echo/",
wsdlLocation="WEB-INF/wsdl/Echo.wsdl")
public interface EchoServicePortType {
/** ...the method process ...*/
@WebMethod
}
package jaxws.provider.source;
import javax.xml.ws.Provider;
import javax.xml.ws.WebServiceProvider;
import javax.xml.transform.Source;
@WebServiceProvider()
public class SourceProvider implements Provider<Source> {
public Source echo(Source data) {
return data;
}
}
제공자 구현 예에서 javax.xml.transform.Source 유형은 일반 <Source> 메소드에서 지정됩니다. 일반 <Source> 메소드는 입력 및 출력 유형이 모두 Source 오브젝트임을 지정합니다.
다음에 수행할 작업
JavaBeans에서 JAX-WS 애플리케이션에 대한 Java 아티팩트를 개발하십시오. 자세히 알아보려면 JAX-WS 애플리케이션에 대한 Java 아티팩트 생성 정보를 참조하십시오.