JAX-WS
JAX-WS(Java™ API for XML-Based Web Services)는 JAX-RPC(Java API for XML-based RPC) 프로그래밍 모델에서 제공되는 기반을 구축하는 차세대 웹 서비스 프로그래밍 모델입니다. JAX-WS를 사용하여 웹 서비스 및 클라이언트 개발은 동적 프록시 및 Java 어노테이션 사용을 통해 Java 애플리케이션에 대한 더 많은 플랫폼 독립성으로 단순화됩니다.
JAX-WS는 웹 서비스 애플리케이션 및 클라이언트를 개발하는 표준 어노테이션 기반 모델 지원을 통해 애플리케이션 개발을 단순화하는 프로그래밍 모델입니다. JAX-WS 기술은 전략적으로 더 많은 문서 중심 메시징 모델을 향한 현재 업계 경향에 맞추고 JAX-RPC에서 정의된 대로 원격 프로시저 호출 프로그래밍 모델을 대체합니다. JAX-RPC 프로그래밍 모델 및 애플리케이션은 여전히 이 제품에서 지원되며 JAX-RPC에는 제한사항이 있으며 다양한 복잡한 문서 중심 서비스를 지원하지 않습니다. JAX-WS는 웹 서비스 개발을 위한 전략적 프로그래밍 모델이며 Java Platform, Enterprise Edition 6(Java EE 6)의 필수 파트입니다. JAX-WS는 JSR 224라고도 합니다.
JAX-WS 2.2 스펙은 JAX-WS 2.1 스펙 내의 기능을 대체하고 포함합니다. JAX-WS 2.2는 @MTOM, @Addressing, @RespectBinding 어노테이션과 같은 WebServiceFeature 관련 어노테이션에 대한 클라이언트 측 지원을 추가합니다. JAX-WS 2.1은 이전에 서버에서 이 어노테이션에 대한 지원을 추가했습니다. WS-Policy 어설션을 WSDL 문서에 추가하여 이제는 클라이언트 또는 서비스에서 WS-Addressing 지원을 사용하고 구성할 기능도 있습니다. 또한, Java EE 1.3 스펙의 웹 서비스는 이 WebServiceFeature 관련 어노테이션에 대한 지원뿐만 아니라 클라이언트와 서버 모두에서 이 기능을 구성하는 배치 디스크립터 요소에 대한 지원도 소개합니다. JAX-WS 2.2에는 데이터 바인딩을 위한 Java Architecture for XML Binding(JAXB) 버전 2.2가 필요합니다.
JAX-WS 프로그래밍 표준 구현은 웹 서비스와 클라이언트 개발을 위한 다음 개선사항을 제공합니다.
- Java 애플리케이션에 대한 향상된 플랫폼 독립성.
JAX-WS API를 사용하여 웹 서비스 및 클라이언트 개발은 Java 애플리케이션에 대한 향상된 플랫폼 독립성으로 단순해집니다. JAX-WS는 동적 프록시 메커니즘을 활용하여 플러그 가능한 제공자를 사용하여 공식 위임 모델을 제공합니다. 이는 JAX-RPC에 대한 개선사항으로 호출에 벤더 고유 스텁 생성을 사용합니다.
- 어노테이션
JAX-WS는 메타데이터를 사용하여 Java 클래스 어노테이션을 지원하여 Java 클래스가 웹 서비스임을 표시합니다. JAX-WS는 Java 프로그래밍 언어용 메타데이터 기능(JSR 175) 스펙, Java 플랫폼(JSR 181)용 웹 서비스 메타데이터 스펙 및 JAX-WS 2.2로 정의된 어노테이션 스펙에 따라 어노테이션 사용을 지원합니다. Java 소스 내 및 Java 클래스 내에서 어노테이션을 사용하여 웹 서비스 개발을 단순화합니다. 어노테이션을 사용하여 일반적으로 배치 디스크립터 파일, WSDL 파일 또는 맵핑 메타데이터에 지정하는 정보를 XML 및 WSDL 파일에서 소스 아티팩트로 정의합니다.
예를 들어, 단순 @WebService 태그를 Java 소스에 임베드하여 Bean을 웹 서비스로 표시할 수 있습니다.
@WebService 어노테이션은 서버 런타임 환경에 모든 공용 메소드를 해당 Bean에 웹 서비스로 표시하도록 지시합니다. 추가 단위 레벨은 각 메소드 또는 매개변수에 개별 어노테이션을 추가하여 제어할 수 있습니다. 어노테이션을 사용하면 Java 아티팩트를 웹 서비스로 더 쉽게 표시할 수 있습니다. 또한, 아티팩트가 WSDL 파일을 시작으로 일부 하향식 맵핑 도구를 사용하여 작성되기 때문에 어노테이션은 소스 및 Java 클래스에 소스 파일과 같이 메타데이터를 캡처하여 포함됩니다.@WebService public class QuoteBean implements StockQuote { public float getQuote(String sym) { ... } }
어노테이션을 사용하면 JAX-RPC 웹 서비스에서 필요한 대로 단일 또는 공통 배치 디스크립터에 모든 웹 서비스를 정의할 필요없이 팀 구조에서 웹 서비스 개발이 향상됩니다. JAX-WS 웹 서비스가 사용되는 어노테이션을 활용하면 서비스 및 필수 메타데이터에 대한 병렬 개발이 가능합니다.
JAX-WS 웹 서비스의 경우, 어노테이션을 사용하여 배치 디스크립터 파일에 포함된 모든 정보를 지정할 수 있기 때문에 webservices.xml 배치 디스크립터를 선택적으로 사용할 수 있습니다. 배치 디스크립터 파일을 사용하여 기존 JAX-WS 어노테이션을 기능 보강하거나 대체할 수 있습니다. webservices.xml 배치 디스크립터에 정의한 정보는 어노테이션으로 지정된 모든 해당 정보를 대체합니다.
예를 들어, JAX-WS 웹 서비스에 대한 서비스 구현 클래스가 다음을 포함하는 경우,- @WebService 어노테이션:
@WebService(wsdlLocation=”http://myhost.com/location/of/the/wsdl/ExampleService.wsdl”)
- webservices.xml 파일은 다음과 같인 WSDL 문서에 대해 다른
파일 이름을 지정합니다.
<webservices> <webservice-description> <webservice-description-name>ExampleService</webservice-description-name> <wsdl-file>META-INF/wsdl/ExampleService.wsdl</wsdl-file> ... </webservice-description> </webservices>
- @WebService 어노테이션:
- 비동기로 웹 서비스 호출
JAX-WS를 사용하여 웹 서비스는 비동기 및 동기로 호출됩니다. JAX-WS는 웹 서비스를 비동기 호출할 때 폴링 및 콜백 메커니즘 모두에 대한 지원을 추가합니다. 폴링 모델을 사용하여 클라이언트는 요청을 발행하고, 서버의 응답 여부를 판별하기 위해 폴링하는 응답 오브젝트를 가져올 수 있습니다. 서버가 응답하면 실제 응답이 검색됩니다. 콜백 모델을 사용하여 클라이언트는 인바운드 응답 오브젝트를 승인하고 처리하는 콜백 핸들러를 제공합니다. 폴링 및 콜백 모델 모두를 사용하여 클라이언트는 응답 리턴을 대기하지 않고도 계속 작업에 집중할 수 있으며 웹 서비스 호출에 더 동적이고 효율적인 모델을 제공합니다.
예를 들어, 웹 서비스 인터페이스는 동기 및 비동기 요청 모두에 대한 메소드를 포함할 수도 있습니다. 비동기 요청은 다음 예에서 굵은체로 식별됩니다.@WebService public interface CreditRatingService { // sync operation Score getCreditScore(Customer customer); // async operation with polling Response<Score> getCreditScoreAsync(Customer customer); // async operation with callback Future<?> getCreditScoreAsync(Customer customer, AsyncHandler<Score> handler); }
콜백 메커니즘을 사용하는 비동기 호출은 클라이언트 프로그래머의 추가 입력을 필요로 합니다. 콜백은 비동기 응답이 수신될 때 실행되는 애플리케이션 코드를 포함하는 오브젝트입니다. 다음 코드 예를 사용하여 비동기 콜백 핸들러를 호출하십시오.CreditRatingService svc = ...; Future<?> invocation = svc.getCreditScoreAsync(customerFred, new AsyncHandler<Score>() { public void handleResponse ( Response<Score> response) { Score score = response.get(); // do work here... } } );
다음 코드 예를 사용하여 비동기 폴링 클라이언트를 호출하십시오.CreditRatingService svc = ...; Response<Score> response = svc.getCreditScoreAsync(customerFred); while (!response.isDone()) { // Complete an action while we wait. } // No cast needed, because of generics. Score score = response.get();
- 자원 인젝션 사용
JAX-WS는 웹 서비스 개발을 좀 더 단순하게 하기 위해 자원 인젝션을 지원합니다. JAX-WS는 Java EE 5의 이 중요 기능을 사용하여 Java 런타임 환경의 공통 자원을 작성 및 초기화하는 부담을 웹 서비스 애플리케이션에서 애플리케이션 컨테이너 환경 자체로 이동합니다. JAX-WS는 해당 런타임 환경에서 자원 인젝션과 애플리케이션 라이프사이클에 대해 JSR-250에 정의되는 어노테이션 서브세트 지원을 제공합니다.
애플리케이션 서버는 JAX-WS 관리 클라이언트를 선언하고 JAX-WS 서비스와 포트 인젝션을 요청하기 위해 @Resource 또는 @WebServiceRef 어노테이션 사용도 지원합니다. 이 어노테이션 중 하나가 필드나 메소드에서 사용되면 JAX-WS 서비스나 포트 인스턴스의 인젝션이 발생합니다. 이 어노테이션을 사용하면 유형도 JNDI 네임스페이스에 바인드 중인 어노테이션으로 지정됩니다.
@Resource 어노테이션은 Java Platform, Enterprise Edition 5(Java EE 5)에 포함된 JSR-250, 공통 어노테이션 스펙으로 정의됩니다. 유형 javax.xml.ws.WebServiceContext 변수의 @Resource 어노테이션을 서비스 엔드포인트 구현 클래스 내에 배치하여 자원 인젝션을 요청하고 해당 특정 엔드포인트 호출에 연관되는 javax.xml.ws.WebServiceContext 인터페이스를 수집할 수 있습니다. WebServiceContext 인터페이스에서 getMessageContext() 메소드를 사용하는 특정 메소드에 연관된 요청에 대해 MessageContext를 수집할 수 있습니다.
@WebServiceRef 어노테이션은 JAX-WS 스펙으로 정의됩니다.
다음 예는 자원 인젝션에 대한 @Resource 및 @WebServiceRef 어노테이션 사용을 설명합니다.@WebService public class MyService { @Resource private WebServiceContext ctx; @Resource private SampleService svc; @WebServiceRef private SamplePort port; public String echo (String input) { … } }
자원 인젝션에 대한 자세한 정보는 JAX-WS 스펙의 5.2.1 및 5.3 절을 참조하십시오.
- JAXB 2.2의 데이터 바인딩
JAX-WS는 Java Architecture for XML Binding(JAXB) 2.2 API 및 Java 오브젝트와 XML 문서 사이의 맵핑을 위한 바인딩 기술로 도구를 사용합니다. JAX-WS 툴링은 Java 오브젝트와 XML 문서 사이의 양방향 맵핑을 위한 기본 데이터 바인딩에 대해 JAXB 툴링을 사용합니다. JAXB 데이터 바인딩은 JAX-RPC 스펙에서 설명하는 데이터 바인딩을 대체합니다.
JAX-WS 2.2에는 데이터 바인딩을 위한 JAXB 2.2가 필요합니다. JAXB 2.2는 스키마 생성 향상 및 JAX-WS 통합 향상을 위한 어노테이션에 대한 작은 개선사항을 제공합니다.
- 동적 및 정적 클라이언트
JAX-WS용 동적 클라이언트 API는 디스패치 클라이언트(javax.xml.ws.Dispatch)라고 합니다. 디스패치 클라이언트는 XML 메시징 지향 클라이언트입니다. 데이터는 PAYLOAD 또는 MESSAGE 모드로 전송됩니다. PAYLOAD 모드를 사용하는 경우 디스패치 클라이언트는 <soap:Body>의 컨텐츠만 제공하고 JAX-WS는 <soap:Envelope> 및 <soap:Header> 요소를 추가합니다. MESSAGE 모드를 사용하는 경우 디스패치 클라이언트는 <soap:Envelope>, <soap:Header>, <soap:Body> 요소를 포함하여 전체 SOAP 엔벨로프를 제공합니다. JAX-WS는 메시지에는 아무런 추가도 하지 않습니다. 디스패치 클라이언트는 콜백 또는 폴링 메커니즘을 사용하여 비동기 호출을 지원합니다.
JAX-WS용 정적 클라이언트 프로그래밍 모델은 프록시 클라이언트라고 합니다. 프록시 클라이언트는 반드시 제공되어야 하는 SEI(Service Endpoint interface)를 기반으로 하는 웹 서비스를 호출합니다.
- MTOM 지원
JAX-WS를 사용하여 이미지나 파일과 같은 2진 첨부 파일을 웹 서비스 요청과 같이 전송할 수 있습니다. JAX-WS는 MTOM(Message Transmission Optimization Mechanism)으로 지정되는 2진 데이터의 최적화된 전송을 지원합니다.
- 다중 데이터 바인딩 기술
JAX-WS는 다음 바인딩 기술을 일반 사용자에게 표시합니다. Java (SAAJ) 1.3 및 Java Architecture for XML Binding(JAXB) 2.2에 대한 XML 소스, SOAP 첨부 파일 API. XML 소스를 사용하여 javax.xml.transform.Source를 처리되는 Source 오브젝트에서 데이터를 표시하는 런타임 환경으로 전달합니다. SAAJ 1.3은 전체 SOAP 문서를 페이로드 자체가 아니라 인터페이스를 통해 전달하는 기능을 가지고 있습니다. 이 조치는 SAAJ SOAPMessage 오브젝트를 인터페이스에서 전달하는 클라이언트로 수행됩니다. JAX-WS는 Java 및 XML 사이에서 선택하는 데이터 바인딩 기술로 JAXB 2.2를 사용합니다.
- SOAP 1.2 지원
SOAP 1.2 지원이 JAX-WS 2.0에 추가되었습니다. JAX-WS는 이미지나 파일과 같은 2진 첨부 파일을 웹 서비스 요청과 같이 전송할 수 있도록 SOAP 1.1 및 SOAP 1.2 모두를 지원합니다. JAX-WS는 MTOM에서 지정한 대로 2진 데이터에 대한 최적화된 전송 지원을 추가합니다.
- 개발 도구
JAX-WS는 JAX-WS 웹 서비스에 대한 이식 가능 아티팩트 생성을 위한 wsgen 및 wsimport 명령행 도구를 제공합니다. JAX-WS 웹 서비스 작성 시 WSDL 파일 또는 구현 Bean 클래스로 시작할 수 있습니다. 구현 Bean 클래스로 시작하는 경우 wsgen 명령행 도구를 사용하여 요청된 경우 WSDL 파일을 포함하여 모든 웹 서비스 서버 아티팩트를 생성하십시오. WSDL로 시작하면 wsimport 명령행 도구를 사용하여 서버 또는 클라이언트 측에 대한 모든 웹 서비스 아티팩트를 생성하십시오. wsimport 명령행 도구는 스키마 정의가 포함된 WSDL 파일을 처리하여 이식 가능 아티팩트를 생성하고 여기에는 서비스 클래스, 서비스 엔드포인트 클래스, 해당 XML 스키마용 JAXB 2.2 클래스가 포함됩니다.
- Java EE, 버전 1.3용 웹 서비스 지원
Java EE 버전 1.3 스펙용 웹 서비스는 MTOM, 주소 지정, JAX-WS 서비스의 RespectBinding 기능, 어노테이션 및 배치 디스크립터 항목 모두의 사용을 통한 클라이언트 구성에 대한 지원을 추가합니다.
- WRAPPED 매개변수 스타일에 대한 비어 있는 targetNamespace 및
리턴 유형에 대한 지원JAX-WS 2.2는 메소드 매개변수와 리턴 유형을 지원합니다. JAX-WS 웹 서비스 조작에서 조작 매개변수와 선택적 리턴 유형이 포함된 웹 서비스 조작을 정의할 수 있습니다. 조작 매개변수와 리턴 유형이 @WebParam 또는 @WebResult 어노테이션이 포함된 targetNamespace 특성에 대해 "" 값을 지정하여 비어 있는 targetNamespace 특성을 정의하는 경우 JAX-WS 런타임 환경은 다음과 같은 방식으로 작동합니다.
- 조작이 문서 스타일이고, 매개변수 스타일은 WRAPPED이며 매개변수는 헤더에 맵핑하지 않는 경우, 비어있는 네임스페이스가 조작 매개변수 및 리턴 유형을 사용하여 맵핑됩니다.
- 매개변수 스타일이 WRAPPED인 경우 @WebParam 또는 @WebResult 어노테이션을 사용하여 지정된 targetNamespace 매개변수 값이 사용됩니다.