본문 바로가기

웹서비스

XML Web Services 정리

출처 : http://tequiero35.egloos.com/900246

1. XML Web Services 란?

▪ XML 기반의 분산 컴포넌트 모델




2. XML Web Services 의 장점

▪ HTTP 프로토콜 이용
▪ 플랫폼과 언어 독립적 (약결합 구조
▪ 동기, 비동기 메시징
▪ 기존 시스템에 적용 가능



3. 웹 서비스의 형태

3-1. 동기적

▪ 클라이언트/서버 간 1:1 연결. 일반적으로 RPC 형태로 동작.
▪ 요청 후 응답이 오기까지 동기적으로 묶여있어서 다른 일을 할 수 없다.


3-2. 비동기적

▪ 단방향 메시징. (ex. 이메일 시스템). 큐가 필요하다.
▪ 메시지를 전달하고 ok 되면 끝. 이벤트성 메시지.



4. 웹 서비스의 기본 구조

1. 고려 사항

1-1. EndPoint 먼저? WSDL 먼저?

① EndPoint구현부터

▪ 프로그램을 먼저 짠후, 그로부터WSDL 을 만드는 방법
▪ Bottom-up 이라고 한다.
▪ 장점 : 쉽다
▪ 단점 : 상호 운용성이 안 좋은 편이고, EndPoint 구현체를 만들 때 쓰는 언어에 의존적이다.


② WSDL구현부터

▪ Top-up 방식
▪ 장점 : 상호 운용성이 좋다
▪ 단점 : WSDL 의 학습이 필요하다.


1-2. RPC 방식? Document 방식?


① RPC (Remote Procedure Call)

▪ 원격지의 함수를 호출하기 위한 오래된 기술.
▪ Java의 RMI, EJB, CORBA, DCOM/COM+, .NET


② Document 방식

▪ Web Services 를 통해 데이터를 주고 받을 때 d0cument 로 주고 받고, 해석을 알아서 한다.
▪ 상호 운용성 측면에서 좋다.


1-3. POJO? EJB? (Java only)


- EndPoint 를 구현할 때 두 가지 중 한 가지를 선택해야 한다.

① POJO


② EJB (Stateless Session Bean)

▪ 선언적 Transaction 관리가 가능하다.
▪ Scalability (확장성) 가 높다.



2. 동기적 Web Services 구현


2-1. JAX_RPC (Java API for XML-Based RPC)


▪ RPC 형태의 동기적인 SOAP 모델을 구현하기 위한 API
▪ Java 를 이용해 서비스를 제공하는 서버와 서비스를 이용하는 클라이언트를 구현하기 위한 API 제공





3. JAX_RPC 를 이용한 웹 서비스 시나리오






cf. 일반적으로 Web Service 와 Web Services 는 다른 의미를 갖는다.
Web Service 는 단일 웹 서비스를 의미하고,
Web Services 는 그 웹 서비스들을 제공하는 체계를 의미한다.

1. Axis (Apache Extensible Interaction System)

▪ 다양한 방법으로 조립 설치 가능한 (pluggable) 컴포넌트 조합을 설정할 수 있도록 하는 웹 서비스 툴킷.
▪ SOAP 메시지를 HTTP 같은 전송매체를 통해 웹 서비스에 전달하고 SOAP 메시지 형태로 만들어진 응답을 다시 요청자에게 전달하는 역할을 한다.




2. Axis architecture

-비즈니스 로직과 데이터를 전송하는 네트워크 전송매체 사이의 얇은 층 (thin layer)라 볼 수 있다.



▪ AXIS 의 체인 구조 : 큰 원통 → 체인 , 작은 원통 → 핸들러
▪ 클라이언트에서 전달된 SOAP 메시지는 Transport Listener 에 의해 Message Context (메시지 객체)로 변환.
▪ 전달된 메시지는 WSDD 파일의 Global Handler 부분을 수행하고 서비스 체인에 전달.
▪ Provider 체인은 실제로 수행할 로직을 구현.



2-1. Axis 컴포넌트

Axis Engine : SOAP 처리기의 주요 입력 부분.
Handler : Axis 내부의 기본적인 구성요소. 기존의 백엔드 시스템과 Axis를 연결하는 역할 담당.
Chain : 순차적으로 정렬된 핸들러 모음. 혹은 하나의 핸들러 자체.
전송매체 (Transports) : SOAP 메시지 흐름이 Axis에 들어오고 나갈 수 있게 하는 메커니즘.
구축/설정 : Axis를 통해 웹 서비스를 사용할 수 있도록 하는 수단.
Serializers / Deserializers (변환코드/복원코드) : 자바와 같은 원래 데이터 타입을 XML 로 변환하는 코드 / 원래 데이터 타입으로 복원하는 코드.



3. Axis Architecture (Server 측 / Client 측)

3-1. server 측


3-2. client 측


1. Apache Tomcat 설치

▪ Tomcat Version 4.1.x 이상이고, Full 버전을 설치해야 한다.

톰캣 설치 및 환경설정: 12




2. JDK 설치

▪ 1.4 버전 이상이어야 한다.

CLASSPATH

set CLASSPATH=.;c:\jdk15\lib\tools.jar;c:\tomcat\common\lib\servlet-api.jar;
set JAVA_HOME=c:\jdk15
set PATH=c:\jdk15\bin;




3. Axis 설치

http://ws.apache.org/axis/
최신 버전을 다운 받아 (AXIS 1.4) 원하는 곳(C:\AXIS1.4) unzip 한다.




docs : 관련 문서와 API
lib : AXIS 환경 구성을 위한 라이브러리

webapps : JSP/Servlet 컨테이너에 등록하기 위한 웹 어플리케이션




lib : 상위의 lib 와 같은 라이브러리가 담겨 있다. 그래서 별도의 서버를
위한환경설정은 필요없다.
클라이언트의 환경을 위해서는 lib 폴더의 jar를CLASSPATH에
담아주면 된다.







- SOAP XML 메세지이므로 XML 파서를 기본으로 사용하는데 Xerces를 권장한다.
톰캣에는 Xerces 파서가 라이브러리에 포함되어 있어서 톰캣 4.1.x 이상의 버전이면 되고

클라이언트 쪽에서는 CLASSPATH Xerces jar를 등록하는 것으로 환경 준비를 마친다.




4. 환경변수 설정 (윈도우 기준)

set AXIS_HOME=c:\axis
set AXIS_LIB=%AXIS_HOME%\lib
set AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;
%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;

%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;

%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar
set CLASSPATH=%CLASSPATH%;%AXISCLASSPATH%


- 디렉토리 내의 jar 파일과 이름을 비교하여 다른 부분은 자신에게 맞게 수정한다.

▪ AXISCLASSPATH
에서 xml-apis.jar 파일과 xercesImpl.jar xerces.apache.org에서 다운로드 받아야 한다.
xerces-J-bin
을 다운로드해서 압축을 풀면 얻을 수 있다
. ( xerces-J-bin.2.9.0.zip)
2
개 파일을 C:\AXIS1.4\webapps\axis\WEB-INF\lib 디렉토리에 복사한다.





5. Tomcat 과의 연동


▪ C:\AXIS1.4\webapps\axis 를 C:\Tomcat 5.5\webapps 아래에 복사한다.





























6. Validate

▪ Tomcat 을 start 한 뒤에

http://localhost:8080/axis에 연결해보자. (포트 번호는 톰캣 설치시 정했던 번호를 입력한다)

Validation 을 클릭한다.

▪ 필수적이거나 옵션으로 설치할 것들이 나온다.
나의 경우는 옵션으로 설치할 것이 다음과 같이 나왔다.













▪ 위처럼 다운 받을 수 있는 링크가 함께 나오므로 해당 사이트에서 다운받을 수 있다.

필요한 것들을 다운받아
C:\Tomcat 5.5\webapps\axis\WEB_INF\lib\ 에 복사하고 재시도해보자.
필요에 따라 CLASSPATH에 설정할 수도 있다.









7. Test a SOAP EndPoint

http://localhost:8080/axis/services/Version?method=getVersion
▪ 다음과 같이 나오면 정상이다. (내용은 환경에 따라 약간의 차이가 있을 수 있다.)

<?xml version="1.0" encoding="UTF-8" ?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<getVersionResponse
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<getVersionReturn xsi:type="xsd:string">
Apache Axis version: 1.4 Built on Apr 22, 2006 (06:55:48 PDT)
</getVersionReturn>
</getVersionResponse>
</soapenv:Body>
</soapenv:Envelope>





8. Test a JWS EndPoint

http://localhost:8080/axis/EchoHeaders.jws?method=list
▪ 다음과 같이 나오면 정상이다. (내용은 환경에 따라 약간의 차이가 있을 수 있다.)

<?xml version="1.0" encoding="UTF-8" ?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<listResponse
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<listReturn xsi:type="soapenc:Array"
soapenc:arrayType="xsd:string[6]"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<item>accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*</item>
<item>accept-language:en-us</item>
<item>accept-encoding:gzip, deflate</item>
<item>user-agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)</item>
<item>host:localhost:8080</item>
<item>connection:Keep-Alive</item>
</listReturn>
</listResponse>
</soapenv:Body>
</soapenv:Envelope>




9. Deploying your Web Service

▪ Find the deployment descriptor : C:\AXIS1.4\samples\stock\deploy.wsdd

Run the admin client

- C:\AXIS1.4\samples\stock 의 예제로 테스트해본다.
- 커맨드 창에 다음을 실행한다.

java org.apache.axis.client.AdminClient
-lhttp://localhost:8080/axis/services/AdminService deploy.wsdd


- 에러가 난다면 클래스패스를 확인해보자.
- deploy 가 되었는지 확인해보자.
http://localhost:8080/axis/servlet/AxisServlet



















- 그림에 표시된 부분이 추가되었다면 deploy된 것이다.

1. 프로그램 작성 플로우

























▪ 서버 Interface 와 구현 Class 를 작성한다.
▪ 컴파일한다.
▪ WSDL 파일을 생성한다.
(WSDL 파일을 직접 작성한다면 여기까지의 과정은 생략할 수 있다.)
▪ WSDL 파일로부터 deploy.wsdd 파일을 생성한다.
▪ AdminClient를 통해 deploy.wsdd 파일을 참조하여 해당 서버에 웹 서비스를 deploy 하고 server-config.wsdd 파일을 생성, 수정한다.
▪ 생성된 프록시 코드(Client Stub Java Source)를 참조해 서비스 클라이언트를 구현 후 컴파일한다.
▪ 서비스를 호출한다.






cf. Axis API : http://ws.apache.org/axis/java/apiDocs/index.html

2. 서버측 구현


2-1. 서버 Interface와 구현 Class 작성


▪ C:\AxisTest MaxMinIF.java MaxMin.java 를 생성한다.

package com.axis.web;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface MaxMinIF extends Remote {
public int Max(int in0, int in1, int in2, int in3, int in4)
throws RemoteException;
public int Min(int in0, int in1, int in2, int in3, int in4)
throws RemoteException;
}

package com.axis.web;

public class MaxMin implements MaxMinIF {
public int Max(int in0, int in1, int in2, int in3, int in4) {
int[] score={in0, in1, in2, in3, in4};
int max = score[0];

for(int i=1; i<score.length; i++) {
if(score[i] > max) {
max=score[i];
}
}
return max;
}

public int Min(int in0, int in1, int in2, int in3, int in4) {
int[] score={in0, in1, in2, in3, in4};
int min= score[0];

for(int i=1; i<score.length; i++) {
if(score[i] < min) {
min=score[i];
}
}
return min;
}
}




2-2. 컴파일


C:\AxisTest> javac -d . *.java




2-3. 클래스 파일 복사

▪ 생성된 클래스 파일들 복사

: %CATALINA_HOME%\webapps\axis\WEB-INF\classes 에 복사한다. (디렉토리 포함해서)






2-4. WSDL 생성 (Java2WSDL)

C:\AxisTest> java org.apache.axis.wsdl.Java2WSDL

-o MaxMin.wsdl

-l http://localhost:8090/axis/services/MaxMin

-n http://web.axis.com
com.axis.web.MaxMinIF


Java2WSDL Reference 1 2 3

-o 파일경로

WSDL 생성 위치

- URL

client가 접속할URL.
생성될 WSDL <address> 요소의 location 속성값으로 매핑.

- n 네임스페이스

WSDL의 타켓 네임스페이스.
WSDL
에서 targetNamespace가 된다.
프록시 코드 생성시의 패키지 구조로서 참조된다.

-p패키지 네임스페이스

네임스페이스와 네임스페이스 매핑

Target

인터페이스 이름





2-5. 생성된 WSDL 파일

<?xml version="1.0" encoding="UTF-8"?>

<wsdl:definitions targetNamespace="http://web.axis.com"

xmlns:apachesoap="http://xml.apache.org/xml-soap"

xmlns:impl="http://web.axis.com"

xmlns:intf="http://web.axis.com"

xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"

xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"

xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<!--WSDL created by Apache Axis version: 1.4 Built on Apr 22, 2006 (06:55:48 PDT)-->

<wsdl:message name="MinResponse">

<wsdl:part name="MinReturn" type="xsd:int"/>

</wsdl:message>

<wsdl:message name="MinRequest">

<wsdl:part name="in0" type="xsd:int"/>

<wsdl:part name="in1" type="xsd:int"/>

<wsdl:part name="in2" type="xsd:int"/>

<wsdl:part name="in3" type="xsd:int"/>

<wsdl:part name="in4" type="xsd:int"/>

</wsdl:message>

<wsdl:message name="MaxResponse">

<wsdl:part name="MaxReturn" type="xsd:int"/>

</wsdl:message>

<wsdl:message name="MaxRequest">

<wsdl:part name="in0" type="xsd:int"/>

<wsdl:part name="in1" type="xsd:int"/>

<wsdl:part name="in2" type="xsd:int"/>

<wsdl:part name="in3" type="xsd:int"/>

<wsdl:part name="in4" type="xsd:int"/>

</wsdl:message>

<wsdl:portType name="MaxMinIF">

<wsdl:operation name="Max" parameterOrder="in0 in1 in2 in3 in4">

<wsdl:input message="impl:MaxRequest" name="MaxRequest"/>

<wsdl:output message="impl:MaxResponse" name="MaxResponse"/>

</wsdl:operation>

<wsdl:operation name="Min" parameterOrder="in0 in1 in2 in3 in4">

<wsdl:input message="impl:MinRequest" name="MinRequest"/>

<wsdl:output message="impl:MinResponse" name="MinResponse"/>

</wsdl:operation>

</wsdl:portType>

<wsdl:binding name="MaxMinSoapBinding" type="impl:MaxMinIF">

<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="Max">

<wsdlsoap:operation soapAction=""/>

<wsdl:input name="MaxRequest">

<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

namespace="http://web.axis.com" use="encoded"/>

</wsdl:input>

<wsdl:output name="MaxResponse">

<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

namespace="http://web.axis.com" use="encoded"/>

</wsdl:output>

</wsdl:operation>

<wsdl:operation name="Min">

<wsdlsoap:operation soapAction=""/>

<wsdl:input name="MinRequest">

<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

namespace="http://web.axis.com" use="encoded"/>

</wsdl:input>

<wsdl:output name="MinResponse">

<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

namespace="http://web.axis.com" use="encoded"/>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>

<wsdl:service name="MaxMinIFService">

<wsdl:port binding="impl:MaxMinSoapBinding" name="MaxMin">

<wsdlsoap:address location="http://localhost:8090/axis/services/MaxMin"/>

</wsdl:port>

</wsdl:service>

</wsdl:definitions>




2-6. WSDL2Java

- WSDL2Java 클래스를 이용해 Java 파일들과 WSDD 파일들을 생성한다.
-
해당 WSDL 파일이 정의한 웹 서비스에 대한 기술(description) 정보를 근거로

서비스 클라이언트가 서비스측과 상호 운용을 가능케 하는Stub 코드와 Skeleton 코드를 생성하며
동시에 deploy.wsdd undeploy.wsdd 파일을 자동 생성한다.

C:\AxisTest> java org.apache.axis.wsdl.WSDL2Java

-o c:\AxisTest\wsdd\

-d Application

-s
c:\AxisTest\MaxMin.wsdl



WSDL2Java Reference 12 3

-o 디렉토리 경로

wsdd 파일과 클래스파일이 생길 디렉토리

-d scope (deployScope)

운용 범위 ( Application / Request / Session )

-s

wsdd 파일 생성

Target

wsdl 파일 경로


* 참고

-Application : 싱글톤 오브젝트를생성.

(create a singleton shared object to service all requests.)
-
Request : SOAPrequest가 일어날 때마다 새로운 오브젝트를생성.

(create a new object each time a SOAP request comes in for your service.)
-
Session : 서비스에 액세스하는 세션을 이용하는 클라이언트에 대해 새로운 오브젝트를 생성.
(create a new object for each session-enabled client who accesses your service.)





2-7. 생성된 deploy.wsdd 및 Client-side.java


생성된 디렉터리



생성된 deploy.wsdd 수정

: className 의 value 를 아래와 같이 변경한다.

<deployment

xmlns="http://xml.apache.org/axis/wsdd/"

xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

<!-- Services from MaxMinIFService WSDL service -->

<service name="MaxMin" provider="java:RPC" style="rpc" use="encoded">

<parameter name="wsdlTargetNamespace" value="http://web.axis.com"/>

<parameter name="wsdlServiceElement" value="MaxMinIFService"/>

<parameter name="wsdlServicePort" value="MaxMin"/>

<parameter name="className" value="com.axis.web.MaxMin"/>

<parameter name="wsdlPortType" value="MaxMinIF"/>

<parameter name="typeMappingVersion" value="1.2"/>

<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="Application"/>

</service>

</deployment>



cf. deployScope 를 Request로 했을 경우, 생성된 파일

<deployment

xmlns="http://xml.apache.org/axis/wsdd/"

xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

<!-- Services from MaxMinIFService WSDL service -->

<service name="MaxMin" provider="java:RPC" style="rpc" use="encoded">

<parameter name="wsdlTargetNamespace" value="http://web.axis.com"/>

<parameter name="wsdlServiceElement" value="MaxMinIFService"/>

<parameter name="wsdlServicePort" value="MaxMin"/>

<parameter name="className" value="com.axis.web.MaxMin"/>

<parameter name="wsdlPortType" value="MaxMinIF"/>

<parameter name="typeMappingVersion" value="1.2"/>

<operation name="max" qname="operNS:Max" xmlns:operNS="http://web.axis.com"
returnQName="MaxReturn" returnType="rtns:int"
xmlns:rtns="http://www.w3.org/2001/XMLSchema" soapAction="" >

<parameter qname="in0" type="tns:int" xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
<parameter qname="in1" type="tns:int" xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
<parameter qname="in2" type="tns:int" xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
<parameter qname="in3" type="tns:int" xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
<parameter qname="in4" type="tns:int" xmlns:tns="http://www.w3.org/2001/XMLSchema"/>

</operation>

<operation name="min" qname="operNS:Min" xmlns:operNS="http://web.axis.com"
returnQName="MinReturn" returnType="rtns:int"
xmlns:rtns="http://www.w3.org/2001/XMLSchema" soapAction="" >

<parameter qname="in0" type="tns:int" xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
<parameter qname="in1" type="tns:int" xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
<parameter qname="in2" type="tns:int" xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
<parameter qname="in3" type="tns:int" xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
<parameter qname="in4" type="tns:int" xmlns:tns="http://www.w3.org/2001/XMLSchema"/>

</operation>

<parameter name="allowedMethods" value="max min"/>
<parameter name="scope" value="Request"/>

</service>

</deployment>



생성된 Client-side.java 파일들




2-8. Deployment (AdminClient 사용)

▪WSDD 파일은 새로운 Handler, Chain, 서비스를 올리기 위해서 AdminClient 에서 사용하는 설정파일.

AdminClient 클래스는 생성된 배포 디스크립터를 이용해 웹 서비스를 Axis 서버에 배포하는 역할을 한다.
직접 server-config.wsdd (C:\Tomcat 5.5\webapps\axis\WEB-INF\server-config.wsdd) 파일을 수정하는 방법도 있다. 어떠한 서비스도 배포한 적이 없다면 server-config.wsdd 파일은 존재하지 않는다.

C:\AxisTest> java org.apache.axis.client.AdminClient
-l http://localhost:8090/axis/services/AdminService

C:\AxisTest\wsdd\com\axis\web\deploy.wsdd

▪ 확인 : http://localhost:8090/axis/servlet/AxisServlet

(포트 번호는 본인이 Tomcat 설치시 설정했던 번호를 사용한다.)



server-config.wsdd

<ex> C:\Tomcat 5.5\webapps\axis\WEB-INF\server-config.wsdd

...

<service name="MaxMin" provider="java:RPC">
<operation name="min" qname="ns1:min" returnQName="minReturn" returnType="xsd:int" soapAction="" xmlns:ns1="http://web.axis.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<parameter name="in0" type="xsd:int"/>
<parameter name="in1" type="xsd:int"/>
<parameter name="in2" type="xsd:int"/>
<parameter name="in3" type="xsd:int"/>
<parameter name="in4" type="xsd:int"/>
</operation>
<operation name="max" qname="ns2:max" returnQName="maxReturn" returnType="xsd:int" soapAction="" xmlns:ns2="http://web.axis.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<parameter name="in0" type="xsd:int"/>
<parameter name="in1" type="xsd:int"/>
<parameter name="in2" type="xsd:int"/>
<parameter name="in3" type="xsd:int"/>
<parameter name="in4" type="xsd:int"/>
</operation>
<parameter name="allowedMethods" value="min max"/>
<parameter name="typeMappingVersion" value="1.2"/>
<parameter name="wsdlPortType" value="MaxMinIF"/>
<parameter name="scope" value="Application"/>
<parameter name="className" value="com.axis.web.MaxMin"/>
<parameter name="wsdlServicePort" value="MaxMin"/>
<parameter name="wsdlTargetNamespace" value="http://web.axis.com"/>
<parameter name="wsdlServiceElement" value="MaxMinIFService"/>
</service>

...




* 참고 :서비스 undeployment

C:\AxisTest> java org.apache.axis.client.AdminClient
-l http://localhost:8090/axis/services/AdminService

C:\AxisTest\wsdd\com\axis\web\deploy.wsdd

-확인 : http://localhost:8090/axis/servlet/AxisServlet

3. 클라이언트 구현

Axis 프로그램 작성 예제 ② 에서 생성 및웹 서버에 deploy한 서비스에 클라이언트가 접근하는 예제를 만들어본다.

▪ 클라이언트 어플리케이션은 다양한 언어와 방법으로 가능하다.

▪ 고려 사항
- 서비스를 호스팅하고 있는 머신 이름
- 서비스 이름
- 호출하고자 하는 메서드 이름
- 호출하고자 하는 메서드용 매개변수 (매개변수의 수와 데이터 타입)
- SOAPAction 필드에 포함되어야 할 것



3-1. 자바로 구현하기 (Axis client API 사용)

① Service 객체 만들기.
② Service 객체를 사용해 Call 객체 만들기.
③ Call 객체의 속성 설정하기. (메서드 이름, 매개변수)
④ Call 객체의 호출 메서드 사용하기.


MaxMinClient.java

import java.net.MalformedURLException;

import java.net.URL;

import java.rmi.RemoteException;

import javax.xml.namespace.QName;

import javax.xml.rpc.ParameterMode;

import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import org.apache.axis.encoding.XMLType;

public class MaxMinClient

{

public static void main(String[] args)

throws ServiceException, MalformedURLException, RemoteException

{

if (args == null || args.length !=6)

{

System.out.println("Usage: MaxMinClient <max|min> arg1 arg2 arg3 arg4 arg5");

System.exit(1);

}

try

{

String method = args[0];

if (! (method.equals("max") || method.equals("min")))

{

System.out.println

("Usage: MaxMinClient <max|min> arg1 arg2 arg3 arg4 arg5");

System.exit(1);

}

Integer num1 = new Integer(args[1]);

Integer num2 = new Integer(args[2]);

Integer num3 = new Integer(args[3]);

Integer num4 = new Integer(args[4]);

Integer num5 = new Integer(args[5]);

// 원격 웹 서비스에 대한 Service 객체 생성 후, call 객체 생성

Service service = new Service();

Call call = (Call)service.createCall();

// Sets the URL of the target Web Service

call.setTargetEndpointAddress

(new URL("http://localhost:8090/axis/services/MaxMin"));

// 메서드 이름(Hello) 정의

call.setOperationName(method);


// call 객체에 새로운 매개변수 추가. 매개변수 이름은 num1, 유형 스트링의 하나이고,
// input 매개변수라는 것을 정의한다.

call.addParameter("num1", XMLType.XSD_INT, ParameterMode.IN);

call.addParameter("num2", XMLType.XSD_INT, ParameterMode.IN);

call.addParameter("num3", XMLType.XSD_INT, ParameterMode.IN);

call.addParameter("num4", XMLType.XSD_INT, ParameterMode.IN);

call.addParameter("num5", XMLType.XSD_INT, ParameterMode.IN);


//웹서비스에 의해 리턴된 데이터가 int 라는 것을 call 객체에게 알려준다.

call.setReturnType(XMLType.XSD_INT);

//입력 인자값을 가지고 웹 서비스 호출, 결과 얻어온다.

int returnValue = (Integer)call.invoke

(new Object[] {num1, num2, num3, num4, num5});

System.out.println("Got Result: " + returnValue);

}

catch (Exception e)

{

e.printStackTrace();

}

}

}



3-2. 컴파일해서 실행하기

C:\AxisTest> javac MaxMinClient.java

C:\AxisTest> java MaxMinClient max 5 32 39 10 7

Got Result: 39

C:\AxisTest> java MaxMinClient min 5 32 39 10 7

Got Result: 5


<< Axis 프로그램 작성 예제 중 생성된 WSDL 파일 분석 >>

<?xml version="1.0" encoding="UTF-8"?>

<wsdl:definitions targetNamespace="http://web.axis.com"

xmlns:apachesoap="http://xml.apache.org/xml-soap"

xmlns:impl="http://web.axis.com"

xmlns:intf="http://web.axis.com"

xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"

xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"

xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<!--WSDL created by Apache Axis version: 1.4 Built on Apr 22, 2006 (06:55:48 PDT)-->

<wsdl:message name="maxResponse">

<wsdl:part name="maxReturn" type="xsd:int"/>

</wsdl:message>

<wsdl:message name="maxRequest">

<wsdl:part name="in0" type="xsd:int"/>

<wsdl:part name="in1" type="xsd:int"/>

<wsdl:part name="in2" type="xsd:int"/>

<wsdl:part name="in3" type="xsd:int"/>

<wsdl:part name="in4" type="xsd:int"/>

</wsdl:message>

<wsdl:message name="minRequest">

<wsdl:part name="in0" type="xsd:int"/>

<wsdl:part name="in1" type="xsd:int"/>

<wsdl:part name="in2" type="xsd:int"/>

<wsdl:part name="in3" type="xsd:int"/>

<wsdl:part name="in4" type="xsd:int"/>

</wsdl:message>

<wsdl:message name="minResponse">

<wsdl:part name="minReturn" type="xsd:int"/>

</wsdl:message>

<wsdl:portType name="MaxMinIF">

<wsdl:operation name="min" parameterOrder="in0 in1 in2 in3 in4 ">

<wsdl:input message="impl:minRequest" name="minRequest"/>

<wsdl:output message="impl: minResponse" name="minResponse"/>

</wsdl:operation>

<wsdl:operation name="max" parameterOrder="in0 in1 in2 in3 in4 ">

<wsdl:input message="impl:maxRequest" name="maxRequest"/>

<wsdl:output message="impl:maxResponse" name="maxResponse"/>

</wsdl:operation>

</wsdl:portType>

<wsdl:binding name="MaxMinSoapBinding" type="impl:MaxMinIF">

<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="min">

<wsdlsoap:operation soapAction=""/>

<wsdl:input name="minRequest">

<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

namespace="http://web.axis.com" use="encoded"/>

</wsdl:input>

<wsdl:output name="minResponse">

<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

namespace="http://web.axis.com" use="encoded"/>

</wsdl:output>

</wsdl:operation>

<wsdl:operation name="max">

<wsdlsoap:operation soapAction=""/>

<wsdl:input name="maxRequest">

<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

namespace="http://web.axis.com" use="encoded"/>

</wsdl:input>

<wsdl:output name="maxResponse">

<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

namespace="http://web.axis.com" use="encoded"/>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>

<wsdl:service name="MaxMinIFService">

<wsdl:port binding="impl:MaxMinSoapBinding" name="MaxMin">

<wsdlsoap:address location="http://localhost:8090/axis/services/MaxMin"/>

</wsdl:port>

</wsdl:service>

</wsdl:definitions>

웹 서비스의 네임스페이스.

SOAP1.1에 정의된 인스턴스 네임스페이스.

WSDL 네임스페이스.

WSDL SOAP 바인딩에 대한 WSDL 네임스페이스.

XSD에 의해 정의된 스키마 네임스페이스.

웹 서비스 응답시 사용되는 데이터 타입.

리턴 타입.

웹 서비스 호출시 사용되는 데이터 타입.

파라미터 이름, 타입 정의.

웹 서비스의 인터페이스 정의.

웹 서비스가 제공하는 메서드 정보 기술.

실제 메시지 전달에 사용되는 프로토콜과 바인딩한다.

Sopa:binding SOAP binding을 이용한다.

rpc타입으로 요청하며 네트워크 전송 프로토콜은 HTTP.

HTTP Header SOAPAction 정의.

("":HTTP 요청 URI가 SOAP 메시지의 의미를 제공한다)

<portType> 의 각각의 message SOAP 전송에 대한 정의에 매핑한다.

웹 서비스에 대한 URL 정보 기술.

클라이언트가 접속할 URL (Java2WSDL 에서 기술)



** 줄이 좀 밀리는 현상이 있을 경우, 첨부 파일 참조.

MaxMinWSDL.doc

◆deploy.wsdd 파일

<deployment xmlns="http://xml.apache.org/axis/wsdd/"

xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

<!-- Services from HelloIFService WSDL service -->

<service name="Hello" provider="java:RPC" style="rpc" use="encoded">

<parameter name="wsdlTargetNamespace" value="http://hello.webservice"/>

<parameter name="wsdlServiceElement" value="HelloIFService"/>

<parameter name="wsdlServicePort" value="Hello"/>

<parameter name="className" value="webservice.hello.HelloImpl"/>

<parameter name="wsdlPortType" value="HelloIF"/>

<parameter name="typeMappingVersion" value="1.2"/>

<operation name="hello" qname="operNS:hello" xmlns:operNS="http://hello.webservice"
returnQName="helloReturn" returnType="rtns:string"
xmlns:rtns="http://schemas.xmlsoap.org/soap/encoding/"
soapAction="" >

<parameter qname="in0" type="tns:string"
xmlns:tns
="http://schemas.xmlsoap.org/soap/encoding/"/>

</operation>

<parameter name="allowedMethods" value="hello"/>

<parameter name="scope" value="Application"/>

</service>

</deployment>




1. <deployment>

deployment 라는 것을 Axis engine에 알려주는 deployment d0cument 의 root element.



2. <service name="name" provider="provider" >

▪ service 이름 정의.

▪ Axis Service를 Deploys/undeploy 한다.

▪ 웹 서비스를 찾을 수 있는 location을 명기한다.
웹 서비스 컨테이너의 기본 address와 혼합해 웹 서비스의 full URI 를 얻을 수 있다.
ex. 기본 address가 http://localhost:8090/axis/services 라면
서비스의 URI 는http://localhost:8090/axis/services/Hello 이다.

service는 targeted chain 이다.


2-1. provider


"Java:RPC" 는 Java RPC Service 를 가리킨다.
실제 클래스는 aixs.jar 의 org.apache.axis.providers.java.RPCProvider.




3. <parameter name="name" value="value"/>

3-1. name 값

▪ className : 서비스의 인터페이스를 구현한 클래스를 참조한다.
▪ allowedMethods : 클라이언트가 접근할 수 있는 클래스 내의 메서드 정의.
ex. <parameter name="className" value="webservice.hello.HelloImpl"/>
=> 해당 핸들러는 webservice.hello.HelloImpl 에 있다고 정의한다.
▪ scope
ex. <parameter name="scope" value="request"/>
=> 웹서비스에 request가 있을 때마다 새로운 서비스 implementation 인스턴스를 생성한다.
서비스 인스턴스는 request가 끝나면 제거된다.




4. <operation>

▪한 메서드에 대한 인코딩 정보 기술. WSDL의 operation 참조.

▪soapAction : HTTP 헤더의 soapAction 정의.


4-1. <parameter>

▪<operation>의 자식으로 사용되며,파라미터를 설명한다.