SOAP2011. 4. 5. 16:42

웹 서비스(Web Service) 소개 및 기본구현

 

  웹서비스(Web Services)는 웹으로 제공되는 메소드 서비스이다. 여기에서 웹은 인터넷 사이트이며 서비스는 특정한 기능, 예를 들어 항공권 예약, 인터넷 배팅, 쇼핑 및 조달 구매 등을 의미한다. 지금까지는 사이트에 접속해서 지정한 양식에 맞게 정보를 입력하고 한 가지 일을 처리하고 나서 다른 사이트로 이동하는 식의 작업을 반복했다. 그러나 웹서비스는 제공하는 사이트에 필요한 값(웹서비스 메소드의 매개변수)을 XML 형식으로 보내주면 마친 결과가 웹페이지가 나타난다.


  웹서비스는 표준 인터넷 프로토콜을 사용하여 액서스 할 수 있는 일종의 메소드로서 프로그램 코드에서 그러한 메소드로서 프로그램 코드에서 그러한 메소드를 사용할 수 있다. 웹서비스는 구성 요소를 이용한 개발과 웹 방식의 장점을 결합한 것이다. 웹서비스도 구성 요소처럼 서비스 구현을 위한 재사용 방식을 이용할 수 있다. 다시 말해서, 자주 사용되는 웹서비스를 만들어두면 다른 웹페이지를 만들 때 사용할 수 있다.

 

웹서비스의 고려사항

   다음의 두 가지 경우를 생각해 보자. 다음 2가지는 시스템 구현시 한번쯤은 생각해 볼 수 있는 부분이 일 것이다. 조건1) 두 사이트 혹은 하나의 사이트와 다중의 클라이언트들은 서로 간에 많은 데이터들은 인터넷을 통해 손쉽게 교환해야 한다. 조건2) 데이터 교환의 매개는 어떤 클라이언트건 간에 플랫폼과 데이터 형식의 제한을 받지 않고 사용할 수 있어야 한다.

 

   (조건1)에 대한 해결방안으로 네트워크 내부의 데이터 교환에 있어서 아무런 제약 조건 없는 통신 프로트콜의 선정을 가장 먼저 생각해 볼 수 있다. 그러나 불행히도 보안상의 문제로 방화벽이나 프록시 서버를 설치하여 HTTP가 통신할 수 있는  80포트와 이메일 전송을 위한 포트를 제외한 대부분의 포트를 봉쇄하고 있는 추세이다. 그러므로 표준 프로트콜인 HTTP를 이용해야 한다.


(조건2)를 해결하기 위해선 어떠한 플랫폼과 데이터베이스와도 종속적이지 않은 독립적인 데이터 교환수단이 필수적이다. 이러한 문제점을 해결할 수 있는 기술로 XML(Extensible Markup Language)이 있다. XML은 데이터의 조직화를 보다 쉽게 이루어 낼 수 있음은 물론 텍스트 기반이므로 쉽게 가공할 수 있다는 장점을 가지고 있다. 따라서 HTTP 프로트콜을 사용하면서 XML로 데이터를 전송하는 방식을 사용해야 한다.

 

웹서비스의 특징

1) 방화벽 같은 특수한 환경적 제약을 받지 않고 표준 프로트콜을 HTTP를 이용해서 원격지의 웹서비스를 호출할 수 있다.

2) 인터넷을 통해 애플리케이션들이 서로 통신하고 데이터를 교환할 수 있는 환경을 제공한다.

3) 특정 언어에 종속되지 않는 언어 독립성(Language Independent)을 제공한다.

4) 서비스 호출을 위해서 특정 프로토콜을 사용하지 않고 표준 프로토콜을 사용하므로 독립성(Protocol Independent)을 제공한다.

5) XML을 기반으로 특정 운영체제나 플랫폼에 종속되지 않는 플랫폼 독립성(Platform Independent)을 제공한다.

 

웹서비스 실행 모델

1) 다이렉트 클라이언트(Direct Client)

클라이언트가 웹서비스를 직접 요청하는 방식이다. 클라이언트가 웹 브라우저를 이용하여 주소를 입력하여 웹서비스를 요청하게 되면, 제공 서버는 요청받은 서비스에 대한 설명을 클라이언트에게 전송을 하고, 클라이언트는 서비스의 설명을 읽고 필요한 파라미터 등을 입력해서 웹서비스를 HTTP GET방식으로 요청한다. 따라서 웹서비스가 호출되고 실행된 결과는 XML로 클라이언트에게 전송된다.

2) 프록시 클라이언트(Proxy Client)

웹 애플리케이션 내에서 웹서비스를 호출하는 방법으로 간접적으로 웹서비스를 호출하게 되며 클라이언트는 요청에 의한 결과가 웹서비스에 의해서 얻어 결과인지는 알지 못한다. 웹 애플리케이션에서 웹서비스를 사용하는 경우 웹 서버에는 웹서비스 호출과 처리를 위한 프록시가 생성된다. 웹 서버와 웹서비스 제공 서버 사이에는 SOAP을 이용해서 웹서비스가 호출되고 실행 결과 값을 전송하게 된다.

 

SOAP(Simple Object Access Protocol)

   SOAP은 정보 교환을 위한 프로토콜이다. SOAP 사양에는 XML과 관련된 규칙이 정의되어 있다. 또한 확장 가능한 메시지 형식이나 SOAP 메시지 형식을 사용하여 RPC(원격 프로시저 호출)를 나타내는 규칙과 HTTP 프로토콜에 바인딩 하는 방법도 정의되어 있다.

   인터넷을 통하여 웹 애플리케이션과 워도 애플리케이션은 모두 웹서비스를 사용할 수 있으며 웹서비스는 또 다른 웹서비스를 사용할 수도 있다. 즉, 인터넷상에서라면 어떠한 애플리케이션도 모두 웹서비스를 통하여 통합될 수 있는 것이다. 이 모든 일련의 과정들의 메시징 처리에는 XML로 규약 된 SOAP이 사용되며 메시징 전달의 매개로는 HTTP 표준 프로트콜이 사용된다.

WSDL(Web Services Description Language)

  WSDL(웹서비스 계약 설정을 위한 표준 언어)은 마이크로소프트와 IBM에서 개발한 XML 기반의 계약 언어로서, 웹서비스가 주어지면 웹서비스에서 수락하고 생성하는 메시지가 어떤 것인지 표준화하여 문서로 만든다. 즉 제공자와 사용자의 규칙인 웹서비스 계약을 문서화하는 표준방법이다.(Visual Studio.NET에서는 웹서비스를 만드는 개발자 도구에서 WSDL을 지원)

 

UDDI(Universal Description, Discovery, Integration)

  우리가 웹서비스를 사용함에 있어서 가장 먼저 접하게 되는 문제는 필요로 하는 기능을 제공해주는 웹서비스가 어디에 있느냐 것이다. 예를 들어 주식정보를 웹서비스로 제공하는 공급자가 있다고 하더라도 소비자 입장에서는 그 사실을 알 수 없다. 이를 위해서 제공되는 서비스가 UDDI이다.  

  UDDI(웹서비스 검색 기술)에는 웹서비스 공급자가 자신의 웹서비스를 광고하고 웹서비스 소비자는 관심 있는 웹서비스를 찾을 수 있게 하는 기술이다. UDDI를 활용하면 사용하려는 웹서비스에 대한 주소를 모르더라도 일정한 조건으로 검색해서 필요한 웹서비스를 사용할 수 있다.

http://www.salcentral.comhttp://uddi.microsoft.com
http://www.soapclient.com/uddisearch.html

  

- 출처 : http://cadcam.yonsei.ac.kr/?menu=resource -


'SOAP' 카테고리의 다른 글

JAVA로 SOAP 구축 관련 자료들  (0) 2011.04.05
JAVA로 SOAP 구축하기(3)  (0) 2011.04.05
JAVA로 SOAP 구축하기(2)  (0) 2011.04.05
JAVA로 SOAP 구축하기(1)  (0) 2011.04.05
[SOAP강좌] Java 서버 - Delphi 클라이언트  (0) 2011.04.05
Posted by 아로나
SOAP2011. 4. 5. 15:54
SOAP2011. 4. 5. 15:50
part3. Axis Practice

그럼 실질적으로 한번 구현을 해보자.
SOAP Part2에서 마지막에 첨부시킨 간단한 Hello 웹 서비스를 바탕으로 코드생성법과 해당코드에 대한 간단한 설명과 함께....
web service를 구현하는 방식에는 2가지가 있는데
첫번째는 Java 파일을 coding한 후 해당 Java파일을 바탕으로 WSDL파일을 생성한 후 deploy 시키는 방법과
두번째는 WSDL 파일로 Java파일을 생성한 후 deploy시키는 방법이 있다. 첫번째 방법은 서비스제공자를 만들때 많이 쓰이며 두번째 방법은 서비스 요청자를 만들때 많이 쓰인다.

[ JAVA2WSDL ]

- STEP1. Java Class생성

 Java 파일을 작성한 후 웹 서비스를 생성할때 작성할 Java파일은 Interface Class와 해당 Interface를 Implement한 Java Class파일 2개가 필요하다라고 문서에는 나와있는데 Interface파일만 있어도 가능하다.다음 파일을 작성 및 complie한 후 적절한 디렉토리에 배치한다. 여기서는 Tomcat\webapps\axis\WEB-INF\classes 에 배치하고 있다.


List1. Java Interface File

package webservice.hello;
public interface HelloIF extends java.rmi.Remote {
      public String hello(java.lang.String name) throws java.rmi.RemoteException;
}


- STEP2. 구현된 Class로부터 WSDL생성.Axis 에서는 Axis.jar파일에 Java2Wsdl이라는 Class파일을 제공하고 있다. 해당 파일의 역할은 STEP1에서 구현한 2개의 Java Class로부터 WSDL파일을 생성하는 것인데 SOAP Part2에서 제공한 문서를 보면 사용법에 대한 자세한 사항이 나와있으니 참조하고.......다음과 같이 실행하자.

java org.apache.axis.wsdl.Java2WSDL -o c:\test\webservice\hello\Hello.wsdl
-l http://localhost:8080/axis/services/Hello -n http://hello.webservice -u literal -pwebservice.hello http://hello.webservice webservice.hello.HelloIF

부연해서 설명하자면 -l 옵션은 실제 웹서비스 URL경로를 지정하는데 WSDL문서를 받은 서비스요청자에서 실제 호출경로로 사용하므로 정확히 작성해야 한다. -n 옵션은 WSDL 문서에서 사용할 targetNamespace의 값을 설정한다. targetNamespace는 해당 문서에서 정의된 XML Element들을 식별하기 위한 것이다. 생성이 잘 되었다면 다음과 같을 것이다.
List2. Hello WSDL
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
    targetNamespace="http://hello.webservice"
    xmlns:apachesoap="http://xml.apache.org/xml-soap"
    xmlns:impl="http://hello.webservice"
    xmlns:intf="http://hello.webservice"
    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="helloResponse">

      <wsdl:part name="helloReturn" type="xsd:string"/>

  </wsdl:message>

   <wsdl:message name="helloRequest">

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

   </wsdl:message>

   <wsdl:portType name="HelloIF">

      <wsdl:operation name="hello" parameterOrder="in0">

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

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


      </wsdl:operation>


   </wsdl:portType>

   <wsdl:binding name="HelloSoapBinding" type="impl:HelloIF">

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


      <wsdl:operation name="hello">

         <wsdlsoap:operation soapAction=""/>


         <wsdl:input >


            <wsdlsoap:body namespace="http://hello.webservice" use="literal"/>

         </wsdl:input>

         <wsdl:output >


            <wsdlsoap:body namespace="http://hello.webservice" use="literal"/>


         </wsdl:output>


      </wsdl:operation>


   </wsdl:binding>

   <wsdl:service name="HelloIFService">


      <wsdl:port binding="impl:HelloSoapBinding" name="Hello">


         <wsdlsoap:address location="http://localhost:8080/axis/service/Hello"/>


      </wsdl:port>


   </wsdl:service>


</wsdl:definitions>

 List1 의 WSDL파일을 보면 portType의 name이 HelloIF, operation의 name이 hello인데 HelloIF.java의 class명과 method명과 일치함을 알 수 있다. targetNamespace는 -n 옵션에서 정의한 값이 설정되어 있고 location에는 -l 옵션에서 정의한 값이 설정되어 있다. Bold된 단어를 하나씩 비교해가면서 확인해보면 연관성을 알 수 있을 것이다.

- STEP3. WSDD파일 및 Java파일 생성WSDD(Web Service Deployment Descriptor)파일의 용도는 새로운 Handler, Chain 그리고 서비스를 올리기 위해 AdminClient에서 사용하는 설정파일이다. WSDD에 대한 자세한 사항은 해당 사이트를 참조하도록하자. AdminClient는 관리툴로서, Handler나 Chain같은 Axis리소스를 올리거나 내릴때 사용한다.
http://ws.apache.org/axis/java/reference.html#DeploymentWSDDReference

cmd#> java org.apache.axis.wsdl.WSDL2Java -o d:\ -d Application -s d:\Hello.wsdl

여기서는 d:\ 디렉토리에 wsdd파일 및 Java파일을 생성했다. 생성된 파일목록은 다음과 같다.
deploy.wsdd
undeploy.wsdd
HelloIF.java
HelloIFService.java
HelloIFServiceLocator.java
HelloSoapBindingImpl.java
HelloSoapBindingStub.java

java 파일에 대한 자세한 설명은 J2EE Web Service에서 자세히 다루기로 하고
deploy.wsdd 와 undeploy.wsdd파일은 말그대로 deploy, undeploy 설정파일이다. HelloIF를 implement한 것이 HelloSoapBindingImpl이므로 해당 파일의 hello 메소드에 관련 로직을 작성하면 된다.


- STEP4. 서비스 deploy


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

서비스 deploy를 완료한 후 http://localhost:8080/axis/servlet/AxisServlet에서 해당 서비스에 대한 deploy완료여부를 확인할 수 있다. 아니면 http://localhost:8080/axis/services/Hello?wsdl 로 확인가능하다.

- 출처 : http://ammoguy.springnote.com/pages/2289092 -

'SOAP' 카테고리의 다른 글

웹서비스 기본 개념  (0) 2011.04.05
JAVA로 SOAP 구축 관련 자료들  (0) 2011.04.05
JAVA로 SOAP 구축하기(2)  (0) 2011.04.05
JAVA로 SOAP 구축하기(1)  (0) 2011.04.05
[SOAP강좌] Java 서버 - Delphi 클라이언트  (0) 2011.04.05
Posted by 아로나
SOAP2011. 4. 5. 15:48

part2. Axis Overview

SOAP Part1에서는 SOAP에 대한 기본적인 사항을 살펴보았다. 이번장에서는 SOAP처리기라고 알려진 Axis를 살펴보자.

Axis 는 Apache SOAP프로젝트의 산물이다. 지금까지 크게 2가지의 Version(Axis1.x, Axis2.x)이 나와있으며 Axis2에서는 기존 Axis보다 보다 유연한 구조(module이 쉽게 configuration 될 수 있는),  성능 향상, 비동기 웹 서비스, hot deploy기능 등을 제공하고 있다. W3C에서는 SOAP를 다음과 같이 정의하고 있다.

SOAP is a lightweight protocol for exchanging structured information in a decentralized, distributed
environment. It is an XML based protocol that consists of three parts: an envelope that defines a
framework for describing what is in a message and how to process it, a set of encoding rules for expressing
instances of application-defined datatypes, and a convention for representing remote procedure calls and responses.

자 세히 설명하자면 SOAP은 분산환경에서 정보의 교환, 즉 웹서비스를 통해 정보를 교환하는 일종의 XML 기반의 protocol이며 그 protocol을 정의하고 있는 SOAP message내에는 무슨 내용이 있으며 어떻게 message를 처리해야하는지와 encoding rule이 정의되어 있다. 즉 일종의 쌍방(서비스 제공자와 요청자)간의 협약이 맺어져 있어 Axis에서는 해당 SOAP message를 처리한다.

먼저 Apache Axis1의 acchitecture부터 살펴보는것 부터 시작하도록 하자.

[ Axis Architecture ]

Figure1. Axis의 기본 구성.

요청자    -------------------------------->   Axis 엔진  <--------------------------> 웹 서비스
              전송매체(HTTP, SMTP, MQ, etc)


Figure1 에서 보듯이 Axis는 SOAP message를 HTTP와 같은 전송매체를 통해 받아 웹 서비스에 전달하고 SOAP message로 만들어진 응답을 다시 요청자에게 전달하는 역할을 하는데 다음고 같은 구성요소들이 어우러져 SOAP을 처리한다.

  • Axis Engine : SOAP 처리기
  • Handler : Axis내부의 기본적인 구성요소로 기본의 백엔드시스템과 Axis를 연결하는 역할을 한다.
  • Chain : 순차적으로 정렬된 Handler들의 모음을 말한다.
  • 전송매체 : SOAP message 흐름이 Axis에 들어오고 나갈 수 있데 하는 메커니즘이다.
  • 구축/설정 : Axis를 통해 웹 서비스를 사용할 수 있도록 하는 수단이다.
  • Seriaizers / Deserializers : Java와 같은 원래 Datatype을 XML로 변환하는 코드/원래 Datatype으로 복원하는 코드이다.

1. Axis Engine

Axis Engine은 여러 컴포넌트, 즉 Handler를 이용해 SOAP message의 흐름을 운영할 뿐만 아니라 이데 대한 순서를 조정하는 책임을 갖는다.

2. Handler & Chain

Chain은 순서대로 정렬된 코드형태의 컴포넌트 모음을 말하며 Axis는 정해진 순서대로 이들을 순차적으로 기동하게 되는데, 이렇게 순차적으로 기동되는 컴포넌트들을 가리켜 Handler라고 한다. 각 Handler는 웹 서비스 기동 전 후의 message에 대해 추가적인 처리를 수행할 필요가 있을 경우에 사용되는데 logging이나 SOAP Header Block을 처리하기 위해 많이 쓰인다. 그럼 웹 서비스 자체내에서 해당 로직, 즉 바로 앞에서 예로 든 logging이나 SOAP Header block처리 같은,을 처리하지 않고 Handler를 사용해서 처리할까? 이유는 웹 서비스 코드는 비즈니스 관점에서 해당 로직만을 처리함으로써 재사용성이 증대되고 각 Handler는 다른작업에 개의치 않고 각자의 고유역할에만 전념할 수 있으므로 코드가 중복되는 여지를 없앨 수 있으며 Axis설정을 통해 새로운 Handler를 추가하거나 삭제하는 식으로 처리가 가능함으로 인해 웹서비스의 재사용성을 증대시키는 역할을 할 수 있기 때문이다. 만약 Security가  적용되어 있는 기존의 웹 서비스에 RealiableMessage를 적용해야 한다는 요구사항이 발생한다면 기존의 로직을 수정하지 않고 간단하게 RealiableMessage를 처리할 수 있는 Handler를 제작한 후 Axis설정만으로 해당 Handler를 SOAP message처리에 참여시킴으로써  비즈니스 로직을 처리하는 웹 서비스, 보안관련사항을 처리하는 Handler, ReliableMessage를 처리하는 Handler를 각각의 역할만 하도록 제한시킬 수 있는 것이다.

그럼 웹 서비스에 대해 정의되어 있는 Handler의 Chain이 모든 요청에 대해 기동할까? 답은 그렇지 않다. 아니 설정을 통해 모든 요청에 대해 기동할 수도 있고 특정부분만이 기동할 수도 있다. 다음 그림을 보도록 하자

Figure1. Axis Server Architecture.

 

Figure1 은 Axis의 Server단의 Architecture를 도식으로 표현한 것이다. (Apache Axis 도식 참조) 작은 cylinder는 handler, 작은 cylinder를 감싸는 큰 cylinder는 chain을 나타낸다.

Axis Engine내에 크게 3부분(Transport, Global, Service)으로 구성되어 있는데, Transport전송매체지정체인으로 특정 전송매체(HTTP, SMTP, MIME...)에 따라 압축 또는 인증 등의 일을 처리하기 위해 정의될 수 있으며, Global전역체인으로 웹 서비스의 종류에 상관없이 동일한 처리를 핑요로 하는 경우에 정의된다. 또한 Service특정웹서비스용체인으로 말그대로 특정 웹서비스만을 위한 Chain을 필요로 하는 경우에 정의된다. 서비스내의 Provider는 일종의 Handler인데 backend의 실질적인 웹서비스와 Axis를 잇는 중계자 역할을 한다. 즉, SOAP message를 해석해서 필요로 하는 웹 서비스와 관련된 코드 부분을 찾아내어 해당 웹서비스를 기동시키는 역할을 한다. 예를 들어,  XML을 자바객체로 변환한 후 기동시킬 적정한 자바 메소드를 찾아 기동시키고, 가능한 응답 데이터를 XML 형태로 재변환하여 응답 SOAP message에 넣는 일을 한다.  Transport Listener는 request의 특정 protocol의 data를 받는 최초 접점으로 해당 protocol-specific data를 Message Object로 package한 후 Message Object와 각종 properties를 MessageContext에 설정한 후 MessageContext를 Axis에 전달하는 역할을 한다. 장황해서 좀 그런데 다시 정리하면...

 1). TransportListener는 요청에 대해 MessageContext Object를 Axis에 전달한다.

 2). 전송매체지정체인이 정의되어 있으면 Chain에 속한 Handler가 기동된다.

 3). 전역체인이 정의되어 있으면 해당 Chain이 기동된다.

 4). 특정웹서비스용체인이 있으면 해당 Chain이 기동된다.

 5). 응답도 이와 비슷한 과정을 거친다........

 

3. Transport

SOAP message를 전달하기 위해 전송매체가 HTTP만이 쓰이는 것은 아니다. SMTP, FTP 등이 사용될 수 있는데 실질적으로 Axis자체는 다중 전송매체를 지원하지는 않는다. 무슨말인고 하니, Axis는 들어오는 메세지로 Axis Engine이 호출되어 다시 응답메세지로 보내는 단순한 코드모음 이상, 이하도 아니며 또한 SOAP message를 기다리는 TransportListener는 Axis Engine의 일부가 아니다. Axis에서는 AxisServlet이라는 TransportListener를 제공하고 만약 특별한 처리가 필요하다면 전송매체에 맞는 TransportListener를 새로 작성해야만 한다. 따라서 Axis Engine은 TransportListener에 의해 메커니즘이 관리되는데 Axis Engine의 기동(요청마다 Engine이 생성되느냐 혹은 하나의 instance를 공유하느냐), message의 Axis Engine으로의 전달, 어떠한 전송매체가 사용되는지를 Axis Engine에게 통보함으로써 Axis는 설정된 특정전송매체지정체인을 기동하게 된다.

지 금까지 Axis Server Architecture를 간략하게 살펴봤는데 Client Architecture는 Provider대신에 Sender라는 전송매체전송자라는 Handler가 대체되고 Transport, Global, Service가 반대로 실행된다고 생각하면 된다. Figure2를 참조하고 자세한 사항은 Apache Axis관련 사이트를 참조하자.

Figure2. Axis Client Architecture

 

지 금까지 Axis의 기본 Architecture에 대해 살펴보았는데 처음보면 이게 무엇인지 감을 잡기 힘들다.(나만 그런가?ㅡ.ㅡ) 우선은 이것만 기억하자. Axis는 SOAP message처리 Engine으로 Handler라는 기본 component 들에 의해 message처리가 이루어진다. (너무 간단한가? 내 실력이 요것밖에 안된다. 아직...ㅜ.ㅜ) 

[ Axis Installation ]

여기다 정리하려고 했는데 좋은 문서가 벌써 있는것 같아 해당 문서사용.apache_axis.doc

문서를 보면서 그냥 한번 따라해보면 좋고, 아님 말고, 그래도 한번 해보는 것이 둏지 아니할런지...

- 출처 : http://ammoguy.springnote.com/pages/2289088 -

'SOAP' 카테고리의 다른 글

JAVA로 SOAP 구축 관련 자료들  (0) 2011.04.05
JAVA로 SOAP 구축하기(3)  (0) 2011.04.05
JAVA로 SOAP 구축하기(1)  (0) 2011.04.05
[SOAP강좌] Java 서버 - Delphi 클라이언트  (0) 2011.04.05
기본 XML Web Services - MSDN  (0) 2011.04.05
Posted by 아로나
SOAP2011. 4. 5. 15:47

이번시간에는 WS Communication Protocol 중 현재 가장 널리 사용되고 있는 SOAP에 대한 기본적인 구조에 대해서 알아보겠다.

SOAP 은 서로 다른 플랫폼의 XML 분산컴퓨팅을 위한 기반기술이다. 분산컴퓨팅이라는 말처럼 SOAP내에는 분산컴퓨팅을 가능하게 하기 위한 기반기술이 XML Document로 정의되어지고 SOAP Message는 SOAP처리기라는 SOAP엔진에 의해 처리된다. 일반적으로 많이 쓰이는 엔진이 Axis 이고 해당 엔진은 많은 Vendor들에 의해 어플리케이션 서버와 같은 제품에 탑재되어 있다. SOAP자체는 일반 application이나 비즈니스 로직의 개발자나 업무사용자를 위한 기술이 아니라, 저 수준의 분산시스템 개발자를 위한 것이다. SOAP을 이해할때 중요한 포인트는 단순히 WS의 통신 Protocol이라는 개념으로 이해하지 말고 분산컴퓨팅을 위한 통신 Protocol이라는 개념을 항상 주지해야 한다는 것이다.

DS process간의 통신(interprocess communication)은 DS의 핵심이다. DS는 수천 수만의 process들이 Network에 편재해 있고 이러한 process들을 어떠한 표준적인 방법으로 접근하지 않는다면 많은 어려움이 뒤따를 것이다. 그래서 나타난 것이 표준적인 Rule인 Protocol이 등장했고 다음이 가장 널리 사용되는 Protocol이다.



  1. Remote Procedure Call ( RPC)
  2. Remote Method Invocation (RMI)
  3. Message-Oriented Middleware (MOM)
  4. Stream

이에 대한 자세한 사항은 Distributed System이라는 Category에서 다루기로 하겠다.

여기서 잠깐, 우선 일반 서적에서 얘기하고 있는 SOAP의 기본적인 Framework부터 살펴보고 SOAP 자체가 어떠한 확장성을 가지는지는 다음시간에 다루겠다. 쉽게쉽게가자. 정리하느라 힘들당.

[ SOAP Envelope Framework ]

SOAP 에서 가장 중요한 부분은 Envelope Framework이다. 메시지에 무엇이 있는지와 이를 어떻게 처리하는지를 설명하는 Framwork을 정의하는 인벨롭(envelope), 애플리케이션 정의의(application-defined) 데이터 유형의 인스턴스를 표현하는 인코딩 규칙, 원격 프로시져 호출과 응답을 나타내는 규칙 등 세 부분으로 구성된 XML 기반의 프로토콜이다

Figure1. 기본 구조




 

SOAP은 크게 세부분, Envelope, Header, Body로 나뉜다.

  • [ Envelope ] SOAP Message 의 root 로서 전체 Message에 대한 Encoding Style을 정의할 수 있다.
  • [ Header ] Envelope 의 Child Element로서 optional하고 1회이상 쓰일 수 있다. Header는 Security, Transaction, Reliable Message, QoS 등과 같은 추가적인 기능을 포함할 수 있는 확장 메커니즘을 제공한다. 또한 SOAP Node간의 각종 Spec과 관련된 협약의 준수여부를 나타내는 mustUnderstande 속성을 제공한다.  
  • [ Body ] 실질적인 Data가 들어가는 곳이다. 다른말로 하면 Body Element내에는 최종수신자에게 보내져야 하는 정보가 들어가 있다. 어떤 서비스를 이용할 것인지, 요청과 응답 Data는 무엇인지 등등

그럼 Header와 Body에 대해서 좀더 자세히 알아보자.

[ Header ]

SOAP Spec은 message path에 서 처리되어야하는 rule을 정의할 수 있는데 처리되어야 하는 rule을 정의하는 곳이 바로 Header block이다. 여기서 message path는 SOAP message가 최초의 sender로 부터 최종 receiver까지 가는데 거쳐야 하는 경로를 말한다. message path상에 등록되어 있는 SOAP Node들을 Intermediaries라 하는데 spec에서는 어떠한 intermediary가 특정 header block을 처리할 것인지를 정의하고 있다. SOAP은 Network상의 SOAP application들 간의 message를 상호 교환하기 위한 protocol이다. 여기서 SOAP application이라 함은 SOAP message를 생성하거나 처리하기 위한 일종의 software이다. 예를 들어 여느 java application 혹은 J2EE component가 JAX-RPC를 사용한다면 일종의 SOAP application이라고 볼 수 있다. SOAP message는 message path를 경유하는데 모든 SOAP message는 최초의 message를 생성하는 initial sender로 부터 시작해서 최종 message를 처리하는 ultimate receiver로 끝이 난다.

Figure2. The SOAP Message Path



SOAP message가 message path를 경유할 때 SOAP header block은 지정된 SOAP node에 의해 intercept되서 해당 header block을 처리하게 되는데 SOAP Node들은 sender 와 receiver의 역할을 병행한다. 여기서 잠시 예를 들어보자.

Figure3. The Message Path of the Purchase-Order SOAP Message.

 



Figure3 은 Purchase Order라는 SOAP message가 Customer, Sales, Accounts, Inventory, Shipping SOAP nodes경유하는 message path이다. Intermediaries는 SOAP body block를 처리하거나 수정할 수 없고 단지 header block을 처리하는 역할을 한다. 실질적인 SOAP message를 살펴보도록 하자.

List1. The process-by Header block.

          <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:mi="http://www.Monson-Haefel.com/jwsbook/message-id"
xmlns:proc="http://www.Monson-Haefel.com/jwsbook/processed-by">
<soap:Header>
<mi:message-id>11d1def534ea:b1c5fa:f3bfb4dcd7:-8000</mi:message-id>
<proc:processed-by>
<node>
<time-in-millis>1013694680000</time-in-millis>
<identity>http://www.customer.com</identity>
</node>
<node>
<time-in-millis>1013694680010</time-in-millis>
<identity>http://www.Monson-Haefel.com/sales</identity>
</node>
<node>
<time-in-millis>1013694680020</time-in-millis>
<identity>http://www.Monson-Haefel.com/AR</identity>
</node>
<node>
<time-in-millis>1013694680030</time-in-millis>
<identity>http://www.Monson-Haefel.com/inventory</identity>
</node>
<node>
<time-in-millis>1013694680040</time-in-millis>
<identity>http://www.Monson-Haefel.com/shipping</identity>
</node>
</proc:processed-by>
</soap:Header>
<soap:Body>
<!-- Application-specific data goes here -->
</soap:Body>
</soap:Envelope>

List1에서 process-by 라는 Header Block은 SOAP Message를 처리한 SOAP node들에 대한 기록을 남긴 것이다. 이말은 Message Path에 있는 SOAP node들이 SOAP Message를 처리하면서 SOAP Message에 내용을 추가하거나 뺄 수도 있다는 얘기이다. 그럼 SOAP node들은 어떤 Header block을 처리해야 하는지 어떻게 알까? 이에 대해 SOAP Spec은 특정 Header Block을 처리하는 node를 식별하기 위한 actor 속성을 도입했다.

actor 속성은 역할에 대한 URI 형태의 식별자이다. 그래서 해당 SOAP Message가 Message Path를 경유할때 해당 actor의 역할을 하기로 되어 있는 SOAP node에서는 처리되어지고 다른 node에서는 무시된다.

List2. The actor Attribute.

          
          
          <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:mi="http://www.Monson-Haefel.com/jwsbook/message-id"
xmlns:proc="http://www.Monson-Haefel.com/jwsbook/processed-by">
<soap:Header>
<mi:message-id soap:actor="http://www.Monson-Haefel.com/logger" >
11d1def534ea:b1c5fa:f3bfb4dcd7:-8000
</mi:message-id>
<proc:processed-by>
<node>
<time-in-millis>1013694680000</time-in-millis>
<identity>http://www.customer.com</identity>
</node>
</proc:processed-by>
</soap:Header>
<soap:Body>
<!-- Application-specific data goes here -->
</soap:Body>
</soap:Envelope>
          
          
           
          
          
          

List2를 보면 soap:actor="http://www.Mansoa-Haefel.com/logger" 을 볼 수가 있는데 actor에 대한 식별자를 URI로 식별하고 있으며 해당 actor에 대한 처리 노드는 해당 처리절차를 진행한다.

일 반적인 관점으로 SOAP Header를 봤을때 SOAP Header는 meta-data를 처리하기 위한 뛰어난 확장성을 지닌다. Security, Transaction, QoS, Message Persistence, Routing 등 실제 Data와는 상관이 없는 meta-data를 처리하기 위한 기반을 제공하고 있다. 물론 범용적으로 사용되는 표준은 OASIS같은 단체에서 관장하고 있으며 Domain에 custom한 방식으로도 사용될 수 있다.

[ BODY ]

SOAP BODY에는 웹 서비스간 교환하려는 실질적인 Data, 어느 operation을 call할것인지, 넘겨줄 parameter는 무엇인지, return 값은 무엇인지, error발생시 fault 메세지 등, 상호운영상에 교환되는 Data가 들어간다. Header Element는 선택적으로 사용될 수 있지만 Body Element는 필수적인 요소이다. 또한 Message Path에서 Body Element를 처리할 수 있는 SOAP node는 Ultimate Node 뿐이다.

상호운영 시 error가 발생해 Body Element에 적용되는 fault message를 제외하고 SOAP은 Body의 Contents가 well-formed XML이라면 어떠한 XML message가 적용되더라도 상관하지 않는다. 물론 웹서비스간 상호운영성에 맞는 Rule를 적용해야 되겠지만서도.......

웹서비스는 상호운영하는데 있어 XML 기반의 Protocol을 사용한다. 즉. Text기반의 Message로 상호간의 원하는 일을 수행한다는 것이다. 그래서 SOAP에서는 4종류의 messaging mode를 지원한다.

  1. RPC/Literal
  2. Document/Literal
  3. RPC/Encoded
  4. Document/Encoded

messaging mode는 messaging style(RPC/Document)과 encoding style(Section 5/Literal)에 의해 정의되는데 여기서는 RPC/Literal과 Document/Literal에 대해서 알아보겠다.

Figure 4. Document Literal and RPC Literal


Document / Literal

SOAP Body Element내에 well-formed XML Document가 embed되어 있는것을 말한다. List3에서는 namespace가 http://www.Monson-Haefel.com/jwsbook/PO 인 XML Schema에 따르는 XML Message가 embed되어 있다.

List3. A Document Style SOAP Message.

          <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:mi="http://www.Monson-Haefel.com/jwsbook/message-id"
xmlns:proc="http://www.Monson-Haefel.com/jwsbook/processed-by">
<soap:Header>
<!-- Header blocks go here -->
</soap:Header>
<soap:Body>
<po:purchaseOrder orderDate="2003-09-22"
xmlns:po="
http://www.Monson-Haefel.com/jwsbook/PO">
          
          
                <po:accountName>Amazon.com</po:accountName>
<po:accountNumber>923</po:accountNumber>
...
<po:book>
<po:title>J2EE Web Services</po:title>
<po:quantity>300</po:quantity>
<po:wholesale-price>24.99</po:wholesale-price>
</po:book>
</po:purchaseOrder>
</soap:Body>
</soap:Envelope>
          
          

RPC / Literal

주 로 기존의 Component를 web serivice화할때 사용하는 방식으로 RPC Request Message에는 method명과 input parameter명이 오고, RPC Response Message에는 return value와 output parameter or fault message가 온다. 기존의 component로는 servlet, stateless session bean, Java RMI object, CORBA object, DCOM component 등이 있다.

List4. An RPC/Literal SOAP Request Message

           
          
          
          List4에서는 SOAP Request Method로 getBookPrice를 call 했고 input parameter로 isbn을 넘겨주었다.
          
          <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:mh="http://www.Monson-Haefel.com/jwsbook/BookQuote">
<soap:Body>
<mh:getBookPrice>
<isbn>0321146182</isbn>
</mh:getBookPrice>
</soap:Body>
</soap:Envelope>
          
          

List5. An RPC/Literal SOAP Response Message

          <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:mh="http://www.Monson-Haefel.com/jwsbook/BookQuote" >
<soap:Body>
<mh:getBookPriceResponse>
<result>24.99</result>
</mh:getBookPriceResponse>
</soap:Body>
</soap:Envelope>

List5에서는 List4에 대한 응답으로 return value인 result를 반환하였다.

[ SOAP Fault ]

Message Path에서 어떠한 한 노드에서 error가 발생했다면 해당 SOAP Fault message는 이전단계의 node로 전송된다. 물론 이러한 방식은 Request / Response Messaging mode에서 발생하며 One-Way mode에서는 fault message를 전송하지 않는다. 예를 들어 Message Path상에 있는 3번째 node에서 error발생했다면 이전단계의 node에게만 fault message가 전송되며 최초의 node에는 message가 전송되지 않는다. fault message를 받은 node는 해당 fault에 대한 적절한 action을 취한 후 최초의 node에게 다른 fault message를 전송한다. SOAP message는 Body Element에 Fault Element를 포함하고 있는데 List6는 이에 대한 예제이다.

List6. A SOAP Fault Message.

          <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:mh="http://www.Monson-Haefel.com/jwsbook/BookQuote" >
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>
The ISBN value contains invalid characters
</faultstring>
<faultactor>http://www.xyzcorp.com</faultactor>
<detail>
<mh:InvalidIsbnFaultDetail>
<offending-value>19318224-D</offending-value>
<conformance-rules>
The first nine characters must be digits. The last
character may be a digit or the letter 'X'. Case is
not important.
</conformance-rules>
</mh:InvalidIsbnFaultDetail>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
          List6에서 보는바와 같이 fault message가 생성되었을 때 SOAP message의 Body는 Fault Element만을 포함하고 최초 Requester가 기대했던 Response는 포함되지 않는다. Fault Element에는 faulcode, faultstring, faultactor, detail element를 child element로 갖는다.
          
  • faultcode Element
  • faultstring Element
  • faultactor Element
  • detail Element

faultcode는 standard code 리스트가 오는데 Client, Server, VersionMismatch, MustUnderstand 등이 있다.

faulstring은 code와는 달리 가독성이 좋은 fault message가 온다.

faultactor는 error가 발생하고 fault를 생성한 node가 온다.

detail은 faultstring보다 더 자세한 message가 온다.

- 출처 : http://ammoguy.springnote.com/pages/2289108 -

'SOAP' 카테고리의 다른 글

JAVA로 SOAP 구축하기(3)  (0) 2011.04.05
JAVA로 SOAP 구축하기(2)  (0) 2011.04.05
[SOAP강좌] Java 서버 - Delphi 클라이언트  (0) 2011.04.05
기본 XML Web Services - MSDN  (0) 2011.04.05
JAVA로 SOAP을 구현하려면?  (0) 2011.04.05
Posted by 아로나
SOAP2011. 4. 5. 15:41

▶ SOAP

SOAP(Simple Object Access Protocol)에 대한 설명은 다른 사이트에 잘 나와 있으니 찾아 보세요.
여기에서는 Java로 SOAP 서버를 만들고, Tomcat으로 Web 서비스 하여, 클라이언트는 Delphi로 만들어 보겠습니다.
이와 같은 예가 외국 사이트를 찾아 보아도 별로 없더군요. 그래서 허접한 설명이지만 도움이 될까 해서 올립니다.
(기회가 되면 배열이나, Dataset도 구현 하고 싶지만 시간이 없어서...)

일부 소스와 내용은 에어콘 출판사의 차세대 자바 SOAP AXUS을 참조 했습니다.

▶ 준비물

JDK 1.4.x 이상 (http://java.sun.com)
Tomcat 4.1.36 (http://tomcat.apache.org/)
AXIS 1.4 (http://ws.apache.org/axis/)
Delphi 7 (http://www.borland.com)

▶ SOAP Web 서비스 설치

여기에서 JDK, Tomcat의 설치는 따로 하지 않겠습니다. 이것도 다른 사이트를 참조하세요.

1. axis-bin-1_4.zip 압축 풀기

Apache에서 받은 axis-bin-1_4.zip을 압축을 특정 폴더에 풀어 주세요. 저는 C:\SOAP\axis-1_4 에 풀었습니다.
앞으로 설명은 C:\SOAP\axis-1_4 으로 하겠습니다.

2. %tomcat_home%\conf\server.xml

아래 내용을 추가해서 AXIS 가상 경로를 추가 Tomcat을 다시 실행 시켜주세요.

<!-- Tomcat SOAP Context -->
<Context path="/axis" docBase="C:\SOAP\axis-1_4\webapps\axis" debug="0"
         reloadable="true" crossContext="true">
</Context>

▶ Java로 SOAP 서버 만들기

아래와 내용과 같이 HelloWorld.java을 만들고, 이 파일을 C:\SOAP\axis-1_4\webapps\axis 디렉토리에 확장자가 .jws로 수정 HelloWorld.jws을 C:\SOAP\axis-1_4\webapps\axis 복사해주세요.

HelloWorld.java 파일

public class HelloWorld {

  public HelloWorld() {
  }
 
  public String getHelloWorldMessage(String name) {
    return "Hello World to " + name;
  }
}

확인하기

지금까지 잘 하셨다면 브라우저에서 http://localhost:8080/axis/HelloWorld.jws 주소로 보시면 아래와 같이 나올 것입니다.

사용자 삽입 이미지















▶ WSDL 파일 만들기


SOAP의 WSDL 파일이 어떤 일을 하는지도 다른 사이트에 자세히 나와 있으니 이것도 다른 사이트에서 찾아보세요.
여기에서는 WSDL 파일을 AXIS을 이용해서 만들고, Delphi로 사용하는 방법만 설명하겠습니다.

브라우저에서 http://localhost:8080/axis/HelloWorld.jws 페이지를 열어서 Click to see the WSDL을 선택하시면 아래와 같이 나올 것입니다.

사용자 삽입 이미지


























이 내용을 복사해서 메모장에 붙여 넣은 후 HelloWorld.wsdl로 저장합니다.

▶ Delphi 로 Client 만들기

1. 새로운 프로젝트을 만들어 주세요.

2  File > New > Other... 선택 WebServices 창에서 WSDL Importer 아이콘을 더블 클릭

사용자 삽입 이미지




















3. HelloWorld.wsdl 선택하고, [Next] 버튼 선택

사용자 삽입 이미지
























4. [Finish] 버튼 선택

사용자 삽입 이미지
























지금까지 하셨으면 HelloWorld1.pas 파일이 만들어 졌을 것입니다.

5. Unit1.pas을 열어서 Button 과 Edit Box을 추가 해주세요

6. Unit1.pas 아래와 같이 코딩 해주세요. 추가된 코드는 파란색으로 표시 해두었습니다.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, HelloWorld1;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FHelloWorld : HelloWorld;
  public
    { Public declarations }
    function GetHelloWorldService(): HelloWorld;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.GetHelloWorldService(): HelloWorld;
begin
  if FHelloWorld = nil then begin
    FHelloWorld := GetHelloWorld();
  end;
  Result := FHelloWorld;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := GetHelloWorld().getHelloWorldMessage('AXIS');
end;


end.

▶ 실행 결과

사용자 삽입 이미지







- 출처 : http://bluexmas.tistory.com/20 크리스

'SOAP' 카테고리의 다른 글

JAVA로 SOAP 구축하기(2)  (0) 2011.04.05
JAVA로 SOAP 구축하기(1)  (0) 2011.04.05
기본 XML Web Services - MSDN  (0) 2011.04.05
JAVA로 SOAP을 구현하려면?  (0) 2011.04.05
Soap이란?  (0) 2011.04.05
Posted by 아로나
SOAP2011. 4. 5. 15:34

기본 XML Web Services

Roger Wolter

Microsoft Corporation

요약 : 이 기사는 SOAP, WSDL, UDDI 소개 및 개발자용 XML Web services 값의 개요를 설명합니다(6페이지/인쇄 페이지 기준).

목차

XML Web Service XML Web Service
SOAP SOAP
WSDL WSDL
UDDI UDDI
기타 기타

XML Web Service

XML Web services는 인터넷상에서 분산된 컴퓨팅으로 이동하는 데 기본이 되는 빌딩 블록입니다. 열린 표준과 통신 중심, 작업자 및 응용 프로그램간의 공동 작업으로 응용 프로그램을 통합하는 데 XML Web services가 플랫폼이 되는 환경을 만들었습니다. 응용 프로그램은 위치나 구현 방법과 상관없이 함께 작동하는 다양한 소스의 여러 XML Web services를 사용하여 구성됩니다.

XML Web Service를 만드는 회사가 많은 만큼 XML Web Service의 정의도 다양하겠지만 모든 정의에는 다음과 같은 공통점이 있습니다.

  • XML Web Services는 표준 웹 프로토콜을 통해 웹 사용자들에게 유용한 기능을 표시합니다. 대부분의 경우 SOAP 프로토콜이 사용됩니다.

  • XML Web services는 사용자와 대화할 수 있는 클라이언트 응용 프로그램을 만들 수 있는 인터페이스를 세부적으로 설명하는 방법을 제공합니다. 일반적으로 이 설명은 Web Services 설명 언어(WSDL) 문서라고 하는 XML 문서에 제공됩니다.

  • XML Web services는 잠재적인 사용자가 XML Web services를 쉽게 찾을 수 있도록 등록됩니다. XML Web services는 UDDI(Universal Discovery Description and Integration)에 등록됩니다.

    본 기사에서 위의 세가지 기술을 모두 설명하겠지만 XML Web services에 주의를 기울여야 하는 이유를 먼저 설명하겠습니다.

    XML Web services 아키텍처의 주요 장점 중 하나는 별도의 플랫폼에 별도의 언어로 작성된 프로그램들이 표준 기반으로 서로 통신할 수 있다는 점입니다. 이 점에 대해 산업 분야에 종사했던 사람들은 DEC 이전과 CORBA에서도 같은 내용이 있었기 때문에 차이점이 없을 것 같다는 의문이 생길 수 있습니다. 첫 번째 차이점은 SOAP가 이전의 접근 방법보다 훨씬 간단하여 표준 규격의 SOAP 구현을 입력하는 작업이 더욱 용이하다는 것입니다. Paul Kulchenko는 79항목이 포함된 마지막 카운트인 http://www.soapware.org/directory/4/implementations  tous.gif 에서 SOAP 구현 목록을 유지 관리합니다. SOAP 구현은 규모가 큰 소프트웨어 회사에서 찾을 수 있지만 개인 개발자가 작성하고 유지 관리하는 구현도 많이 찾을 수 있습니다. 이전에 비해 XML Web services가 갖는 또 다른 큰 장점은 표준 웹 프로토콜인 XML, HTTP 및 TCP/IP와 작동한다는 것입니다. 수 많은 회사들이 웹 인프라와 이를 유지 관리하는 지식과 경험이 있는 직원들을 갖추었기 때문에 XML Web services에 대한 항목에 소모되는 비용이 이전 기술에 비해 현저히 감소됩니다.

    지금까지 WSDL 파일에 설명되고 UDDI에 등록된 XML Web service를 SOAP를 통해 웹에 나타나는 소프트웨어 서비스로 정의했습니다. 그 다음 논리적인 질문은 XML Web services로 무엇을 할 수 있는가 하는 것입니다. 처음에 XML Web services는 주식 시세, 일기 예보, 스포츠 등 응용 프로그램에 쉽게 통합될 수 있는 정보원이었습니다. 원하는 정보를 분석하고 집계하여 다양한 방법으로 표시하도록 작성할 수 있는 응용 프로그램이 있습니다. 예를 들어, Microsoft® Excel 스프레드시트를 사용하여 주식, 401K, 은행 계좌, 대출 등의 전체 금융 상태를 요약할 수 있습니다. 이 정보를 XML Web services에서 사용할 수 있는 경우 Excel은 이 Web services를 계속 업데이트합니다. 이 정보 중 일부는 무료이며 어떤 정보는 서비스 구독이 필요할 수도 있습니다. 대부분의 정보는 웹에서 현재 사용할 수 있지만 XML Web services는 더욱 쉽고 안정적인 프로그래밍 방식으로 액세스됩니다.

    기존 응용 프로그램을 XML Web services로 나타내면 XML Web services를 빌딩 블록으로 사용하는 더욱 강력한 새 응용 프로그램을 작성할 수 있습니다. 예를 들어, 여러 공급업체의 가격 정보를 자동으로 얻을 수 있고 공급업체를 선택할 수 있으며 주문한 다음 제품이 도착할 때까지 배달 과정을 확인할 수 있습니다. 공급업체 응용 프로그램은 웹상에 서비스를 표시한 다음 XML Web services를 사용하여 고객의 신용 확인, 요금 부과 및 배달 회사에 배달을 의뢰할 수도 있습니다.

    앞으로 몇몇 중요한 XML 웹 서비스를 사용하면 웹을 사용하는 응용 프로그램을 지원하여 오늘날에는 실행하지 못하는 사항들을 실행할 수 있게 될 것입니다. 예를 들어, 일정 관리 서비스는 Microsoft .NET My Services tous.gif프로젝트가 지원하는 서비스 중 하나입니다. 치과 의사나 정비사가 XML Web service를 사용하여 일정을 관리하는 경우 고객이 온라인으로 시간 약속을 예약하거나, 고객이 원할 경우 치과 의사나 정비사가 직접 고객과 청소 및 정기 점검 약속을 할 수 있습니다.조금만 생각해 보면, 웹을 프로그램할 수 있는 능력이 있기만 하면 작성할 수 있는 응용 프로그램이 많이 있습니다.

    XML Web services 및 응용 프로그램 작성에 대한 더 자세한 내용은 MSDN Web services tous.gif홈 페이지를 참조하십시오.

SOAP

SOAP는 XML Web services용 통신 프로토콜입니다. SOAP를 통신 프로토콜로 설명하면 대부분의 사람들은 DCOM 또는 CORBA를 생각하고 "SOAP가 객체를 활성화하는 방법은 " 또는 "SOAP가 사용하는 이름 서비스는 " 등과 같은 질문을 합니다. SOAP 구현에 이러한 내용이 포함되기는 하지만 SOAP 표준은 이 내용을 지정하지 않습니다. SOAP는 메시지 즉, 요청된 사양의 일부에 대한 XML 형식을 정의하는 사양입니다. 몇몇 SOAP 요소에 포함된 올바른 형식의 XML 조각이 있는 경우 SOAP 메시지가 나타납니다. 간단합니다.

SOAP 사양의 다른 부분은 프로그램 데이터를 XML로 표시하고 SOAP를 사용하여 원격 프로시저 호출을 수행하는 방법을 설명합니다. 이러한 사양의 선택적 부품은 클라이언트에서 전송되는 SOAP 메시지에 호출 가능한 함수와 해당 함수에 전달되는 매개 변수가 포함되어 있는 RPC 스타일 응용 프로그램을 구현하는 데 사용되며 서버는 실행된 함수의 결과와 함께 메시지를 반환합니다. COM 또는 CORBA 응용 프로그램을 실행하는 프로그래머들은 RPC 스타일을 이해하기 때문에 현재 대부분의 SOAP 구현은 RPC 응용 프로그램을 지원합니다. 또한 SOAP는 SOAP 메시지가 XML 문서에서 래퍼 기능만 수행하는 문서 스타일 응용 프로그램도 지원합니다. 문서 스타일 SOAP 응용 프로그램은 매우 융통성이 있으며 여러 새 XML Web services는 이 장점을 활용하여 RPC를 사용하여 구현하기 어려운 서비스를 만듭니다.

SOAP 사양의 마지막 선택 부분은 SOAP 메시지를 포함한 HTTP 메시지의 형식을 정의합니다. HTTP 바인딩은 HTTP가 거의 모든 현재 OS 및 현재가 아닌 여러 OS에 의해 지원되기 때문에 중요합니다. HTTP 바인딩은 선택 사항이지만 SOAP에 대해 유일하게 표준화된 프로토콜이기 때문에 거의 모든 SOAP 구현은 HTTP 바인딩을 지원합니다. 이러한 이유로 인해 SOAP에 HTTP가 필요한 것으로 잘못 생각하는 경우가 있습니다. 몇몇 구현은 MSMQ, MQ 시리즈, SMTP 또는 TCP/IP 전송을 지원하지만 거의 모든 현재 XML Web services는 흔히 사용되는 HTTP를 사용합니다. HTTP는 핵심 웹 프로토콜이므로 대부분의 회사는 HTTP를 지원하는 네트워크 인프라와 이를 관리하는 인력을 갖추고 있습니다. 보안, 모니터링 및 HTTP에 대한 로드 균형 인프라는 오늘날 쉽게 사용할 수 있습니다.

SOAP를 시작할 때 혼동되는 주요 원인은 SOAP 사양과 여러 SOAP 사양 구현간의 차이점입니다. SOAP를 사용하는 대부분의 사람들은 SOAP 메시지를 직접 작성하지는 않지만 SOAP 도구 키트를 사용하여 SOAP 메시지를 만들고 구문 분석합니다. 일반적으로 이러한 도구 키트는 함수 호출을 몇몇 종류의 언어에서 SOAP 메시지로 변환합니다. 예를 들어, Microsoft SOAP Toolkit 2.0은 COM 함수 호출을 SOAP로 전환하고 Apache Toolkit는 JAVA 함수 호출을 SOAP로 변환합니다. 함수 호출의 유형과 지원되는 매개 변수의 데이터 유형은 각 SOAP 구현에 따라 다양하기 때문에 한 개의 도구 키트와 함께 작동하는 함수는 다른 도구 키트와 작동하지 않을 수도 있습니다. 이것은 SOAP의 제한 사항이 아니라 사용자가 사용하는 특정 구현입니다.

훨씬 강제적인 SOAP의 기능은 많은 별도의 하드웨어 및 소프트웨어 플랫폼에 구현되었다는 점입니다. 이것은 사용자의 회사 내부, 외부의 서로 다른 시스템을 연결하는 데 SOAP를 사용할 수 있다는 의미입니다. 과거에 시스템을 통합하는 일반 통신 프로토콜을 개발하려는 노력은 많았지만 아무도 SOAP를 일반적으로 채택하지는 않았습니다. 왜냐하면, SOAP는 이전의 많은 프로토콜에 비해 구현하는 데 훨씬 작고 단순했기 때문입니다. 예를 들어, DCE 및 CORBA는 구현하는 데 수 년이 걸렸기 때문에 소수의 구현만이 출시되었습니다. 그러나 SOAP는 기존의 XML 파서 및 HTTP 라이브러리를 사용하여 대부분의 힘든 작업을 수행하므로 수 개월 내에 SOAP 구현을 완료할 수 있습니다. 따라서 70종류의 SOAP 구현을 사용할 수 있습니다. SOAP는 DCE 또는 CORBA가 수행하는 작업을 모두 수행하지는 않지만 기능 교환이 복잡하지 않기 때문에 SOAP를 쉽게 사용할 수 있습니다.

HTTP의 보편성와 SOAP의 간소성이 동시에 존재하면 거의 모든 환경에서 호출할 수 있는 XML Web services를 구현하는 데 있어 이상적인 기반이 됩니다. SOAP에 대한 더 자세한 내용은 MSDN SOAP tous.gif홈 페이지를 참조하십시오.

보안

SOAP를 처음 사용하는 사람들의 첫 번째 질문 중 하나는 SOAP가 보안을 다루는 방법입니다. SOAP 개발 초기에는 SOAP가 HTTP 기반 프로토콜로 표시되어 HTTP 보안이 SOAP에 충분했습니다. 오늘날 수 많은 웹 응용 프로그램이 HTTP 보안을 사용하여 실행되므로 HTTP 보안은 SOAP에 충분합니다. 따라서 현재 SOAP 표준은 보안 문제보다는 전송 문제를 다룹니다.

SOAP가 여러 전송 작업에서 제대로 실행되는 보다 일반적인 용도의 프로토콜로 확장되면 보안은 더욱 큰 문제가 됩니다. 예를 들어, HTTP는 SOAP를 호출하는 사용자를 인증하는 몇 가지 방법을 제공하지만 메시지가 HTTP에서 SMTP로 전송될 때 해당 ID의 전파 방법에 대한 문제가 발생합니다. 다행히 SOAP는 빌딩 블록 프로토콜로 디자인되었기 때문에 SOAP를 작성하는 작업에 이미 사양이 포함되어 Web services에 대한 추가 보안 기능을 제공합니다. WS-Security specification tous.gif은 전체 암호화 시스템을 정의하고 WS-License specificationtous.gif은 호출자의 ID와 권한이 부여된 사용자만 Web service를 사용할 수 있도록 하는 기술을 정의합니다.

WSDL

whiz-dull이라고도 하는 WSDL는 Web Services Description Language의 약어입니다. 편의상, WSDL 파일을 SOAP 메시지 집합 및 해당 메시지가 교환되는 방법을 설명하는 XML 문서라고 할 수 있습니다. 다시 말해서 WSDL은 IDL이 CORBA 또는 COM인 SOAP입니다. WSDL은 XML이기 때문에 읽을 수 있고 편집할 수 있지만 대부분의 경우에는 소프트웨어에 의해 작성되고 사용됩니다.

WSDL의 값을 보려면 비즈니스 파트너가 제공하는 SOAP 메서드를 호출해야 합니다. 비즈니스 파트너에게 몇몇 예제 SOAP 메시지를 요청하고 해당 예제와 같은 메시지를 작성하고 사용하는 응용 프로그램을 작성할 수 있으나, 오류가 발생하기 쉽습니다. 예를 들어, 고객 ID가 2387인 경우 메시지가 문자열이면 ID는 정수입니다. WSDL은 요청 메시지에 포함되는 사항과 응답 메시지의 형식을 명백한 노테이션으로 지정합니다.

WSDL 파일이 메시지 형식을 설명하기 위해 사용하는 노테이션은 XML 스키마 표준을 기반으로 하며, 이것은 프로그래밍 언어 중립적이며 또한 표준 기반이어서 다양한 플랫폼과 프로그래밍 언어에서 액세스할 수 있는 XML Web services 인터페이스를 설명하기에 적합하다는 것을 의미합니다. WSDL은 메시지 컨텐트를 설명할 뿐만 아니라 서비스를 사용할 수 있는 위치 및 서비스와 대화하는 데 사용되는 통신 프로토콜을 정의합니다. 즉, WSDL 파일은 XML Web service와 함께 작동하는 프로그램을 쓰는 데 필요한 모든 사항을 정의합니다. WSDL 파일을 읽고 XML Web service와 통신하는 데 필요한 코드를 생성할 수 있는 몇 가지 도구가 있습니다. 그 중에서 성능이 뛰어난 몇몇 도구들이 Microsoft Visual Studio® .NET에 있습니다.

많은 현재 SOAP 도구 키트에는 기존 프로그램 인터페이스에서 WSDL 파일을 생성하는 도구가 포함되지만 WSDL을 직접 작성하는 도구는 거의 없으며 WSDL에 대해 필요한 만큼 도구가 지원되지 않습니다. WSDL 파일 작성자에게 도구가 지원되어 COM IDL과 같은 프록시 및 스텁을 작성하는 것은 대부분의 SOAP 구현의 일부분이 됩니다. 이런 점에서 WSDL은 XML Web services에 대한 SOAP 인터페이스를 만드는 데 좋은 방법입니다.

http://www.w3.org/TR/wsdl tous.gif에서 WSDL 사양을 볼 수 있으며 우수한 description of WSDL 을 사용할 수 있습니다.

UDDI

UDDI(Universal Discovery Description 및 Integration)는 Web services의 옐로 페이지입니다. 전통적인 옐로 페이지에서는 필요한 서비스를 제공하는 회사를 찾아 제공된 서비스를 검토한 후에 담당자와 연락하여 자세한 정보를 구할 수 있습니다. 지하실에서 비즈니스를 시작하고 말로 광고를 할 수 있는 것처럼 UDDI에 등록하지 않고도 Web service를 제공할 수는 있습니다. 그러나 시장을 넓히기 위해서는 고객이 Web services를 찾을 수 있도록 UDDI에 등록해야 합니다.

UDDI 디렉터리 항목은 비즈니스 및 제공되는 서비스를 설명하는 XML 파일입니다. UDDI 디렉터리의 항목은 세 부분으로 되어 있습니다. "화이트 페이지"는 서비스를 제공하는 회사의 이름, 주소, 연락처 등을 설명합니다. "옐로 페이지"에는 북미 산업 분류 시스템 및 표준 산업 분류 등과 같은 표준 분류법을 기반으로 하는 산업 범주가 나와 있습니다. "그린 페이지"는 Web service를 사용하는 응용 프로그램을 작성할 수 있도록 서비스에 인터페이스를 세부적으로 설명합니다. 서비스 방법은 유형 모델 또는 tModel이라고도 하는 UDDI 문서를 통해 정의됩니다. 많은 경우에, tModel에는 XML Web service에 SOAP 인터페이스를 설명하는 WSDL 파일이 포함되어 있지만 tModel은 융통성이 있어 거의 모든 종류의 서비스를 설명할 수 있습니다.

또한 UDDI 디렉터리에는 사용자의 응용 프로그램을 작성하는 데 필요한 서비스를 검색하는 몇 가지 방법이 있습니다. 예를 들어, 지정된 지역 및 지정된 유형의 비즈니스로 서비스 공급자를 검색할 수 있습니다. 그런 다음 UDDI 디렉터리는 정보, 연락처, 링크 및 기술적인 데이터를 공급하여 사용자의 요구 사항에 맞는 서비스를 평가할 수 있도록 합니다.

UDDI를 사용하여 Web services를 얻을 수 있는 비즈니스를 찾을 수 있습니다. 비즈니스 파트너는 알고 있지만 제공되는 서비스가 무엇인지 모를 경우에는 WS-Inspection specification tous.gif을 사용하여 특정 서버에 제공된 XML Web services의 컬렉션을 검색하여 필요한 서비스를 찾을 수 있습니다.

UDDI에 대한 더 자세한 내용은 http://www.uddi.org/about.html tous.gif를 참조하십시오.

기타

지금까지 XML Web services와의 대화 방법(SOAP), XML Web services 설명 방법(WSDL) 및 XML Web services 찾는 방법(UDDI)에 대해 설명했습니다. 이러한 사항들은 응용 프로그램 통계 및 집계에 대한 기초를 제공하는 기준 사양 집합을 구성합니다. 회사는 기준 사양을 이용하여 실제 솔루션을 구축하고 실제 값을 얻습니다.

실제 XML Web services를 만드는 데 많은 노력을 해왔지만 앞으로 더욱 많은 노력이 필요합니다. 오늘날 XML Web services를 성공적으로 작성하고는 있지만 보안, 운영 관리, 트랜잭션, 안정된 메시징과 같이 개발자가 개발해야 할 사항들이 여전히 남아 있습니다. 전역 XML Web Services 아키텍처는 모듈화 및 확장 가능한 XML Web services에 새 고급 기능을 추가하는 데 정확한 다용도 모델을 제공하여 XML Web services를 다음 단계로 이동할 수 있도록 도와줍니다.

위에서 언급한 보안 모듈(WS-Security tous.gifWS-License) tous.gif은 전역 Web Services 아키텍처의 사양 중 일부입니다. 운영 관리를 프로세싱하려면 여러 서버 간에 메시지를 라우팅하고 해당 서버를 동적으로 구성해야 하는데 이러한 작업도 전역 Web Services 아키텍처의 일부이며  WS-Routing specification tous.gif 및  WS-Referral specificationtous.gif과 일치합니다. 전역 Web Services 아키텍처가 발전함에 따라 해당 사양 및 기타 필요 사항이 소개됩니다.

더 자세한 내용은 Global XML Web Services Architecture tous.gif를 참조하십시오.

최종 수정일: 2002년 2월 6일


- 출처 : http://msdn.microsoft.com/ko-kr/library/ms996507.aspx -

'SOAP' 카테고리의 다른 글

JAVA로 SOAP 구축하기(2)  (0) 2011.04.05
JAVA로 SOAP 구축하기(1)  (0) 2011.04.05
[SOAP강좌] Java 서버 - Delphi 클라이언트  (0) 2011.04.05
JAVA로 SOAP을 구현하려면?  (0) 2011.04.05
Soap이란?  (0) 2011.04.05
Posted by 아로나
SOAP2011. 4. 5. 15:29

Tip: SOAP attachments와 JAX-RPC

 

 


난이도 : 중급

Russell Butek, 소프트웨어 엔지니어, IBM

2004 년 2 월 27 일

JAX-RPC는 SOAP with attachments를 지원한다. JAX-RPC API를 사용하여 MIME attachments를 보내는 방법을 이 글에서 설명한다.

SOAP 메시징 프로토콜은 SOAP 메시지들을 통해 MIME attachments를 보낼 수 있도록 한다. WSDL은 이 attachment의 디스크립션을 제공한다. JAX-RPC는 attachment의 WSDL 디스크립션을 자바로 매핑한다. 이 글에서 JAX-RPC 매핑을 사용하여 SOAP 메시지에서 attachment를 보내는 방법을 설명한다.

WSDL

attachment의 WSDL 디스크립션은 그다지 단순하지가 않다. Listing 1의 WSDL을 보자.


Listing 1. WSDL with attachments
<?xml version="1.0" encoding="utf-8"?>
<definitions
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
    targetNamespace="urn:attachment.tip"
    xmlns:tns="urn:attachment.tip">
  <message name="empty"/>
  <message name="imageMsg">
    <part name="image" type="xsd:hexBinary"/>
  </message>
  <message name="octetMsg">
    <part name="octet" type="xsd:hexBinary"/>
  </message>

  <portType name="AttachmentTip">
    <operation name="sendImage">
      <input message="tns:imageMsg"/>
      <output message="tns:empty"/>
    </operation>
    <operation name="sendOctet">
      <input message="tns:octetMsg"/>
      <output message="tns:empty"/>
    </operation>
  </portType>

  <binding name="AttachmentBinding" type="tns:AttachmentTip">
    <soap:binding style="rpc"
                  transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="sendImage">
      <soap:operation soapAction=""/>
      <input>
        <mime:multipartRelated>
          <mime:part>
            <soap:body use="literal"/>
          </mime:part>
          <mime:part>
            <mime:content part="image" type="image/jpeg"/>
          </mime:part>
        </mime:multipartRelated>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
    <operation name="sendOctet">
      <soap:operation soapAction=""/>
      <input>
        <mime:multipartRelated>
          <mime:part>
            <soap:body use="literal"/>
          </mime:part>
          <mime:part>
            <mime:content part="octet" type="application/octet-stream"/>
          </mime:part>
        </mime:multipartRelated>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>

  <service name="AttachmentService">
    <port name="AttachmentTip" binding="tns:AttachmentBinding">
      <soap:address
          location="http://localhost:9080/attachment/services/AttachmentTip"/>
    </port>
  </service>

</definitions>

WS-I와 attachments


MIME 유형은 WSDL의 '인터페이스'로 정의될 수 없다. WS-I organization (참고자료)은 모든 MIME 유형을 위한 새로운 XML 유형을 도입하여 부분적이라도 이러한 단점을 보완을 시도하고 있다: wsi:swaRef. 이 글을 쓰는 당시에는 이 유형은 작업중에 있었으며 표준화된 자바 바인딩이 존재하지 않았음을 밝힌다.

우선 기억해야 할 것은 항상 바인딩에 대처하기 전까지는 어떤 MIME 정보도 없다는 것이다. 한 순간이라도 바인딩을 무시하고 WSDL의 '인터페이스'(portType과 메시지)만을 본다면 두 개의 오퍼레이션인 sendImagesendOctet를 보게 될 것이다. 이들 각각은 hexBinary 인풋을 갖고 있다. hexBinarybyte[]로 매핑한다. 단지 이 정보만을 이용하여 이 portType이 Java language Service Endpoint Interface (SEI)로 매핑되는 것을 짐직할 수 있다. 이것은 두 개의 메소드를 갖고 있는데 각각 하나의 byte[] 매개변수를 갖고있다. 이는 MIME 유형을 제외한 모든 것에 알맞은 생각이다. 하지만 MIME 유형의 경우 실제 매개변수 유형을 결정하려면 바인딩을 살펴보아야한다.

바인딩에서 오퍼레이션용 인풋이 실제로 MIME 콘텐트 유형인 image/jpegapplication/octet-stream이라는 것을 알 수 있다. hexBinary가 아니다. JAX-RPC는 이들을 java.awt.Imagejavax.activation.DataHandler에 매핑하도록 정의한다.




위로


Service Endpoint Interface

Listing 2에는 Listing 1의 WSDL에서 만들어진 Java language SEI가 포함되어 있다.


Listing 2. AttachmentTip SEI
package tip.attachment;

import java.awt.Image;
import java.rmi.Remote;
import java.rmi.RemoteException;
import javax.activation.DataHandler;

public interface AttachmentTip extends Remote {
    public void sendImage(Image image) throws RemoteException;
    public void sendOctet(DataHandler octet) throws RemoteException;
}

WSDL의 sendImage 오퍼페이션은 java.awt.Image 매개변수를 이용하여 자바 프로그램 메소드가 된다. 매우 단순하고 깔끔하다. 표 1은 MIME 유형을 자바 유형으로 매핑한 리스트이다.

표 1 - JAX-RPC 매핑

MIME Type Java Type
image/gif, image/jpeg java.awt.Image
text/plain java.lang.String
multipart/* javax.mail.internet.MimeMultipart
text/xml, application/xml javax.xml.transform.Source



위로


클라이언트 구현

JAX-RPC 구현을 사용하여 AttachmentTip WSDL에서 모든 클라이언트 쪽 매핑을 만든다고 가정한다. 클라이언트 구현은 이 매핑에 의존할 것이고 특히 Listing 2의 AttachmentTip SEI를 의존한다.

attachments의 클라이언트 구현은 우선 Service에서 SEI의 구현을 얻는 것으로 시작한다.(Listing 3).

sendImage 메소드 호출하기

SEI 구현을 갖게 되면 attachment로 이 메소드를 호출할 수 있다. sendImage의 경우, 이 attachment는 java.awt.Image 이다. 이 뿐이다. JAX-RPC 구현은 모든 이미지가 attachment로서 보내지는 것을 알고 있고 이에 따라 SOAP 메시지를 만든다. 클라이언트 프로그래머는 attachment가 개입되었는지를 알 필요가 없다. (Listing 3).


Listing 3. AttachmentTip 클라이언트 구현과 sendImage 호출
package tip.attachment;

import java.awt.Image;
import java.awt.Toolkit;

import java.net.URL;

import java.rmi.RemoteException;

import javax.xml.namespace.QName;

import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;

public class AttachmentTipClient {

    static AttachmentTip getTip() throws Exception {
        QName serviceName = new QName(
                "urn:attachment.tip",
                "AttachmentService");
        URL wsdlLocation = new URL(
                "http://localhost:9080/attachment/services/AttachmentTip?wsdl");
        ServiceFactory factory = ServiceFactory.newInstance();
        Service service = factory.createService(wsdlLocation, serviceName);
        QName portName = new QName("", "AttachmentTip");
        return (AttachmentTip) service.getPort(
                portName,
                AttachmentTip.class);
    }

    static void sendImage(AttachmentTip tip, String fileName)
            throws RemoteException {
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Image image = toolkit.createImage(fileName);
        tip.sendImage(image);
    }

    public static void main(String[] args) {
        try {
            AttachmentTip tip = getTip();
            sendImage(tip, args[0]);
        }
        catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

sendOctet 메소드 호출하기

비 지정 MIME 유형을 매핑할 때 유의할 점


JAX-RPC는 표 1에 나타나지 않은 MIME 유형을 지원하는 구현을 필요로하지 않는다. 구현은 비 지정 MIME 유형을 DataHandler로 매핑하지 않을 수도 있다. 예를 들어, WebSphere 웹 서비스는 Application Server 6.0 버전이 나오기 전까지는 이 매핑을 지원하지 않는다.

JAX-RPC가 매핑을 정의한 몇 가지 MIME 유형이 있다는 것은 다행이다. (표 1 참조). For those MIME types for which there is no explicit 뚜렷한 JAX-RPC 매핑이 없는 MIME 유형의 경우 javax.activation.DataHandler 객체와 함께 남아있다. 이 클래스는 Java Activation Framework (JAF -- 참고자료)의 일부이다. 따라서 JAF에 대해 알아야한다. 그다지 어렵지 않다. DataHandler에는 javax.activation.DataSource가 포함되어 있고 인풋과 아웃풋 스트림이 포함되어 있다. 대부분의 자바 프로그래밍 유형은 이 스트림에서 매우 쉽게 변환된다. 게다가 활성화 프레임웍도 도움이 된다. attachment 데이터가 파일에 있으면 활성화 프레이웍은 javax.activation.FileDataSource 클래스를 제공하고 따라서 스트림 단계를 우회할 수 있다.(Listing 4) .


Listing 4. 완전한 AttachmentTip 클라이언트 구현
package tip.attachment;

import java.awt.Image;
import java.awt.Toolkit;

import java.net.URL;

import java.rmi.RemoteException;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;

import javax.xml.namespace.QName;

import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;

public class AttachmentTipClient {

    static AttachmentTip getTip() throws Exception {
        QName serviceName = new QName(
                "urn:attachment.tip",
                "AttachmentService");
        URL wsdlLocation = new URL(
                "http://localhost:9080/attachment/services/AttachmentTip?wsdl");
        ServiceFactory factory = ServiceFactory.newInstance();
        Service service = factory.createService(wsdlLocation, serviceName);
        QName portName = new QName("", "AttachmentTip");
        return (AttachmentTip) service.getPort(
                portName,
                AttachmentTip.class);
    }

    static void sendImage(AttachmentTip tip, String fileName)
            throws RemoteException {
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Image image = toolkit.createImage(fileName);
        tip.sendImage(image);
    }

    static void sendOctet(AttachmentTip tip, String fileName)
            throws RemoteException {
        FileDataSource fds = new FileDataSource(fileName);
        DataHandler dh = new DataHandler(fds);
        tip.sendOctet(dh);
    }

    public static void main(String[] args) {
        try {
            AttachmentTip tip = getTip();
            sendImage(tip, args[0]);
            sendOctet(tip, args[0]);
        }
        catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

두 개의 attachment 작동에 대한 데이터로 같은 파일을 사용했지만 어디까지나 이것은 sendOctet에 한해서였다는 것을 기억하라. 이를 고려하지 않는다면 상상에 맡기겠다. application/octet-streamFileDataSource용 디폴트 콘텐트 유형이다. 이것이 바로 내가 이를 사용한 이유이다. 파일에 데이터를 갖고 있지 않다면 application/octet-stream 말고 다른 것으로 보내야한다. DataSource의 구현을 만들어야 하지만 이는 간단한 인터페이스이기 때문에 많은 노력이 필요하지는 않다.




위로


참고자료




위로


필자소개

Russell Butek: IBM WebSphere Web services engine 개발자. IBM JAX-RPC Java Specification Request (JSR) 전문가 그룹 대표.



- 출처 : http://www.ibm.com/developerworks/kr/webservices/library/ws-tip-soapjax.html#N100EA -

'SOAP' 카테고리의 다른 글

JAVA로 SOAP 구축하기(2)  (0) 2011.04.05
JAVA로 SOAP 구축하기(1)  (0) 2011.04.05
[SOAP강좌] Java 서버 - Delphi 클라이언트  (0) 2011.04.05
기본 XML Web Services - MSDN  (0) 2011.04.05
Soap이란?  (0) 2011.04.05
Posted by 아로나
SOAP2011. 4. 5. 14:17

1. Soap이란?

 

-SOAP(Simple Object Access Protocol)은 일반적으로 널리 알려진 HTTP,HTTPS,SMTP등을 사용하여 XML기반의 메시지를 컴퓨터 네트워크 상에서 교환하는 형태의 프로토콜

 

-SOAP은 웹 서비스(Web Service)에서 기본적인 메시지를 전달하는 기반

 

2. Soap 작동원리

 대다수의 방화벽이 웹 포트인 80 포트만 허용하기 때문에 SOAP은 대부분 HTTP에 의존하여 메시징 처리가 이루어진다. SOAP이 인터넷을 통한 메시징 처리의 표준으로 자리 잡을 수 있었던 이유는 HTTP 위에 SOAP이 올라갈 수 있기 때문이다. HTTP위에 SOAP이 올라간다는 것은 HTTP의 요청과 응답에 메시지에 SOAP 메시지가 포함될 수 있다는 것을 의미한다.

 SOAP 스펙은 SOAP 메시지들이 단방향(one-way)이 아니라 양방향(two-way)이라고 말하고 있다 서버뿐 아니라 클라이언트도 SOAP메시지를 해석할 수 있어야 한다.

 

SOAP에 HTTP를 이용하는 이유
·          HTTP는 이미 널리 구현되어 있으며, 이해하기 쉬운 프로토콜이다.
·          그 자체가 가지고 있는 요청/응답 패러다임이 RPC와 잘 들어 맞는다.
·          이미 대부분의 방화벽이 HTTP에서 작업할 수 있도록 설정되어 있다.
·          HTTP보안 소켓 레이어(Secure Sockets Layer, SSL)를 이용하여 쉽게 보안을 구축 할 수 있다.
·        현재의 주 컴포넌트 기술로 일컬어지는 JAVA, CORBA, COM 등은 목적은 비슷하지만 목적을 구현하는 방법은 매우 다르므로 호환성을 기대하기 어렵다.
 
SOAP TCP HTTP뿐만 아니라 SMTP 같은 다양한 프로토콜과도 함께 사용할 수 있는 것이다. 메시징 서버를 사용해서 메시지 처리를 할 때와 마찬가지로, SOAP은 기본적으로 단방향으로 메시지를 보낸다. 송신자는 메시지를 보내지만, 수신자로부터 메시지를 받지는 않는다. 하지만 송신자가 메시지를 보내고 그 결과로 다시 SOAP 프로토콜을 통해 메시지를 받는 것은 가능하다.
 

 

 
3. Soap 메시지 구조
 SOAP 메시지는 크게 SOAP Envelope, SOAP Header, SOAP Body, SOAP Fault로 구성되어있다.
 

 

·           SOAP Envelope : EnvelopeSOAP 메시지를 감싸는 가장 상위의 요소이다. EnvelopeHeaderBody를 가질 수 있다.
 
·           SOAP Header : Header는 메시지에서 필수적인 요소는 아니지만 SOAP 메시지에 기능을 추가 하는 역할을 담당한다. 여러 가지 정보를 헤더에 담기 위해 여러 개의 블록으로 구성되어 있으며, HeaderEnvelope 태그 다음에 가장 먼저 나오는 항목이어야 한다. 보통 Header는 인코딩, 인증, 트랜잭션 같은 관리적인 문제에 사용된다.
 
·           SOAP Body : BodySOAP을 통해 전송할 데이터로 채워진다. 여러 개의 블록으로 구성될 수 있으며, 요청할 때 요청할 웹 서비스의 이름과 매개변수로 채워지고, 응답할 때는 결과로 채워진다.
 
·           SOAP Fault : SOAP 처리를 한 후 발생하는 에러 처리 메시지가 이 영역에 채워진다. SOAP Fault는 에러에 대한 자세한 내용을 기술할 수 있도록 다음과 같이 여러 개의 요소를 지원한다.
 
-         <faultcode> : 에러의 종류를 코드로 구분할 수 있도록 해준다. 웹 서비스 소비자는 이 코드를 보고 어떤 종류의 에러가 발생했는지 알 수 있다. SOAP에는 SOAP 메시징에서 일어날 수 있는 기본 코드를 정의하고 있고 웹 서비스 제공자가 별도로 정의할 수도 있다.
-         <faultstring> : 코드가 기계적인 내용인 데 반해, 스트링은 사람이 에러에 대한 내용을 읽고 이해할 수 있도록 해준다.
-         <faultactor> : 메시징 처리를 하는 중에 어떤 부분에서 에러가 발생했는지 알릴 때 사용된다.
-         <detail> : Body에 관련된 데이터 때문에 SOAP 메시징이 성공하지 못했을 경우에 사용된다. 만약 에러가 발생했는데 <detail> 부분이 없다면, Body와 관련된 부분에서 에러가 발생하지 않았다는 것을 알 수 있다.
 
 
 4. Soap의 데이터베이스 접근방법
 
         The SOAP developer's approach to such a problem is to encapsulate the database request logic for the service in a method (or function) in C or VB or Java etc, then set up a process that listens for requests to the service; such requests being in SOAP format and containing the service name and any required parameters. As mentioned, the transport layer might be HTTP though it could just as easily be SMTP or something else. Now, the listener process, which for simplicity is typically written in the same language as the service method, decodes the incoming SOAP request and transforms it into an invocation of the method. It then takes the result of the method call, encodes it into a SOAP message (response) and sends it back to the requester. Conceptually, this arrangement looks like the following:
 
 
 
예 ) ORACLE 

 

 

5. Soap Message Packet

 

 

Client code makes a service call by invoking the appropriate method in the SOAP package (1). The

SOAP package's SOAP serializer converts this invocation into a SOAP request and sends that to t

e HTTP encoder (2). The HTTP encoder wraps the SOAP message in a HTTP request and sends it

o the SOAP server (3). The response is received from the SOAP server by the HTTP encoder/deco

er module(4) which decodes it and extracts the SOAP response which it hands to the SOAP deser

alizer(5). The SOAP deserializer deserializes the message and passes the result to the client code

(6) as the return value to the orginal invocation (1).

 

 

 

 

 

 Appserver process receives a HTTP request from the SOAP Client at the SOAP service's URL (1) and passes it accordingly to the SOAP servlet (2). The SOAP servlet uses the package-supplied HTTP and SOAP decoding functionality to extract the details of the services call (3 and 4), ie. the method name and method parameters. Once armed with these the SOAP servlet can invoke the method (5 and 6), encode the response (7 and 8) and supply the HTTP response to the HTTP Request handler (9) which in turn replies to the SOAP Client (10). Note that the Servlet Thread box simply indicates what is running in the Servlet's VM.

'SOAP' 카테고리의 다른 글

JAVA로 SOAP 구축하기(2)  (0) 2011.04.05
JAVA로 SOAP 구축하기(1)  (0) 2011.04.05
[SOAP강좌] Java 서버 - Delphi 클라이언트  (0) 2011.04.05
기본 XML Web Services - MSDN  (0) 2011.04.05
JAVA로 SOAP을 구현하려면?  (0) 2011.04.05
Posted by 아로나