SOAP란 Simple Object Access Protocol의 약자로 XML기반의 메세지 교환 프로토콜입니다
SOAP는 서로 다른 플랫폼 언어로 구현된 애플리케이션 간에
구조화된 정보를 주고받기 위해 설계되었습니다
모든 메세지가 XML문서 형태로 인코딩되므로 언어나 플랫폼에 독립적입니다
주로 HTTP를 이용하지만 SMTP, JMS 등의 프로토콜을 통해서도 메세지를 전송할 수 있습니다
SOAP Header를 통해 보안, 트랜잭션, 인증, 라우팅 등 다양한 확장이 가능합니다
WS-Security, WS-ReliableMessaging, WS-Transaction 등 고급 웹서비스 표준과 결합할 수 있습니다
SOAP Fault를 통해 표준적일 오류 처리를 지원합니다
SOAP 메세지는 Envelope, Header, Body, Fault 구성요소로 이루어집니다
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header>
<m:Authentication xmlns:m="http://example.org/auth">
<m:UserName>JohnDoe</m:UserName>
<m:Password>1234</m:Password>
</m:Authentication>
</soap:Header>
<soap:Body>
<m:GetPrice xmlns:m="http://example.org/stock">
<m:StockName>Google</m:StockName>
</m:GetPrice>
</soap:Body>
<soap:Fault>
<soap:Code>
<soap:Value>soap:Sender</soap:Value>
</soap:Code>
<soap:Reason>
<soap:Text>Invalid Stock Name</soap:Text>
</soap:Reason>
</soap:Fault>
</soap:Envelope>
요소명 | 필수 여부 | 설명 |
---|---|---|
Envelope | 필수 | SOAP 메세지 전체를 감싸는 최상위 요소 |
Header | 선택 | 확장 정보를 포함(보안, 인증, 라우팅 등) |
Body | 필수 | 실제 요청 및 응답 데이터를 포함 |
Fault | 선택 | 오류 발생 시 오류정보를 표준적으로 포함 |
SOAP 메세지 처리 중 오류가 발생하면, Fault 요소를 이용하여 표준화된 형태로 응답합니다
<soap:Fault>
<soap:Code>
<soap:Value>soap:Sender</soap:Value>
<soap:Subcode>
<soap:Value>m:InvalidMessage</soap:Value>
</soap:Subcode>
</soap:Code>
<soap:Reason>
<soap:Text xml:lang="en">Invalid Stock Name</soap:Text>
</soap:Reason>
<soap:Detail>
<m:ErrorDetail xmlns:m="http://example.org/stock">
The provided stock name was not recognized.
</m:ErrorDetail>
</soap:Detail>
</soap:Fault>
SOAP는 기본적으로 전송 프로토콜과 독립적이지만, 대표적인 전송 방식은 다음과 같습니다.
HTTP를 사용할 경우 일반적으로 POST 메서드를 사용하며, 메시지의 MIME 타입은 다음과 같습니다.
text/xml
application/soap+xml
SOAP | REST |
---|---|
프로토콜이 엄격하고 명확함 | 가볍고 가벼운 구조 |
XML 기반 | XML, JSON 등 자유로운 포맷 사용 |
Stateful 가능 | Stateless를 원칙으로 함 |
확장성이 뛰어나지만 복잡함 | 간단하고 직관적인 제공 |
서버가 클라이언트의 이전 요청 상태를 전혀 기억하지 않고, 모든 요청이 독립적으로 처리되는 방식입니다
각 요청에 서비스 수행에 필요한 모든 정보가 포함되어야 합니다
서버가 클라이언트와의 세션 상태를 저장/관리하며, 연속된 요청을 하나의 흐름으로 취급합니다
초기 요청 이후 추가정보를 서버가 내부적으로 유지합니다
참고로 SOAP의 기본 스펙은 stateless이며,
WS-* 확장(WS-ReliableMessaging, WS-AtomicTransaction)을 붙여 stateful 플로우를 구현
할 수 있습니다