상세 컨텐츠

본문 제목

Chapter 6 Web Service Client Program

프로그래밍/웹서비스

by 라제폰 2008. 12. 13. 20:23

본문

Chapter 6 Web Service Client Program

 
JAX-RPC 클라이언트 호출모델에 따른 종류
 
·          정적 스텁 호출 모델 : 정적 스텁이란 WSDL문서를 이용하여 수동으로 생성된 클래스를 말한다. 정적 스텁 호출 모델은 생성된 스텁을 이용해서 원격 프로시저 호출을 하는 모델을 말한다.
·          동적 프록시 호출 모델 : 동적 프록시란 동적으로 생성되는 프록시를 말한다. 일반적으로 프록시는 외부 인터넷과 내부 컴퓨터 간에 중개 역할을 하는 소프트웨어를 말하는데, JAX-RPC에서는 웹 서비스 시스템과 클라이언트를 서로 연결해 주는 스텁 클래스를 말한다. 따라서 동적 프록시는 동적 스텁이라고 말할 수 있다.
·          동적 호출 인터페이스 모델 : 호출 가능한 인터페이스란 뜻으로 클라이언트 측에서 원격 인터페이스명을 알지 못해도 동적으로 원격 메소드를 호출할 수 있도록 해주는 모델을 말한다. Call 객체를 이용하면 원격 프로시저명과 인자에 대한 정보만 알고 있으면 원격 프로시저를 호출할 수 있다.
 
Sample Web Service 확인
5장에서 작성한 샘플 웹 서비스 프로그램을 확인해 본다.
디플로이된 Context+”/webservice” 을 하면 등록된 웹서비스의 정보를 볼 수 있다.


 
1.      정적 스텁 호출 모델
-         스텁 클래스를 “wscompile.bat” 라는 도구를 이용하여 생성한다. C:jwsdp-1.4jaxrpcbin(예를 들어) 디렉토리에 있다.
-         config.xml 문서를 아래와 같이 만든다.(다른 이름이어도 상관없다. “C:jwsdp-1.4jaxrpcsamplesHelloWorldetc” 디렉토리에 샘플 문서가 들어있다.)
<?xml version="1.0" encoding="UTF-8"?>
 
<!--
 Copyright 2004 Sun Microsystems, Inc. All rights reserved.
 SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
-->
 
<configuration
    xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
    <wsdl
        location="http://localhost:8080/WSHello/webservice?WSDL"
        packageName="WSHello" />
</configuration>
-         “wscompile -gen:client [-d 클래스 저장 위치] config.xml” 을 실행하면 문서에서 “packageName”으로 지정한 디렉토리 밑에 다음과 같은 파일이 생성된다.
User.class
 UserInfoIntf.class
 UserInfoIntf_getUser_RequestStruct.class
 UserInfoIntf_getUser_RequestStruct_SOAPBuilder.class
 UserInfoIntf_getUser_RequestStruct_SOAPSerializer.class
 UserInfoIntf_getUser_ResponseStruct.class
 UserInfoIntf_getUser_ResponseStruct_SOAPBuilder.class
 UserInfoIntf_getUser_ResponseStruct_SOAPSerializer.class
 UserInfoIntf_Stub.class
 User_SOAPBuilder.class
 User_SOAPSerializer.class
 Webservice.class
 Webservice_Impl.class
 Webservice_SerializerRegistry.class
-         생성된 정적 스텁 클래스을 기반으로 클라이언트 프로그램을 작성한다.
package WSHello;
 
import java.rmi.RemoteException;
import javax.xml.rpc.Stub;
 
public class WSHelloClient  {
    public WSHelloClient() {
    }
   
    public static void main(String[] args) {
        try {
            Webservice_Impl webservice = new Webservice_Impl();
            Stub stub = (Stub) webservice.getUserInfoIntfPort();
            UserInfoIntf userInfo = (UserInfoIntf)stub;
            User user = userInfo.getUser("후루꾸",19);
            System.out.println("사용자 : "+user.getName());
            System.out.println("나이 : "+user.getAge());
        }
        catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}
 
2.      동적 프록시 호출 모델
package WSHello;
import java.net.MalformedURLException;
import java.net.URL;
 
import java.rmi.RemoteException;
 
import javax.xml.namespace.QName;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Stub;
 
public class WSDynamicHello  {
    public WSDynamicHello() {
    }
   
    public static void main(String[] args) {
        /**
         * 작성한 WSDL 문서를 참고하여 아래의 항목을 웹서비스에 맞게 수정한다.
         */
        String WSUrl = "http://localhost:8080/WSHello/webservice?WSDL";
        String Qname = "http://localhost:8888/hello/webservice/wsdl/webservice";
        String serviceName = "Webservice";
        String PortName = "UserInfoIntfPort";
        try {
            ServiceFactory servicefactory = ServiceFactory.newInstance();
           
            URL wsdlUrl = new URL(WSUrl);
           
            QName serviceQname = new QName(Qname,serviceName);
                
            Service service = servicefactory.createService(wsdlUrl, serviceQname);
           
            QName portQname = new QName (Qname,PortName);
           
            Stub stub = (Stub) service.getPort(portQname, UserInfoIntf.class);
            UserInfoIntf userInfo = (UserInfoIntf)stub;
            User user = userInfo.getUser("후루꾸",19);
            System.out.println("사용자 : "+user.getName());
            System.out.println("나이 : "+user.getAge());
        }
        catch (ServiceException e) {
            e.printStackTrace();
        }
        catch (MalformedURLException e) {
            e.printStackTrace();
        }
        catch (RemoteException e) {
            e.printStackTrace();
        }
           
    }
}
 
3.      동적 호출 인터페이스
정적 스텁 호출 모델 및 동적 프록시 호출 모델에서는 클라이언트 응용프로그램이 원격 프로시저를 호출하기 위해서는 스텁을 원격 인터페이스로 형 변환해야 한다. 따라서 원격 인터페이스가 클라이언트 응용프로그램 작성 시 반드시 있어야 한다. 하지만 동적 호출 인터페이스는 원격 인터페이스로 형 변환 없이  Call 객체를 통해서 바로 원격 프로시저를 호출할 수 있다. 즉 웹 서비스 소비자인 클라이언트에서는 원격 인터페이스가 없어도 된다는 뜻이다. 단지 원격 프로시저명과 인자에 대한 정보만 알고 있으면 원격 프로시저를 호출 할 수 있다.
package WSHello;
 
import java.rmi.RemoteException;
import javax.xml.rpc.*;
import javax.xml.namespace.*;
import java.net.*;
 
public class WSCallHello  {
    public WSCallHello() {
    }
   
    public static void main(String[] args) {
        /**
         * 작성한 WSDL 문서를 참고하여 아래의 항목을 웹서비스에 맞게 수정한다.
         */
        String WSUrl = "http://localhost:8080/WSHello/webservice?WSDL";
        String Qname = "http://localhost:8888/hello/webservice/wsdl/webservice";
        String serviceName = "Webservice";
        String PortName = "UserInfoIntfPort";
        String EndPoint = "http://localhost:8080/WSHello/webservice";
       
        try {
            ServiceFactory servicefactory = ServiceFactory.newInstance();
            QName serviceQname = new QName(Qname,serviceName);
            Service service = servicefactory.createService(serviceQname);
            QName portQname = new QName (Qname,PortName);
           
            Call call = service.createCall(portQname);
            
            call.setTargetEndpointAddress(EndPoint);
            call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true));
            call.setProperty(Call.SOAPACTION_URI_PROPERTY, "");
            call.setProperty("javax.xml.rpc.encodingstyle.namespace.uri",
                             "http://schemas.xmlsoap.org/soap/encoding/");
            call.setOperationName(
                new QName(Qname,"getUser"));
           
            call.addParameter("String_1",
                new QName("http://www.w3.org/2001/XMLSchema","string"),
                ParameterMode.IN);
   
            call.addParameter("int_2",
                new QName("http://www.w3.org/2001/XMLSchema","int"),
                ParameterMode.IN);
           
            call.setReturnType(
                new QName("http://localhost:8888/hello/webservice/type/webservice","User"));
           
            Object[] params = {new String("후루꾸"), new Integer(19)};
            User user = (User)call.invoke(params);
            System.out.println("사용자 : "+user.getName());
            System.out.println("나이 : "+user.getAge());       
        }
        catch (ServiceException e) {
            e.printStackTrace();
        }
        catch (RemoteException e) {
            e.printStackTrace();
        }
       
    }
}

 


관련글 더보기