JAX-WS 웹 서비스에서 MTOM 사용으로 설정
JAX-WS(Java™ API for XML-Based Web Services)에서 이미지 또는 파일과 같은 2진 첨부 파일을 웹 서비스 요청과 함께 전송할 수 있습니다. JAX-WS는 SOAP MTOM(Message Transmission Optimization Mechanism) 스펙에서 지정한 대로 2진 데이터의 최적화된 전송을 위한 지원을 추가합니다.
이 태스크 정보
JAX-WS는 2진 첨부 데이터 전송을 위한 SOAP MTOM(Message Transmission Optimized Mechanism) 사용을 지원합니다. MTOM을 사용으로 설정하면 XML 문서에 2진 데이터를 임베드하는 데 필요한 데이터 인코딩 비용을 발생시키지 않으면서 2진 데이터를 최적으로 전송하고 수신할 수 있습니다.
애플리케이션 서버는 JAX-WS 애플리케이션 전용 MTOM을 사용한 첨부 파일 전송을 지원합니다. 이 제품은 새 MTOM 및 XOP 표준을 사용하여 웹 서비스 보안 SOAP 메시지와 함께 첨부 파일을 전송할 수 있는 기능을 제공합니다.
JAX-WS 애플리케이션은 XML 문서에 포함된 base64 또는 hexBinary 인코딩된 데이터로 2진 데이터를 전송할 수 있습니다. 그러나 MTOM에서 제공하는 최적화를 이용하려면 MTOM을 사용으로 설정하여 2진 base64 데이터를 XML 문서 외부에 포함된 첨부 파일로 전송하십시오. MTOM 최적화는 기본적으로 사용으로 설정되지 않습니다. JAX-WS 애플리케이션에서는 MTOM 지원이 가능하도록 클라이언트 및 서버 아티팩트 둘 다를 개별적으로 구성해야 합니다.
프로시저
결과
MTOM을 사용하여 2진 데이터를 최적으로 전송 및 수신하는 JAX-WS 웹 서비스 서버 및 클라이언트 애플리케이션을 개발했습니다.
예
다음 예에서는 WSDL 파일을 사용하여 시작할 때 웹 서비스 클라이언트 및 서버 엔드포인트 둘 다에서 MTOM 지원을 사용으로 설정하는 것을 보여줍니다.
- xsd:base64Binary 요소가 들어 있는 WSDL 파일을 찾으십시오. 다음 예는
xsd:base64Binary 요소를 포함하는 WSDL 파일 부분입니다.
<types> ........ <xs:complexType name="ImageDepot"> <xs:sequence> <xs:element name="imageData" type="xs:base64Binary" xmime:expectedContentTypes="image/jpeg"/> </xs:sequence> </xs:complexType> ........ </types>
- WSDL 파일에 대해 app_server_root\bin\ 디렉토리에서 wsimport 명령을 실행하여 일련의 JAX-WS 이식 가능 아티팩트를 생성하십시오.
WSDL 파일에 포함된 expectedContentTypes 값에 따라 생성된 JAXB 아티팩트는 다음 테이블에 설명된 대로 Java 유형입니다.
표 1. MIME 유형 및 Java 유형의 맵핑. MIME 유형과 Java 유형 사이의 맵핑에 대해 설명합니다. MIME 유형 Java 유형 image/gif java.awt.Image image/jpeg java.awt.Image text/plain java.lang.String text/xml javax.xml.transform.Source application/xml javax.xml.transform.Source */* javax.activation.DataHandler - 다른 JAX-WS 애플리케이션과 같은 방식으로 JAXB 아티팩트를 사용하십시오. 이러한 Bean을 사용하여 디스패치 및 동적 프록시 클라이언트 API 둘 다에서 2진 데이터를 전송하십시오.
- 디스패치 클라이언트에서 MTOM을 사용으로 설정하십시오.
//Create the Dispatch instance. JAXBContext jbc = JAXBContext.newInstance("org.apache.axis2.jaxws.sample.mtom"); Dispatch<Object> dispatch = svc.createDispatch(portName, jbc, Service.Mode.PAYLOAD); //Enable MTOM. SOAPBinding binding = (SOAPBinding) dispatch.getBinding(); binding.setMTOMEnabled(true);
- 동적 프록시 클라이언트에서 MTOM을 사용으로 설정하십시오.
MTOM에 대해 JAX-WS 클라이언트가 사용으로 설정되었으므로 서버에 전송된 메시지가 MTOM 사용으로 설정됩니다. 그러나 서버가 MTOM을 사용하여 클라이언트에게 응답하게 하려면 엔드포인트에서 MTOM을 사용으로 설정해야 합니다.//Create the Dynamic Proxy instance. Service svc = Service.create(serviceName); MtomSample proxy = svc.getPort(portName, MtomSample.class); //Enable MTOM. BindingProvider bp = (BindingProvider) proxy; SOAPBinding binding = (SOAPBinding) bp.getBinding(); binding.setMTOMEnabled(true);
- 엔드포인트 구현 클래스에서 MTOM을 사용으로 설정하십시오.
jaxax.xml.ws.SOAPBinding 클래스에는 지원되는 바인딩 유형 각각에 대한 정적 멤버가 있습니다. SOAP11HTTP_MTOM_BINDING 또는 SOAP12HTTP_MTOM_BINDING 중 하나를 @BindingType 어노테이션에 대한 값으로 포함시키십시오. 이 값은 모든 서버 응답에서 MTOM이 사용으로 설정되도록 합니다.@MTOM(enabled, threshold=4096) @WebService (endpointInterface="org.apache.axis2.jaxws.sample.mtom.MtomSample") public class MtomSampleService implements MtomSample { .... }
서버 및 클라이언트에서 MTOM을 사용으로 설정하는 경우 첨부를 나타내는 2진 데이터는 SOAP 메시지에 대한 MIME(Multipurpose Internet Mail Extensions) 첨부로서 포함됩니다. MTOM을 사용하지 않으면, 동일한 데이터가 XML 스키마(base64 또는 16진 인코딩)를 설명하는 형식으로 인코딩되어 XML 문서에 인라인으로 포함됩니다.
... other transport headers ...
Content-Type: multipart/related; boundary=MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812;
type="application/xop+xml"; start="
<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>"; start-info="text/xml"; charset=UTF-8
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: application/xop+xml; charset=UTF-8; type="text/xml";
content-transfer-encoding: binary
content-id:
<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom">
<input>
<imageData>
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include"
href="cid:1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org"/>
</imageData>
</input>
</sendImage>
</soapenv:Body>
</soapenv:Envelope>
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: text/plain
content-transfer-encoding: binary
content-id:
<1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org>
… binary data goes here …
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812--
... other transport headers ...
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom">
<input>
<imageData>R0lGADl ... more base64 encoded data ... KTJk8giAAA7</imageData>
</input>
</sendImage>
</soapenv:Body>
</soapenv:Envelope>
추가 정보는 Information Center의 샘플 섹션을 참조하십시오. 이 섹션에는 JAX-WS 웹 서비스에서 MTOM을 사용하는 것을 보여주는 샘플이 있습니다.