정적 JAX-WS 웹 서비스 클라이언트 구현
Java™ EE(Java Platform, Enterprise Edition) 스펙 및 JAX-RPC(Java API for XML-Based Web Services) 프로그래밍 모델에 대한 웹 서비스에 기반하여 정적 웹 서비스 클라이언트를 개발할 수 있습니다.
시작하기 전에

이 태스크 정보
- JAX-WS 프로그래밍 모델에 기반하여 웹 서비스 클라이언트 개발
JAX-WS 웹 서비스에 액세스하고 호출할 수 있는 웹 서비스 클라이언트는 Java EE(Java Platform, Enterprise Edition)용 웹 서비스 스펙에 기반하여 개발됩니다. 애플리케이션 서버는 JAX-WS 프로그래밍 모델에 기반하는 EJB(JavaBeans) 클라이언트, Java EE 애플리케이션 클라이언트, JSP(JavaServer Pages) 파일 및 서블릿을 지원합니다. WSDL(Web Services Description Language) 파일이 웹 서비스 상호 운용성(WS-I) 기본 프로파일을 준수하는 경우 JAX-RPC 스펙에 기반한 웹 서비스 클라이언트는 JAX-WS 기반 웹 서비스를 호출할 수 있습니다.
JAX-WS 클라이언트 프로그래밍 모델은 디스패치 클라이언트 API 및 동적 프록시 클라이언트 API 모두를 지원합니다. 디스패치 클라이언트 API는 동적 클라이언트 프로그래밍 모델이지만, JAX-WS에 대한 정적 클라이언트 프로그래밍 모델은 동적 프록시 클라이언트입니다. 디스패치 및 동적 프록시 클라이언트에서는 JAX-WS 웹 서비스의 동기 및 비동기 호출을 모두 사용할 수 있습니다.
동적 프록시 클라이언트는 제공되는 서비스 엔드포인트 인터페이스(SEI)에 기반하여 웹 서비스를 호출합니다. JAX-WS 동적 프록시 인스턴스는 기본 JRE(Java SE Runtime Environment) 6에서 동적 프록시 기능을 활용합니다. 정적 클라이언트를 개발하는 경우 WSDL 파일로 시작해야 합니다.
반대로, 디스패치 클라이언트 API, javax.xml.ws.Dispatch는 XML 구성 사용을 선호하는 고급 XML 개발자를 대상으로 하는 XML 메시징 중심 클라이언트입니다. 디스패치 API는 PAYLOAD 또는 MESSAGE 모드로 데이터를 전송할 수 있습니다. PAYLOAD 모드를 사용하는 경우 디스패치 클라이언트만 soap:Body의 컨텐츠를 제공할 책임이 있으며, JAX-WS는 soap:Envelope 요소에 페이로드를 포함합니다. MESSAGE 모드를 사용하는 경우 디스패치 클라이언트는 전체 SOAP 엔벨로프 제공을 담당합니다. 동적 클라이언트를 개발하는 경우 WSDL 파일이 필요하지 않습니다.
JAX-WS 프로그래밍 모델에 기반하여 웹 서비스 클라이언트를 개발하려면 웹 서비스 애플리케이션의 요구에 가장 부합하는 클라이언트 모델을 판별해야 합니다. 웹 서비스 클라이언트에서 동적 프록시를 통해 서비스 엔드포인트 인터페이스에 기반하여 서비스를 호출하려는 경우 동적 프록시 API를 사용하여 정적 웹 서비스 클라이언트를 개발합니다. 프록시를 작성한 후에 클라이언트 애플리케이션은 서비스 엔드포인트 인터페이스의 표준 구현과 같이 해당 프록시에서 메소드를 호출할 수 있습니다. 그러나 Java 추상 대신, XML을 직접 사용하려는 경우 메시지 구조 또는 메시지 페이로드 구조에 대한 작업을 수행할 때 디스패치 API를 사용하여 동적 웹 서비스 클라이언트를 개발합니다. 동적 웹 서비스 클라이언트를 개발하는 방법을 학습하려면 동적 JAX-WS 웹 서비스 클라이언트 구현을 참조하십시오.
이 태스크를 완료하여 WSDL 파일로 웹 서비스 클라이언트 개발을 시작하십시오.
정적 또는 동적 JAX-WS 클라이언트를 사용하여 웹 서비스를 비동기로 호출하려면 콜백 또는 폴링 모델 중 구현할 대상을 판별하십시오. 웹 서비스 클라이언트의 폴링 또는 비동기 콜백 구현에 관한 자세한 정보는 JAX-WS 웹 서비스 비동기 호출 관련 주제를 참조하십시오. 서비스 및 클라이언트의 JAX-WS 프로그래밍 모델은 어노테이션을 사용하여 벤더 중립적 방식으로 JAX-RPC 클라이언트 바인딩에 제공된 동일한 정보를 표시합니다.
- 관리 및 비관리 JAX-WS 웹 서비스 클라이언트
애플리케이션 서버는 JAX-WS 프로그래밍 모델을 사용할 때 관리 및 비관리 웹 서비스 클라이언트 모두를 지원합니다.
- 관리 클라이언트
Java EE용 웹 서비스 클라이언트는 JSR(Java Specification Requirements) 109에 의해 정의되며 Java EE 컨테이너에서 실행되므로 관리 클라이언트입니다. 이 클라이언트는 엔터프라이즈 아카이브(EAR) 파일로 패키지되며 서비스 요청자 역할을 하는 컴포넌트를 포함합니다. 이 컴포넌트는 Java EE 클라이언트 애플리케이션, 서블릿 또는 JSP(JavaServer Pages)와 같은 웹 컴포넌트 또는 세션 EJB(Enterprise JavaBeans)로 구성됩니다. 웹 서비스 관리 클라이언트는 JSR 109 API 및 배치 정보를 사용하여 웹 서비스를 검색 및 호출합니다.
관리 클라이언트인 경우 JNDI(Java Naming and Directory Interface) 검색을 사용하여 서비스 검색을 수행하거나 어노테이션을 사용하여 JAX-WS 서비스 또는 포트의 인스턴스를 삽입할 수 있습니다. UserName 토큰 웹 서비스 보안, 디지털 서명 웹 서비스 보안, LTPA(Lightweight Third-Party Authentication) 토큰 웹 서비스 보안 설정을 참조하십시오. 다음 코드는 JSR 109를 준수하는 컨텍스트 검색 예제입니다.
InitialContext ctx = new InitialContext(); FredsBankService service =(FredsBankService)ctx.lookup("java:comp/env/service/FredsBankService"); FredsBank fredsBank = service.getFredsBankPort(); long balance = fredsBank.getBalance();
@WebServiceRef 또는 @Resource 어노테이션을 사용하여 관리 클라이언트를 선언할 수 있습니다. 이 어노테이션을 사용하면 JNDI 네임스페이스에 바인드된 어노테이션으로 유형을 지정합니다. 필드 또는 메소드에서 어노테이션을 사용하는 경우 JAX-WS 서비스 또는 포트 인스턴스의 삽입이 수행됩니다. 클라이언트 배치 디스크립터에서 service-ref 항목을 선언하는 대신, 이 어노테이션을 사용할 수 있습니다. 계속해서 클라이언트 배치 디스크립터를 사용하여 JAX-RPC 관리 클라이언트와 비슷한 방식으로 JAX-WS 관리 클라이언트를 선언할 수 있습니다. 또한 @WebServiceRef 및 @Resource 어노테이션에서 지정한 정보를 대체 및 기능 보강하도록 배치 디스크립터를 사용할 수 있습니다. @WebServiceRef 어노테이션을 사용하여 JAX-WS 서비스 또는 포트 인스턴스를 바인드 및 삽입합니다. @Resource 어노테이션만 사용하여 JAX-WS 서비스 인스턴스를 바인드 및 삽입할 수 있습니다. 이 어노테이션 중 하나를 사용하여 JAX-WS 관리 클라이언트를 선언하는 방법은 특정 클래스 유형에서만 지원됩니다. 이러한 몇 가지 클래스 유형으로는, JAX-WS 엔드포인트 구현 클래스, JAX-WS 핸들러 클래스, 엔터프라이즈 Bean 클래스, 서블릿 클래스가 포함됩니다.
다음 예제는 @WebServiceRef 어노테이션을 사용하여 FredsBank의 인스턴스를 가져옵니다.
이제 클래스 내에서 fredsBank 필드는 초기화하지 않아도 됩니다. 이 필드는 다음과 같이 직접 사용할 수 있습니다.@WebServiceRef(name=”service/FredsBankPort”, value=FredsBankService.class) FredsBank fredsBank;
long balance = fredsBank.getBalance();
또한 @WebServiceRef 어노테이션을 사용하여 JAX-WS 서비스 클래스의 인스턴스를 가져올 수도 있습니다. 예를 들어, 다음과 같습니다.@WebServiceRef(name=”service/FredsBankService”) FredsBankService service;
이제 클래스 내에서 service 필드는 초기화하지 않아도 됩니다. 이 필드는 다음과 같이 직접 사용할 수 있습니다.FredsBank fredsBank = service.getFredsBankPort(); long balance = fredsBank.getBalance();
@WebServiceRef 어노테이션 외에도 JAX-WS 서비스 클래스의 인스턴스를 가져오기 위해 @Resource 어노테이션을 사용할 수 있습니다. 예를 들어, 다음과 같습니다.@Resource(name=”service/FredsBankService”, type=FredsBankService.class) FredsBankService service;
@WebServiceRef 어노테이션과 마찬가지로, 이제 인스턴스화 없이도 service 필드를 사용할 수 있습니다. 예를 들어, 다음과 같습니다.FredsBank fredsBank = service.getFredsBankPort(); long balance = fredsBank.getBalance();
클래스에서 @Resource 또는 @WebServiceRef 어노테이션을 사용할 수 있습니다. 이 경우 JNDI는 JAX-WS 서비스 또는 포트를 검색하는 데 사용해야 합니다. 예를 들어, 다음과 같습니다.@WebServiceRef(name=”service/FredsBankService”, type=FredsBankService”) public class J2EEClientExample { … … public static void main(String[] args) { … … InitialContext ctx = new InitialContext(); FredsBankService service =(FredsBankService)ctx.lookup("java:comp/env/service/FredsBankService"); FredsBank fredsBank = service.getFredsBankPort(); long balance = fredsBank.getBalance(); } … }
@WebServiceRef 및 @Resource 어노테이션 사용에 대한 자세한 정보는 JSR-109, JSR-224, JSR-250, Java EE 5(Java Platform Enterprise Edition 5)에 대한 스펙을 참조하십시오.
이전에 언급한 대로 어노테이션 또는 JNDI를 사용하여 JAX-WS 서비스 및 포트의 인스턴스를 가져오는 경우 리턴된 오브젝트를 인스턴스화하지 마십시오. 그러면 비관리 클라이언트 인스턴스가 생성될 수 있습니다. 다음 예제는 잘못된 사용에 관한 예제를 보여줍니다.@WebServiceRef(name=”service/FredsBankService”) FredsBankService service; service = new FredsBankService(); // client becomes unmanaged.
@WebServiceRef 또는 @Resource 어노테이션에 의해 선언된 JAX-WS 관리 클라이언트 및 클라이언트 배치 디스크립터에서 service-ref 항목을 사용하여 선언된 클라이언트의 경우 관리 콘솔을 사용하여 클라이언트가 사용하는 엔드포인트 URL을 제공할 수 있습니다. 이 지정된 URL은 클라이언트에서 사용하는 WSDL 문서의 엔드포인트 URL을 대체합니다. 이 엔드포인트 URL 지정에 대해 자세히 학습하려면 웹 서비스 클라이언트 바인딩 구성 문서를 참조하십시오.
- 비관리 클라이언트
JAX-WS 런타임 환경을 사용하여 웹 서비스를 호출하고 Java EE 컨테이너에서 실행되지 않는 Java SE 6(Java Platform, Standard Edition) 클라이언트를 비관리 클라이언트라고도 합니다. 웹 서비스 비관리 클라이언트는 독립형 Java 클라이언트로, WSDL 파일을 직접 검사하고 JAX-WS API를 사용하여 웹 서비스에 대한 호출을 공식화할 수 있습니다. 이 클라이언트는 JAR 파일로 패키지되며, 배치 정보를 포함하지 않습니다.
- 관리 클라이언트
WebSphere Application Server 버전 7.0 이상을 시작하면 JAX-WS 서비스와 클라이언트를 식별하기 위한 어노테이션을 찾기 위해 Java EE 5 애플리케이션 모듈(웹 애플리케이션 모듈 버전 2.5 이상 또는 EJB 모듈 버전 3.0 이상)을 스캔합니다. 하지만 Java EE 5 이전 애플리케이션 모듈(웹 애플리케이션 모듈 버전 2.4 이하 또는 EJB 모듈 버전 2.1 이하)에서는 성능을 고려하여 기본적으로 JAX-WS 어노테이션을 스캔하지 않습니다. 버전 6.1 Feature Pack for Web Services의 경우 기본적으로 애플리케이션을 설치하는 동안 Java EE 5 이전 웹 애플리케이션 모듈을 스캔하여 JAX-WS 서비스를 식별하고 서비스 클라이언트용 Java EE 5 이전 웹 애플리케이션 모듈 및 EJB 모듈을 스캔합니다. WebSphere Application Server 버전 7.0 이상에서의 기본 동작은 애플리케이션 설치 또는 서버 시작 중에 어노테이션을 찾기 위해 Java EE 5 이전 모듈을 스캔하지 않고 이전 릴리스 기능팩과의 역방향 호환성을 유지하는 것이기 때문에 애플리케이션 설치 및 서버 시작 중에 스캐닝을 요청하려면 EJB 모듈 또는 WAR(Web Application Archive) 파일의 META-INF/MANIFEST.MF에서 UseWSFEP61ScanPolicy 특성을 구성하거나 JVM(Java Virtual Machine) 사용자 정의 특성(com.ibm.websphere.webservices.UseWSFEP61ScanPolicy)을 서버에서 정의해야 합니다. 어노테이션 스캐닝에 대해 보다 자세히 학습하려면 JAX-WS 어노테이션 정보를 참조하십시오.
프로시저
결과
웹 서비스 클라이언트 애플리케이션을 작성 및 테스트합니다.
다음에 수행할 작업
웹 서비스 애플리케이션 클라이언트를 개발하고 클라이언트가 정적으로 바인드된 경우 구현에서 사용하는 서비스 엔드포인트는 개발 프로세스 중에 사용한 WSDL 파일에서 식별된 항목입니다. 웹 서비스 애플리케이션 설치 중 또는 이후에 서비스 엔드포인트를 변경할 수 있습니다. 관리 클라이언트의 경우 관리 콘솔 또는 wsadmin 스크립트 도구를 사용하여 엔드포인트를 변경할 수 있습니다. 비관리 JAX-WS 웹 서비스 클라이언트인 경우 클라이언트 애플리케이션에서 엔드포인트를 변경할 수 있습니다.
웹 서비스 클라이언트에 대한 확장을 구현하여 웹 서비스 사용자 정의를 추가로 고려할 수 있습니다. 이러한 확장의 몇 가지 예로는, SOAP 헤더에서 값의 전송 및 수신 또는 HTTP나 JMS(Java Message Service) 전송 헤더의 전송 또는 수신이 포함됩니다. 이 확장에 대해 자세히 학습하려면 웹 서비스 클라이언트에 대한 확장 구현을 참조하십시오.