본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/xml

[Soap] xml 웹서비스, Soap 방식 총정리

by 미노드 2023. 6. 9.

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

지금은 Rest 방식 전송을 많이 선호하는 편이지만, Rest가 등장하기 전에는 SOAP이 사용되었다.
SOAP 만의 장점이 존재하기도 하며, 기존의 SOAP 을 사용하는 곳은 Rest 로 전환하는데 드는 비용 문제도 있다보니 아직 사용되는 곳이 존재한다.

최근에 서비스개발을 진행할때도 rest로 개발하는데,
전송 용량이나 구현 방식이 더욱 간편하고 효율적이다보니 SOAP 방식을 굳이 구현해서 사용할 일이 많지 않다.
나는 회사에서 사용하다보니 어쩔 수없이 사용방법이나 개념을 정리해본다.

1. Soap 의 역할이 무엇이고 어떤 구성을 가지고있나?

SOAP은 웹 서비스에서 기본적인 메시지를 전달하는 구조다.
일반적으로 Soap 방식으로 전송 이라고도 한다.
SOAP에는 몇가지 형태의 메시지 패턴이 있지만, 보통의 경우 원격 프로시져 호출(Remote Procedure Call:RPC) 패턴으로, 네트워크 노드(클라이언트)에서 다른 쪽 노드(서버)로 메시지를 요청 하고, 서버는 메시지를 즉시 응답하게 된다.

SOAP은 XML을 근간으로 헤더와 바디를 조합하는 디자인 패턴으로 설계되어 있다.
「header」는 선택사항으로 반복이나 보안 및 트랜잭션을 정보로 하는 메타 정보를 가지고 있다.
「body」부분은 주요한 정보인 정보를 가지고 있다.

Soap의 특징을 정리해보면 다음과 같다.
* 기존 원격 기술들에 비해서 프록시와 방화벽에 구애받지 않고 쉽게 통신 가능하다.
* 플랫폼과 프로그래밍 언어에 독립적이다.
* 웹 서비스를 제공하기 위한 표준(WSDL, UDDI, WS-*)이 잘 정립되어 있다.
* 에러 처리에 대한 내용이 기본으로 내장되어 있다.
* 분산 환경에 적합하다.
* 복잡한 구조로 인해 오버헤드가 있으며, 이는 SOAP의 확장을 저해하고 있다.
* REST에 비해 상대적으로 무겁고 속도도 느리다.
* 개발 난이도가 높아 개발 환경의 지원이 필요하다.

Soap 메시지 예제

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
32
33
<?xml version='1.0' Encoding='UTF-8' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> 
 <env:Header>
  <m:reservation xmlns:m="http://travelcompany.example.org/reservation" 
        env:role="http://www.w3.org/2003/05/soap-envelope/role/next">
   <m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference>
   <m:dateAndTime>2007-11-29T13:20:00.000-05:00</m:dateAndTime>
  </m:reservation>
  <n:passenger xmlns:n="http://mycompany.example.com/employees" 
        env:role="http://www.w3.org/2003/05/soap-envelope/role/next">
   <n:name>Fred Bloggs</n:name>
  </n:passenger>
 </env:Header>
 <env:Body>
  <p:itinerary xmlns:p="http://travelcompany.example.org/reservation/travel">
   <p:departure>
     <p:departing>New York</p:departing>
     <p:arriving>Los Angeles</p:arriving>
     <p:departureDate>2007-12-14</p:departureDate>
     <p:departureTime>late afternoon</p:departureTime>
     <p:seatPreference>aisle</p:seatPreference>
   </p:departure>
   <p:return>
     <p:departing>Los Angeles</p:departing>
     <p:arriving>New York</p:arriving>
     <p:departureDate>2007-12-20</p:departureDate>
     <p:departureTime>mid-morning</p:departureTime>
     <p:seatPreference></p:seatPreference>
   </p:return>
  </p:itinerary>
 </env:Body>
</env:Envelope>
 
cs

Soap을 다루기 위해 기본적으로 알아둬야 하는 개념들이 있는데, 다음 포스팅에 정리해봤다.
https://teck10.tistory.com/281

 

[XML] SOAP 서비스를 작동하기 위해 알아야 할 것들

SOAP 형식을 서비스 하기위해 알아야 할 정보들이 여럿 존재한다. xsd와 wsdl, soap형식, soapaction 같은 용어들도 알아야 한다. 일반적으로 wsdl이 있으면 soap을 작성할 예제를 만들 수 있으며 validation ch

onpups.pe.kr

동작하는 방식을 정리하자면,
(request)서비스 요청자가 SOAP로 인코딩하여 웹 서비스 요청을 서비스 제공자에게 전달하며,
(response)서비스 제공자는 이를 디코딩하여 적절한 서비스 로직을 수행시켜서 결과를 얻고, 그 결과를 다시 SOAP로 인코딩하여 반환한다.

즉, soap 형식으로 전달하여 요청하면, soap 형식으로 응답을 받는다.

2. Envelope 영역

Envelope는 모든 SOAP 메시지의 루트 요소이며 두 개의 하위 요소인 
선택적 Header 요소 및 필수 Body 요소를 포함한다.

Envelope 요소에도 옵션을 달 수 있는데, 아래같은 네임스페이스와 옵션이 들어간다.

<접두사:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding" >
    ...
    ...
</접두사:Envelope>

xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"

네임스페이스의 접두사들과 uri는 여러가지 사용할 수 있으며, 용도에 맞게 골라야 하는데,
각 uri들의 역할은 별도로 정리해두겠다.
용도에 따라 특정 uri가 빠지면 응답에서 실패로 뜨기도 하기에 provider 측과 소통이 필요하다.

3. Soap Header 영역

Header영역은 SOAP 메시지에 대한 응용 프로그램 정보가 들어간다.

xml 구조를 띠고있다보니 xml 요소의 형태로 Header 영역에 들어가는데,
요소의 이름은 원하는데로 결정할 수 있으며, 요소의 옵션이 선택적으로 들어가는 형식이다.

구분을 위해 namespace를 자주 사용하며, xmlns를 같이 사용한다.
양식을 정리해보자면 이런 식이다.
<접두사:요소  xmlns:접두사="uri"  soap:actor="uri"  soap:mustUnderstand="uri" soap:role="uri">data</접두사:요소>
<접두사:요소  xmlns:접두사="uri"  soap:actor="uri">data</접두사:요소>
<접두사:요소  xmlns:접두사="uri"  >data</접두사:요소>
참조 : https://www.w3big.com/ko/soap/soap-header.html#gsc.tab=0

4. Soap Body 영역

Envelope의 필수 하위 요소이며 메시지의 정보가 들어가는 공간이다.

전송시킬 데이터를 Body영역에 담아 보내는게 일반적이다.
Header에는 메시지의 설명, 구분, 특징이 들어가는데 이용하는 부분에서의 차이점이 있다.
구분해서 조합해 사용하면 된다.

5. SOAP Fault 영역

Fault는 Body의 하위 요소이며 오류 보고에 사용된다.

주로 Response 영역에서 확인할 수 있으며, 보통 fault 내용이 담겨있다.

....마무리

이번 포스팅을 정리하자면,
- soap 형식이 어떻게 생긴 것이고, 각 요소별 특징과 용도를 정리
인 것이다.

soap 형식으로 통신을 하려면 기본적으로 soap 형식이 뭔지는 알아야 될것 아닌가...
그런데 워낙 오래된 방식이다보니 제대로 된 설명글이나 메뉴얼을 찾기 어렵다.

실제로 soap으로 통신하려면 이번처럼 soap 형식 뿐만 아니라, xsd와 wsdl 도 알아야 한다.

wsdl은 xsd로 이루어진 문서이며, soap 형식의 정의하는 문서이다.
각 xsd로 통신시 wsdl을 통해 validation check까지 담당한다.
soap문서를 작성할 때 wsdl을 참조해야 하기도 하다보니, 프로젝트 생성시 wsdl을 이용해 프로젝트를 자동으로 만들어 주는 기능도 존재한다.

이는 별도 포스팅을 통해 정리하겠다.