달력

122024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

http://tong.nate.com/junprio/36676524

“SOAP
은 분산 환경에서 구조화된 정보를 교환하기 위한 경량 프로토콜이다. SOAP은 확장성 있는 메시지 프레임워크를 정의하기 위해 XML 기술을 사용하고, 하부에 다양한 프로토콜을 사용하여 데이터가 교환될 수 있는 메시지 구조를 제공한다. 이 프레임워크는 특정 프로그래밍 모델이나 구현 방식에 독립적일 수 있도록 디자인 되어있다.”
 
SOAP는 객체에 접근하기 위한 프로토콜이다. 리모트에 있는 객체를 참조하기 위한 다양한 정의를 할 수 있는 것이 SOAP이다. 처음에는 SOAP이 특정 컴포넌트, DCOM이나 CORBA 같은 객체의 메소드를 리모트로 서비스하는 데 집중하였기 때문에 프로토콜 이름에 Object라는 말이 들어갔다. 하지만 SOAP는 객체의 메소드를 서비스하는 것에 만족하지 않고 이제 메시징 처리를 위한 기본 프로토콜로 변모하였다. SOAP이 메시지 처리의 기본 프로토콜로 자리 잡은 이유는 단순하다는 것 때문이다. 단순하고 가볍기 때문에 인터넷을 기반으로 사용할 수 있는 것이다.
SOAP은 산업 표준인 XML에 기반하고 있기 때문에 어떤 애플리케이션에서도 사용할 수 있는 프로토콜인 것이다.
 
1.     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)를 이용하여 쉽게 보안을 구축 할 수 있다.
 
SOAP TCP HTTP뿐만 아니라 SMTP 같은 다양한 프로토콜과도 함께 사용할 수 있는 것이다. 메시징 서버를 사용해서 메시지 처리를 할 때와 마찬가지로, SOAP은 기본적으로 단방향으로 메시지를 보낸다. 송신자는 메시지를 보내지만, 수신자로부터 메시지를 받지는 않는다. 하지만 송신자가 메시지를 보내고 그 결과로 다시 SOAP 프로토콜을 통해 메시지를 받는 것은 가능하다.
 
2.     SOAP 메시지의 구조
SOAP 메시지는 크게 SOAP Envelope, SOAP Header, SOAP Body, SOAP Fault로 구성되어있다.
 

SOAP Envelope
SOAP Header
 
SOAP Body
SOAP Body Block
 
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와 관련된 부분에서 에러가 발생하지 않았다는 것을 알 수 있다.
 
SOAP Request


사용자 삽입 이미지

 
SOAP Response


사용자 삽입 이미지

 
SOAP Fault


사용자 삽입 이미지



http://blog.empas.com/inter999/3354100


3.     SOAP 인코딩
SOAP 메시지는 모두 문자로 이루어진 XML 문서이기 때문에 SOAP 메시지를 처리하는 응용프로그램은 SOAP 메시지의 데이터를 숫자로 처리해야 할지 아니면 문자열로 처리해야 될지를 결정해야 한다. 응용프로그램이 SOAP 메시지의 데이터를 임의의 데이터형으로 처리할 수도 있지만, SOAP 메시지에서 표기한 데이터형으로 처리하도록 해야 한다. 데이터형의 표기 방법은 아무렇게 하는 것이 아니고 발신자와 수신자가 모두 이해하는 정해진 규칙으로 작성해야 한다.
자바 기본형인 Boolean, byte, short, int, float, double SOAP 메시지에서 어떻게 표기해야 되고, 배열은 어떻게 표기해야 되는지를 정해 놓은 것이 SOAP 인코딩이다.
 
encodingStyle
발신자가 SOAP 메시지를 생성할 때에 <Envelop> 엘리먼트의 encodingStyle 속성값으로 어떤 표기법을 이용해서 데이터형을 지정했는가를 명시해야 한다. encodingStyle 속성은 <Envelop> 엘리먼트가 아니라 어떠한 엘리먼트에서도 기술될 수 있다. 엘리먼트의 인코딩 스타일 결정 규칙은 다음과 같이 간단하다.
 
·          만약 엘리먼트가 encodingStyle 속성을 가지고 있다면, 이 엘리먼트의 인코딩 스타일은 encodingStyle 속성 값과 같다.
·          만약 엘리먼트가 encodingStyle 속성을 가지고 있지 않고, 상위 엘리먼트에 인코딩 스타일이 있다면, 해당 엘리먼트의 인코딩 스타일은 상위 엘리먼트의 인코딩 스타일과 동일하다.
·          만약 위의 조건을 만족하지 않으면, 엘리먼트에 특정 인코딩 스타일이 적용되지 않는다.
 
SOAP 설계 명세서가 규정하고 있는 하나의 인코딩 규칙이 있는데,
[ SOAP-ENV:encodingStyle=http://schemas.xmlsoap.org/soap/encoding ]
 
을 사용하는 것이다. SOAP에서는 디폴트 인코딩을 지원하지 않기 때문에 명시적으로 인터딩을 기술해야 한다. SOAP 설계 명세서에서는 인코딩에 관한 강제성이 없어 자신만의 인코딩 스타일을 선택할 수도 있다. 이때는 수신자도 그 인코딩을 이해하고 있어야 한다.
 
SOAP설계 명세서에서 기술되어있는 데이터 표기법에는 단순 타입과 복합 타입이 있다.
 
단순 타입(Symple Type) 표기법
단순 타입이란 프로그램언어에서 기본 데이터 타입 이라고 생각하면 된다. 아래는 문법이다.
 

<엘리먼트 xsi:type=”xsd:데이터타입”>데이터</엘리먼트>

 
다음은 자바 기본형 및 String 데이터 형에 해당하는 XML 스키마 기반의 단순 타입이다.

자바 데이터형
단순 타입
boolean
xsd:boolean
byte
xsd:byte
short
xsd:short
Int
xsd:int
long
xsd:long
float
xsd:float
double
xsd:double
String
xsd:string

 
다음은 사용법이다.

<?xml version="1.0" encoding="UTF-8"?>
 
<env:Envelope
  xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:enc=http://schemas.xmlsoap.org/soap/encoding/
  xmlns:ns0=http://localhost:8080/hello/webservice/wsdl/webservice a원격프로시져
  env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> a 인코딩 스타일
 
  <env:Body>
    <ns0:sayHello> a 원격 프로시져의 접두사와 메소드명
      <String_1 xsi:type="xsd:string">mincheol</String_1> a 인자명, 데이터형, 데이터
    </ns0:sayHello>
  </env:Body>
</env:Envelope>

주의: 메소드명, 인자명은 수신자에서 실행될 원격 프로시저를 정의해 놓은 웹 서비스 명세서 WSDL 문서에서 지정된 이름을 반드시 사용해야 합니다.
 
복합 타입(Compound Type) 표기법
배열과 구조체(클래스)를 복합 타입으로 구분한다. 배열은 같은 종류의 데이터 타입만 값으로 가질 수 있고 index을 사용하여 값을 저장하고, 읽는다. 구조체는 서로 다른 데이터 타입을 멤버로 가지고 있고, 멤버의 이름을 통해 값을 저장하고, 읽을 수 있다.
 
배열 표기법

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:enc="http://schemas.xmlsoap.org/soap/encoding/"
              xmlns:ns0="http://localhost:8080/hello/webservice/wsdl/webservice"
              env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <env:Body>
       
        <!-- 메소드 지정및 인자 지정 :
             인자는 array 엘리먼트에서 지정한 id로 링크 건다.-->
        <ns0:addBook>
            <arrayString-1 href="#bookarray"/>
        </ns0:addBook>
       
        <!-- id:배열식별자와 데이터형을 지정한다. -->
        <array id="bookarray" xsi:type="enc:Array" enc:arrayType="xsd:string[3]">
            <item>book1</item>
            <item>book2</item>
            <item>book3</item>
        </array>
    </env:Body>
</env:Envelope>

·           id 속성은 원격 프로시저 호출 시에 이 배열을 참조하여 사용할 수 있도록 배열 식별자를 지정해준다.
·           xsi:type 속성은 이 엘리먼트가 배열형임을 나타내기 위해 사용한다.
·           enc:arrayType 속성은 데이터 타입과 배열의 크기를 지정하기 위해 사용된다.
 
구조체 표기법
자바에서 구조체는 클래스를 말한다. 여기서 Book이라는 클래스가 있고 프로퍼티로 String:title, int:price을 가지고 있다고 gettersetter 메소드가 존재한다고 가정하자. 발신자가 요청 SOAP 메시지에서 Book클래스을 사용하도록 하기 위해서는 시스템 제공자는 웹서비스 명세서 WSDL문서에서 types 엘리먼트의 자식 엘리먼트로 Book 클래스형을 정의해 두어야 한다. 이에 관한 자세한 내용은 WSDL단원에서 설명하기로 하겠습니다.
 

<?xml version="1.0" encoding="UTF-8"?>
 
<!--
    ns0 : 원격 프로시저의 네임스페이스 접두사
    ns1 : 구조체의 네임스페이스 접두사
-->
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:enc="http://schemas.xmlsoap.org/soap/encoding/"
              xmlns:ns0="http://localhost:8080/wsdl/webservice"
              xmlns:ns1="http://localhost:8080/type/webservice"
              env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <env:Body>
       
        <ns0:addBook>
            <Book_1 href="#ID1"/>
        </ns0:addBook>
       
        <book id="ID1" xsi:type="ns1:Book">
            <!-- 멤버변수명, 데이터형, 값 지정 -->
            <title xsi:type="xsd:string">book1</title>
            <price xsi:type="xsd:int">9000</price>
        </book>
    </env:Body>
</env:Envelope>

'Soap & WebService' 카테고리의 다른 글

SOAP 모델에 따른 인코딩방식  (0) 2008.08.20
SOAP Version 1.2 스펙 한글판  (0) 2008.08.20
SOAP message  (0) 2008.08.20
Webservice, Soap, wsdl  (0) 2008.08.20
SOAP 인코딩 스타일 비교  (0) 2008.05.24
Posted by 알 수 없는 사용자
|