29.2. 주입을 통해 프록시 인스턴스화

29.2.1. 개요

Apache CXF의 Spring Framework를 사용하면 JAX-WS API를 사용하여 서비스 프록시를 생성하는 번거로움을 피할 수 있습니다. 구성 파일에 클라이언트 끝점을 정의한 다음 구현 코드에 프록시를 직접 삽입할 수 있습니다. 런타임이 구현 오브젝트를 인스턴스화할 때 구성에 따라 외부 서비스에 대한 프록시를 인스턴스화합니다. 구현은 인스턴스화된 프록시에 대한 참조로 제공됩니다.

프록시는 구성 파일의 정보를 사용하여 인스턴스화되므로 WSDL 위치는 하드 코딩할 필요가 없습니다. 배포 시 변경할 수 있습니다. 런타임이 애플리케이션의 classpath에서 WSDL을 검색하도록 지정할 수도 있습니다.

29.2.2. 절차

외부 서비스의 프록시를 서비스 공급자의 구현에 삽입하려면 다음을 수행합니다.

  1. 애플리케이션의 모든 부분에서 액세스할 수 있는 잘 알려진 위치에 필요한 WSDL 문서를 배포합니다.

    참고

    애플리케이션을 WAR 파일로 배포하는 경우 WAR의 WEB-INF/wsdl 폴더에 모든 WSDL 문서 및 XML 스키마 문서를 배치하는 것이 좋습니다.

    참고

    애플리케이션을 JAR 파일로 배포하는 경우 JAR의 META-INF/wsdl 폴더에 모든 WSDL 문서 및 XML 스키마 문서를 배치하는 것이 좋습니다.

  2. 삽입되는 프록시에 대해 JAX-WS 클라이언트 끝점을 구성합니다.
  3. @Resource 주석을 사용하여 제공하는 서비스에 프록시를 삽입합니다. ???

29.2.3. 프록시 구성

애플리케이션의 구성 파일에서 jaxws:client 요소를 사용하여 JAX-WS 클라이언트 엔드포인트를 구성합니다. 이렇게 하면 런타임에 org.apache.cxf.jaxws.JaxWsClientProxy 개체를 지정된 속성을 사용하여 인스턴스화합니다. 이 오브젝트는 서비스 공급자에 삽입될 프록시입니다.

최소한 다음 속성에 대한 값을 제공해야 합니다.

  • id- 삽입할 클라이언트를 식별하는 데 사용되는 ID를 지정합니다.
  • serviceClass는 프록시가 요청하는 서비스의 SEI를 지정합니다.

예 29.1. “프록시가 서비스 구현에 삽입될 수 있는 구성” JAX-WS 클라이언트 끝점에 대한 구성을 보여줍니다.

예 29.1. 프록시가 서비스 구현에 삽입될 수 있는 구성

<beans ...
  xmlns:jaxws="http://cxf.apache.org/jaxws"
  ...
  schemaLocation="...
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
    ...">
  <jaxws:client id="bookClient"
                serviceClass="org.apache.cxf.demo.BookService"
                wsdlLocation="classpath:books.wsdl"/>
  ...
</beans>
참고

예 29.1. “프록시가 서비스 구현에 삽입될 수 있는 구성” 에서 wsdlLocation 특성은 런타임이 classpath에서 WSDL을 로드하도록 지시합니다. books.wsdl 이 classpath에 있는 경우 런타임에서 해당 경로를 찾을 수 있습니다.

JAX-WS 클라이언트 구성에 대한 자세한 내용은 17.2절. “소비자 엔드 포인트 구성” 을 참조하십시오.

29.2.4. 공급자 구현 코딩

예 29.2. “서비스 구현에 프록시 삽입” 에 표시된 대로 @Resource 를 사용하여 서비스 구현에 구성된 프록시를 서비스 구현에 리소스로 삽입합니다.

예 29.2. 서비스 구현에 프록시 삽입

package demo.hw.server;

import org.apache.hello_world_soap_http.Greeter;

@javax.jws.WebService(portName = "SoapPort", serviceName = "SOAPService",
                      targetNamespace = "http://apache.org/hello_world_soap_http",
                      endpointInterface = "org.apache.hello_world_soap_http.Greeter")
public class StoreImpl implements Store {

@Resource(name="bookClient") private BookService proxy;

}

주석의 name 속성은 JAX-WS 클라이언트의 id 속성 값에 해당합니다. 구성된 프록시는 주석 직후 선언된 BookService 오브젝트에 삽입됩니다. 이 오브젝트를 사용하여 프록시의 외부 서비스에서 호출을 수행할 수 있습니다.