SOAP/WSDL vs REST

API์˜ ๊ตฌ์กฐ๋ฅผ ์ด์•ผ๊ธฐํ•  ๋•Œ, ๋Œ€ํ‘œ์ ์œผ๋กœ SOAP๊ณผ REST๊ฐ€ ํ”ํžˆ ๋น„๊ต๋œ๋‹ค. SOAP์€ ํ”„๋กœํ† ์ฝœ์ด๋ฉฐ, REST๋Š” ์•„ํ‚คํ…์ณ ์Šคํƒ€์ผ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • SOAP๋Š” ๋ถ„์‚ฐ ์ปดํ“จํŒ… ํ™˜๊ฒฝ์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ REST๋Š” ์ง€์  ๊ฐ„ ํ™˜๊ฒฝ์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ๋‹ค.

  • WADL์„ ์‚ฌ์šฉํ•˜์—ฌ REST ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.

SOAP(Simple Object Access Protocol)

https://dydals5678.tistory.com/4

SOAP(Simple Object Access Protocol)์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋„๋ฆฌ ์•Œ๋ ค์ง„ HTTP, HTTPS, SMTP ๋“ฑ์„ ํ†ตํ•ด XML ๊ธฐ๋ฐ˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ๊ตํ™˜ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. -์œ„ํ‚คํ”ผ๋””์•„-

SOAP๋Š” SOA๋ฅผ ๋”ฐ๋ฅด๋Š” ์›น์„œ๋น„์Šค ๋””์ž์ธ ํ‘œ์ค€์ด๋ฉฐ, WSDL(Web Services Description Language)์„ ์ด์šฉํ•ด ์ •์˜ํ•œ๋‹ค. XML์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ—ค๋”์™€ ๋ฐ”๋””๋ฅผ ์กฐํ•ฉํ•˜๋Š” ๋””์ž์ธํŒจํ„ด์œผ๋กœ ์„ค๊ณ„๋œ๋‹ค.

์žฅ์ 

  • ํ”Œ๋žซํผ๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋…๋ฆฝ์ ์ด๋‹ค.

  • ๋ถ„์‚ฐ์ปดํ“จํŒ… ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ธ์ด๋‹ค.(์š”์ฒญ๊ณผ ์‘๋‹ต์ด ๋งค์šฐ ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ณ  DTD๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค)

  • ์›น์„œ๋น„์Šค๋ฅผ ์œ„ํ•ด ๋„๋ฆฌ ์‚ฌ์šฉํ•˜๋Š” ํ‘œ์ค€์ด๋ฉฐ, ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜๋‹ค.

๋‹จ์ 

  • ์–ด๋ ต๊ณ , ๋ฌด๊ฒ๊ณ , ๋А๋ฆฌ๋‹ค.

์ฆ‰, ์˜์‚ฌ ์†Œํ†ต๊ณผ ๊ฐ™์€ ์—„๊ฒฉํ•œ ๊ณ„์•ฝ์„ ์ฒด๊ฒฐํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉ ํ•˜๋‹ค.

SOA(Service Oriented Architecture)

https://mblogthumb-phinf.pstatic.net/20151102_101/wndrlf2003_1446452548035Gkxze_PNG/soa.png?type=w2

SOA๋ž€ ๋Œ€๊ทœ๋ชจ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ๋•Œ์˜ ๊ฐœ๋…์œผ๋กœ ์—…๋ฌด์ƒ์˜ ์ผ ์ฒ˜๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ธฐ๋Šฅ์„ ์„œ๋น„์Šค๋กœ ํŒ๋‹จํ•˜์—ฌ ๊ทธ ์„œ๋น„์Šค๋ฅผ ๋„คํŠธ์›Œํฌ์ƒ์— ์—ฐ๋™ํ•˜์—ฌ ์‹œ์Šคํ…œ ์ „์ฒด๋ฅผ ๊ตฌ์ถ•ํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค. ์œ„ํ‚คํ”ผ๋””์•„

์ฆ‰, ๋น„์ฆˆ๋‹ˆ์Šค ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋…๋ฆฝ์ ์ธ ์„œ๋น„์Šค๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋ฉฐ, ์ด๋กœ ์ธํ•ด ๊ฐ ์„œ๋น„์Šค๋“ค์„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ฌถ์–ด ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๊ณต๊ธ‰์—…์ฒด์™€ ํ˜‘๋ ฅ์—…์ฒด ๋ฐ ๊ณ ๊ฐ๋“ค๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณ€ํ™” ์š”๊ตฌ์—์„œ ์‹ ์†ํžˆ ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

WSDL(Web Services Description Language)

WSDL์€ ์›น ์„œ๋น„์Šค ๊ธฐ์ˆ ์–ธ์–ด ๋˜๋Š” ๊ธฐ์ˆ ๋œ ์ •์˜ ํŒŒ์ผ์˜ ์ด์นญ์œผ๋กœ XML๋กœ ๊ธฐ์ˆ ๋œ๋‹ค. ์›น ์„œ๋น„์Šค์˜ ๊ตฌ์ฒด์  ๋‚ด์šฉ์ด ๊ธฐ์ˆ ๋˜์–ด ์žˆ์–ด ์„œ๋น„์Šค ์ œ๊ณต ์žฅ์†Œ, ์„œ๋น„์Šค ๋ฉ”์‹œ์ง€ ํฌ๋งท, ํ”„๋กœํ† ์ฝœ ๋“ฑ์ด ๊ธฐ์ˆ ๋œ๋‹ค. - ์œ„ํ‚คํ”ผ๋””์•„ -

https://upload.wikimedia.org/wikipedia/commons/c/c2/WSDL_11vs20.png

WSDL์€ SOAP๊ณผ XML ์Šคํ‚ค๋งˆ๋ฅผ ๊ฒฐํ•ฉํ•ด ์ธํ„ฐ๋„ท ์ƒ์— ์›น ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

  • ์›น ์„œ๋น„์Šค์˜ name, URL ์ •๋ณด

  • SOAP ๋ฉ”์„ธ์ง€์˜ ์ธ์ฝ”๋”ฉ ๊ทœ์น™

  • SOAP ๋ฉ”์„ธ์ง€ ์ „์†ก์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ ์ •๋ณด

  • ์›น์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ •๋ณด(type, including name, operations, parameter, data)

<description>
    <types></types>
  <interface></interface>
  <binding></binding>
  <service></service>
</description>

2.0๋ฒ„์ „์€ ์œ„์˜ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ, ์•„๋ž˜๋Š” ์˜ˆ์‹œ์ด๋‹ค.

  • types(types,message)

    • ๋ฉ”์„ธ์ง€๋‚˜ ํ”„๋กœ์‹œ์ €์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์„ค์ •

    • ๋ฉ”์„ธ์ง€ ์ „์†ก๊ณผ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ ํฌ๋งท ์ •์˜

  • interface(portType)

    • WSDL๋ฌธ์„œ๋Š” ์ด์™€ ๊ฐ™์ด ๊ตฌ์ฒด์ ์œผ๋กœ ๋ฌผ๋ฆฌ์ ์ธ ๋ถ€๋ถ„(๋ฐ์ดํ„ฐ ํƒ€์ž…)์—์„œ ์ถ”์ƒ์ ์ด๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๋ถ€๋ถ„(์ธํ„ฐํŽ˜์ด์Šค)๊นŒ์ง€ ๋ชจ๋‘ ํฌ๊ด„ํ•ด ์ฐธ์กฐ ๊ฐ€๋Šฅ

  • binding

    • ๋…ผ๋ฆฌ์  ๋ชจ๋ธ๊ณผ ๋ฌผ๋ฆฌ์  ๋ชจ๋ธ ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ์„ ์ œ๊ณต

    • ์ด๋ฏธ ์ •์˜ํ•œ ์ถ”์ƒ์ ์ธ ํฌํŠธํƒ€์ž…์— ์žˆ๋Š” SOAP๋ฅผ ์–ด๋–ป๊ฒŒ ์ „์†กํ•  ๊ฒƒ์ธ์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ธฐ์ˆ ํ•œ ์‹ค์ œ ํฌํŠธ์— ์—ฐ๊ฒฐ

    • SOAP์— HTTP์™€ SMTP๊ฐ™์€ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ก์‹œ๋‚˜ ๋ฐฉํ™”๋ฒฝ์€ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ณด์•ˆ์„ฑ์— ์žˆ์–ด์„œ๋Š” ์ทจ์•ฝ

  • service

    • ํฌํŠธ ํƒ€์ž…๊ณผ ๋ฐ”์ธ๋”ฉ์„ ์ด์šฉํ•ด์„œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์›น ์ฃผ์†Œ ๋˜๋Š” URL ์ง€์ •

    • SOAP ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•œ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•

<?xml version="1.0" encoding="UTF-8"?>
<description xmlns="http://www.w3.org/ns/wsdl"
             xmlns:tns="http://www.example.com/wsdl20sample"
             xmlns:whttp="http://www.w3.org/ns/wsdl/http"
             xmlns:wsoap="http://www.w3.org/ns/wsdl/soap"
             targetNamespace="http://www.example.com/wsdl20sample">


<!-- Abstract types(๋ฐ์ดํ„ฐ ํƒ€์ž…/method์˜ ์ธ์ž์™€ ๋ฆฌํ„ด ๊ฐ’ ์„ ์–ธ) -->
   <types>
      <xs:schema xmlns="http://www.example.com/wsdl20sample"
                 xmlns:xs="http://www.w3.org/2001/XMLSchema"
                 targetNamespace="http://www.example.com/wsdl20sample">

         <xs:element name="request">
            <xs:complexType>
               <xs:sequence>
                  <xs:element name="header" maxOccurs="unbounded">
                     <xs:complexType>
                        <xs:simpleContent>
                           <xs:extension base="xs:string">
                              <xs:attribute name="name" type="xs:string" use="required"/>
                           </xs:extension>
                        </xs:simpleContent>
                     </xs:complexType>
                  </xs:element>
                  <xs:element name="body" type="xs:anyType" minOccurs="0"/>
               </xs:sequence>
               <xs:attribute name="method" type="xs:string" use="required"/>
               <xs:attribute name="uri" type="xs:anyURI" use="required"/>
            </xs:complexType>
         </xs:element>

         <xs:element name="response">
            <xs:complexType>
               <xs:sequence>
                  <xs:element name="header" maxOccurs="unbounded">
                     <xs:complexType>
                        <xs:simpleContent>
                           <xs:extension base="xs:string">
                              <xs:attribute name="name" type="xs:string" use="required"/>
                           </xs:extension>
                        </xs:simpleContent>
                     </xs:complexType>
                  </xs:element>
                  <xs:element name="body" type="xs:anyType" minOccurs="0"/>
               </xs:sequence>
               <xs:attribute name="status-code" type="xs:anySimpleType" use="required"/>
               <xs:attribute name="response-phrase" use="required"/>
            </xs:complexType>
         </xs:element>
      </xs:schema>
   </types>


<!-- Abstract interfaces : ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ -->
   <interface name="RESTfulInterface">
      <fault name="ClientError" element="tns:response"/>
      <fault name="ServerError" element="tns:response"/>
      <fault name="Redirection" element="tns:response"/>
      <operation name="Get" pattern="http://www.w3.org/ns/wsdl/in-out">
         <input messageLabel="GetMsg" element="tns:request"/>
         <output messageLabel="SuccessfulMsg" element="tns:response"/>
      </operation>
      <operation name="Post" pattern="http://www.w3.org/ns/wsdl/in-out">
         <input messageLabel="PostMsg" element="tns:request"/>
         <output messageLabel="SuccessfulMsg" element="tns:response"/>
      </operation>
      <operation name="Put" pattern="http://www.w3.org/ns/wsdl/in-out">
         <input messageLabel="PutMsg" element="tns:request"/>
         <output messageLabel="SuccessfulMsg" element="tns:response"/>
      </operation>
      <operation name="Delete" pattern="http://www.w3.org/ns/wsdl/in-out">
         <input messageLabel="DeleteMsg" element="tns:request"/>
         <output messageLabel="SuccessfulMsg" element="tns:response"/>
      </operation>
   </interface>


<!--binding : ์‹ค์ œ ๋„คํŠธ์›Œํฌ protocol๊ณผ protType ๋งคํ•‘ ์ฆ‰, ์–ด๋–ป๊ฒŒ ์ฃผ๊ณ  ๋ฐ›์„์ง€-->
<!-- Concrete Binding Over HTTP -->
   <binding name="RESTfulInterfaceHttpBinding" interface="tns:RESTfulInterface"
            type="http://www.w3.org/ns/wsdl/http">
      <operation ref="tns:Get" whttp:method="GET"/>
      <operation ref="tns:Post" whttp:method="POST"
                 whttp:inputSerialization="application/x-www-form-urlencoded"/>
      <operation ref="tns:Put" whttp:method="PUT"
                 whttp:inputSerialization="application/x-www-form-urlencoded"/>
      <operation ref="tns:Delete" whttp:method="DELETE"/>
   </binding>

<!-- Concrete Binding with SOAP-->
   <binding name="RESTfulInterfaceSoapBinding" interface="tns:RESTfulInterface"
            type="http://www.w3.org/ns/wsdl/soap"
            wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/"
            wsoap:mepDefault="http://www.w3.org/2003/05/soap/mep/request-response">
      <operation ref="tns:Get" />
      <operation ref="tns:Post" />
      <operation ref="tns:Put" />
      <operation ref="tns:Delete" />
   </binding>


<!-- Web Service offering endpoints for both the bindings-->
   <service name="RESTfulService" interface="tns:RESTfulInterface">
      <endpoint name="RESTfulServiceRestEndpoint"
                binding="tns:RESTfulInterfaceHttpBinding"
                address="http://www.example.com/rest/"/>
      <endpoint name="RESTfulServiceSoapEndpoint"
                binding="tns:RESTfulInterfaceSoapBinding"
                address="http://www.example.com/soap/"/>
   </service>
</description>

REST(REpresentaional State Transfer)

REST(Representational State Transfer)๋Š” ํ‘œ์ค€์„ ์ •์˜ํ•˜์ง€ ์•Š๋Š” ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ JSON์ด ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€๋งŒ, XML, YAML๋“ฑ protocol์„ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค.

์žฅ์ 

  • ํ”Œ๋žซํผ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋…๋ฆฝ์ ์ด๋‹ค.

  • ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๊ณ  ์‰ฝ๋‹ค.

  • ํ˜•์‹์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.(XML, JSON, HTML ๋“ฑ ๋ฌด์—‡์ด๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

๋‹จ์ 

  • HTTP ํ”„๋กœํ† ์ฝœ์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ๋ถ„์‚ฐํ™˜๊ฒฝ์— ๋น„์ ํ•ฉํ•˜๋‹ค.(point to point ํ†ต์‹  ๋ชจ๋ธ ๊ฐ€์ •)

  • ๋ณด์•ˆ, ์ •์ฑ… ๋“ฑ์— ํ‘œ์ค€์ด ์—†๋‹ค.

RESTful์— ๋Œ€ํ•ด์„œ ๋” ์•Œ์•„๋ณด๊ธฐ

์ฐธ์กฐ

Last updated

Was this helpful?