XML 기반 웹 서비스용 Java API

JSR-224라고도 하는 JAX-WS(Java™ API for XML-based Web Services는 JAX-RPC(Java API for XML-based RPC) 프로그래밍 모델에서 제공되는 기초를 확장한 차세대 웹 서비스 프로그래밍 모델입니다. JAX-WS를 사용하면 동적 프록시 및 Java 어노테이션을 사용하여 Java 애플리케이션에 대해 더 많은 플랫폼 독립성을 사용할 수 있기 때문에 웹 서비스 및 클라이언트 개발이 훨씬 쉬워집니다. 이 제품에 포함된 웹 서비스 도구에서는 JAX-WS 2.0, 2.1, 2.2를 지원합니다.

JAX-WS는 웹 서비스 애플리케이션 및 클라이언트를 개발하는 데 표준 및 어노테이션 기반 모델을 지원하여 애플리케이션 개발을 단순화하는 새 프로그래밍 모델입니다. JAX-WS 프로그래밍 표준은 현재 업계 추세를 반영하는 자체 표준 뿐만 아니라 더 나아가서는 문서 중심의 메시지 모델까지도 전략적으로 제공하고 JAX-RPC에 정의된 대로 원격 프로시저 호출 프로그래밍 모델을 바꿉니다. 이 제품에서 여전히 JAX-RPC 프로그래밍 모델 및 애플리케이션을 지원하고 있지만 JAX-RPC에는 그 기능이 제한되어 현재 문서 중심의 서비스 중 많은 부분을 지원하지 않습니다. JAX-WS는 웹 서비스 개발을 위한 전략적인 프로그래밍 모델로서, 여기에는 Java EE 5 플랫폼이 부분적으로 필요합니다.

JAX-WS 프로그래밍 표준을 구현하여 웹 서비스 및 클라이언트 개발에 다음과 같은 기능이 추가됩니다.
Java 애플리케이션에 대한 플랫폼 독립성 개선
JAX-WS API를 사용하면 Java 애플리케이션에 대해 더 나은 플랫폼 독립성을 사용할 수 있기 때문에 웹 서비스 및 클라이언트 개발이 훨씬 쉬워집니다. JAX-WS는 동적 프록시를 사용할 수 있게 되고 JAX-RPC는 생성된 스텁을 사용하게 됩니다. 동적 프록시 클라이언트는 생성되거나 제공된 SEI(Service Endpoint Interface)를 기반으로 웹 서비스를 호출합니다. 동적 프록시 클라이언트는 JAX-RPC 프로그래밍 모델의 스텁 클라이언트와 유사합니다. JAX-WS 동적 프록시 클라이언트 및 JAX-RPC 스텁 클라이언트 둘 다 WSDL 파일에서 생성된 SEI(Service Endpoint Interface)를 기반으로 하지만 둘 사이에는 큰 차이점이 있습니다. 동적 프록시 클라이언트는 Java 5 동적 프록시 기능을 사용하여 실행 시에 동적으로 생성되지만 JAX-RPC 기반 스텁 클라이언트는 도구로 생성되는 이식 불가능한 Java 파일입니다. JAX-RPC 스텁 클라이언트와는 다르게 동적 프록시 클라이언트에서는 생성된 인터페이스에 특정 벤더 정보가 필요하지 않기 때문에 다른 벤더에 대한 애플리케이션 서버에서 클라이언트를 실행하기 전에 스텁을 생성하지 않아도 됩니다. 동적 프록시 클라이언트 사용에 대한 자세한 정보는 JAX-WS 2.0 스펙의 제 4 장을 참조하십시오.
어노테이션

JAX-WS에서는 Java 클래스가 웹 서비스임을 나타내는 메타데이터와 같이 Java 클래스 어노테이션 처리를 위한 지원을 제공합니다. JAX-WS는 Java 프로그래밍 언어(JSR 175) 스펙, Java 플랫폼(JSR 181) 스펙, JAX-WS 2.0 스펙에서 정의된 어노테이션에 사용되는 메타데이터 기능을 기반으로 하는 어노테이션 사용을 지원합니다. Java 소스 및 Java 클래스에서 어노테이션을 사용하면 일반적으로 배치 디스크립터 파일, WSDL 파일 또는 XML 파일, WSDL 파일에서 소스 아티팩트로의 맵핑 메타데이터에서 확보되는 일부 추가 정보를 정의하여 웹 서비스 개발이 쉬워집니다.

예를 들어, Java 소스에 단순 @WebService 태그를 임베드하여 웹 서비스로 Bean을 표시할 수 있습니다.

@WebService 

public class QuoteBean implements StockQuote {

       public float getQuote(String sym) { ... }

}

@WebService 어노테이션은 해당 Bean의 전체 공용 메소드를 웹 서비스로 표시하도록 서버 런타임 환경에 설정합니다. 메소드나 매개변수 각각에 어노테이션을 추가하여 추가 표시 레벨을 제어할 수 있습니다. 어노테이션을 사용하면 웹 서비스로 Java 아티팩트를 표시하기 더 쉬워집니다. 또한 WSDL 파일을 시작으로 하는 일부 하향식 맵핑 도구를 사용하여 아티팩트를 작성할 때 어노테이션은 소스 및 Java 클래스 내에 소스 파일과 같이 메타데이터를 캡처하는 방법으로 포함됩니다.

비동기로 웹 서비스 호출

JAX-WS를 사용하여 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()) {
		// do something while we wait
}

// no cast needed, thanks to generics
Score score = response.get();
</Score>
자원 인젝션 사용

JAX-WS는 웹 서비스의 개발을 더욱 단순화하는 인젝션을 지원합니다. JAX-WS에서는 Java EE 5의 이 주요 기능을 사용하여 Java 런타임 환경에서 공통 자원을 작성하고 초기화하는 부담을 웹 서비스 애플리케이션으로부터 애플리케이션 컨테이너 환경으로 자체적으로 이전합니다. JAX-WS에서는 런타임 환경의 애플리케이션 라이프사이클 및 자원 인젝션에 대해 JSR-250에 정의된 어노테이션의 서브세트에 대한 지원을 제공합니다.

또한 애플리케이션 서버에서 JAX-WS 관리 클라이언트를 선언하고 JAX-WS 서비스 및 포트의 인젝션을 요청하기 위한 @Resource 또는 @WebServiceRef 어노테이션의 사용을 지원합니다. 필드 또는 메소드에 이러한 어노테이션 중 하나가 사용되는 경우 JAX-WS 서비스 또는 포트 인스턴스의 인젝션이 발생합니다. 또한 이러한 어노테이션을 사용하면 JNDI 네임스페이스에 바인드되는 어노테이션에 의해 지정된 유형이 생성됩니다.

@Resource 어노테이션은 Java EE 5(Java Platform, Enterprise Edition 5)에 포함된 공통 어노테이션 스펙인 JSR-250에 의해 정의됩니다. 서비스 엔드포인트 구현 클래스 내에 javax.xml.ws.WebServiceContext 유형의 변수에 대해 @Resource 어노테이션을 배치하여 자원 인젝션을 요청하고 특정 엔드포인트 호출과 관련된 javax.xml.ws.WebServiceContext 인터페이스를 수집할 수 있습니다. WebServiceContext 인터페이스에서 getMessageContext() 메소드를 사용하여 특정 메소드 호출과 연관된 요청에 대해 MessageContext를 수집할 수 있습니다.

다음 예제는 자원 인젝션에 대해 @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 오브젝트와 XML 문서 간의 맵핑에 JAXB API 및 도구를 바인딩 기술로 사용합니다. JAX-WS 도구는 Java 오브젝트와 XML 문서의 양방향 맵핑의 기본 데이터 바인딩에 JAXB 도구를 사용합니다. JAXB 데이터 바인딩은 JAX-RPC 스펙에서 설명한 데이터 바인딩을 바꿉니다.

WebSphere® Application Server 버전 7.0에서는 JAXB 2.1 스펙을 지원합니다. JAX-WS 2.1에는 데이터 바인딩을 위해 JAXB 2.1이 필요합니다. JAXB 2.1에서는 향상된 컴파일 지원, @XMLSeeAlso 어노테이션에 대한 지원 및 전체 스키마 1.0 지원과 같은 개선사항을 제공합니다.

WebSphere Application Server Version 8.0 이상 및 WebSphere Application Server Liberty Profile V8.5.5에서는 JAXB 2.2 스펙을 지원합니다. 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 엔벨로프(envelope) 제공을 처리하고 JAX-WS는 메시지에 아무 것도 추가하지 않습니다. 디스패치 클라이언트는 콜백이나 폴링 메커니즘을 사용하여 비동기 호출을 지원합니다. </soap:Body></soap:Header></soap:Envelope></soap:Header></soap:Envelope></soap:Body>

JAX-WS에 대한 정적 클라이언트 프로그래밍 모델은 프록시 클라이언트라고 합니다. 프록시 클라이언트는 생성되거나 제공된 SEI(Service Endpoint interface)를 기반으로 웹 서비스를 호출합니다.

MTOM 지원
JAX-WS를 사용하여 웹 서비스 요청과 함께 2진 첨부(예: 이미지 또는 파일)를 전송할 수 있습니다. JAX-WS는 MTOM(Message Transmission Optimization Mechanism)에서 지정된 대로 2진 데이터의 최적화된 전송에 지원을 추가합니다.
다중 페이로드 구조
JAX-WS는 XML 소스, SAAJ(SOAP Attachments API for Java) 1.3, JAXB(Java Architecture for XML Binding) 2.0의 바인딩 기술을 보여줍니다. XML 소스를 사용하여 javax.xml.transform.Source를 런타임에 전달되는 소스 오브젝트에서 데이터를 표시하는 런타임으로 전달합니다. 현재 SAAJ 1.3에는 전체 SOAP 문서를 페이로드 자체가 아닌 인터페이스간에 전달할 수 있는 기능이 추가되었습니다. 이 작업은 인터페이스간에 SAAJ SOAPMessage 오브젝트를 전달하는 클라이언트가 수행합니다. JAX-WS는 Java와 XML간의 선택 가능한 데이터 바인딩 기술로 JAXB 2.0 지원을 사용합니다.
SOAP 1.2 지원
SOAP 1.2 지원이 JAX-WS 2.0에 추가되었습니다. JAX-WS는 SOAP 1.1과 SOAP 1.2를 모두 지원합니다. SOAP 1.2는 WS-I(Web Services-Interoperability) 프로파일이 없는 경우, 상호 운용성 문제를 발생시키기도 하는 대다수의 모호성을 제거해주는 SOAP 프로세스 모델링에 더 고유한 정의를 제공합니다. SOAP 1.2는 다른 벤더간의 SOAP 1.2 구현에 연관된 상호 운용성 문제를 줄여줍니다. 이전 버전과 상호 운용되지 않습니다.
메소드 매개변수 및 리턴 유형 지원
JAX-WS 2.2에서는 메소드 매개변수 및 리턴 유형을 지원합니다. JAX-WS 웹 서비스 오퍼레이션에서 오퍼레이션 매개변수 및 선택적 리턴 유형과 함께 웹 서비스 오퍼레이션을 정의할 수 있습니다. 오퍼레이션 매개변수 및 리턴 유형이 @WebParam 또는 @WebResult 어노테이션 중 하나로 targetNamespace 특성에 대해 "" 값을 지정하여 빈 targetNamespace 특성을 정의하는 경우 JAX-WS 런타임 환경이 다음과 같은 방식으로 작동합니다.
  • 오퍼레이션이 문서 스타일인 경우 매개변수 스타일은 WRAPPED이고 매개변수가 헤더에 맵핑되지 않습니다. 빈 네임스페이스가 오퍼레이션 매개변수 및 리턴 유형과 함께 맵핑됩니다.
  • 매개변수 스타일이 WRAPPED가 아닌 경우 @WebParam 또는 @WebResult 어노테이션을 사용하여 지정된 targetNamespace 매개변수의 값이 사용됩니다.

JAX-WS 2.1.6

Java 클래스에서 JAX-WS 웹 서비스를 작성하면 클래스의 공용 메소드가 조작으로 노출되어 웹 서비스 WSDL 계약의 일부가 됩니다. 이러한 메소드와 오퍼레이션 사이의 맵핑은 주로 JSR-181 및 JSR-250에서 조정됩니다. 이러한 규칙에 따라, 다음 조건이 만족되면 Java 클래스와 최대 그 계층 구조에 속한 공용 메소드가 노출됩니다. 단, java.lang.Object는 제외됩니다.
  • 메소드에 @WebMethod 또는 @WebMethod(exclude=false) 어노테이션이 있고 포함하는 클래스에 @WebService 웹 서비스가 있는 경우
  • 메소드에 @WebMethod 어노테이션이 없지만 포함하는 클래스에 @WebService 어노테이션이 있고 다른 메소드에는 @WebMethod 또는 @WebMethod(exclude=false) 어노테이션이 없는 경우
JAX-WS 2.1.6는 Java 클래스 메소드가 웹 서비스 인터페이스에서 노출되는 방법의 규칙을 변경합니다. 이제 다음 조건이 만족되면 Java 클래스와 최대 그 계층 구조에 속한 공용 메소드가 노출됩니다. 단, java.lang.Object는 제외됩니다.
  • 메소드에 @WebMethod 또는 @WebMethod(exclude=false) 어노테이션이 있는 경우
  • 메소드에 @WebMethod 어노테이션이 없지만 포함하는 클래스에 @WebService 어노테이션이 있는 경우
예제:
public class Base
{
  @WebMethod(exclude=false)
  public void superExposed(String s) {}
  public String supernoanno(String s) {}
}

@WebService
public class BeanImpl extends Base
{
  @WebMethod(exclude=false)
  public void exposed(String s) {}
  public String nonpublic(String s) {}
}
JAX-WS 2.1.6 이전에는 public void exposed(String s) 메소드만 표시되었습니다. JAX-WS 2.1.6 이상에서는 다음 메소드가 표시됩니다.
public void exposed(String s)
public String nonpublic(String s)
public void superExposed(String s)

WebSphere Application Server 버전 7.0.0.7 이상에는 IBM® JDK 6 SR6을 통한 이러한 변경사항이 포함됩니다. 워크벤치에서 JAX-WS 2.1.6 사용법 안내를 표시하도록 설정하려면 > 환경 설정 > 일반 > 서비스 정책 > WebSphere 프로그래밍 모델 > JAX-WS로 이동한 후 JAX-WS 2.1.6 메소드 노출 안내 설정을 true로 설정하십시오.

JAX-WS 2.2

JAX-WS 버전 2.2 및 Java EE(JSR 109) 버전 1.3용 웹 서비스 스펙을 지원하는 서버 런타임 환경은 다음과 같습니다.
  • WebSphere Application Server Liberty Profile V8.5.5
  • WebSphere Application Server V8.5
  • WebSphere Application Server V8.0

JAX-WS 2.2 스펙은 JAX-WS 2.1 스펙 내의 기능을 대체하고 포함합니다. JAX-WS 2.2에서는 @MTOM, @Addressing 및 @RespectBinding 어노테이션과 같은 WebServiceFeature 관련 어노테이션을 사용할 수 있도록 클라이언트 측 지원을 추가합니다. JAX-WS 2.1에서는 서버에 이러한 어노테이션에 대한 지원을 이전에 추가했습니다. 또한 Java EE 1.3용 웹 서비스 스펙에서는 WebServiceFeature 관련 어노테이션 및 클라이언트와 서버 둘 다에서 이러한 기능을 구성하기 위해 배치 디스크립터 요소를 사용할 수 있는 지원을 도입합니다. JAX-WS 2.2에는 데이터 바인딩을 위해 JAXB(Java Architecture for XML Binding) 버전 2.2가 필요합니다.

JAX-WS에 대한 자세한 정보는 공식적인 JSR-224 스펙인 JSR 224: Java API for XML-Based Web Services(JAX-WS) 2.0을 참조하십시오.

주제 유형을 표시하는 아이콘 개념 주제
Information Center의 이용 약관 | 피드백

시간소인 아이콘 마지막 업데이트 날짜: 2014-05-22

파일 이름: cjaxws.html