본 장에서는 JEUS 웹 서비스가 새롭게 지원하는 Fast Infoset 웹 서비스와 이를 구현하고 사용하는 방법에 대해 설명한다.
Fast Infoset 표준은 XML 대신 사용할 수 있는 효과적인 XML Infoset들의 바이너리 형태를 명시하고 있다.
Fast Infoset(ITU-T Rec. X.891 | ISO/IEC 24824-1 Fast Infoset) 스펙은 다음에 의해 표준화되고 있다.
ITU-T(통신장비 및 시스템의 조합 표준을 육성하기 위한 조직체)
http://www.itu.int/ITU-T/studygroups/com17/index.asp
ISO(International Standards Organization)
http://www.iso.org/iso/home/standards_development/list_of_iso_technical_committees.htm
XML 문서와 마찬가지로 이러한 XML Infoset들의 바이너리 형태 인스턴스를 가리켜 Fast Infoset 문서라고 한다. XML 문서와 Fast Infoset 문서는 실질적인 형태를 가지며 내부적으로 XML Infoset을 지니고 있다. 이러한 Fast Infoset 문서는 직렬화 또는 파싱(Parsing)하는 속도가 더 빠르며 크기면에서도 XML 문서보다 작다. 따라서 Fast Infoset 문서는 XML 문서의 프로세싱 속도와 크기가 이슈가 되는 경우 사용한다.
Fast Infoset 문서는 XML 문서와 마찬가지로 직렬화되거나 파싱(Parsing)될 수 있다.
직렬화 과정
XML 문서로부터 얻은 DOM 문서나 SAX 이벤트에 해당하는 XML Infoset으로부터 Fast Infoset을 얻고 다시 이 Fast Infoset으로부터 Fast Infoset 문서를 얻는 과정이다.
파싱 과정
Fast Infoset 문서로부터 Fast Infoset을 얻고 다시 이 Fast Infoset으로부터 XML Infoset을 얻는 과정이다. Fast Infoset 스펙은 이러한 문서들의 효과적인 직렬화 혹은 파싱 과정 그리고 문서 크기의 축소에 대한 최적화를 보장한다.
다음은 이러한 직렬화 또는 파싱 과정을 나타낸 것이다.
Fast Infoset 문서는 XML 문서에 비해 파싱하는 속도와 직렬화하는 속도가 빠르며 문서의 크기가 더 작아진다는 장점이 있다.
이 외에도 다음과 같은 여러 가지 장점을 갖는다.
XML 문서에서 사용되는 것과 같은 end 태그가 존재하지 않는다.
escaping 문자 데이터가 존재하지 않는다.
Fast Infoset 문서를 Fast Infoset으로 변환하는 디코더(decoder)는 길이를 미리 알고 있다는 장점이 있다.
반복되는 문자열을 인덱싱한다.
문자 공간(Namespace)과 같은 정보 또한 인덱싱한다.
바이너리 콘텐츠를 내포할 수 있다.
비슷한 어휘(Vocabulary)를 가진 문서들의 상태를 보존한다.
또한 바이너리 형태의 Fast Infoset 문서는 다음과 같은 장점을 갖는다.
Element 아이템 또는 문자 정보들이 더 작은 비트들로 인코딩된다.
Fast Infoset 인코더와 디코더는 잘 정의된 경계선(Boundary)에 힘입어 구현이 쉽고 효율이 뛰어나다.
인덱싱 정보를 통해 직렬화 또는 파싱하는 데 있어서 대상물의 크기가 작아지기 때문에 속도가 빠르다.
스트리밍 기능을 활용하기 적합하다.
본 절에서는 Fast Infoset 기능을 사용하기 위한 방법인 Content Negotiation 기법에 대해 설명한다.
JAX-WS 웹 서비스에서 Fast Infoset 기능을 사용하기 위해서는 표준 HTTP Header인 Accept 또는 Content-Type에 Fast Infoset 기능의 사용 여부를 등록시키는 방법을 사용한다. 이러한 Fast Infoset의 사용 여부가 항상 웹 서비스를 호출하는 클라이언트에 의해 결정된다는 점에서 그리고 HTTP Header를 통해 이러한 결정이 이루어진다는 점에서 Content Negotiation 기법이라고 한다.
클라이언트가 HTTP Header에 정보를 삽입하는가에 따라 결정되는 웹 서비스의 Fast Infoset에서 클라이언트는 첫 번째 메시지를 전달할 때에는 XML로 인코딩된 SOAP 메시지를 전달한다. 이때 클라이언트가 HTTP Accept Header에 MIME 타입 application/fastinfoset의 정보를 포함시키면 그 다음부터 이루어지는 메시지 전달은(서버가 Fast Infoset을 지원한다면) 모두 Fast Infoset으로 인코딩된 SOAP 메시지를 전송한다. 즉, 클라이언트가 XML로 인코딩된 SOAP 메시지를 HTTP Accept Header에 MIME 타입 application/fastinfoset로 전달하면 Fast Infoset이 가능한 서버는 Fast Infoset으로 인코딩된 메시지를 응답 메시지로써 전달한다. 만약 이후에 클라이언트가 같은 Stub Object를 통해 메시지를 전송한다면 클라이언트와 서버는 계속 이러한 Fast Infoset으로 인코딩된 메시지를 주고받게 된다. 이러한 방법을 Negotiation Pessimistic 방식이라고 한다.
JAX-WS 웹 서비스에서 Fast Infoset 기능을 사용하기 위해서는 다음의 방법으로 설정한다.
클라이언트의 속성을 설정한다.
((BindingProvider) stubOrDispatch).getRequestContext().put( com.sun.xml.ws.client.ContentNegotiation.PROPERTY, "pessimistic");
클라이언트가 동작하는 VM의 시스템 변수를 설정한다.
java -Dcom.sun.xml.ws.client.ContentNegotiation=pessimistic
JAX-WS 웹 서비스에서 Fast Infoset 기능을 사용하기 위해서는 클라이언트 애플리케이션에서 클라이언 트의 속성을 설정하는 방법과 클라이언트가 동작하는 VM의 시스템 변수를 설정하는 방법이 있다.
본 절에서는 클라이언트 애플리케이션을 통해 클라이언트의 속성을 설정하는 방법에 대해 설명한다.
서버에서는 다른 옵션을 통한 기능은 제공하지 않는다. Fast Infoset 속성은 모두 클라이언트에 의해서 결정된다.
다음은 Fast Infoset 속성을 위한 클라이언트 애플리케이션의 예제이다.
[예 11.1] Fast Infoset 예제 : <AddNumbersClient.java>
public class AddNumbersClient { public static void main(String[] args) { AddNumbersImpl port = new AddNumbersImplService().getAddNumbersImplPort(); ((BindingProvider) port).getRequestContext().put( ContentNegotiation.PROPERTY, "pessimistic"); int number1 = 10; int number2 = 20; System.out.println("#################################################"); System.out.println("### JAX-WS Webservices examples - fastinfoset ###"); System.out.println("#################################################"); System.out.println("Testing Fast Infoset webservices..."); int result = port.addNumbers(number1, number2); if (result == 30) { System.out.println("Success!"); } } }
위와 같이 Fast Infoset 기능을 사용하기 위해서는 서비스 인터페이스로부터 얻은 프록시(Stub) 객체를 통해 pessimistic 속성을 Request 컨텍스트의 ContentNegotiation으로 설정한다.
본 절에서는 이전 절에서 구현한 클래스들 및 기타 설정 파일들을 이용하여 Fast Infoset 웹 서비스를 실행하는 방법을 설명한다. 기타 SEI의 구현 클래스 및 기타 설정 파일들은 앞 장에서 설명한 예제의 내용과 동일하다.
다음과 같이 Fast Infoset 웹 서비스를 설정한 서비스를 생성하여 JEUS에 deploy한다.
$ ant build deploy
위의 과정이 모두 실행되어 서비스가 정상적으로 deploy되면, 클라이언트를 빌드하고 호출한다. 클라이언트에서 wsimport의 과정을 거치므로 서비스의 deploy가 모두 완료되었을 때 클라이언트의 구성이 가능하다.
다음과 같이 Fast Infoset 웹 서비스를 설정한 클라이언트를 생성하고 서비스에 호출한다.
$ ant run ... run: [java] ################################################# [java] ### JAX-WS Webservices examples - fastinfoset ### [java] ################################################# [java] Testing Fast Infoset webservices... [java] Success! ... BUILD SUCCESSFUL
$ ant run ---[HTTP request]--- Host: localhost:8088 Content-length: 218 Content-type: text/xml; charset=utf-8 Accept: application/fastinfoset, text/xml, multipart/related, text/html, image/g if, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive Soapaction: "" User-agent: JAX-WS RI 2.2 - JEUS 21 <?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envel ope/"><S:Body><ns2:addNumbers xmlns:ns2="http://server.fastinfoset/"><arg0>10</a rg0><arg1>20</arg1></ns2:addNumbers></S:Body></S:Envelope> -------------------- ---[HTTP response 200]--- ?