SOAP에 대하여..
요약
SOAP는 분산 환경에서 구조적이고 타입이 있는 정보를 XML을 이용해서 교환하기 위한 프로토콜로서, 문서 중심 메시지 통신과 원격 함수 호출을 위한 표준화된 방법을 제공한다. XML과 HTTP POST를 사용하기 때문에 간단하고 SOAP 메시지는 웹서비스의 public, fine, bind 오퍼레이션을 지원한다.
웹 서비스에서 SOAP은 EDI와 RPC 두 가지 용도로 사용된다. SOAP 메시지의 구성 중 Envelope 원소는 Header와 Body라는 자식 원소를 갖는다. 헤더 부분은 생략할 수 있지만, 바디 부분은 반드시 기술하여야 한다. SOAP에서 사용되는 데이터 타입들은 스칼라 타입과 합성 타입으로 구분할 수 있다. SOAP 메시지는 헤더 정보를 옵션으로 포함할 수도 있다. 그리고 바디 부분에는 실질적으로 처리되어야 할 정보들을 가지고 있다.
클라이언트와 서버 사이에 SOAP 메시지들이 이동하는데, 이 메시지들은 보통 HTTP 프로토콜을 통해서 전달된다. 서버에서 응답하는 경우에도 HTTP 프로토콜을 사용한다.
SOAP(Simple Object Access Protocol)
SOAP는 분산 환경에서 구조적이고 타입이 있는 정보를 XML을 이용해서 교환하기 위한 프로토콜로서, 처음에는 MS에서 제안되었으며 W3C에서 1.1이 표준화되었고, 현재는 1.2 버전이 표준화되고 있다.
기존에 분산 환경에서 원격 함수를 호출하는 방법은 CORBA의 IIOP(Internet Inter-ORB Protocol)나 DCOM의 ORPC(Object Remote Procedure Call)와 같은 프로토콜을 이용하는 것이었다.
그러나, 이러한 통신 프로토콜들은 통신 포맷이 바이너리 형태로 되어 있기 때문에 서로 통신할 수 없다는 문제점이 있다. 이러한 문제를 해결하기 위해서 CORBA-DCOM 브리지를 사용할 수 있지만, 복잡하고, 호환성에 문제가 있다.
IIOP와 ORPC 등의 바이너리 프로토콜은 플랫폼이 다양한 인터넷 환경에서는 적당하지 않기 때문에 XML을 이용한 원격 함수 호출 방법을 고안하게 되었다. 이러한 필요성 때문에 개발된 것이 SOAP이다. SOAP은 XML을 사용하는 텍스트 기반의 프로토콜이기 때문에 다음과 같은 장점을 가지고 있다.
● 텍스트 기반 프로토콜이기 때문에 구현이 쉽다.
● 사람이 읽을 수 있는 텍스트 형태의 요청이기 때문에 디버깅이 쉽다.
● 호환성이 높기 때문에 널리 사용될 수 있다.
일반적으로 SOAP은 HTTP 네트워크 프로토콜 위에서 실행된다. HTTP 프로토콜은 모든 플랫폼의 웹 서버와 웹 브라우저에서 지원하고 있으며, PDA와 핸드폰 등의 소형 가전 제품에서 사용할 수 있는 장점이 있다. SOAP에 관한 보다 자세한 문서는 http://www.w3.org/TR/SOAP/ 사이트에서 찾을 수 있다.
SOAP 1.1은 2개의 네임스페이스를 정의하고 있다. SOAP-ENV 접두어를 사용하는 경우에 http://schemas.xmlsoap.org/soap/envelope/ 네임스페이스를 사용한다. 인코딩과 관련되어서 SOAPENC 접두어를 사용하는 경우에는 http://schemas.xmlsoap.org/soap/encoding/ 네임스페이스를 사용한다. SOAP 1.1에서는 이 두 개의 네임스페이스 이외에 xsd 접두어를 사용하는 http://www.w3.org/1999/XMLSchema 네임스페이스와 xsi 접두어를 사용하는 http://www.w3.org/1999/XMLSchemainstance 네임스페이스를 같이 사용한다. xsd와 xsi는 XML 스키마와 관련된 네임스페이스이다.
웹 서비스에서 SOAP은 다음과 같은 두 가지 용도로 사용된다.
● EDI(Electronic Data Interchange) - 문서 스타일 SOAP(document style SOAP)이라고도 하며 주로 전자 문서를 교환하기 위해서 사용된다. 예로는 물품 주문서, 세금 계산서 등을 SOAP을 이용하여 전달하는 경우이다. 문서 스타일 SOAP을 위해서 SUN에서는 JAXM(Java API for Messaging)을 제공한다.
● RPC(Remote Procedure Call) - 원격 함수를 호출하기 위해서 사용되는 SOAP이다. SOAP을 통해서 전달되는 내용은 호출할 메소드의 이름, 매게 변수, 리턴 값이다. RPC 스타일 SOAP 을 위해서 SUN에서는 JAX-RPC를 제공한다.
다음 그림은 웹 서비스 구조에서 XML 메시징과 네트워크 프로토콜을 보여준다. 응용프로그램에서 원격 함수 호출이 있으면, 내부적으로 원격 메소드 호출에 관한 사항들이 SOAP 메시지로 변환되어 서버로 전달된다. 서버에서는 SOAP 형태로 전달된 메시지를 응용프로그램에 전달하고, 메소드를 호출한다.
서비스 제공자나 요청자가 되기 위해서 기본적으로 필요한 요구 사항은 네트워크 기능과 함께 SOAP 메시지를 작성하거나 파싱할 수 있는 기능이다. 일반적으로 웹 응용프로그램 서버에서 실행되는 SOAP 서버는 이러한 기능들을 수행한다. SOAP 메시지는 기본적으로 SOAP 전송자(sender)에서 SOAP 발신자(receiver)로 단 방향 전송이다. 그러나, 응용프로그램에서는 요청과 응답 및 대화 형태의 통신으로 확정될 수 있다.
SOAP 메시지는 다음 그림과 같은 형태로 구성되어 있다. Envelope 원소는 Header와 Body라는 자식 원소를 갖는다. 헤더 부분은 생략할 수 있지만, 바디 부분을 반드시 기술하여야 한다.
Envelope는 네임스페이스 선언과 추가적인 속성을 포함할 수 있다. 추가적인 속성을 가지는 경우에는 네임스페이스를 사용하여야 한다. Envelope의 encodingStyle 전역 속성은 SOAP 메시지에서 직렬화 규칙을 지시하기 위해서 사용된다, 이 속성은 임의의 원소에서 사용될 수 있으며, 속성이 적용되는 범위는 속성이 사용된 원소 내부이다. SOAP 메시지에는 디폴트 인코딩은 없지만 잠정적으로 XML 스키마를 사용한다.
SOAP에서 사용되는 데이터 타입들은 스칼라 타입(scalar type)과 합성 타입(compound type)으로 구분할 수 있다. 스칼라 타입은 한 개의 값만 갖는 경우이고, 합성 타입은 구조체나 배열과 같이 여러 개의 값을 갖는 경우이다. SOAP에서 스칼라 타입은 XML Schema에서 정의한 단순 타입들이 사용된다.
SOAP에서 배열을 기술하기 위해서는 원소 타입과 배열의 크기를 기술하여야 한다. 배열 타입을 기술하기 위해서는 먼저 xsi:type 속성을 Array라고 기술하고, arrayType 속성에 배열의 크기를 기술한다.
SOAP 메시지는 헤더 정보를 옵션으로 포함할 수도 있다. 헤더는 Envelope 원소의 첫 번째 자식 원소로 나타나며, SOAP 메시지에 대한 메타 정보를 제공한다. 즉, 헤더는 SOAP 메시지가 어떻게 처리되어야 하는지에 대한 정보를 가지고 있다. 예를 들어, 라우팅 정보, 인증 정보, 트랜잭션 정보 등을 포함한다. Header 원소는 헤더 정보를 위한 자식 원소들을 포함할 수 있으며, Header의 자식 원소의 경우에는 네임스페이스를 사용하여야 한다. mustUnderstand 전역 속성은 SOAP 메시지를 받는 프로그램이 헤더 엔트리를 반드시 처리하여야 하는지 혹은 옵션으로 처리 하여야 하는지를 기술하기 위해서 사용된다. mustUnderstand 속성 값이 ‘1’인 경우에 SOAP 메시지를 처리하는 프로그램은 헤더 엔트리에 포함된 의미에 따라서 처리하여야 한다.
바디 부분에는 실질적으로 처리되어야 할 정보들을 가지고 있다. Envelope 원소는 오직 하나의 Body 자식 원소를 가진다. Body 원소는 필요한 경우에 많은 자식 원소를 포함할 수 있다. Body 원소의 내용이 메시지가 된다. Body 원소는 네임스페이스를 갖고, DTD 참조나 처리 명령어를 갖지 않으면서 유효하고, 잘 정의된 XML 문서를 포함할 수 있다.
다음 예는 원격 함수를 호출하는 클라이언트의 요청을 SOAP으로 표현한 것이다. 이 SOAP 메시지는 Header 원소를 포함하고 있지 않다.
<예> SOAP 요청(원격 함수 호출 요청) |
1 <?xml version="1.0" encoding="UTF-8"?> 2 <SOAP-ENV:Envelope 3 SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 4 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 5 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 6 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 7 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> 8 <SOAP-ENV:Body> 9 <ns1:echoString xmlns:ns1="http://soapinterop.org/"> 10 <arg0 xsi:type="xsd:string">Hello World</arg0> 11 </ns1:echoString> 12 </SOAP-ENV:Body> 13 </SOAP-ENV:Envelope> |
❇ 설명
2 : Envelope 원소를 기술한다.
3,4,5,6,7: SOAP의 네임스페이스를 기술한다.
8 : Body 원소를 기술한다. Body 원소 내부에는 실제 데이터가 포함되어 있다.
9 : 호출할 원격 함수의 이름을 기술한다. 함수 이름은 echdString()이고, 네임스페스는 http://soapinterop.org/ 이다.
10 : echdString() 메소드의 매개 변수 이름은 arg0 이고, 데이터 타입은 xsd:string 타입이다.
또한 매개 변수의 값은 “Hello World"이다.
클라이언트에서 원격 메소드 호출에 대한 요청이 SOAP 문서로 전달되면, 서버는 해당 메소드를 호출하고, 결과 값을 클라이언트에 전달하게 된다. 다음 예는 서버가 함수를 호출하고 결과를 클라이언트에 전달하는 것을 SOAP으로 표현한 것이다.
<예> SOAP 응답(원격 함수 호출 응답) |
1 <?xml version="1.0" encoding="UTF-8"?> 2 <SOAP-ENV:Envelope 3 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 4 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 6 <SOAP-ENV:Body> 7 <ns1:echoStringResponse 8 SOAP-ENV:encoding="http://schema.xmlsoap.org/soap/encoding/" 9 xmlns:ns1="http://soapinterop.org/"> 10 <echoStringResult xsi:type="wsd:string"> 11 1 th:Hello World</echoStringResult> 12 </ns1:echoStringResponse> 13 </SOAP-ENV:Body> 14 </SOAP-ENV:Envelope> |
❇ 설명
7,8,9 : echoString()메소드의 결과임을 표시하기 위해서, echoStringResponse원소를 사용한다.
10,11 : echoString()메소드의 리턴 타입은 xsd:string 타입이고, 값은 “1 th : Hello World” 이다.
클라이언트와 서버 사이에 SOAP 메시지들이 이동하는데, 이 메시지들은 보통 HTTP 프로트콜을 통해서 전달된다. 메시지 처음 부분에는 HTTP를 위한 헤더 메시지가 있고, 내용 부분에 SOAP 요청 메시지가 포함된다.
서버에서 응답하는 경우에도 HTTP 프로토콜을 사용한다.
결론
● 경량 프로토콜로 CORBA, RMI, DCOM과 같은 다른 분산 컴퓨팅 프로토콜의 내용보다 적기 때문에 프로토콜 자체가 복잡하지 않고 가벼운 것 같다.
● Text-based XML 포멧 사용하므로 하드웨어 플랫폼, 운영체제, 프로그래밍 언어 전 영역에 걸쳐서 독립적인 프로토콜이다.
● 기본적으로 HTTP 프로토콜로 전송 되므로 인터넷 연결 시스템과 추가 적인 구성없이 통신 가능하다.
● 방화벽에 제한되지 않으나 반대로 비허가 사용자도 SOAP 응용프로그램에 접근할 수 있게 되므로 보안을 고려해야 할 것 같다.
● 관련된 XML 표준에 대해 잘 숙지해야 XML을 잘 활용할 수 있을 것 같다.
출처 : 자바 개발자를 위한 XML/ 홍익, 자바개발자를 위한 XML 프로그래밍/ 한빛
'Robotics > Software Tech.' 카테고리의 다른 글
MFC 샘플 소스코드 (0) | 2007.09.20 |
---|---|
메세지 펌프(Message Pump) (0) | 2007.09.08 |
SOAP(Simple Object Access Protocol) (0) | 2007.09.06 |
CString to Hex Decimal (1) | 2007.09.06 |
[MFC Tip] 화면보호기 실행 방법 (0) | 2007.08.30 |