상세 컨텐츠

본문 제목

Chapter 2 SOAP(Simple Object Access Protocol) - 2

프로그래밍/웹서비스

by 라제폰 2008. 12. 13. 19:35

본문

 
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 à원격프로시져
  env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> à 인코딩 스타일
 
  <env:Body>
    <ns0:sayHello> à 원격 프로시져의 접두사와 메소드명
      <String_1 xsi:type="xsd:string">mincheol</String_1> à 인자명, 데이터형, 데이터
    </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>

관련글 더보기