JAX-WS란?
JAX-WS(Java API for XML Web Services)는 웹 서비스를 작성하는 데 필요한 Java 프로그래밍 언어 API이다. Java 웹 서비스 개발자 팩은 Java를 사용하여 웹 서비스 솔루션을 빌드하는 방법을 보여주기 위해 Sun에서 제공하는 툴킷이다. 이 툴킷에는 Java 기반 웹 서비스 솔루션을 빌드하고 배치하는 데 필요한 모든 것이 들어 있다. 따라서 이 툴킷은 모든 Java 기반 웹 서비스의 참조 구현으로 역할을 한다.
또한, 이 툴킷에는 다양한 웹 서비스 제품을 처리하는 데 사용되는 많은 Java 확장 라이브러리가 함께 패키지되어 있다. 이 툴킷에 있는 도구는 이러한 API를 거의 사용하지 않으므로 이러한 API를 너무 자세히 알 필요는 없다. 그 대신 이러한 API가 이 툴킷에 포함되어 있고 상위 레벨에서 작동한다는 사실을 알면 된다. 이러한 API로는 다음과 같은 것들이 있다.
- JAXP(Java API for XML Processing): 다양한 XML 구문 분석기를 위한 표준화된 인터페이스이다. 이 API를 작성하면 사용자 코드를 변경하지 않고도 다양한 성능과 메모리 특성이 있는 구문 분석기로 기본 XML 구문 분석기를 전환할 수 있다.
- JAX-RPC(Java API for XML-based RPC): SOAP(Simple Object Access Protocol) 1.2 스펙에 따라 XML 기반 RPC 기능을 통합하는 웹 서비스와 웹 애플리케이션을 빌드하는 데 필요한 도구를 개발자에게 제공한다. 일반적으로 이 API는 웹 서비스를 빌드할 때 가장 많이 사용하는 API이다.
- JAXM(Java API for XML Messaging): SOAP 메시지를 작성하고 시스템 간에 통신을 수행하는 데 필요한 기본 코드를 많이 제공한다.
- SAAJ(SOAP with Attachments API for Java): 개발자가 SOAP 1.2 스펙 및 SwA(SOAP with Attachment) 참고를 준수하는 메시지를 생성하고 사용할 수 있게 한다.
- JAXR(Java API for XML Registries): 다양한 XML 레지스트리에 액세스하는 데 필요한 표준 Java API를 제공한다. 이 튜토리얼에서는 이 API를 사용하여 UDDI 또는 ebXML 레지스트리와 통신한다.
- JAXB(Java Architecture for XML Binding): XML 스키마를 하나 이상의 Java 클래스로 컴파일하여 XML을 사용하기 쉽게 한다.
JAX-WS의 다양한 웹 서비스 방식
JAX-WS를 사용하여 애플리케이션을 개발하는 방법은 다음과 같이 세 가지가 있다.
WSDL2Java 방식: WSDL에 역점을 두며 wsimport와 같은 도구를 사용하여 이식 가능한 웹 서비스 아티팩트를 생성한다.
Java2WSDL 방식: 서비스 엔드포인트 인터페이스를 Java 소스 파일로 작성한다. 이 소스 파일을 입력으로 사용하여 WSDL과 기타 이식 가능한 필수 아티팩트를 생성한다.
Java 및 WSDL로부터 시작하는 방식: 이 방식은 현명한 작업 방식이다. Java 클래스를 작성하고 wsgen으로 원하는 스키마와 WSDL을 작성한다. 그런 다음, 생성된 아티팩트를 로컬에 저장하고 필요에 따라 수정한 후, @WebService 어노테이션의 wsdlLocation 속성을 사용하여 구현된 서비스가 이러한 아티팩트를 가리키도록 한다. 이렇게 하려면 스키마와 WSDL을 사용하여 클래스를 동기화해야 하지만, 편리성과 제어성을 극대화하는 데는 이 방법이 최적이다.
어떤 방식을 사용하든지 JAX-WS를 사용하게 되면 상당히 많은 코드가 생성되지만, 시스템에서 읽을 수 있게 설계된 코드를 처리해야 하는 문제점이 줄어들게 된다.
SAAJ란?
SAAJ(SOAP with Attachments API for Java)는 특히, 급증하고 있는 SOAP 기반 웹 서비스 개발자의 요구를 처리하기 위해 개발되었다. SAAJ를 이용하면 SOAP 엔벨로프를 프로그램 방식으로 조작할 수 있다. 개발자는 SAAJ의 클래스와 메소드를 사용하여 엔벨로프 작성, 엔벨로프에 헤더 추가, 헤더에 데이터 삽입, SOAP 본문 작성, SOAP 본문에 XML 문서 추가 및 SOAP 분문을 엔벨로프에 추가하는 작업을 수행할 수 있다.
메시지가 완료되면 디스패처를 사용하여 웹 서비스를 호출하도록 완료된 SOAP 메시지를 HTTP를 통해 전송할 수 있다. SAAJ를 사용하여 SOAP 메시지 구조를 작성했으면 SOAPConnection 오브젝트를 사용하여 요청을 전송하고 응답을 수신할 수 있다. SAAJ 연결은 java.net.URL 클래스를 기반으로 하며, 모든 네트워크 프로토콜을 지원하도록 확장 가능하다.
JAX-WS Vs. SAAJ
실용적인 관점에서 보면 SAAJ를 사용하는 경우에는 'wsimport'나 'wsdl2java'와 같은 도구를 사용하지 않아도 된다. 이러한 도구는 JAX-WS와 함께 사용하도록 개발된 것이며 이러한 도구를 이용하면 클라이언트에서 도메인 오브젝트를 생성할 수 있으며, 웹 서비스를 전혀 사용하고 있지 않는 것처럼 클라이언트를 운영할 수 있다. SAAJ를 사용하면 서비스 도메인을 볼 수 없다. 실제로는 플러밍을 다루고 있는 것이다. JAX-WS를 사용하여 개발하는 것이 훨씬 더 신속하고 수월하며 일반적으로 통제력을 잃지 않게 된다. 그러나 JAX-WS는 편의 계층이며 다행히도 일부 SAAJ 명령을 사용하면 WSDL 인터페이스를 사용하는 데 필요한 작업을 수행할 수 있다.
JAX-WS 아키텍처
Java 웹 서비스는 인터페이스 코드를 작성하는 데 도움을 주기 위해 사용된다. Sun에서는 이러한 코드 조각을 타이(tie: 서비스 측 모듈) 및 스텁(stub: 클라이언트 측 모듈)이라고 한다. 그림 1을 참조한다.
그림 1. JAX-WS 아키텍처(시스템을 구조화하는 방법)
타이와 스텁은 각각 'wsdeploy' 및 'wscompile'이라고 하는 패키지된 도구 세트로 생성된다. 'Wsdeploy'는 해당 서비스에 있는 메소드를 조사할 뿐만 아니라 전달된 SOAP 메시지의 마샬링을 해제하고 리턴 데이터를 마샬링하는 일련의 클래스를 작성한다. 마찬가지로 이 도구를 사용하여 WSDL 파일을 작성한다. wscompile 도구는 지정된 서비스의 WSDL 파일을 확인함으로써 작동한다. 이 도구는 해당 서비스와의 통신과 모든 메소드 호출의 마샬링을 처리하는 일련의 프록시 클래스를 생성하기 위해 WSDL 파일에서 XML 디스크립터를 조사한다. 본질적으로 wsdeploy와 wscompile은 함께 사용된다. 전체적으로 이러한 도구는 웹 서비스 상호 연결을 빌드하는 데 있어 많은 수작업을 필요로 한다. 이러한 도구를 사용하지 않으면 XML SOAP 엔벨로프를 빌드하여 사용하고 데이터와 Java 오브젝트 간의 변환을 수행하는 코드를 모두 직접 작성해야 한다. 이렇게 되면 개발자가 패키지에 포함된 API를 훨씬 더 자세하게 알아야 하고 개발 프로세스도 훨씬 더 복잡해진다.
http://dev.anyframejava.org/docs/anyframe/plugin/optional/cxf-jaxws/1.0.3/reference/htmlsingle/cxf-jaxws.html#cxf_jaxws_introduction_part