<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>LOVEMADE</title>
	<link>http://lovemade.egloos.com</link>
	<description>lovemade</description>
	<language>ko</language>
	<pubDate>Wed, 01 Aug 2007 01:13:45 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>LOVEMADE</title>
		<url>http://md.egloos.com/img/samplelogo2.gif</url>
		<link>http://lovemade.egloos.com</link>
		<width>80</width>
		<height>80</height>
		<description>lovemade</description>
	</image>
  	<item>
		<title><![CDATA[ Web Service 첨부파일 ]]> </title>
		<link>http://lovemade.egloos.com/486364</link>
		<guid>http://lovemade.egloos.com/486364</guid>
		<description>
			<![CDATA[ 
  <p>몇달동안 프로젝트로 인해 정리를 못했다. <br>Web Service 첨부파일에 대한 개괄적인 설명서이다.<br><a href="http://pds3.egloos.com/pds/200707/31/66/webservice_attachment_analysis.doc">webservice_attachment_analysis.doc</a></p>			 ]]> 
		</description>
		<category>WS-FirstGeneration</category>

		<comments>http://lovemade.egloos.com/486364#comments</comments>
		<pubDate>Tue, 31 Jul 2007 05:37:05 GMT</pubDate>
		<dc:creator>lovemade</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Web Service Document/RPC 분석 ]]> </title>
		<link>http://lovemade.egloos.com/118228</link>
		<guid>http://lovemade.egloos.com/118228</guid>
		<description>
			<![CDATA[ 
  글이 조금 길어서 문서로 정리했다. <br />
<br />
<a href="http://pds4.egloos.com/pds/200704/03/66/webservice_document_rpc_analysis.doc">webservice_document_rpc_analysis.doc</a>			 ]]> 
		</description>
		<category>WS-FirstGeneration</category>

		<comments>http://lovemade.egloos.com/118228#comments</comments>
		<pubDate>Tue, 03 Apr 2007 07:46:02 GMT</pubDate>
		<dc:creator>lovemade</dc:creator>
	</item>
	<item>
		<title><![CDATA[ WS Example1 - JMS를 이용한 비동기식 웹 서비스 ]]> </title>
		<link>http://lovemade.egloos.com/46790</link>
		<guid>http://lovemade.egloos.com/46790</guid>
		<description>
			<![CDATA[ 
  제목에서와 같이 이번장은 JMS를 이용한 비동기식 웹 서비스를 구현하는데 JMS및&nbsp;MDB(Message Driven Bean)에 대한 얘기는 하지 않는다.&nbsp;본문을 보고싶다면<br />
<a href="http://www.ibm.com/developerworks/kr/library/ws-tip-altdesign1/">http://www.ibm.com/developerworks/kr/library/ws-tip-altdesign1/</a>&nbsp;를 참조하고&nbsp;나는 부가적인 설명을 하면서 정리해나가도록 하겠다.<br />
<br />
우선 웹서비스에서는 기본적인 4가지의 메세지 교환패턴(MEP)이 있는데 다음과 같다.<br />
<br />
<ol><li><strong>Request -&nbsp;Response</strong> : 가장 흔히 사용되는 형태의 MEP이다. 메세지가 서비스 요청자로부터 서비스 제공자로 전송되는 단순한 형태의 교환이다. 메세지를 받으면 서비스 제공자는 서비스 요청자에게 메세지로 응답한다. 동기, 비동기 방식 모두 쓰인다,</li><li><strong>Fire and Forget : </strong>서비스 요청자에서 서비스 제공자로 메세지를 보내고 응답을 기다리지 않는다. 가장 단순한 비동기 방식이다.</li><li>기억안남.(기대 - 응답인가?)</li><li>기억안남. 책보고 정리하자. (Notification인가?)</li></ol>여하튼,&nbsp;WSDL1.1에서는&nbsp;위의 1,2를 권고하고&nbsp;있다.사실 위의&nbsp;MEP는 새로운 것이 못되고 단지 웹서비스에 적용하기 위해 정리한 것에 불과하다. 이번장에서 사용할 MEP는 비동기방식의 1번방식인&nbsp;요청-응답&nbsp;패턴이다.<br />
<br />
<strong>Figure1.&nbsp;비동기식 쿼리패턴<br />
</strong><br />
<br />
<p><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds5.egloos.com/pds/200702/21/66/e0003966_11020836.gif" width="500" height="152.323580034" onclick="Control.Modal.openDialog(this, event, 'http://pds5.egloos.com/pds/200702/21/66/e0003966_11020836.gif');" /></div><br />
<br />
Figure1의 flow는&nbsp;다음과 같다. <br />
1. 요청자는 서비스 공급자(Service Provider)에게 요청을 제출한다. 서비스 공급자는 메시지를 대기열에 넣고 <br />
&nbsp;&nbsp; (queue) 요청자(Requester)가 요청 상태를 확인할 때 사용할 수 있는 코릴레이션&nbsp;ID를 리턴한다.<br />
&nbsp;&nbsp;&nbsp;여기서&nbsp;코릴레이션 ID는&nbsp;활성화된 즉, 실행중인 서비스에 대한&nbsp;식별키라고 보는 것이 맞을 것이다.<br />
2. 요청 프로세서는 요청을 대기열에서 빼고(dequeue) 이를 처리한다. 일반적으로 이 요청 프로세싱은 장기 실행이<br />
&nbsp;&nbsp; 다. 일단 프로세싱이 완료되면 프로세서(Processor)는 응답 메시지를 대기열에 넣는다.<br />
3. 어떤 지점에서 그 요청에 대한 응답이 준비가 되면 요청자는 서비스 공급자에게 요청한다. 응답이 대기열에 들어가<br />
&nbsp;&nbsp; 면 공급자는 요청자에게 응답을 리턴한다.&nbsp;응답을 사용할 수 없다면 공급자는 이를 요청자에게 보고한다. 요청자는 <br />
&nbsp;&nbsp; 요청을 취소하거나 계속 기다릴 수 있다. 선택된 기간 동안, 응답이 사용 가능하게 될 때까지 공급자는 폴링(polling)<br />
&nbsp;&nbsp; 한다.<br />
<br />
간단하게&nbsp;관련지식을 알았으면 예제로 들어가 보자.<br />
<br />
<strong>[&nbsp;&nbsp;서비스 인터페이스 설계 ]</strong><br />
<strong></strong><br />
<strong>List1. AsyncService.wsdl<br />
<br />
</strong>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;wsdl:definitions <br />
&nbsp; targetNamespace="<a href="http://one.wspattern.developerworks.ibm.com/">http://one.wspattern.developerworks.ibm.com</a>" <br />
&nbsp; xmlns:impl="<a href="http://one.wspattern.developerworks.ibm.com/">http://one.wspattern.developerworks.ibm.com</a>" <br />
&nbsp; xmlns:intf="<a href="http://one.wspattern.developerworks.ibm.com/">http://one.wspattern.developerworks.ibm.com</a>" <br />
&nbsp; xmlns:wsdl="<a href="http://schemas.xmlsoap.org/wsdl/">http://schemas.xmlsoap.org/wsdl/</a>" <br />
&nbsp; xmlns:wsdlsoap="<a href="http://schemas.xmlsoap.org/wsdl/soap/">http://schemas.xmlsoap.org/wsdl/soap/</a>" <br />
&nbsp; xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>"&gt;<br />
<br />
&nbsp; &lt;<strong>wsdl:types</strong>&gt;<br />
&nbsp; &lt;schema <br />
&nbsp;&nbsp;&nbsp; targetNamespace="<a href="http://one.wspattern.developerworks.ibm.com/">http://one.wspattern.developerworks.ibm.com</a>" <br />
&nbsp;&nbsp;&nbsp; xmlns="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>" <br />
&nbsp;&nbsp;&nbsp; xmlns:impl="<a href="http://one.wspattern.developerworks.ibm.com/">http://one.wspattern.developerworks.ibm.com</a>" <br />
&nbsp;&nbsp;&nbsp; xmlns:intf="<a href="http://one.wspattern.developerworks.ibm.com/">http://one.wspattern.developerworks.ibm.com</a>" <br />
&nbsp;&nbsp;&nbsp; xmlns:wsdl="<a href="http://schemas.xmlsoap.org/wsdl/">http://schemas.xmlsoap.org/wsdl/</a>" <br />
&nbsp;&nbsp;&nbsp; xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>"&gt;<br />
&nbsp;&nbsp; &lt;complexType name="ResponseCheck"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;element name="correlationID" nillable="true" type="xsd:string"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br />
&nbsp;&nbsp; &lt;/complexType&gt;<br />
&nbsp;&nbsp; &lt;element name="ResponseCheck" nillable="true" type="impl:ResponseCheck"/&gt;<br />
&nbsp;&nbsp; &lt;complexType name="Response"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;element name="type" type="xsd:int"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;element name="correlationID" nillable="true" type="xsd:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;element name="refresh" type="xsd:int"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;element name="a" nillable="true" type="xsd:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;element name="b" nillable="true" type="xsd:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;element name="c" nillable="true" type="xsd:string"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br />
&nbsp;&nbsp; &lt;/complexType&gt;<br />
&nbsp;&nbsp; &lt;element name="Response" nillable="true" type="impl:Response"/&gt;<br />
&nbsp;&nbsp; &lt;complexType name="Request"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;element name="a" nillable="true" type="xsd:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;element name="b" nillable="true" type="xsd:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;element name="c" nillable="true" type="xsd:string"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br />
&nbsp;&nbsp; &lt;/complexType&gt;<br />
&nbsp;&nbsp; &lt;element name="Request" nillable="true" type="impl:Request"/&gt;<br />
&nbsp; &lt;/schema&gt;<br />
&nbsp;&lt;/<strong>wsdl:types</strong>&gt;<br />
<br />
&nbsp;&nbsp; &lt;wsdl:message name="submitRequestRequest"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:part name="request" type="intf:Request"/&gt;<br />
&nbsp;&nbsp; &lt;/wsdl:message&gt;<br />
&nbsp;&nbsp; &lt;wsdl:message name="checkResponseResponse"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:part name="checkResponseReturn" type="intf:Response"/&gt;<br />
&nbsp;&nbsp; &lt;/wsdl:message&gt;<br />
&nbsp;&nbsp; &lt;wsdl:message name="checkResponseRequest"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:part name="check" type="intf:ResponseCheck"/&gt;<br />
&nbsp;&nbsp; &lt;/wsdl:message&gt;<br />
&nbsp;&nbsp; &lt;wsdl:message name="submitRequestResponse"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:part name="submitRequestReturn" type="intf:Response"/&gt;<br />
&nbsp;&nbsp; &lt;/wsdl:message&gt;<br />
<br />
&nbsp;&nbsp; &lt;<strong>wsdl:portType</strong> name="AsyncService"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;<strong>wsdl:operation</strong> name="checkResponse" parameterOrder="check"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:input&nbsp;message="intf:checkResponseRequest"&nbsp;name="checkResponseRequest"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:output&nbsp;message="intf:checkResponseResponse"&nbsp;name="checkResponseResponse"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/<strong>wsdl:operation</strong>&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;<strong>wsdl:operation</strong> name="submitRequest" parameterOrder="request"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:input&nbsp;message="intf:submitRequestRequest"&nbsp;name="submitRequestRequest"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:output&nbsp;message="intf:submitRequestResponse"&nbsp;name="submitRequestResponse"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/<strong>wsdl:operation</strong>&gt;<br />
&nbsp;&nbsp; &lt;/<strong>wsdl:portType</strong>&gt;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; &lt;<strong>wsdl:binding</strong> name="AsyncServiceSoapBinding" type="intf:AsyncService"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;<strong>wsdlsoap:binding</strong>&nbsp;style="rpc"&nbsp;transport="<a href="http://schemas.xmlsoap.org/soap/http%22/">http://schemas.xmlsoap.org/soap/http"/</a>&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;<strong>wsdl:operation</strong> name="checkResponse"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;<strong>wsdlsoap:operation</strong> soapAction=""/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:input name="checkResponseRequest"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdlsoap:body&nbsp;namespace="<a href="http://one.wspattern.developerworks.ibm.com/">http://one.wspattern.developerworks.ibm.com</a>"&nbsp;use="literal"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsdl:input&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:output name="checkResponseResponse"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdlsoap:body&nbsp;namespace="<a href="http://one.wspattern.developerworks.ibm.com/">http://one.wspattern.developerworks.ibm.com</a>"&nbsp;use="literal"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsdl:output&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/<strong>wsdl:operation</strong>&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;<strong>wsdl:operation</strong> name="submitRequest"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;<strong>wsdlsoap:operation</strong> soapAction=""/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:input name="submitRequestRequest"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdlsoap:body&nbsp;namespace="<a href="http://one.wspattern.developerworks.ibm.com/">http://one.wspattern.developerworks.ibm.com</a>"&nbsp;use="literal"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsdl:input&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:output name="submitRequestResponse"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdlsoap:body&nbsp;namespace="<a href="http://one.wspattern.developerworks.ibm.com/">http://one.wspattern.developerworks.ibm.com</a>"&nbsp;use="literal"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsdl:output&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/<strong>wsdl:operation</strong>&gt;<br />
&nbsp;&nbsp; &lt;/<strong>wsdl:binding</strong>&gt;<br />
<br />
&nbsp;&nbsp; &lt;<strong>wsdl:service</strong> name="AsyncServiceService"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;<strong>wsdl:port</strong> binding="intf:AsyncServiceSoapBinding" name="AsyncService"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdlsoap:address&nbsp;location="<a href="http://localhost:8088/ws/services/AsyncService%22/">http://localhost:8088/ws/services/AsyncService"/</a>&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/<strong>wsdl:port</strong>&gt;<br />
&nbsp;&nbsp; &lt;/<strong>wsdl:service</strong>&gt;<br />
&lt;/wsdl:definitions&gt;<br />
<br />
<strong></strong><br />
List1은 비동기 응답-요청이 적용된 WSDL파일이다. 해석하는 것이 가능한가? 가능하면 OK~~ 계속진행해도 좋다. 가능하지 않다면 기본학습을 하고 읽자.<br />
<br />
으~~ 간만에 이어서 쓰게&nbsp;된다. 회사일이 너무 바빠서....</p><p>위에 적힌 WSDL을&nbsp;가지고 Tmax JEUS에서 실행시켜보기로 하겠다. 우선&nbsp;Tmax Technet에 가서&nbsp;JEUS 5 Fix#18을&nbsp;받은 후 적절한 디렉토리에 설치한다. 또한 JMaker&nbsp;최신 Version을&nbsp;받아서 설치하자. JMaker는 JEUS환경의&nbsp;Eclipse기반 개발툴이다. 손쉽게&nbsp;웹서비스를 구축할 수 있기 때문에 WSDL2JAVA, JAVA2WSDL,&nbsp;java mapping&nbsp;파일 같은 중노동(?)을 하지 않아도 된다......고&nbsp;Tmax에서는 얘기하겠지만 천만의 말씀,&nbsp;만만의 콩떡이다.말그대로 JEUS환경에 적절한 WSDL을 갖고는 손쉽게 구축이 가능한데 위와 같이 비 JEUS 친화적인(?) WSDL로는&nbsp;generate된 java파일과&nbsp;여러 Descriptor파일들의 설정이 맞지 않는다.&nbsp;우선&nbsp;WSDL2JAVA와 같은&nbsp;command로 웹서비스를 생성시켜 직접 Deploy해보는것도&nbsp;학습에는 여러 도움이 된다. 그래야&nbsp;JMaker생성시킨 엉뚱한&nbsp;결과물에도 대처가 가능하다. 어찌됐든 개발의 편의성이 있는것만은 사실이다. 하기 귀찮은 사람은&nbsp;다음 파일을 다운받아서 Deplo시키자.<a href="http://pds5.egloos.com/pds/200703/14/66/wsexer002ear.ear">wsexer002ear.ear</a>&nbsp;이 파일은 JMaker에서 생성시킨파일을 토대로 약간의 수정작업을 거친 ear파일이다. 열어보면 알겠지만 위의 WSDL과 차이점이 있는걸 발견할 수 있다. 여하튼 이런 얘기는 여기까지 하기로 하고 직접 작성한 것이든 위의 파일이든 JEUS&nbsp;웹어드민을 통해 Deploy시키자. <br />
&nbsp; </p>			 ]]> 
		</description>
		<category>WS-FirstGeneration</category>

		<comments>http://lovemade.egloos.com/46790#comments</comments>
		<pubDate>Wed, 21 Feb 2007 14:26:27 GMT</pubDate>
		<dc:creator>lovemade</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 시작하며... ]]> </title>
		<link>http://lovemade.egloos.com/45183</link>
		<guid>http://lovemade.egloos.com/45183</guid>
		<description>
			<![CDATA[ 
  SOA의 구현측면을 봤을때 SOA의&nbsp;핵심 solution이라고 할 수 있는 ESB를 가장 먼저 시장에 내세운 업체가 BEA이다. 국내에서는 TmaxSoft가 심혈을 기울여 개발하고 있기는 한데......<br />
<br />
따라서 BEA가 SOA 선점을 위해 자사 핵심 solution으로 내세우고 있는 AquaLogic을 살펴보는 것도 나름대로의 의미가 있다고 봤기에 관련 학습을 하기로 했다. 나도 BEA Product에 대해서는 무지하기에 나름대로 힘든 여정이 될 것 같기도 한다. 그럼 시작해볼까나? 			 ]]> 
		</description>
		<category>SOA - BEA</category>

		<comments>http://lovemade.egloos.com/45183#comments</comments>
		<pubDate>Tue, 20 Feb 2007 12:02:42 GMT</pubDate>
		<dc:creator>lovemade</dc:creator>
	</item>
	<item>
		<title><![CDATA[ SOAP Part3 - Axis Practice ]]> </title>
		<link>http://lovemade.egloos.com/45155</link>
		<guid>http://lovemade.egloos.com/45155</guid>
		<description>
			<![CDATA[ 
  그럼 실질적으로 한번 구현을 해보자.<br />
SOAP Part2에서 마지막에 첨부시킨 간단한 Hello 웹 서비스를 바탕으로 코드생성법과 해당코드에 대한 간단한 설명과 함께....<br />
web service를 구현하는 방식에는 2가지가 있는데<br />
첫번째는 Java 파일을 coding한 후 해당 Java파일을 바탕으로 WSDL파일을 생성한 후&nbsp;deploy 시키는 방법과<br />
두번째는 WSDL 파일로 Java파일을 생성한 후 deploy시키는 방법이 있다. 첫번째 방법은 서비스제공자를 만들때 많이 쓰이며 두번째 방법은 서비스 요청자를 만들때 많이 쓰인다.<br />
<br />
<br />
<strong>[ JAVA2WSDL ]</strong><br />
<strong></strong><br />
<strong>- STEP1. Java Class생성</strong><br />
<span style="FONT-FAMILY: 돋움"><span style="FONT-SIZE: 100%"><br />
&nbsp;Java파일을 작성한 후 웹 서비스를 생성할때 작성할 Java파일은 Interface Class와 해당 Interface를 Implement한 Java Class파일 2개가 필요하다라고 문서에는 나와있는데 Interface파일만 있어도 가능하다.다음 파일을 작성 및 complie한 후 적절한 디렉토리에 배치한다. 여기서는 <span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA">Tomcat\webapps\axis\WEB-INF\classes 에 배치하고 있다.</span></span></span><br />
<br />
<span style="FONT-SIZE: 100%">List1. Java Interface File </span><br />
<br />
<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA">package webservice.hello;<br />
public <strong>interface</strong> <strong><span style="COLOR: #000099">HelloIF</span></strong> extends <strong>java.rmi.Remote</strong> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public String <strong>hello</strong>(java.lang.String name) throws java.rmi.RemoteException;<br />
}</span><br />
<br />
<p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><br />
</span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><br />
<span style="FONT-FAMILY: 돋움"><strong>- STEP2. 구현된 Class로부터 WSDL생성.<br />
<br />
</strong>Axis에서는 Axis.jar파일에 Java2Wsdl이라는 Class파일을 제공하고 있다. 해당 파일의 역할은 STEP1에서 구현한 2개의 Java Class로부터 WSDL파일을 생성하는 것인데 SOAP Part2에서 제공한 문서를 보면 사용법에 대한 자세한 사항이 나와있으니 참조하고.......다음과 같이 실행하자.</span></span></span></p><p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA">java org.apache.axis.wsdl.Java2WSDL <strong>-o</strong> c:\test\webservice\hello\Hello.wsdl <br />
<strong>-l</strong> http://localhost:8080/axis/services/Hello <strong>-n</strong> http://hello.webservice -u literal <strong>-p</strong>webservice.hello <span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA">http://hello.webservice webservice.hello.HelloIF</span></span></span></span></p><p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">부연해서 설명하자면 -l 옵션은 실제 웹서비스 <strong>URL경로</strong>를 지정하는데 WSDL문서를 받은 서비스요청자에서 실제 호출경로로 사용하므로 정확히 작성해야 한다. -n 옵션은 WSDL 문서에서 사용할 <strong>targetNamespace</strong>의 값을 설정한다. targetNamespace는 해당 문서에서&nbsp;정의된 XML Element들을 식별하기 위한 것이다. 생성이 잘 되었다면 다음과 같을 것이다.<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움"><br />
List2.&nbsp;Hello WSDL<br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;wsdl:definitions <br />
&nbsp;&nbsp;&nbsp; <strong>targetNamespace</strong>="<a href="http://hello.webservice/">http://hello.webservice</a>" <br />
&nbsp;&nbsp;&nbsp; xmlns:apachesoap="<a href="http://xml.apache.org/xml-soap">http://xml.apache.org/xml-soap</a>" <br />
&nbsp;&nbsp;&nbsp; xmlns:impl="<a href="http://hello.webservice/">http://hello.webservice</a>" <br />
&nbsp;&nbsp;&nbsp; xmlns:intf="<a href="http://hello.webservice/">http://hello.webservice</a>" <br />
&nbsp;&nbsp;&nbsp; xmlns:wsdl="<a href="http://schemas.xmlsoap.org/wsdl/">http://schemas.xmlsoap.org/wsdl/</a>"&nbsp; <br />
&nbsp;&nbsp;&nbsp; xmlns:wsdlsoap="<a href="http://schemas.xmlsoap.org/wsdl/soap/">http://schemas.xmlsoap.org/wsdl/soap/</a>" <br />
&nbsp;&nbsp;&nbsp; xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;!--WSDL created by Apache Axis version: 1.4 Built on Apr 22, 2006 (06:55:48 PDT)--&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp; <br />
&nbsp;&nbsp; &lt;wsdl:message name="helloResponse"&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:part name="helloReturn" type="xsd:string"/&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp; &lt;/wsdl:message&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp; &lt;wsdl:message name="helloRequest"&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:part name="in0" type="xsd:string"/&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp; &lt;/wsdl:message&gt;</span></span></span></span></p><p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp; &lt;wsdl:portType <strong>name</strong>="<strong>HelloIF</strong>"&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:operation <strong>name</strong>="<strong>hello</strong>" parameterOrder="in0"&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:input message="impl:helloRequest" name="helloRequest"/&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:output message="impl:helloResponse" name="helloResponse"/&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsdl:operation&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp; &lt;/wsdl:portType&gt;</span></span></span></span></p><p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp; &lt;wsdl:binding name="HelloSoapBinding" type="impl:HelloIF"&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdlsoap:binding style="rpc" transport="<a href="http://schemas.xmlsoap.org/soap/http%22/">http://schemas.xmlsoap.org/soap/http"/</a>&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:operation <strong>name</strong>="<strong>hello</strong>"&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdlsoap:operation soapAction=""/&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:input name="helloRequest"&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdlsoap:body namespace="<a href="http://hello.webservice/">http://hello.webservice</a>" <strong>use</strong>="literal"/&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsdl:input&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:output name="helloResponse"&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdlsoap:body namespace="<a href="http://hello.webservice/">http://hello.webservice</a>" <strong>use</strong>="literal"/&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsdl:output&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsdl:operation&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp; &lt;/wsdl:binding&gt;</span></span></span></span></p><p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp; &lt;wsdl:service name="HelloIFService"&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:port binding="impl:HelloSoapBinding" name="Hello"&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdlsoap:address <strong>location</strong>="<a href="http://localhost:8080/axis/service/Hello%22/">http://localhost:8080/axis/service/Hello"/</a>&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsdl:port&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&nbsp;&nbsp; &lt;/wsdl:service&gt;<br />
</span></span></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">&lt;/wsdl:definitions&gt;<br />
<br />
&nbsp;List1의 WSDL파일을 보면 portType의 name이 HelloIF, operation의 name이 hello인데 HelloIF.java의 class명과 method명과 일치함을 알 수 있다. targetNamespace는 -n 옵션에서 정의한 값이 설정되어 있고 location에는 -l 옵션에서 정의한 값이 설정되어 있다. <strong>Bold</strong>된 단어를 하나씩 비교해가면서 확인해보면 연관성을 알 수 있을 것이다.</p></span></span></span></span><p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><strong><span style="FONT-FAMILY: 돋움"><p></p></span><p></p></strong></span></span><p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움"><strong>- STEP3. WSDD파일 및 Java파일 생성<br />
<br />
</strong>WSDD(Web Service Deployment Descriptor)파일의 용도는 새로운 Handler, Chain 그리고 서비스를 올리기 위해 AdminClient에서 사용하는 설정파일이다. WSDD에 대한 자세한 사항은 해당 사이트를 참조하도록하자. AdminClient는 관리툴로서, Handler나 Chain같은 Axis리소스를 올리거나 내릴때 사용한다.<br />
<a href="http://ws.apache.org/axis/java/reference.html#DeploymentWSDDReference">http://ws.apache.org/axis/java/reference.html#DeploymentWSDDReference</a></span></span></span></span></p><p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA">cmd#&gt; java org.apache.axis.wsdl.WSDL2Java -o d:\ -d Application -s d:\Hello.wsdl<br />
<br />
</p></span></span></span><p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">여기서는 d:\ 디렉토리에 wsdd파일 및 Java파일을 생성했다. 생성된 파일목록은 다음과 같다.</span><br />
<span style="FONT-FAMILY: 돋움">deploy.wsdd<br />
undeploy.wsdd<br />
HelloIF.java<br />
HelloIFService.java<br />
HelloIFServiceLocator.java<br />
HelloSoapBindingImpl.java<br />
HelloSoapBindingStub.java</span></span></p><p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 돋움">java 파일에 대한 자세한 설명은 J2EE Web Service에서 자세히 다루기로 하고<br />
deploy.wsdd와 undeploy.wsdd파일은 말그대로 deploy, undeploy 설정파일이다. HelloIF를 implement한 것이 HelloSoapBindingImpl이므로 해당 파일의 hello 메소드에 관련 로직을 작성하면 된다.</span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"></p><p><br />
<strong><span style="FONT-FAMILY: 돋움">- STEP4. 서비스 deploy<br />
</span></strong></p><br />
<span style="FONT-FAMILY: 돋움"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA">java org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/AdminService deploy.wsdd</span><br />
</span><br />
</span><strong></strong><br />
<strong></strong>서비스 deploy를 완료한 후 <a href="http://localhost:8080/axis/servlet/AxisServlet">http://localhost:8080/axis/servlet/AxisServlet</a>에서&nbsp;해당 서비스에 대한 deploy완료여부를 확인할 수 있다.&nbsp;아니면 <a href="http://localhost:8080/axis/services/Hello?wsdl">http://localhost:8080/axis/services/Hello?wsdl</a> 로 확인가능하다.<br />
<strong></strong><br />
<strong></strong>&nbsp; 			 ]]> 
		</description>
		<category>WS-FirstGeneration</category>

		<comments>http://lovemade.egloos.com/45155#comments</comments>
		<pubDate>Tue, 20 Feb 2007 11:44:36 GMT</pubDate>
		<dc:creator>lovemade</dc:creator>
	</item>
	<item>
		<title><![CDATA[ SOAP Part2 - Axis Overview ]]> </title>
		<link>http://lovemade.egloos.com/44565</link>
		<guid>http://lovemade.egloos.com/44565</guid>
		<description>
			<![CDATA[ 
  SOAP Part1에서는 SOAP에 대한 기본적인 사항을 살펴보았다. 이번장에서는 SOAP처리기라고 알려진 Axis를 살펴보자.<br />
<br />
Axis는 Apache&nbsp;SOAP프로젝트의 산물이다. 지금까지 크게 2가지의 Version(Axis1.x, Axis2.x)이 나와있으며 Axis2에서는 기존 Axis보다 보다 유연한 구조(module이 쉽게 configuration 될 수 있는), &nbsp;성능 향상, 비동기 웹 서비스, hot deploy기능 등을 제공하고 있다.&nbsp;W3C에서는 SOAP를 다음과 같이 정의하고 있다. <br />
<br />
SOAP is a lightweight protocol for exchanging structured information in a decentralized, distributed <br />
environment. It is an <strong><span style="COLOR: #000099">XML based protocol that consists of three parts</span></strong>: <strong><span style="COLOR: #000099">an envelope</span></strong> that defines a <br />
framework for describing what is in a message and how to process it, a set of encoding rules for expressing <br />
instances of application-defined datatypes, and <strong><span style="COLOR: #000099">a convention for representing remote procedure calls</span></strong> and <strong><span style="COLOR: #000099">responses</span></strong>.<br />
<br />
자세히 설명하자면&nbsp;SOAP은&nbsp;분산환경에서 정보의 교환, 즉 웹서비스를 통해 정보를 교환하는 일종의&nbsp;XML 기반의 protocol이며 그 protocol을 정의하고 있는 SOAP&nbsp;message내에는&nbsp;무슨 내용이 있으며&nbsp;어떻게 message를 처리해야하는지와 encoding&nbsp;rule이 정의되어 있다.&nbsp;즉 일종의&nbsp;쌍방(서비스 제공자와 요청자)간의 협약이 맺어져 있어 Axis에서는&nbsp;해당 SOAP&nbsp;message를 처리한다. <br />
<br />
먼저 Apache Axis1의 acchitecture부터 살펴보는것 부터 시작하도록 하자.<br />
<br />
<strong>[ Axis Architecture ]</strong><br />
<strong></strong><br />
Figure1. Axis의 기본 구성.<br />
<br />
요청자&nbsp;&nbsp;&nbsp; --------------------------------&gt;&nbsp;&nbsp; Axis 엔진&nbsp;&nbsp;&lt;--------------------------&gt;&nbsp;웹&nbsp;서비스 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;전송매체(HTTP, SMTP, MQ, etc)<br />
<br />
<br />
Figure1에서 보듯이 Axis는 SOAP&nbsp;message를 HTTP와 같은 전송매체를 통해 받아 웹 서비스에 전달하고 SOAP message로&nbsp;만들어진 응답을 다시 요청자에게 전달하는&nbsp;역할을 하는데 다음고&nbsp;같은 구성요소들이 어우러져 SOAP을 처리한다.<br />
<br />
<ul><li>Axis&nbsp;Engine :&nbsp;SOAP 처리기</li><li>Handler :&nbsp;Axis내부의 기본적인 구성요소로 기본의 백엔드시스템과 Axis를 연결하는 역할을 한다.</li><li>Chain :&nbsp;순차적으로 정렬된&nbsp;Handler들의 모음을 말한다.</li><li>전송매체 : SOAP message 흐름이 Axis에 들어오고 나갈 수 있데 하는 메커니즘이다. </li><li>구축/설정 : Axis를 통해 웹 서비스를 사용할 수 있도록 하는 수단이다.</li><li>Seriaizers / Deserializers :&nbsp;Java와 같은 원래 Datatype을 XML로 변환하는&nbsp;코드/원래 Datatype으로 복원하는 코드이다.</li></ul><p><strong>1. Axis Engine</strong></p><p>Axis Engine은 여러 컴포넌트, 즉&nbsp;Handler를 이용해 SOAP message의 흐름을 운영할 뿐만 아니라 이데 대한 순서를 조정하는 책임을 갖는다. </p><p><strong>2. Handler &amp; Chain</strong></p><p><strong>Chain</strong>은 순서대로 정렬된 코드형태의 컴포넌트 모음을 말하며 Axis는 정해진 순서대로 이들을 순차적으로 기동하게 되는데, 이렇게 순차적으로 기동되는 컴포넌트들을 가리켜 <strong>Handler</strong>라고 한다. 각 <strong>Handler</strong>는 웹 서비스 기동 전 후의&nbsp;message에 대해 추가적인 처리를 수행할 필요가 있을 경우에 사용되는데 logging이나 SOAP Header Block을 처리하기 위해 많이 쓰인다. 그럼 웹 서비스 자체내에서 해당 로직, 즉 바로 앞에서 예로 든 logging이나 SOAP Header block처리 같은,을 처리하지 않고 Handler를 사용해서 처리할까? 이유는 웹 서비스 코드는 비즈니스 관점에서 해당 로직만을 처리함으로써 재사용성이 증대되고 각 Handler는 다른작업에 개의치 않고 각자의 고유역할에만 전념할 수 있으므로 코드가 중복되는 여지를 없앨 수 있으며 Axis설정을 통해 새로운 Handler를 추가하거나 삭제하는 식으로 처리가 가능함으로 인해 웹서비스의 재사용성을 증대시키는 역할을 할 수 있기 때문이다. 만약 Security가&nbsp;&nbsp;적용되어 있는 기존의 웹 서비스에 RealiableMessage를 적용해야 한다는 요구사항이 발생한다면 기존의 로직을 수정하지 않고 간단하게 RealiableMessage를 처리할 수 있는 Handler를 제작한 후&nbsp;Axis설정만으로 해당 Handler를 SOAP message처리에 참여시킴으로써&nbsp; 비즈니스 로직을 처리하는 웹 서비스, 보안관련사항을 처리하는 Handler, ReliableMessage를 처리하는 Handler를 각각의 역할만 하도록 제한시킬 수 있는 것이다.</p><p>그럼 웹 서비스에 대해 정의되어 있는 Handler의 Chain이 모든 요청에 대해 기동할까? 답은 그렇지 않다. 아니 설정을 통해 모든 요청에 대해 기동할 수도 있고 특정부분만이 기동할 수도 있다. 다음 그림을 보도록 하자</p><p><strong>Figure1. Axis Server Architecture.</strong></p><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds4.egloos.com/pds/200702/20/66/e0003966_02023316.jpg" width="500" height="234.219269103" onclick="Control.Modal.openDialog(this, event, 'http://pds4.egloos.com/pds/200702/20/66/e0003966_02023316.jpg');" /></div><br />
<strong></strong><p>Figure1은 Axis의 Server단의 Architecture를 도식으로 표현한 것이다. (Apache Axis&nbsp;도식 참조) 작은 cylinder는 handler, 작은 cylinder를 감싸는 큰&nbsp;cylinder는 chain을 나타낸다.<br />
<br />
Axis Engine내에&nbsp;크게 3부분(Transport, Global, Service)으로 구성되어 있는데, <strong>Transport</strong>는 <strong>전송매체지정체인</strong>으로 특정 전송매체(HTTP, SMTP, MIME...)에 따라 압축 또는 인증 등의 일을 처리하기 위해 정의될 수 있으며,&nbsp;<strong>Global</strong>은 <strong>전역체인</strong>으로 웹 서비스의 종류에 상관없이 동일한 처리를 핑요로 하는 경우에 정의된다. 또한 <strong>Service</strong>는 <strong>특정웹서비스용체인</strong>으로 말그대로 특정 웹서비스만을 위한 Chain을&nbsp;필요로 하는 경우에&nbsp;정의된다. 서비스내의 <strong>Provider</strong>는 일종의 Handler인데 backend의 실질적인 웹서비스와 Axis를 잇는 중계자 역할을 한다. 즉, SOAP message를 해석해서 필요로 하는 웹 서비스와 관련된 코드 부분을 찾아내어 해당 웹서비스를 기동시키는 역할을 한다. 예를 들어,&nbsp; XML을 자바객체로 변환한 후 기동시킬 적정한 자바 메소드를 찾아 기동시키고, 가능한 응답 데이터를 XML 형태로 재변환하여 응답 SOAP message에 넣는 일을 한다.&nbsp;&nbsp;Transport Listener는 request의 특정 protocol의 data를 받는 최초 접점으로 해당 protocol-specific data를 <strong>Message Object</strong>로 package한 후 Message Object와 각종 properties를&nbsp;MessageContext에 설정한 후 MessageContext를 Axis에 전달하는 역할을 한다. 장황해서 좀 그런데 다시 정리하면...</p><p>&nbsp;1). TransportListener는 요청에 대해 MessageContext Object를 Axis에 전달한다.</p><p>&nbsp;2). 전송매체지정체인이 정의되어 있으면 Chain에 속한 Handler가 기동된다.</p><p>&nbsp;3). 전역체인이 정의되어 있으면 해당 Chain이 기동된다.</p><p>&nbsp;4). 특정웹서비스용체인이 있으면 해당 Chain이 기동된다. </p><p>&nbsp;5). 응답도 이와 비슷한 과정을 거친다........</p><p>&nbsp;</p><p><strong>3. Transport</strong></p><p>SOAP message를 전달하기 위해 전송매체가 HTTP만이 쓰이는 것은 아니다. SMTP, FTP 등이 사용될 수 있는데 <strong>실질적으로&nbsp;Axis자체는 다중 전송매체를 지원하지는 않는다</strong>. 무슨말인고 하니, Axis는 들어오는 메세지로 Axis Engine이 호출되어 다시 응답메세지로 보내는 단순한 코드모음 이상, 이하도 아니며 또한 SOAP message를 기다리는 <strong>TransportListener는 Axis Engine의 일부가 아니다</strong>. Axis에서는 AxisServlet이라는 <strong>TransportListener</strong>를 제공하고 만약 특별한 처리가 필요하다면 전송매체에 맞는 TransportListener를 새로 작성해야만 한다. 따라서 Axis Engine은 TransportListener에 의해 메커니즘이 관리되는데 <strong>Axis Engine</strong>의 기동(요청마다 Engine이 생성되느냐 혹은 하나의 instance를 공유하느냐), message의 <strong>Axis Engine</strong>으로의 전달, 어떠한 전송매체가 사용되는지를 Axis Engine에게 통보함으로써 Axis는 설정된 <strong>특정전송매체지정체인</strong>을 기동하게 된다.</p><p>지금까지 Axis Server Architecture를 간략하게 살펴봤는데 Client Architecture는 Provider대신에 Sender라는 전송매체전송자라는 Handler가 대체되고 Transport, Global, Service가 반대로 실행된다고 생각하면 된다. Figure2를 참조하고 자세한 사항은 Apache Axis관련 사이트를 참조하자.</p><p><strong>Figure2. Axis Client Architecture</strong></p><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds5.egloos.com/pds/200702/20/66/e0003966_03025045.jpg" width="500" height="234.219269103" onclick="Control.Modal.openDialog(this, event, 'http://pds5.egloos.com/pds/200702/20/66/e0003966_03025045.jpg');" /></div><br />
<p>지금까지 Axis의 기본 Architecture에 대해 살펴보았는데 처음보면 이게 무엇인지 감을 잡기 힘들다.(나만 그런가?ㅡ.ㅡ) 우선은 이것만 기억하자. Axis는 SOAP message처리 Engine으로 Handler라는 기본 component 들에 의해 message처리가 이루어진다. (너무 간단한가? 내 실력이 요것밖에 안된다. 아직...ㅜ.ㅜ)&nbsp;</p><p><strong>[ Axis Installation ]</strong></p><p>여기다&nbsp;정리하려고 했는데 좋은 문서가 벌써 있는것 같아 해당 문서사용.<a href="http://pds5.egloos.com/pds/200702/20/66/apache_axis.doc">apache_axis.doc</a></p><p>문서를 보면서 그냥 한번 따라해보면 좋고, 아님 말고, 그래도 한번 해보는 것이 둏지 아니할런지...</p><p>&nbsp;</p><p><strong></strong>&nbsp;</p><p><br />
&nbsp; </p>			 ]]> 
		</description>
		<category>WS-FirstGeneration</category>

		<comments>http://lovemade.egloos.com/44565#comments</comments>
		<pubDate>Tue, 20 Feb 2007 04:28:57 GMT</pubDate>
		<dc:creator>lovemade</dc:creator>
	</item>
	<item>
		<title><![CDATA[ WS-Coordinator & WS-Transaction Scenario Part2 ]]> </title>
		<link>http://lovemade.egloos.com/37195</link>
		<guid>http://lovemade.egloos.com/37195</guid>
		<description>
			<![CDATA[ 
  일반적으로 atomic transaction이 실행되고 있는 동안에는 해당 activity에 관련된 resources는 lock이 걸리고 transaction이 끝날때까지 suspension상태를 유지한다. 이러한 유형의 transaction은 activity의 수행시간이 짧아대체적으로 system resources를 낭비하지 않는다. 근데 수시간에서 수일이 걸리는 transaction을 처리하려면 어떻게 해야될까? 해당 transaction이 complete될때까지 resources lock을 걸어야 하나? 그럼 당근 system resources 를 낭비하게되 효율성이 떨어지게 된다. 그래서 이와같은 문제점을 해결하기 위해 도입된 spec이 WS-BusinessActivity이다. 해당 spec은 long-running transactions 동안 resources에 lock을 걸지 않고 context정보를 유지함으로써 이와 같은 문제점을 해결한다. 이러한 점으로 인해&nbsp;atomic transaction coordinator와 business activity coordinator가 activity failure를 다루는 방식이 다른데 atomic transaction은 ACID rollback 메커니즘을 따른다면 business activity transaction은 compensation process라는 메커니즘을 따른다. compensation은 자체 process activity를 도입함으로써 일반적인 exception handling과는 다른 방식을 사용한다. 다음은 business activity transaction에서 사용하는 두가지 유형의 protocol이다.<br />
<br />
<br />
<ul><li>BusinessAgreement</li><li>BusinessAgreementWithComplete</li></ul>그럼 Senario를 보면서 확인해 보도록 하자.<br />
<br />
<strong>Figure1. The Business Transactions scenario<br />
<br />
<p><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds4.egloos.com/pds/200702/14/66/e0003966_050223100.jpg" width="500" height="352.430555556" onclick="Control.Modal.openDialog(this, event, 'http://pds4.egloos.com/pds/200702/14/66/e0003966_050223100.jpg');" /></div><br />
</strong><br />
<br />
<strong>[ Activation ]</strong><br />
</p><p><strong>[Step1]. application은 WS-Coordination framework의 activation service를 사용해서 <span style="COLOR: #3333ff">business activity</span>를 생성한다. </strong><br />
</p><p><strong>List1. Application creates a business activity</strong></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Lucida Console">&lt;soapenv&gt;<br />
&lt;soapbody&gt;<br />
&nbsp; &lt;wscoor:CreateCoordinationContext&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ActivationService&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://myActiviationService <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Address&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/ActiviationService&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;RequesterReference&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://myApplicationProgram<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Address&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/RequesterReference&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;CoordinationType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://xml-soap.org/2002/xx/BusinessActivity<br />
&nbsp;&nbsp;&nbsp; &lt;/CoordinationType&gt;<br />
&nbsp;&nbsp; &lt;/wscoor:CreateCoordinationContext&gt;<br />
&lt;/soapbody&gt;<br />
&lt;soapenv&gt;<br />
</span><br />
</p><p><strong>[Step2]. Coordinator는 CoordinationContext를 return한다.</strong></p><p>CoordinationContext는 하위의 atomic transaction과의 관계를 정의하기의해 사용된다.</p><p><strong>List2. Coordination Service returns a CoordinationContext</strong> </p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Lucida Console">&lt;soapenv&gt;<br />
&lt;soapbody&gt;<br />
&nbsp;&nbsp; &lt;wscoor:CreateCoordinationContextResponse&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;RequesterReference&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://myApplicationProgram<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Address&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/RequesterReference&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;CoordinationContext&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Identifier&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://myCoordinationService/ts/activity1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Identifier&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;CoordinationType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://xml-soap.org/2002/xx/BusinessActivity<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/CoordinationType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RegistrationService&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://myCoordinationService/tm/myRegistrationService<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/RegistrationService&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/CoordinationContext&gt;<br />
&nbsp; &lt;/wscoor:CreateCoordinationContextResponse&gt;<br />
&lt;/soapbody&gt;<br />
&lt;/soapenv&gt;<br />
</span></p><p><strong>[Step3]. Application은 <span style="COLOR: #3333ff">activity</span>를 생성한다. 여기서의 activity는 Step1의 business activity를 구성하나는 하위 activity이다. 즉 parent와 child의 관계.<br />
</strong></p><p><strong>List3. Application sends CreateCoordinationContext</strong></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Lucida Console">&lt;soapenv&gt;<br />
&lt;soapbody&gt;<br />
&nbsp; &lt;wscoor:CreateCoordinationContext&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ActivationService&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://myActiviationService <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Address&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/ActiviationService&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;RequesterReference&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://myApplicationProgram<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Address&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/RequesterReference&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;CoordinationType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://xml-soap.org/2002/xx/BusinessActivity<br />
&nbsp;&nbsp;&nbsp; &lt;/CoordinationType&gt;<br />
&nbsp;&nbsp; &lt;/wscoor:CreateCoordinationContext&gt;<br />
&nbsp;&nbsp; <span style="COLOR: #3333ff">&lt;CurrentContext&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Identifier&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://myCoordinationService/ts/activity1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Identifier&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;CoordinationType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://xml-soap.org/2002/xx/BusinessActivity<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/CoordinationType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RegistrationService&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://myCoordinationService/tm/myRegistrationService<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/RegistrationService&gt;<br />
&nbsp;&nbsp; &lt;/CurrentContext&gt;<br />
</span>&nbsp;&nbsp; <em><span style="COLOR: #3333ff">&lt;myActivationService:<strong>NestedCreate</strong>/&gt;<br />
</span></em>&lt;/soapbody&gt;<br />
&lt;soapenv&gt;<br />
</span></p><p>Application은 business task를 위해 activity를 생성하는데 마찬가지로 Activation Service를 사용한다. 또한 List3에서 보면 알겠지만 해당 business task가 전체적인 business activity와 관련이 있다는 것을 나타내기 위해 NestedCreate라는 option을 정의하고 있다. </p><p><strong>[Step 4].Coordinator는 CoordinationContext를 return한다. </strong></p><p><strong>List4. Coordination Service returns a CoordinationContext</strong></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Lucida Console">&lt;soapenv&gt;<br />
&lt;soapbody&gt;<br />
&nbsp;&nbsp; &lt;wscoor:CreateCoordinationContextResponse&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;RequesterReference&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://myApplicationProgram<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Address&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/RequesterReference&gt;<br />
&nbsp;&nbsp;&nbsp; <span style="COLOR: #3333ff">&lt;CoordinationContext&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Identifier&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://myCoordinationService/ts/activity2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Identifier&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;CoordinationType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://xml-soap.org/2002/xx/BusinessActivity<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/CoordinationType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RegistrationService&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://myCoordinationService/tm/myRegistrationService<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/RegistrationService&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/CoordinationContext&gt;<br />
</span>&nbsp; &lt;/wscoor:CreateCoordinationContextResponse&gt;<br />
&lt;/soapbody&gt;<br />
&lt;/soapenv&gt;<br />
</span></p><p>여기서 return된 CoordinationContext는 Step2에서 return 된 Context와는 다른 Context이다. 다시 말하자면 Step2에서 return된 Context는 전체적인 long-running business activity를 관리하기 위한 Context이고 Step4에서 return된 Context는 long-running business activity의 부분을 이루는 atomic transaction activity이다.&nbsp;여기서 atomic transaction activity를 <strong>business task</strong>라 명하고 있고&nbsp;long-running business activity는 <strong>business activity</strong>라 명하고 있다는 점을 잊지말자. activity의 하위가 task라고 생각하면 될 것 같다.</p><p><strong>[STEP 5]. application은 web service에서 제공하는 operation을 수행한다.</strong></p><p><strong>List5. SOAP Header with CoordinationContext </strong></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Lucida Console">URL:http//myhost/myBank<br />
&lt;soapenv&gt;<br />
<span style="COLOR: #3333ff">&lt;soapheader&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;wscoor:CoordinationContext<br />
&nbsp;&nbsp;&nbsp; &lt;sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;CoordinationContext-Parent(Activity1)/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;CoordinationContext-Child (Activity2/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;&nbsp;&nbsp; <br />
&lt;/soapheader&gt;<br />
</span>&lt;soapbody&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;debitAccount ... /&gt;<br />
&lt;/soapbody&gt;<br />
&lt;/soapenv&gt;<br />
</span><br />
XML message를 보면 알겠지만 SOAP Header에 CoordinationContext를 포함하고 있다. activity scope내의 taks는 계층적인 구조를 띄는데 이러한 activity와 task의 관계정보는 Web Service가 invoke될때 operation에 포함된다. </p><p><strong>[ Registration ]</strong></p><p><strong>[STEP6] Business task registers with the Business activity</strong></p><p>business task가 atomic transaction의&nbsp;메커니즘으로 수행되어 지고 난 후 &nbsp;(Part1 참조) 해당 business task는 business activity에 등록된다. 또한 전체적인 business activity가 fail되면 Registration은 관련 Compensation Process를 invoke한다.</p><p><strong>List6. A compensation registration message when business activity fails<br />
</strong><span style="FONT-SIZE: 100%; FONT-FAMILY: Lucida Console"></span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Lucida Console">&lt;soapenv&gt;<br />
&lt;soapbody&gt;<br />
&nbsp; &lt;wscoor:Register&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;RegistrationService&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;http://myRegistrationService&lt;/Address&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/RegistrationService&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;RequesterReference&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;http://myBusinessTask&lt;/Address&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/RequesterReference&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ProtocolIdentifier&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://xml-soap.org/2002/xx/BusinessActivity/2PC<br />
&nbsp;&nbsp;&nbsp; &lt;/ProtocolIdentifier&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ParticipantProtocolService&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;http://myResource&lt;/Address&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/ParticipantProtocolService&gt;<br />
&nbsp; &lt;/wscoor:Register&gt;<br />
&lt;/soapbody&gt;<br />
&lt;/soapenv&gt;<br />
<p></p></span><p></p><p>[STEP7] Registration Service는 등록요청에 대한 응답으로 <span style="FONT-FAMILY: Courier New">bpCoordinatorRef를 return한다.</span></p><p><strong>List7. Registration services sends a bpCoordinatorRef reference<br />
</strong></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Lucida Console">&lt;soapenv&gt;<br />
&lt;soapbody&gt;<br />
&nbsp; &lt;wscoor:RegisterResponse&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;RequesterReference&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://myBusinessTask<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/RequesterReference&gt;<br />
&lt;CoordinatorProtocolService&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;<br />
&nbsp; http://myCoordinator<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Address&gt; <br />
&lt;/CoordinatorProtocolService&gt;<br />
&nbsp; &lt;/wscoor:RegisterResponse&gt;<br />
&lt;/soapbody&gt;<br />
&lt;/soapenv&gt;<br />
</span></p><p><strong><span style="FONT-SIZE: 100%">[ </span></strong><a name="3.3"><font size="+0"><span style="FONT-SIZE: 100%; FONT-FAMILY: Arial"><strong>Completion/Coordination</strong></span></font></a><strong><span style="FONT-SIZE: 100%">&nbsp;]</span></strong><br />
</p><p><strong>[STEP8] business activity는 어느 business task가 완료되었는지를 점검하기 위해 <span style="COLOR: #3333ff"><em>Complete </em></span><span style="COLOR: #000000">Message를 보낸다</span></strong></p><p><a name="listing19"><b>Listing 8. Business activity issues a Complete message</b></a><br />
<span style="FONT-SIZE: 100%; FONT-FAMILY: Lucida Console">&lt;soapenv&gt;<br />
&lt;soapheader&gt;<br />
&nbsp;&nbsp; &lt;ParticipantProtocolService&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;<br />
&nbsp; http://myResource<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Address&gt; <br />
&nbsp;&nbsp; &lt;/ParticipantProtocolService&gt;<br />
&lt;/soapheader&gt;<br />
&nbsp;&nbsp; &lt;wstx:Notification&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type=BusinessActivity<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; portType=BusinessAgreementwithComplete<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message=<span style="COLOR: #3333ff">Complete</span><br />
&nbsp; &lt;/wstx:Notification&gt;<br />
&lt;/soapbody&gt;<br />
&lt;/soapenv&gt;<br />
</span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Lucida Console"><span style="FONT-FAMILY: 돋움">[STEP9] business task는&nbsp;해당 task가 성공적으로 완료되었으면&nbsp;<strong><span style="COLOR: #3333ff">Completed</span></strong> message를 보낸다.</span></span></p><p><span style="FONT-FAMILY: Lucida Console"><span style="FONT-FAMILY: 돋움"><a name="listing20"><b><span style="FONT-SIZE: 100%">Listing 9. Business Task sends the Completed message</span></b></a><br />
</span><span style="FONT-SIZE: 100%; FONT-FAMILY: Lucida Console">&lt;soapenv&gt;<br />
&lt;soapheader&gt;<br />
&nbsp;&nbsp; &lt;CoordinatorProtocolService&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;Address&gt;<br />
&nbsp; http://myCoordinator<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Address&gt; <br />
&nbsp;&nbsp; &lt;/CoordinatorProtocolService&gt;<br />
&lt;/soapheader&gt;<br />
&nbsp;&nbsp; &lt;wstx:Notification&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type=BusinessActivity<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; portType=BusinessAgreementwithComplete<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message=Completed<br />
&nbsp; &lt;/wstx:Notification&gt;<br />
&lt;/soapbody&gt;<br />
&lt;/soapenv&gt;<br />
</span><p></p></span><p></p><p>참고서적 <br />
</p><p>Service-Oriented Architecture : A Field Guide to Integrating XML and Web Services by Thomas Erl<br />
Service-Oriented Architecture : Concepts, Technology and Design by Thomas Erl</p><p>Web Services Platform Architecture: SOAP, WSDL, WS-Policy, WS-Addressing, WS-BPEL, WS-Reliable Messaging, and More&nbsp;&nbsp;&nbsp;by <a class="v1" target="_new">Sanjiva&nbsp;Weerawarana</a>, <a class="v1" target="_new">Francisco&nbsp;Curbera</a>, <a class="v1" target="_new">Frank&nbsp;Leymann</a>,&nbsp;<a class="v1" target="_new">Tony&nbsp;Storey</a>,&nbsp;<a class="v1" target="_new">Donald&nbsp;F.&nbsp;Ferguson</a><br />
&nbsp; </p>			 ]]> 
		</description>
		<category>WS-SecondGeneration</category>

		<comments>http://lovemade.egloos.com/37195#comments</comments>
		<pubDate>Wed, 14 Feb 2007 08:18:32 GMT</pubDate>
		<dc:creator>lovemade</dc:creator>
	</item>
	<item>
		<title><![CDATA[ No Surprise ]]> </title>
		<link>http://lovemade.egloos.com/36020</link>
		<guid>http://lovemade.egloos.com/36020</guid>
		<description>
			<![CDATA[ 
  <p><strong><span style="COLOR: #9b18c1"><embed style="WIDTH: 297px; HEIGHT: 47px" src="http://pds5.egloos.com/pds/200702/13/66/10_no_surprises-eyelovesyou.wma" autostart="0"></embed></span></strong></p><p><strong><span style="COLOR: #9b18c1">Radio Head - No Surprise</span></strong></p><p><strong><span style="COLOR: #993366">A heart that's full up like a landfill, <br />
a job that slowly kills you,<br />
bruises that won't heal. <br />
You look so tired-unhappy, <br />
bring down the government, <br />
they don't, they don't speak for us.<br />
I'll take a quiet life,<br />
a handshake of carbon monoxide, </span></strong></p><p><strong><span style="COLOR: #993366">with no alarms and no surprises, <br />
no alarms and no surprises, <br />
no alarms and no surprises, <br />
Silent silence. </span></strong></p><p><strong><span style="COLOR: #993366">This is my final fit,<br />
my final bellyache, </span></strong></p><p><strong><span style="COLOR: #993366">with no alarms and no surprises,<br />
</span></strong></p><p><strong><span style="COLOR: #993366">no alarms and no surprises,<br />
no alarms and no surprises please. </span></strong></p><p><strong><span style="COLOR: #993366">Such a pretty house<br />
and such a pretty garden. </span></strong></p><p><strong><span style="COLOR: #993366">No alarms and no surprises, <br />
no alarms and no surprises, <br />
no alarms and no surprises please. </span></strong></p><p><span style="COLOR: #000000">언제부터인지 모르겠다. </span></p><p><span style="COLOR: #000000">감성이 필요할때................. </span></p><p><span style="COLOR: #000000">절대적으로 감성이 필요할때................... </span></p><p><span style="COLOR: #000000">누군가에게 의지하고 싶을때 듣게 되었다.</span></p><p>나른해지고 </p><p>미소가 나오고 </p><p>아련한 옛 추억의 행복했던 시절들이 </p><p>가볍게 가슴 한 켠을 휩쓸고 간다. </p><p>가는 것이 아쉬워 </p><p>반복해서 듣다보면 모하나 싶기도 하지만서도 </p><p>너무나 따뜻한 기분에 취해 ..........</p><p>by lovemade 2006-02-13 21:41</p><p>&nbsp;</p><p>&nbsp;</p>			 ]]> 
		</description>
		<category>재잘재잘</category>

		<comments>http://lovemade.egloos.com/36020#comments</comments>
		<pubDate>Tue, 13 Feb 2007 12:41:40 GMT</pubDate>
		<dc:creator>lovemade</dc:creator>
	</item>
	<item>
		<title><![CDATA[ WSDL Part1 ]]> </title>
		<link>http://lovemade.egloos.com/35996</link>
		<guid>http://lovemade.egloos.com/35996</guid>
		<description>
			<![CDATA[ 
  <span style="FONT-FAMILY: 돋움">저번시간에는 SOAP에 대한 기본적인 것에 대해 알아보았다. 보다 자세한 얘기는 SOAP message처리 Engine인 Axis를 다루면서 진행하기로 하고 이번절은 WSDL이다.<br />
<br />
WSDL은 <strong>W</strong>eb <strong>S</strong>ervice <strong>D</strong>escription <strong>L</strong>anguage의 약자로 서비스에 대한 자체설명을 내재하고 있는 XML Document이다. 예를 들어 일반적으로 타 시스템의 Process를 call하려면 call하려는 입장에서는 process가 구동되는 시스템에 대한 위치정보와 process명 input parameter, output parameter등에 대한 정보가 필요하다. 마찬가지로 WSDL은 process가 구동되기 위한 서비스 위치정보와 interface, method, input, output parameter등에 정보를 설명하고 있는 정형화된 XML Document이다. 아울러 protocol 정보까지..<br />
<br />
WSDL은 정형화된 XML Document라고 했다. 따라서 해당 spec이 어떠한 XML 형식으로 서비스를 설명하고 있는지를 알려면 그 어떠한에 대한 기본적인 학습이 SOAP과 마찬가지로 필요하다. <br />
<br />
다음은 WSDL 의 한예이다. 그냥 가볍게 <strong>Bold</strong>된 단어만 보도록 하자<br />
<br />
List1. WSDL Example. <br />
<br />
<br />
<br />
</span><pre><span style="FONT-FAMILY: 돋움">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;<strong>definitions</strong> name="BookQuoteWS"<br />
&nbsp;targetNamespace="</span><a href="http://www.monson-haefel.com/jwsbook/BookQuote"><span style="FONT-FAMILY: 돋움">http://www.Monson-Haefel.com/jwsbook/BookQuote</span></a><span style="FONT-FAMILY: 돋움">"<br />
&nbsp;xmlns:mh="</span><a href="http://www.monson-haefel.com/jwsbook/BookQuote"><span style="FONT-FAMILY: 돋움">http://www.Monson-Haefel.com/jwsbook/BookQuote</span></a><span style="FONT-FAMILY: 돋움">"<br />
&nbsp;xmlns:soapbind="</span><a href="http://schemas.xmlsoap.org/wsdl/soap/"><span style="FONT-FAMILY: 돋움">http://schemas.xmlsoap.org/wsdl/soap/</span></a><span style="FONT-FAMILY: 돋움">"<br />
&nbsp;xmlns:xsd="</span><a href="http://www.w3.org/2001/XMLSchema"><span style="FONT-FAMILY: 돋움">http://www.w3.org/2001/XMLSchema</span></a><span style="FONT-FAMILY: 돋움">"<br />
&nbsp;xmlns="</span><a href="http://schemas.xmlsoap.org/wsdl/"><span style="FONT-FAMILY: 돋움">http://schemas.xmlsoap.org/wsdl/</span></a><span style="FONT-FAMILY: 돋움">"&gt;</span></pre><pre><span style="FONT-FAMILY: 돋움">&nbsp; &lt;!-- message elements describe the input and output parameters --&gt;<br />
&nbsp; &lt;<strong>message</strong> name="GetBookPriceRequest"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;part name="isbn" type="xsd:string" /&gt;<br />
&nbsp; &lt;/<strong>message</strong>&gt;<br />
&nbsp; &lt;<strong>message</strong> name="GetBookPriceResponse"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;part name="price" type="xsd:float" /&gt;<br />
&nbsp; &lt;/<strong>message</strong>&gt;</span></pre><pre><span style="FONT-FAMILY: 돋움">&nbsp; &lt;!-- portType element describes the abstract interface of a Web service --&gt;<br />
&nbsp; &lt;<strong>portType</strong> name="BookQuote"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;<strong>operation</strong> name="getBookPrice"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input name="isbn" message="mh:GetBookPriceRequest"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;output name="price" message="mh:GetBookPriceResponse"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/<strong>operation</strong>&gt;<br />
&nbsp; &lt;/<strong>portType</strong>&gt;</span></pre><pre><span style="FONT-FAMILY: 돋움">&nbsp; &lt;!-- binding tells us which protocols and encoding styles are used --&gt;<br />
&nbsp; &lt;<strong>binding</strong> name="BookPrice_Binding" type="mh:BookQuote"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;soapbind:binding style="rpc"<br />
&nbsp;&nbsp;&nbsp;&nbsp; transport="</span><a href="http://schemas.xmlsoap.org/soap/http%22/"><span style="FONT-FAMILY: 돋움">http://schemas.xmlsoap.org/soap/http"/</span></a><span style="FONT-FAMILY: 돋움">&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;<strong>operation</strong> name="getBookPrice"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;soapbind:operation style="rpc"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; soapAction=<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "</span><a href="http://www.monson-haefel.com/jwsbook/BookQuote/GetBookPrice%22/"><span style="FONT-FAMILY: 돋움">http://www.Monson-Haefel.com/jwsbook/BookQuote/GetBookPrice"/</span></a><span style="FONT-FAMILY: 돋움">&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;soapbind:body use="literal"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace="</span><a href="http://www.monson-haefel.com/jwsbook/BookQuote"><span style="FONT-FAMILY: 돋움">http://www.Monson-Haefel.com/jwsbook/BookQuote</span></a><span style="FONT-FAMILY: 돋움">" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/input&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;output&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;soapbind:body use="literal"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace="</span><a href="http://www.monson-haefel.com/jwsbook/BookQuote"><span style="FONT-FAMILY: 돋움">http://www.Monson-Haefel.com/jwsbook/BookQuote</span></a><span style="FONT-FAMILY: 돋움">" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/output&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/<strong>operation</strong>&gt;<br />
&nbsp; &lt;/<strong>binding</strong>&gt;</span></pre><pre><span style="FONT-FAMILY: 돋움">&nbsp; &lt;!-- service tells us the Internet address of a Web service --&gt;<br />
&nbsp; &lt;<strong>service</strong> name="BookPriceService"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;port name="BookPrice_Port" binding="mh:BookPrice_Binding"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;soapbind:address location=<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "</span><a href="http://www.monson-haefel.com/jwsbook/BookQuote"><span style="FONT-FAMILY: 돋움">http://www.Monson-Haefel.com/jwsbook/BookQuote</span></a><span style="FONT-FAMILY: 돋움">" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/port&gt;<br />
&nbsp; &lt;/<strong>service</strong>&gt;</span></pre><pre><span style="FONT-FAMILY: 돋움">&lt;/<strong>definitions</strong>&gt;</span></pre><ul><li><span style="FONT-FAMILY: 돋움">definitions Element</span></li><li><span style="FONT-FAMILY: 돋움">message Element</span></li><li><span style="FONT-FAMILY: 돋움">portType Element</span></li><li><span style="FONT-FAMILY: 돋움">service Element</span></li></ul><p><span style="FONT-FAMILY: 돋움">이외에도 types element, import element등이 있는데 예제에는 사용하고 있지 않다.</span></p><p><strong><span style="FONT-FAMILY: 돋움">[ definitions element ]</span></strong></p><p><span style="FONT-FAMILY: 돋움">definitions는 root element로서 해당 WSDL문서에서 사용할 XML namespace 선언을 한다. attribute로 나오는 targetNamespace는 해당 WSDL문서에서&nbsp;정의된 element들의 namespace를 식별하기 위해 정의하는 attribute이다.</span></p><span style="FONT-FAMILY: 돋움"><strong>[&nbsp;message element ]</strong><br />
<br />
web service를 통해 주고 받는 Data를 말한다. SOAP&nbsp;header block의 내용이나&nbsp;fault detail element를 나타낼수도 있다.&nbsp;일반적인 프로그래밍을 생각할때&nbsp;method&nbsp;call시 주고 받는 parameter라고 생각하면 편하다. SOAP&nbsp;Part1에서&nbsp;messaging mode에 대해 설명했는데&nbsp;RPC-style&nbsp;혹은 Document-style이냐에 따라 SOAP의 messaging&nbsp;mode가 달라진다. 마찬가지로 WSDL에서도 설명하는 방법이 틀리다.<br />
<br />
</span><p><span style="FONT-FAMILY: 돋움">- The message element&nbsp;for RPC-Style Web Services </span></p><p><span style="FONT-FAMILY: 돋움">GetBookPriceRequest <strong>message</strong>는 client에서 web service를 call할시에 전송되는 input 전문을 정의하고 있으며 GetBookPriceResponse <strong>message</strong>는 web service에서 client에게 전송되는 전문을 정의하고 있다.</span></p><p><span style="FONT-FAMILY: 돋움">&lt;<strong>message</strong> name="GetBookPriceRequest"&gt;<br />
&nbsp; &lt;<strong>part</strong> name="isbn" <strong>type</strong>="xsd:string" /&gt;<br />
&lt;/<strong>message</strong>&gt;<br />
&lt;<strong>message</strong> name="GetBookPriceResponse"&gt;<br />
&nbsp; &lt;<strong>part</strong> name="price" <strong>type</strong>="xsd:float" /&gt;<br />
&lt;/<strong>message</strong>&gt;<br />
&nbsp;&nbsp; </span></p><p><span style="FONT-FAMILY: 돋움">- The&nbsp;message element for Document-Style Web Services</span></p><p><span style="FONT-FAMILY: 돋움"><strong>types</strong>&nbsp;XML schema에서 built-in tyle으로 정의되어 질 수 없는 여는 data type을 정의하기&nbsp;위한 container의 역할을 하는 &nbsp;element이며, <strong>import</strong>는 다른 XML document를 사용하기 위해&nbsp;쓰이는 element이다. 해당 구문은 </span><a href="http://www.monson-haefel.com/jwsbook/po.xsd"><span style="FONT-FAMILY: 돋움">http://www.Monson-Haefel.com/jwsbook/po.xsd</span></a><span style="FONT-FAMILY: 돋움">에 위치한 po.xsd를 import해서 사용하겠다는 의미이다. po.xsd에는&nbsp;XSD schema validation한&nbsp;내용이 정의되어 있을 것이다.&nbsp;</span></p><p><span style="FONT-FAMILY: 돋움">&lt;<strong>types</strong>&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;xsd:schema targetNamespace="http://www.Monson-Haefel.com/jwsbook/PO"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Import the PurchaseOrder XML schema document --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-FAMILY: 돋움"><span style="FONT-SIZE: 100%">&lt;xsd:<strong>import</strong> namespace="http://www.Monson-Haefel.com/jwsbook/PO"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; schemaLocation="http://www.Monson-Haefel.com/jwsbook/po.xsd" /&gt;<br />
</span>&nbsp;&nbsp;&nbsp; &lt;/xsd:schema&gt;<br />
&lt;/<strong>types</strong>&gt;<br />
&lt;<strong>message</strong> name="<span style="FONT-SIZE: 100%">SubmitPurchaseOrderMessage</span>"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;<strong>part</strong> name="order" </span><span style="FONT-FAMILY: 돋움"><span style="FONT-SIZE: 100%"><strong>element</strong>="mh:purchaseOrder" /&gt;<br />
</span>&lt;/<strong>message</strong>&gt;<br />
</span></p><p><strong><span style="FONT-FAMILY: 돋움">[ portType element ]</span></strong></p><p><span style="FONT-FAMILY: 돋움">portType는 개념적으로 java interface라고 보면 된다. 실제 implementation은 abstract type과 methods만을 정의한다. implementation은 <strong>binding</strong> element와 <strong>service</strong> element에 의해 이루어지는데 이때 protocol, encoding, address등이 정의되면서 실제적인 구현의 단계에 이르게 된다.portType element내의 <strong>operation</strong> element는 method라 생각하면 되고 <strong>input</strong>, <strong>output</strong> element가 client와 web service사이에 전송되어져하는 전문을 의미한다. </span></p><p><span style="FONT-FAMILY: 돋움"><strong>[ operation element ]</strong></span></p><p><span style="FONT-FAMILY: 돋움"><strong>portType</strong> element내에 정의된 <strong>operation</strong> element는 input, output, fault를 정의하기 위해 하나이상의 <strong>message</strong> 정의를 사용한다.&nbsp;</span></p><p><span style="FONT-SIZE: 100%">&lt;<strong>portType</strong> name="BookQuote"&gt;<br />
&nbsp; &lt;<strong>operation</strong> name="getBookPrice"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;<strong>input</strong> name="isbn" message="mh:GetBookPriceRequest"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;<strong>output</strong> name="price" message="mh:GetBookPriceResponse"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;<strong>fault</strong> name="InvalidArgumentFault" message="mh:InvalidArgumentFault"/&gt;<br />
&nbsp; &lt;/<strong>operation</strong>&gt;<br />
&lt;/<strong>portType</strong>&gt;<br />
</span></p><p><strong>input</strong>은 web service에게 전해지는 전문이며, <strong>output</strong>은 client에게 보내지는 전문, <strong>fault</strong>는 operation 수행시 발생하는 error에 대한 내용을 저장하기 위해 사용된다.</p><p><strong>[ binding element ]</strong></p><p><strong>portType</strong>이 추상적인 인터페이스를 제공했다면 실질적인 implementation은 <strong>binding</strong>에서 처리된다. 즉 protocol을 어떤 것을 사용할 것인지, messaging style(RPC or document)과 encoding style은 어느 것을 사용할 것인지 <strong>binding</strong>에서 정의한다.&nbsp;우리가 일반적으로 사용하는 protocol은 SOAP이지만 SMTP나 MIME같은 protocol도 사용될 수 있다. </p><p><strong>List2. binding example</strong></p><pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;definitions name="BookQuoteWS"<br />
&nbsp;targetNamespace="<a href="http://www.monson-haefel.com/jwsbook/BookQuote">http://www.Monson-Haefel.com/jwsbook/BookQuote</a>"<br />
&nbsp;xmlns:mh="<a href="http://www.monson-haefel.com/jwsbook/BookQuote">http://www.Monson-Haefel.com/jwsbook/BookQuote</a>"<br />
&nbsp;xmlns:soapbind="<a href="http://schemas.xmlsoap.org/wsdl/soap/">http://schemas.xmlsoap.org/wsdl/soap/</a>"<br />
&nbsp;xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>"<br />
&nbsp;xmlns="<a href="http://schemas.xmlsoap.org/wsdl/">http://schemas.xmlsoap.org/wsdl/</a>"&gt;<br />
&nbsp; ...<br />
&nbsp; &lt;!-- binding tells us which protocols and encoding styles are used --&gt;<br />
&nbsp; &lt;binding name="BookPrice_Binding" type="mh:BookQuote"&gt;     --- 1<br />
&nbsp;&nbsp;&nbsp; &lt;soapbind:binding style="rpc"                            --- 2<br />
&nbsp;&nbsp;&nbsp;&nbsp; transport="<a href="http://schemas.xmlsoap.org/soap/http%22/">http://schemas.xmlsoap.org/soap/http"/</a>&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;operation name="getBookPrice"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;soapbind:operation style="rpc"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; soapAction=<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://www.monson-haefel.com/jwsbook/BookQuote/GetBookPrice%22/">http://www.Monson-Haefel.com/jwsbook/BookQuote/GetBookPrice"/</a>&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;soapbind:body use="literal"                       --- 3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace="<a href="http://www.monson-haefel.com/jwsbook/BookQuote">http://www.Monson-Haefel.com/jwsbook/BookQuote</a>" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/input&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;output&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;soapbind:body use="literal"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace="<a href="http://www.monson-haefel.com/jwsbook/BookQuote">http://www.Monson-Haefel.com/jwsbook/BookQuote</a>" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/output&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/operation&gt;<br />
&nbsp; &lt;/binding&gt;<br />
&nbsp; ...<br />
&lt;/definitions&gt;</pre><pre>1. binding element의 attribute인 type은 portType이 'BookQuote'인 것을 binding에서 실제 implementation하겠다는 것을 선언하고 있다.</pre><pre>2. implementation시 messaging style은 RPC이며 transport 값의 의미는 network application protocol은 SOAP over HTTP를 사용하겠다는 것을 의미하고 있다.</pre><pre>3. literal의 의미는 해당 element에 사용되는 XML document가 해당 XML Schema(여기서는 <a href="http://www.monson-haefel.com/jwsbook/BookQuote/GetBookPrice">http://www.Monson-Haefel.com/jwsbook/BookQuote/GetBookPrice</a>)에 validation해야 된다는 의미이다.</pre><pre>&nbsp;</pre><pre><strong>[ service element ]</strong></pre><pre><strong>service element</strong>는 1개 이상의 port element를 포함하고 있는데 각각의 port는 다른 web service를 나타낸다. 따라서 port는 특정 binding에 대한 URL을 부여할 수 있는데 하나의 binding에 대해 1개 이상의 URL을 부여할 수도 있다. 이 경우에는 load balancing 혹은 failover용도로 사용된다. &nbsp;</pre><pre>List3. service example</pre><pre><pre>&lt;<strong><span style="COLOR: #000099">service</span></strong> name="BookPriceService"&gt;<br />
&nbsp; &lt;<strong><span style="COLOR: #000099">port</span></strong> name="BookPrice_Port" binding="mh:BookPrice_Binding"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;soapbind:address location=<br />
&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://www.monson-haefel.com/jwsbook/BookQuote">http://www.Monson-Haefel.com/jwsbook/BookQuote</a>" /&gt;<br />
&nbsp; &lt;/<span style="COLOR: #000099"><strong>port</strong></span>&gt;<br />
&nbsp; &lt;<strong><span style="COLOR: #000099">port</span></strong> name="BookPrice_Failover_Port" binding="mh:BookPrice_Binding"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;soapbind:address location=<br />
&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://www.monson-haefel.org/jwsbook/BookPrice">http://www.monson-haefel.org/jwsbook/BookPrice</a>" /&gt;<br />
&nbsp; &lt;/<strong><span style="COLOR: #000099">port</span></strong>&gt;<br />
&nbsp; &lt;<strong><span style="COLOR: #000099">port</span></strong> name="SubmitPurchaseOrder_Port"<br />
&nbsp;&nbsp; binding="mh:SubmitPurchaseOrder_Binding"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;soapbind:address location=<br />
&nbsp;&nbsp;&nbsp;&nbsp; "<a href="https://www.monson-haefel.org/jwsbook/po">https://www.monson-haefel.org/jwsbook/po</a>" /&gt;<br />
&nbsp; &lt;/<strong><span style="COLOR: #000099">port</span></strong>&gt;<br />
&lt;/<strong><span style="COLOR: #000099">service</span></strong>&gt;</pre><pre>&nbsp;</pre><pre>List3에서는 service element내에 3개의 port 를 정의하고 있다. 2개는 같은 web service를 가리키고 있으며 하나는 name에서 지칭하는 바와 같이 failover시 사용됨을 알 수 있다. address element의 location은 실질적인 Internet URL 주소를 나타낸다. </pre><pre>&nbsp;</pre><pre>솔직히 SOAP도 마찬가지겠지만 WSDL얘기를 하자면 이정도 갖고는 어림도 없다. 현재 web services 의 구조상 SOAP과 WSDL은 뗄래랴 뗄수도 없는 관계인지라 같이 예제를 들면서 비교해보면 좋은일이겠지만 겅부해야할 것은 많고 나름대로의 게으름(^^)으로 인해 이번절은 여기까지.... 다음 SOAP Part2로 넘어간다. Axis에 대해서 한번 들어가보자.</pre></pre>			 ]]> 
		</description>
		<category>WS-FirstGeneration</category>

		<comments>http://lovemade.egloos.com/35996#comments</comments>
		<pubDate>Tue, 13 Feb 2007 12:25:31 GMT</pubDate>
		<dc:creator>lovemade</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 시작하며... ]]> </title>
		<link>http://lovemade.egloos.com/26426</link>
		<guid>http://lovemade.egloos.com/26426</guid>
		<description>
			<![CDATA[ 
  EAI 기술지원 나갈지도 모르니 준비하라고 한다. 그 차원에서 정리가 필요했기에 시작한다.<br />
당분간 정리도 할겸 BPEL에 집중하자. Architecture관련 사항은 주말학습(될려나?)...... <br />
<br />
BPEL은 웹서비스의 이해없이는 도저히 학습이 불가능한 분야다. 물론 나처럼 무턱대고 회사에서 하라고 하면 하는 경우도 있지만 처음엔 당최 무슨소리인지 모른다. 우선은 웹서비스에 대한 기본적인 지식은 있어야 편하게 익힐 수 있다.<br />
<br />
Let's get started!!!!&nbsp; 			 ]]> 
		</description>
		<category>BPEL4WS</category>

		<comments>http://lovemade.egloos.com/26426#comments</comments>
		<pubDate>Tue, 06 Feb 2007 15:54:10 GMT</pubDate>
		<dc:creator>lovemade</dc:creator>
	</item>
</channel>
</rss>
