-
1. SOAP란?
-
2. 탄생 비화
-
3. 언제 SOAP 방식을 써?
-
예시 1: 물류 서비스와의 연동 (배송 추적 API)
-
예시 2: 금융 서비스와의 연동 (환율 정보 가져오기)
-
4. UDDI 란?
-
4-1. 서비스 제공자 (Service Provider) = 가게주인
-
4-2. 서비스 요청자 (Service Requester) = 손님
-
4-3. 브로커 (Service Broker) = 광고 게시판
-
4-4. SOAP 통신 흐름에서 UDDI / WSDL 흐름
-
5. WSDL
-
5-1. WSDL 이란?
-
5-2. SOAP 통신에서 WSDL의 역할
-
5-3. WDSL 구조
-
5-4. WSDL 코드
-
6. 자바로 SOAP 방식 요청/응답 하기
-
6-1. 응답 XML안에 JSON값이 있을경우
-
6-2. 응답 XML을 찍어내고 싶은경우
-
7. 웹서버 소켓
-
7-1. 클라이언트 → 서버 요청 (SOAP Request)
-
7-2. 웹서버 → 애플리케이션 전달
-
7-3. 서버 → 클라이언트 응답 (SOAP Response)
-
7-4. 클라이언트에서 응답 처리
-
7-5. 웹서버와 소켓의 역할
-
8. SOAP 통신의 한계
-
⭐참고 자료⭐

1. SOAP란?
SOAP의 풀네임은 “Simple Object Access Protocol” 이다. 서로 다른 서비스 간의 연동을 위해 만들어진 프로토콜 HTTP, HTTPS, SMTP 등을 사용하여 XML 기반의 메시지를 컴퓨터 네트워크 상에서 교환하는 통신 프로토콜이다.
2. 탄생 비화
과거에는 DCOM(Distributed Component Object Model)이나 CORBA(Common Object Request Broker Architecture) 같은 기술로 원격 통신을 구현할 수 있었지만, 호환성과 보안 문제가 있었다. 특히, DCOM과 CORBA는 주로 TCP 기반 통신을 사용했는데, 이는 방화벽에서 차단되는 경우가 많았다.
이를 극복하기 위해, 더 범용적이고 호환성 높은 방법이 필요했는데 ㄱ ㅡ래서 인터넷 환경에서 대부분의 서버가 지원하는 HTTP를 기반으로 한 SOAP가 등장했다. SOAP를 통해 방화벽 문제를 회피하고 다양한 플랫폼 및 언어 간의 통신이 ㄱ ㅏ능해진 것이다.
한 마디로, SOAP는 기업의 원격 통신 및 서비스 연동 요구를 충족하기 위해 설계된 HTTP 기반의 XML 메시징 프로토콜로, 플랫폼과 언어에 구애받지 않고 상호운용성을 제공하는 데 중점을 둔다.
3. 언제 SOAP 방식을 써?
- API 가져올 때
- 데몬(daemon) 프로그램
💡 데몬(daemon)이란 ?
백그라운드에서 실행되는 프로그램 또는 프로세스를 의미한다. 사용자가 직접 제어하지 않아도 스스로 실행되고, 지속적으로 작동하면서 특정 작업을 수행하거나 서비스를 제공한다.
💡 데몬의 특징
- 백그라운드에서 실행: 데몬은 보통 사용자 인터페이스 없이 작동하며, 시스템의 백그라운드에서 조용히 실행된다.
- 독립성: 사용자의 로그아웃이나 세션 종료와 관계없이 계속 실행될 수 있다.
- 자동화된 작업: 주기적으로 실행되는 작업(예: 로그 관리, 데이터 동기화)을 수행하거나 요청에 따라 특정 서비스를 제공한다.
예시 1: 물류 서비스와의 연동 (배송 추적 API)
한 물류 회사는 SOAP 기반 API를 통해 배송 추적 정보를 제공한다.
내가 만든 애플리케이션에서 사용자가 입력한 운송장 번호를 SOAP 메시지로 서버에 보내고, 해당 운송장의 상태(배송 중, 배송 완료 등)를 받아와야 한다. 배송 정보와 같은 비즈니스 데이터를 물류 서비스와 연동해서 표준화된 XML 메시지를 통해 주고받을 수 있다.
[SOAP 요청 XML 예시]
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:track="http://example.com/tracking">
<soapenv:Header/>
<soapenv:Body>
<track:GetTrackingInfo>
<track:TrackingNumber>1234567890</track:TrackingNumber>
</track:GetTrackingInfo>
</soapenv:Body>
</soapenv:Envelope>
예시 2: 금융 서비스와의 연동 (환율 정보 가져오기)
어떤 금융 API에서 특정 날짜의 환율 정보를 제공하는 SOAP 서비스를 운영 중이다.
내가 만든 데몬 프로그램에서 매일 오전 9시에 특정 국가의 환율 정보를 가져와 DB에 저장하면 날짜와 화폐 코드와 같은 입력 데이터를 기반으로 정확한 환율 데이터를 가져올 수 있다.
[SOAP 요청 XML 예시]
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rate="http://example.com/exchangeRate">
<soapenv:Header/>
<soapenv:Body>
<rate:GetExchangeRate>
<rate:CurrencyCode>USD</rate:CurrencyCode>
<rate:Date>2025-01-24</rate:Date>
</rate:GetExchangeRate>
</soapenv:Body>
</soapenv:Envelope>
위 두 가지 경우 모두 SOAP 프로토콜을 통해 보안 및 메시지 구조 표준화를 유지하며, 다른 시스템과의 연동을 가능하게 한다.
4. UDDI 란?

SOAP 통신에서 서비스 제공자, 요청자, 그리고 브로커의 역할은 가게, 손님, 그리고 광고 게시판에 비유할 수 있다.
- 서비스 제공자: "내가 이 서비스를 해줄게!"
- 서비스 요청자: "좋아, 너한테 요청할게!"
- 브로커: "여기 서비스가 있다!"
- UDDI: 서비스 전화번호부
- WSDL: 메뉴판(서비스 명세서)
4-1. 서비스 제공자 (Service Provider) = 가게주인
서비스 제공자는 자신의 서비스를 인터넷에서 사용할 수 있도록 만들어 놓는다.
예를 들어, "날씨 정보를 주는 서비스"를 SOAP 방식으로 만들고, 서비스 설명서(WSDL)를 준비한다.
서비스 제공자는 SOAP 기반의 웹 서비스를 만들어 제공하는 주체이다.
역할: 서비스 제공자는 자신이 제공하는 웹 서비스의 기능, 데이터 형식, 접근 경로 등을 정의 WSDL(Web Services Description Language) 파일을 작성하고 이를 브로커에 등록한다.
💡 WSDL(Web Services Description Language)
→ 이건 메뉴판과 같다.
→ "우리 가게에서 제공하는 서비스는 이런 메뉴(기능)가 있고, 이런 재료(파라미터)로 만들어져요"라고 설명해 주는 명세서이다.
WSDL은 XML 기반의 문서로, 서비스에 대한 정의를 제공한다.
서비스의 엔드포인트(URL), 요청과 응답 메시지의 구조, 사용 가능한 메서드, 데이터 형식 등이 상세히 기술된 문서이고, 한 마디로 WSDL은 서비스 계약서와 같은 역할을 하며, 요청자가 제공자의 서비스를 호출하기 위해 반드시 필요하다.
4-2. 서비스 요청자 (Service Requester) = 손님
요청자는 원하는 서비스를 찾고, 사용한다. 예를 들어, "오늘의 날씨가 궁금해!"라는 요청을 보내면 요청자는 서비스 제공자의 WSDL을 읽고, 필요한 정보(메뉴 주문처럼)를 SOAP 메시지로 요청한다.
서비스 요청자는 특정 기능을 제공하는 웹 서비스를 호출하는 주체이다.
UDDI를 통해 자신이 필요로 하는 서비스를 검색한다.
검색된 서비스의 WSDL을 읽어 호출 가능한 메서드와 메시지 구조를 확인한다.
WSDL에 정의된 내용을 기반으로 SOAP 요청 메시지를 생성하여 서비스 제공자에게 전송한다.
서비스 제공자로부터 SOAP 응답 메시지를 받아 필요한 데이터를 활용한다.
요청자는 WSDL에 정의된 내용에 따라 정확한 형식으로 요청해야만 서비스를 올바르게 호출할 수 있다.
4-3. 브로커 (Service Broker) = 광고 게시판
브로커는 여러 가게(서비스 제공자)가 자신의 서비스를 광고할 수 있도록 정보를 정리해 둔 공간이다. 여기서 UDDI가 등장 한다.
쉽게 말해서 서비스 브로커는 서비스 제공자와 요청자를 연결하는 중개자 역할을 한다. UDDI를 사용해 제공자가 등록한 서비스 정보를 관리하고, 요청자가 검색할 수 있도록 한다.
UDDI는 서비스의 검색 및 탐색을 위해 사용되며, 서비스의 이름, 설명, WSDL 위치(URL) 등의 메타데이터를 포함한다.
요청자는 브로커에 질의(쿼리)를 수행해 자신이 필요로 하는 서비스를 검색한 후, 제공자가 제공한 WSDL 정보를 통해 직접 통신한다.
💡 UDDI(Universal Description, Discovery, and Integration)
→ 서비스의 전화번호부와 같다.
→ 서비스 제공자가 '우리 가게 정보(서비스 정보)'를 UDDI에 등록하면, 요청자가 브로커를 통해 원하는 서비스를 검색할 수 있다.
→ 요청자는 브로커를 보고, "어? 여기 날씨 서비스가 있네!" 하면서 서비스를 찾아낸다.
4-4. SOAP 통신 흐름에서 UDDI / WSDL 흐름
- 서비스 제공자: "나는 날씨 정보 서비스야! 이게 내 메뉴판(WSDL)이야!"라고 UDDI에 광고를 올린다. ( 예: "날씨 정보 서비스는 여기에 있고, 이 WSDL로 서비스 호출 방법이 정의되어 있습니다."
- 브로커(UDDI): 서비스 요청자가 "날씨 정보를 제공하는 서비스가 어디 있지?"라고 검색하면, 제공자의 정보를 알려준다.
- 서비스 요청자: UDDI 브로커를 통해 "날씨 정보"와 같은 키워드로 원하는 서비스를 검색하면, 브로커는 요청자에게 해당 서비스의 WSDL URL을 반환한다. 요청자는 WSDL을 통해 서비스가 제공하는 메서드, 입력 파라미터, 데이터 타입 등을 확인한 후 WSDL에 정의된 형식에 맞춰 SOAP 요청 메시지를 생성하고, 서비스 제공자의 엔드포인트로 전송한다.
- 서비스 제공자: 요청을 받아서 요청 메세지를 처리 한 뒤, 요청자가 요구한 날씨 데이터를 SOAP 응답 메세지로 반환한다.
이 구조 덕분에 서비스 요청자는 필요한 서비스를 쉽게 찾고, SOAP 통신으로 데이터를 주고받을 수 있다.
5. WSDL
5-1. WSDL 이란?
WSDL은 XML 기반의 문서로, SOAP 웹 서비스에 대한 기술 명세서이다.
서비스가 사용하는 프로토콜(예: HTTP, SMTP)과 SOAP 액션 등, 통신 방식을 명확히 정의하여 클라이언트(서비스 요청자)가 제공자(서비스 제공자)의 서비스와 상호작용할 때, 어떤 메시지를 주고받아야 하는지 이해하도록 돕는 역할을 한다.
서비스의 위치(URL) , 지원하는 메서드, 입력/출력 메시지의 형식, 전송 프로토콜(예: HTTP, SMTP) 등을 포함한다.

① 웹 서비스 제공자는 웹 서비스의 기능, 즉 프로시저의 이름, 인자의 종류, 반환형의 종류, 전송 프로토콜의 종류 그리고 웹 서비스 종점 URL 등을 WSDL 문서로 작성해서 웹 서비스 소비자가 언제든지 다운로드 받을 수 있도록 웹 서버에 저장한다.
② WSDL 문서의 다운로드 URL을 UDDI 레지스트리에 공개한다.
③ 웹 서비스 소비자인 클라이언트 응용 프로그램은 UDDI 레지스트리에서 웹 서비스 명세서인 WSDL 문서를 다운로드 받을 수 있는 URL을 얻는다.
④~⑤ 실제로 해당 URL에서 WSDL 문서를 요청하고 다운로드 받는다.
⑥ 클라이언트 응용 프로그램은 WSDL 문서를 해석하여 웹 서비스 시스템의 사용법을 파악한다.
⑦~⑧ SOAP 메시지를 생성하여 전송하고 결과를 돌려받는다.
5-2. SOAP 통신에서 WSDL의 역할
서비스 인터페이스 정의
WSDL은 웹 서비스가 제공하는 메서드(기능)와 입력/출력 데이터의 형식을 정의한다.
예) 날씨 API에서 getWeather 메서드를 호출하려면 도시 이름과 날짜를 입력값으로 보내야 하고, JSON 형식의 날씨 정보를 응답받을 수 있다는 정보를 명확히 기술한다.
5-3. WDSL 구조
SOAP 메시지는 XML 형식으로 요청과 응답이 이루어지며, WSDL은 메시지의 구조를 상세히 정의한다.
어떤 요소(Element)와 데이터 타입이 필요하며, 어떤 순서로 보내야 하는지를 명시합니다.
또 클라이언트가 서비스에 접근하기 위한 URL 엔드 포인트(예: https://api.weather.com/soap )를 WSDL에 명시한다.
WSDL의 구성요소


- Types : 교환될 메세지 설명, 사용될 데이터 형식 정의
- Interface : operation정의 (input과 output)
- Binding : Interface에 정의된 작업에 대해 메세지 형식과 프로토콜 정의 (클래스화)
- Service : WebService URL endpoint정의
5-4. WSDL 코드
<definitions name="WeatherService"
targetNamespace="http://example.com/weather"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://example.com/weather">
<!--
<definitions>: WSDL 문서의 루트 태그
- name: 서비스 이름
- targetNamespace: 서비스의 고유 네임스페이스를 정의 (URL 형태로 유일하게 식별)
- xmlns: 네임스페이스 정의
-->
<!-- 1. 데이터 타입 정의 -->
<types>
<!-- XML Schema를 사용하여 메시지에서 사용될 데이터 형식을 정의 -->
<xs:schema targetNamespace="http://example.com/weather">
<xs:element name="getWeatherRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="cityName" type="xs:string"/>
<xs:element name="date" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getWeatherResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="temperature" type="xs:float"/>
<xs:element name="description" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</types>
<!--
<types>: 서비스에서 사용할 데이터의 구조 정의
- 여기서 getWeatherRequest와 getWeatherResponse는 각각 요청과 응답 데이터의 형식을 정의
- 데이터는 XML Schema (XSD) 형식으로 지정
-->
<!-- 2. 메시지 정의 -->
<message name="getWeatherRequest">
<part name="parameters" element="tns:getWeatherRequest"/>
</message>
<message name="getWeatherResponse">
<part name="parameters" element="tns:getWeatherResponse"/>
</message>
<!--
<message>: 요청 및 응답 메시지 정의
- name: 메시지 이름
- part: 메시지의 구성 요소 (보통 단일 part로 XML 요소를 사용)
- element: 요청 및 응답 데이터의 타입 (위 <types> 섹션에서 정의)
-->
<!-- 3. 인터페이스 정의 -->
<portType name="WeatherPortType">
<operation name="getWeather">
<documentation>Get weather information for a specific city and date</documentation>
<input message="tns:getWeatherRequest"/>
<output message="tns:getWeatherResponse"/>
</operation>
</portType>
<!--
<portType>: 웹 서비스의 인터페이스 정의
- name: 포트 타입 이름
- operation: 사용할 메서드 정의
- input/output: 각각 요청 및 응답 메시지를 지정 (위 <message> 섹션 참조)
-->
<!-- 4. 바인딩 정의 -->
<binding name="WeatherBinding" type="tns:WeatherPortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getWeather">
<soap:operation soapAction="http://example.com/weather#getWeather"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<!--
<binding>: 서비스가 사용하는 프로토콜 및 포맷을 정의
- name: 바인딩 이름
- type: 연결된 portType
- soap:binding: SOAP 관련 프로토콜 속성 (style: document 또는 rpc, transport: HTTP를 사용)
- soap:operation: SOAP 액션 URL 지정
-->
<!-- 5. 서비스 정의 -->
<service name="WeatherService">
<documentation>Provides weather information</documentation>
<port name="WeatherPort" binding="tns:WeatherBinding">
<soap:address location="http://example.com/weather"/>
</port>
</service>
<!--
<service>: 실제 서비스에 대한 정보 정의
- name: 서비스 이름
- port: 특정 바인딩을 사용하는 네트워크 엔드포인트
- soap:address: 클라이언트가 요청을 보낼 엔드포인트 URL
-->
</definitions>
▶ <types> (데이터 타입 정의)
- 서비스 요청과 응답에서 사용되는 데이터의 구조를 XML Schema(XSD) 형식으로 정의한다.
- 복잡한 데이터 구조(Complex Types)도 처리 가능하다.
- 요청 메시지에 cityName(문자열)과 date(문자열)가 필요하며, 응답 메시지는 temperature(소수점 숫자)와 description(문자열)로 구성된다.
▶ <message> (메시지 정의)
- 서비스 요청과 응답에 사용되는 메시지를 정의한다.
- 각 메시지는 <types> 섹션에서 정의된 데이터 타입을 참조한다.
- 예) getWeatherRequest 메시지에는 cityName과 date 데이터가 포함된다.
▶ <portType> (서비스 인터페이스 정의)
- 서비스에서 제공하는 작업(메서드)을 정의한다.
- 각 작업은 요청과 응답 메시지를 연결한다.
- 예) getWeather 작업은 getWeatherRequest를 입력으로 받고, getWeatherResponse를 출력으로 반환한다.
▶ <binding> (프로토콜 및 데이터 형식 정의)
- SOAP 통신에서 사용할 프로토콜(SOAP, HTTP 등)과 데이터 포맷을 정의한다.
- 예: SOAP 기반 HTTP 프로토콜을 사용하며, 데이터는 XML의 literal 형식을 사용한다.
▶ <service> (서비스 정의)
- 실제 서비스 엔드포인트를 정의한다.
- 클라이언트가 이 URL로 요청을 보낸다.
예) `http://example.com/weather`는 클라이언트가 요청을 전송할 엔드포인트
6. 자바로 SOAP 방식 요청/응답 하기
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder parser = factory.newDocumentBuilder();
//request SOAP message DOMSource create
String sendMessage =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<root> " +
" <body>" +
" <record>" +
" ... " +
" ... " +
" ... " +
" </record>" +
" <body>" +
"</root> ";
StringReader reader = new StringReader(sendMessage);
InputSource is = new InputSource(reader);
Document document = parser.parse(is);
DOMSource requestSource = new DOMSource(document);
//SOAPMessage create
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage requestSoapMessage = messageFactory.createMessage();
SOAPPart requestSoapPart = requestSoapMessage.getSOAPPart();
requestSoapPart.setContent(requestSource);
먼저 보낼(요청할) SOAP XML을 String으로 담고 MessageFactory, SOAPMessage등으로 요청할 XML로 파싱하기
//SOAPConnection create instance
SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
SOAPConnection connection = scf.createConnection();
//SOAP SEND MESSAGE
SOAPMessage responseSoapMessage = connection.call(requestSoapMessage, "요청보낼 URL");
요청할 SOAP XML을 생성한후, SOAPMessage를 요청할 연결준비를 하기
새로운 커넥션을 맺고 요청보낼 URL을 입력하자
ByteArrayOutputStream out = new ByteArrayOutputStream();
responseSoapMessage.writeTo(out);
SOAPBody soapBody = responseSoapMessage.getSOAPBody();
Iterator i = soapBody.getChildElements();
Node node = (Node) i.next();
JSONParser jsonParser = new JSONParser();
JSONObject soapResult = (JSONObject) jsonParser.parse(node.getChildNodes().item(0).getChildNodes().item(0).getNodeValue());
log.debug(soapResult.toString());
6-1. 응답 XML안에 JSON값이 있을경우
요청에 성공하였다면 responseSoapMessage 응답값을 OutputStream에 담고 만약 응답 SOAP XML내부에 JSON형식의 String이 있다면, 내부 Body노드를 찾아 JSON으로 파싱후 결과값을 출력 하면 된다.
ByteArrayOutputStream out = new ByteArrayOutputStream();
responseSoapMessage.writeTo(out);
String soapResult = new String(out.toByteArray(), "UTF-8");
log.debug(soapResult);
6-2. 응답 XML을 찍어내고 싶은경우
JSON String이 아니라면 단순 응답값을 String으로 찍어낸후 확인하기
import java.io.ByteArrayOutputStream;
import java.io.StringReader;
import java.util.Iterator;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.Node;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.transform.dom.DOMSource;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder parser = factory.newDocumentBuilder();
//request SOAP message DOMSource create
String sendMessage =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<root> " +
" <body>" +
" <record>" +
" ... " +
" ... " +
" ... " +
" </record>" +
" <body>" +
"</root> ";
StringReader reader = new StringReader(sendMessage);
InputSource is = new InputSource(reader);
Document document = parser.parse(is);
DOMSource requestSource = new DOMSource(document);
//SOAPMessage create
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage requestSoapMessage = messageFactory.createMessage();
SOAPPart requestSoapPart = requestSoapMessage.getSOAPPart();
requestSoapPart.setContent(requestSource);
//SOAPConnection create instance
SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
SOAPConnection connection = scf.createConnection();
//SOAP SEND MESSAGE
SOAPMessage responseSoapMessage = connection.call(requestSoapMessage, "요청보낼 URL");
ByteArrayOutputStream out = new ByteArrayOutputStream();
responseSoapMessage.writeTo(out);
//String soapResult = new String(out.toByteArray(), "UTF-8");
SOAPBody soapBody = responseSoapMessage.getSOAPBody();
Iterator i = soapBody.getChildElements();
Node node = (Node) i.next();
JSONParser jsonParser = new JSONParser();
JSONObject soapResult = (JSONObject) jsonParser.parse(node.getChildNodes().item(0).getChildNodes().item(0).getNodeValue());
log.debug(soapResult.toString());
} catch (Exception e) {
e.printStackTrace();
}
7. 웹서버 소켓
웹서버와 소켓은 SOAP 통신에서 요청과 응답을 처리하는 중요한 요소이다. 웹서버와 소켓을 이용한 SOAP 통신은 클라이언트와 서버 간의 XML 기반 메시지를 HTTP(S) 프로토콜을 통해 교환하는 방식이다.
위에서 본 것처럼
- 요청(Request): 클라이언트는 XML 형식의 SOAP 메시지를 서버에 전송한다.
- 응답(Response): 서버는 클라이언트 요청에 대해 XML 형식의 SOAP 메시지를 생성해 반환한다.
SOAP 메시지는 HTTP 요청/응답의 Body에 포함되며, 일반적으로 HTTP(S) 프로토콜을 기반으로 전달된다.
7-1. 클라이언트 → 서버 요청 (SOAP Request)
클라이언트는 WSDL 파일을 참조해 SOAP 요청 메시지를 작성한다. 이 메시지는 HTTP POST 방식으로 웹서버(예: Apache, Nginx 등)에 전달된다.
[요청 메세지]
POST /weather HTTP/1.1
Host: example.com
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://example.com/weather#getWeather"
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ws="http://example.com/weather">
<soap:Body>
<ws:getWeather>
<ws:cityName>Tokyo</ws:cityName>
<ws:date>2025-01-25</ws:date>
</ws:getWeather>
</soap:Body>
</soap:Envelope>
SOAPAction: 호출할 메서드 식별자
Body: XML 형식으로 데이터 전달
7-2. 웹서버 → 애플리케이션 전달
웹서버가 클라이언트 요청을 수신한 후, 소켓 또는 애플리케이션 서버를 통해 요청을 백엔드 애플리케이션(예: Python, Java, PHP 등)으로 전달한다. 소켓은 서버의 네트워크 레벨에서 클라이언트와의 연결을 관리한다.
7-3. 서버 → 클라이언트 응답 (SOAP Response)
애플리케이션에서 비즈니스 로직을 처리한 후, SOAP 응답 메시지를 생성해 클라이언트로 반환한다.
[응답 메세지]
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ws="http://example.com/weather">
<soap:Body>
<ws:getWeatherResponse>
<ws:temperature>18.5</ws:temperature>
<ws:description>Sunny</ws:description>
</ws:getWeatherResponse>
</soap:Body>
</soap:Envelope>
응답 메시지는 요청 메시지와 동일한 XML 구조를 가지며, 결과 데이터를 포함한다.
7-4. 클라이언트에서 응답 처리
SOAP 응답 메시지를 XML 파싱하여 결과를 분석 or 사용자에게 보여준다.
7-5. 웹서버와 소켓의 역할
웹서버의 역할
- HTTP 요청/응답 처리: 클라이언트가 SOAP 요청을 보낼 때 HTTP 프로토콜을 기반으로 이를 처리한다.
- WSDL 제공: 클라이언트는 웹서버를 통해 WSDL 문서를 다운로드하여 서비스 사양을 확인한다.
- 소켓과 애플리케이션 연결: 웹서버는 내부 소켓을 통해 애플리케이션 서버와 데이터를 주고받는다.
소켓의 역할
- 네트워크 통신: 클라이언트와 서버 간의 물리적 연결
- TCP 연결 관리: SOAP 통신은 보통 HTTP를 기반으로 하며, 이는 TCP 연결을 통해 데이터 전송을 관리한다.
- 세션 유지: 요청과 응답의 연결 상태를 관리한다.
8. SOAP 통신의 한계
- JSON 기반의 REST API에 비해 XML과 WSDL 문서가 복잡한다.
- XML 메시지는 JSON보다 크기 때문에, 대역폭 소비가 많아서 오버헤드가 날 수 있다.
- REST API와 비교하면 처리 속도가 상대적으로 느릴 수 있다.
⭐참고 자료⭐
1. ChatGPT SOAP 프로토콜 설명
2. 내 머릿속
3.포스팅 작성에 도움을 주신 블로그 (꾸벅)
웹서비스, XML, UDDI, WSDL, SOAP
XML 웹서비스 아키텍쳐 블로그 > lucky074님의 블로그 http://blog.nave...
blog.naver.com
호다닥 공부해보는 SOAP
Overview OpenAPI에 대해 포스팅을 적은지도 벌써 2달이 지났네요… 이번 포스팅에서는 SOAP에 대해서 알아보겠습니다.
gruuuuu.github.io
웹 서비스 명세화, WSDL
1. WSDL 소개 WSDL(Web Service Description Language)은 IBM, MS, 아리바에 의해 정의됐으며, 현재 WSDL 1.1 버전으로 W3C에 표준을 위해 제출된 상태이다. WSDL 스펙에서는 WSDL을 다음과 같이 정의한다. WSDL은 네트
jaewonsoft.tistory.com
XML , MSXML, WSDL, XSD이란 – XSL
Remark : XML 과 MSXML XML(Extensible Markup Language)은 웹에서 데이터를 사용하기 위한 범용 언어입니다. XML을 통하여 개발자는 매우 다양한 응용 프로그램으로부터 구조화된 데이터를 로컬 컴퓨팅 및 프
xslt.auctionpro.co.kr
[펌] WSDL정의및 구조분석
#WSDL(Web Service Description Language)란? 인터넷 표준기구 월드와이드웹컨소시엄(W3C)이 제정한 표준 중 하나로 웹서비스를 정의하기 위한 확장성표기언어(XML) 스키마, 즉 웹서비스를 사용하는 방법에
jethihmm.tistory.com

'Java' 카테고리의 다른 글
[Java] WebContent 와 /src/main/webapp의 차이점 (17) | 2025.01.26 |
---|---|
[이클립스] web.xml & Maven pom.xml 파일이 텍스트 에디터 형식으로 안 열릴 때 해결법 (8) | 2025.01.26 |
[Java] 자원을 자동으로 해제하는 try-with-resources 구문 (57) | 2024.12.26 |
[이클립스] Eclipse 깃허브 커밋 푸쉬 로그인 안됨 해결법 (can't connect to any~) (65) | 2024.12.14 |
[Java] 배열 사용자정의 정렬하는 법(내림차순, 람다식) (4) | 2024.11.12 |

1. SOAP란?
SOAP의 풀네임은 “Simple Object Access Protocol” 이다. 서로 다른 서비스 간의 연동을 위해 만들어진 프로토콜 HTTP, HTTPS, SMTP 등을 사용하여 XML 기반의 메시지를 컴퓨터 네트워크 상에서 교환하는 통신 프로토콜이다.
2. 탄생 비화
과거에는 DCOM(Distributed Component Object Model)이나 CORBA(Common Object Request Broker Architecture) 같은 기술로 원격 통신을 구현할 수 있었지만, 호환성과 보안 문제가 있었다. 특히, DCOM과 CORBA는 주로 TCP 기반 통신을 사용했는데, 이는 방화벽에서 차단되는 경우가 많았다.
이를 극복하기 위해, 더 범용적이고 호환성 높은 방법이 필요했는데 ㄱ ㅡ래서 인터넷 환경에서 대부분의 서버가 지원하는 HTTP를 기반으로 한 SOAP가 등장했다. SOAP를 통해 방화벽 문제를 회피하고 다양한 플랫폼 및 언어 간의 통신이 ㄱ ㅏ능해진 것이다.
한 마디로, SOAP는 기업의 원격 통신 및 서비스 연동 요구를 충족하기 위해 설계된 HTTP 기반의 XML 메시징 프로토콜로, 플랫폼과 언어에 구애받지 않고 상호운용성을 제공하는 데 중점을 둔다.
3. 언제 SOAP 방식을 써?
- API 가져올 때
- 데몬(daemon) 프로그램
💡 데몬(daemon)이란 ?
백그라운드에서 실행되는 프로그램 또는 프로세스를 의미한다. 사용자가 직접 제어하지 않아도 스스로 실행되고, 지속적으로 작동하면서 특정 작업을 수행하거나 서비스를 제공한다.
💡 데몬의 특징
- 백그라운드에서 실행: 데몬은 보통 사용자 인터페이스 없이 작동하며, 시스템의 백그라운드에서 조용히 실행된다.
- 독립성: 사용자의 로그아웃이나 세션 종료와 관계없이 계속 실행될 수 있다.
- 자동화된 작업: 주기적으로 실행되는 작업(예: 로그 관리, 데이터 동기화)을 수행하거나 요청에 따라 특정 서비스를 제공한다.
예시 1: 물류 서비스와의 연동 (배송 추적 API)
한 물류 회사는 SOAP 기반 API를 통해 배송 추적 정보를 제공한다.
내가 만든 애플리케이션에서 사용자가 입력한 운송장 번호를 SOAP 메시지로 서버에 보내고, 해당 운송장의 상태(배송 중, 배송 완료 등)를 받아와야 한다. 배송 정보와 같은 비즈니스 데이터를 물류 서비스와 연동해서 표준화된 XML 메시지를 통해 주고받을 수 있다.
[SOAP 요청 XML 예시]
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:track="http://example.com/tracking"> <soapenv:Header/> <soapenv:Body> <track:GetTrackingInfo> <track:TrackingNumber>1234567890</track:TrackingNumber> </track:GetTrackingInfo> </soapenv:Body> </soapenv:Envelope>
예시 2: 금융 서비스와의 연동 (환율 정보 가져오기)
어떤 금융 API에서 특정 날짜의 환율 정보를 제공하는 SOAP 서비스를 운영 중이다.
내가 만든 데몬 프로그램에서 매일 오전 9시에 특정 국가의 환율 정보를 가져와 DB에 저장하면 날짜와 화폐 코드와 같은 입력 데이터를 기반으로 정확한 환율 데이터를 가져올 수 있다.
[SOAP 요청 XML 예시]
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rate="http://example.com/exchangeRate"> <soapenv:Header/> <soapenv:Body> <rate:GetExchangeRate> <rate:CurrencyCode>USD</rate:CurrencyCode> <rate:Date>2025-01-24</rate:Date> </rate:GetExchangeRate> </soapenv:Body> </soapenv:Envelope>
위 두 가지 경우 모두 SOAP 프로토콜을 통해 보안 및 메시지 구조 표준화를 유지하며, 다른 시스템과의 연동을 가능하게 한다.
4. UDDI 란?

SOAP 통신에서 서비스 제공자, 요청자, 그리고 브로커의 역할은 가게, 손님, 그리고 광고 게시판에 비유할 수 있다.
- 서비스 제공자: "내가 이 서비스를 해줄게!"
- 서비스 요청자: "좋아, 너한테 요청할게!"
- 브로커: "여기 서비스가 있다!"
- UDDI: 서비스 전화번호부
- WSDL: 메뉴판(서비스 명세서)
4-1. 서비스 제공자 (Service Provider) = 가게주인
서비스 제공자는 자신의 서비스를 인터넷에서 사용할 수 있도록 만들어 놓는다.
예를 들어, "날씨 정보를 주는 서비스"를 SOAP 방식으로 만들고, 서비스 설명서(WSDL)를 준비한다.
서비스 제공자는 SOAP 기반의 웹 서비스를 만들어 제공하는 주체이다.
역할: 서비스 제공자는 자신이 제공하는 웹 서비스의 기능, 데이터 형식, 접근 경로 등을 정의 WSDL(Web Services Description Language) 파일을 작성하고 이를 브로커에 등록한다.
💡 WSDL(Web Services Description Language)
→ 이건 메뉴판과 같다.
→ "우리 가게에서 제공하는 서비스는 이런 메뉴(기능)가 있고, 이런 재료(파라미터)로 만들어져요"라고 설명해 주는 명세서이다.
WSDL은 XML 기반의 문서로, 서비스에 대한 정의를 제공한다.
서비스의 엔드포인트(URL), 요청과 응답 메시지의 구조, 사용 가능한 메서드, 데이터 형식 등이 상세히 기술된 문서이고, 한 마디로 WSDL은 서비스 계약서와 같은 역할을 하며, 요청자가 제공자의 서비스를 호출하기 위해 반드시 필요하다.
4-2. 서비스 요청자 (Service Requester) = 손님
요청자는 원하는 서비스를 찾고, 사용한다. 예를 들어, "오늘의 날씨가 궁금해!"라는 요청을 보내면 요청자는 서비스 제공자의 WSDL을 읽고, 필요한 정보(메뉴 주문처럼)를 SOAP 메시지로 요청한다.
서비스 요청자는 특정 기능을 제공하는 웹 서비스를 호출하는 주체이다.
UDDI를 통해 자신이 필요로 하는 서비스를 검색한다.
검색된 서비스의 WSDL을 읽어 호출 가능한 메서드와 메시지 구조를 확인한다.
WSDL에 정의된 내용을 기반으로 SOAP 요청 메시지를 생성하여 서비스 제공자에게 전송한다.
서비스 제공자로부터 SOAP 응답 메시지를 받아 필요한 데이터를 활용한다.
요청자는 WSDL에 정의된 내용에 따라 정확한 형식으로 요청해야만 서비스를 올바르게 호출할 수 있다.
4-3. 브로커 (Service Broker) = 광고 게시판
브로커는 여러 가게(서비스 제공자)가 자신의 서비스를 광고할 수 있도록 정보를 정리해 둔 공간이다. 여기서 UDDI가 등장 한다.
쉽게 말해서 서비스 브로커는 서비스 제공자와 요청자를 연결하는 중개자 역할을 한다. UDDI를 사용해 제공자가 등록한 서비스 정보를 관리하고, 요청자가 검색할 수 있도록 한다.
UDDI는 서비스의 검색 및 탐색을 위해 사용되며, 서비스의 이름, 설명, WSDL 위치(URL) 등의 메타데이터를 포함한다.
요청자는 브로커에 질의(쿼리)를 수행해 자신이 필요로 하는 서비스를 검색한 후, 제공자가 제공한 WSDL 정보를 통해 직접 통신한다.
💡 UDDI(Universal Description, Discovery, and Integration)
→ 서비스의 전화번호부와 같다.
→ 서비스 제공자가 '우리 가게 정보(서비스 정보)'를 UDDI에 등록하면, 요청자가 브로커를 통해 원하는 서비스를 검색할 수 있다.
→ 요청자는 브로커를 보고, "어? 여기 날씨 서비스가 있네!" 하면서 서비스를 찾아낸다.
4-4. SOAP 통신 흐름에서 UDDI / WSDL 흐름
- 서비스 제공자: "나는 날씨 정보 서비스야! 이게 내 메뉴판(WSDL)이야!"라고 UDDI에 광고를 올린다. ( 예: "날씨 정보 서비스는 여기에 있고, 이 WSDL로 서비스 호출 방법이 정의되어 있습니다."
- 브로커(UDDI): 서비스 요청자가 "날씨 정보를 제공하는 서비스가 어디 있지?"라고 검색하면, 제공자의 정보를 알려준다.
- 서비스 요청자: UDDI 브로커를 통해 "날씨 정보"와 같은 키워드로 원하는 서비스를 검색하면, 브로커는 요청자에게 해당 서비스의 WSDL URL을 반환한다. 요청자는 WSDL을 통해 서비스가 제공하는 메서드, 입력 파라미터, 데이터 타입 등을 확인한 후 WSDL에 정의된 형식에 맞춰 SOAP 요청 메시지를 생성하고, 서비스 제공자의 엔드포인트로 전송한다.
- 서비스 제공자: 요청을 받아서 요청 메세지를 처리 한 뒤, 요청자가 요구한 날씨 데이터를 SOAP 응답 메세지로 반환한다.
이 구조 덕분에 서비스 요청자는 필요한 서비스를 쉽게 찾고, SOAP 통신으로 데이터를 주고받을 수 있다.
5. WSDL
5-1. WSDL 이란?
WSDL은 XML 기반의 문서로, SOAP 웹 서비스에 대한 기술 명세서이다.
서비스가 사용하는 프로토콜(예: HTTP, SMTP)과 SOAP 액션 등, 통신 방식을 명확히 정의하여 클라이언트(서비스 요청자)가 제공자(서비스 제공자)의 서비스와 상호작용할 때, 어떤 메시지를 주고받아야 하는지 이해하도록 돕는 역할을 한다.
서비스의 위치(URL) , 지원하는 메서드, 입력/출력 메시지의 형식, 전송 프로토콜(예: HTTP, SMTP) 등을 포함한다.

① 웹 서비스 제공자는 웹 서비스의 기능, 즉 프로시저의 이름, 인자의 종류, 반환형의 종류, 전송 프로토콜의 종류 그리고 웹 서비스 종점 URL 등을 WSDL 문서로 작성해서 웹 서비스 소비자가 언제든지 다운로드 받을 수 있도록 웹 서버에 저장한다.
② WSDL 문서의 다운로드 URL을 UDDI 레지스트리에 공개한다.
③ 웹 서비스 소비자인 클라이언트 응용 프로그램은 UDDI 레지스트리에서 웹 서비스 명세서인 WSDL 문서를 다운로드 받을 수 있는 URL을 얻는다.
④~⑤ 실제로 해당 URL에서 WSDL 문서를 요청하고 다운로드 받는다.
⑥ 클라이언트 응용 프로그램은 WSDL 문서를 해석하여 웹 서비스 시스템의 사용법을 파악한다.
⑦~⑧ SOAP 메시지를 생성하여 전송하고 결과를 돌려받는다.
5-2. SOAP 통신에서 WSDL의 역할
서비스 인터페이스 정의
WSDL은 웹 서비스가 제공하는 메서드(기능)와 입력/출력 데이터의 형식을 정의한다.
예) 날씨 API에서 getWeather 메서드를 호출하려면 도시 이름과 날짜를 입력값으로 보내야 하고, JSON 형식의 날씨 정보를 응답받을 수 있다는 정보를 명확히 기술한다.
5-3. WDSL 구조
SOAP 메시지는 XML 형식으로 요청과 응답이 이루어지며, WSDL은 메시지의 구조를 상세히 정의한다.
어떤 요소(Element)와 데이터 타입이 필요하며, 어떤 순서로 보내야 하는지를 명시합니다.
또 클라이언트가 서비스에 접근하기 위한 URL 엔드 포인트(예: https://api.weather.com/soap )를 WSDL에 명시한다.
WSDL의 구성요소


- Types : 교환될 메세지 설명, 사용될 데이터 형식 정의
- Interface : operation정의 (input과 output)
- Binding : Interface에 정의된 작업에 대해 메세지 형식과 프로토콜 정의 (클래스화)
- Service : WebService URL endpoint정의
5-4. WSDL 코드
<definitions name="WeatherService" targetNamespace="http://example.com/weather" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://example.com/weather"> <!-- <definitions>: WSDL 문서의 루트 태그 - name: 서비스 이름 - targetNamespace: 서비스의 고유 네임스페이스를 정의 (URL 형태로 유일하게 식별) - xmlns: 네임스페이스 정의 --> <!-- 1. 데이터 타입 정의 --> <types> <!-- XML Schema를 사용하여 메시지에서 사용될 데이터 형식을 정의 --> <xs:schema targetNamespace="http://example.com/weather"> <xs:element name="getWeatherRequest"> <xs:complexType> <xs:sequence> <xs:element name="cityName" type="xs:string"/> <xs:element name="date" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getWeatherResponse"> <xs:complexType> <xs:sequence> <xs:element name="temperature" type="xs:float"/> <xs:element name="description" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> </types> <!-- <types>: 서비스에서 사용할 데이터의 구조 정의 - 여기서 getWeatherRequest와 getWeatherResponse는 각각 요청과 응답 데이터의 형식을 정의 - 데이터는 XML Schema (XSD) 형식으로 지정 --> <!-- 2. 메시지 정의 --> <message name="getWeatherRequest"> <part name="parameters" element="tns:getWeatherRequest"/> </message> <message name="getWeatherResponse"> <part name="parameters" element="tns:getWeatherResponse"/> </message> <!-- <message>: 요청 및 응답 메시지 정의 - name: 메시지 이름 - part: 메시지의 구성 요소 (보통 단일 part로 XML 요소를 사용) - element: 요청 및 응답 데이터의 타입 (위 <types> 섹션에서 정의) --> <!-- 3. 인터페이스 정의 --> <portType name="WeatherPortType"> <operation name="getWeather"> <documentation>Get weather information for a specific city and date</documentation> <input message="tns:getWeatherRequest"/> <output message="tns:getWeatherResponse"/> </operation> </portType> <!-- <portType>: 웹 서비스의 인터페이스 정의 - name: 포트 타입 이름 - operation: 사용할 메서드 정의 - input/output: 각각 요청 및 응답 메시지를 지정 (위 <message> 섹션 참조) --> <!-- 4. 바인딩 정의 --> <binding name="WeatherBinding" type="tns:WeatherPortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="getWeather"> <soap:operation soapAction="http://example.com/weather#getWeather"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <!-- <binding>: 서비스가 사용하는 프로토콜 및 포맷을 정의 - name: 바인딩 이름 - type: 연결된 portType - soap:binding: SOAP 관련 프로토콜 속성 (style: document 또는 rpc, transport: HTTP를 사용) - soap:operation: SOAP 액션 URL 지정 --> <!-- 5. 서비스 정의 --> <service name="WeatherService"> <documentation>Provides weather information</documentation> <port name="WeatherPort" binding="tns:WeatherBinding"> <soap:address location="http://example.com/weather"/> </port> </service> <!-- <service>: 실제 서비스에 대한 정보 정의 - name: 서비스 이름 - port: 특정 바인딩을 사용하는 네트워크 엔드포인트 - soap:address: 클라이언트가 요청을 보낼 엔드포인트 URL --> </definitions>
▶ <types> (데이터 타입 정의)
- 서비스 요청과 응답에서 사용되는 데이터의 구조를 XML Schema(XSD) 형식으로 정의한다.
- 복잡한 데이터 구조(Complex Types)도 처리 가능하다.
- 요청 메시지에 cityName(문자열)과 date(문자열)가 필요하며, 응답 메시지는 temperature(소수점 숫자)와 description(문자열)로 구성된다.
▶ <message> (메시지 정의)
- 서비스 요청과 응답에 사용되는 메시지를 정의한다.
- 각 메시지는 <types> 섹션에서 정의된 데이터 타입을 참조한다.
- 예) getWeatherRequest 메시지에는 cityName과 date 데이터가 포함된다.
▶ <portType> (서비스 인터페이스 정의)
- 서비스에서 제공하는 작업(메서드)을 정의한다.
- 각 작업은 요청과 응답 메시지를 연결한다.
- 예) getWeather 작업은 getWeatherRequest를 입력으로 받고, getWeatherResponse를 출력으로 반환한다.
▶ <binding> (프로토콜 및 데이터 형식 정의)
- SOAP 통신에서 사용할 프로토콜(SOAP, HTTP 등)과 데이터 포맷을 정의한다.
- 예: SOAP 기반 HTTP 프로토콜을 사용하며, 데이터는 XML의 literal 형식을 사용한다.
▶ <service> (서비스 정의)
- 실제 서비스 엔드포인트를 정의한다.
- 클라이언트가 이 URL로 요청을 보낸다.
예) http://example.com/weather
는 클라이언트가 요청을 전송할 엔드포인트
6. 자바로 SOAP 방식 요청/응답 하기
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder parser = factory.newDocumentBuilder(); //request SOAP message DOMSource create String sendMessage = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<root> " + " <body>" + " <record>" + " ... " + " ... " + " ... " + " </record>" + " <body>" + "</root> "; StringReader reader = new StringReader(sendMessage); InputSource is = new InputSource(reader); Document document = parser.parse(is); DOMSource requestSource = new DOMSource(document); //SOAPMessage create MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage requestSoapMessage = messageFactory.createMessage(); SOAPPart requestSoapPart = requestSoapMessage.getSOAPPart(); requestSoapPart.setContent(requestSource);
먼저 보낼(요청할) SOAP XML을 String으로 담고 MessageFactory, SOAPMessage등으로 요청할 XML로 파싱하기
//SOAPConnection create instance SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance(); SOAPConnection connection = scf.createConnection(); //SOAP SEND MESSAGE SOAPMessage responseSoapMessage = connection.call(requestSoapMessage, "요청보낼 URL");
요청할 SOAP XML을 생성한후, SOAPMessage를 요청할 연결준비를 하기
새로운 커넥션을 맺고 요청보낼 URL을 입력하자
ByteArrayOutputStream out = new ByteArrayOutputStream(); responseSoapMessage.writeTo(out); SOAPBody soapBody = responseSoapMessage.getSOAPBody(); Iterator i = soapBody.getChildElements(); Node node = (Node) i.next(); JSONParser jsonParser = new JSONParser(); JSONObject soapResult = (JSONObject) jsonParser.parse(node.getChildNodes().item(0).getChildNodes().item(0).getNodeValue()); log.debug(soapResult.toString());
6-1. 응답 XML안에 JSON값이 있을경우
요청에 성공하였다면 responseSoapMessage 응답값을 OutputStream에 담고 만약 응답 SOAP XML내부에 JSON형식의 String이 있다면, 내부 Body노드를 찾아 JSON으로 파싱후 결과값을 출력 하면 된다.
ByteArrayOutputStream out = new ByteArrayOutputStream(); responseSoapMessage.writeTo(out); String soapResult = new String(out.toByteArray(), "UTF-8"); log.debug(soapResult);
6-2. 응답 XML을 찍어내고 싶은경우
JSON String이 아니라면 단순 응답값을 String으로 찍어낸후 확인하기
import java.io.ByteArrayOutputStream; import java.io.StringReader; import java.util.Iterator; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.soap.MessageFactory; import javax.xml.soap.Node; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPConnection; import javax.xml.soap.SOAPConnectionFactory; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import javax.xml.transform.dom.DOMSource; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder parser = factory.newDocumentBuilder(); //request SOAP message DOMSource create String sendMessage = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<root> " + " <body>" + " <record>" + " ... " + " ... " + " ... " + " </record>" + " <body>" + "</root> "; StringReader reader = new StringReader(sendMessage); InputSource is = new InputSource(reader); Document document = parser.parse(is); DOMSource requestSource = new DOMSource(document); //SOAPMessage create MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage requestSoapMessage = messageFactory.createMessage(); SOAPPart requestSoapPart = requestSoapMessage.getSOAPPart(); requestSoapPart.setContent(requestSource); //SOAPConnection create instance SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance(); SOAPConnection connection = scf.createConnection(); //SOAP SEND MESSAGE SOAPMessage responseSoapMessage = connection.call(requestSoapMessage, "요청보낼 URL"); ByteArrayOutputStream out = new ByteArrayOutputStream(); responseSoapMessage.writeTo(out); //String soapResult = new String(out.toByteArray(), "UTF-8"); SOAPBody soapBody = responseSoapMessage.getSOAPBody(); Iterator i = soapBody.getChildElements(); Node node = (Node) i.next(); JSONParser jsonParser = new JSONParser(); JSONObject soapResult = (JSONObject) jsonParser.parse(node.getChildNodes().item(0).getChildNodes().item(0).getNodeValue()); log.debug(soapResult.toString()); } catch (Exception e) { e.printStackTrace(); }
7. 웹서버 소켓
웹서버와 소켓은 SOAP 통신에서 요청과 응답을 처리하는 중요한 요소이다. 웹서버와 소켓을 이용한 SOAP 통신은 클라이언트와 서버 간의 XML 기반 메시지를 HTTP(S) 프로토콜을 통해 교환하는 방식이다.
위에서 본 것처럼
- 요청(Request): 클라이언트는 XML 형식의 SOAP 메시지를 서버에 전송한다.
- 응답(Response): 서버는 클라이언트 요청에 대해 XML 형식의 SOAP 메시지를 생성해 반환한다.
SOAP 메시지는 HTTP 요청/응답의 Body에 포함되며, 일반적으로 HTTP(S) 프로토콜을 기반으로 전달된다.
7-1. 클라이언트 → 서버 요청 (SOAP Request)
클라이언트는 WSDL 파일을 참조해 SOAP 요청 메시지를 작성한다. 이 메시지는 HTTP POST 방식으로 웹서버(예: Apache, Nginx 등)에 전달된다.
[요청 메세지]
POST /weather HTTP/1.1 Host: example.com Content-Type: text/xml; charset=utf-8 SOAPAction: "http://example.com/weather#getWeather" <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://example.com/weather"> <soap:Body> <ws:getWeather> <ws:cityName>Tokyo</ws:cityName> <ws:date>2025-01-25</ws:date> </ws:getWeather> </soap:Body> </soap:Envelope>
SOAPAction: 호출할 메서드 식별자
Body: XML 형식으로 데이터 전달
7-2. 웹서버 → 애플리케이션 전달
웹서버가 클라이언트 요청을 수신한 후, 소켓 또는 애플리케이션 서버를 통해 요청을 백엔드 애플리케이션(예: Python, Java, PHP 등)으로 전달한다. 소켓은 서버의 네트워크 레벨에서 클라이언트와의 연결을 관리한다.
7-3. 서버 → 클라이언트 응답 (SOAP Response)
애플리케이션에서 비즈니스 로직을 처리한 후, SOAP 응답 메시지를 생성해 클라이언트로 반환한다.
[응답 메세지]
HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://example.com/weather"> <soap:Body> <ws:getWeatherResponse> <ws:temperature>18.5</ws:temperature> <ws:description>Sunny</ws:description> </ws:getWeatherResponse> </soap:Body> </soap:Envelope>
응답 메시지는 요청 메시지와 동일한 XML 구조를 가지며, 결과 데이터를 포함한다.
7-4. 클라이언트에서 응답 처리
SOAP 응답 메시지를 XML 파싱하여 결과를 분석 or 사용자에게 보여준다.
7-5. 웹서버와 소켓의 역할
웹서버의 역할
- HTTP 요청/응답 처리: 클라이언트가 SOAP 요청을 보낼 때 HTTP 프로토콜을 기반으로 이를 처리한다.
- WSDL 제공: 클라이언트는 웹서버를 통해 WSDL 문서를 다운로드하여 서비스 사양을 확인한다.
- 소켓과 애플리케이션 연결: 웹서버는 내부 소켓을 통해 애플리케이션 서버와 데이터를 주고받는다.
소켓의 역할
- 네트워크 통신: 클라이언트와 서버 간의 물리적 연결
- TCP 연결 관리: SOAP 통신은 보통 HTTP를 기반으로 하며, 이는 TCP 연결을 통해 데이터 전송을 관리한다.
- 세션 유지: 요청과 응답의 연결 상태를 관리한다.
8. SOAP 통신의 한계
- JSON 기반의 REST API에 비해 XML과 WSDL 문서가 복잡한다.
- XML 메시지는 JSON보다 크기 때문에, 대역폭 소비가 많아서 오버헤드가 날 수 있다.
- REST API와 비교하면 처리 속도가 상대적으로 느릴 수 있다.
⭐참고 자료⭐
1. ChatGPT SOAP 프로토콜 설명
2. 내 머릿속
3.포스팅 작성에 도움을 주신 블로그 (꾸벅)
웹서비스, XML, UDDI, WSDL, SOAP
XML 웹서비스 아키텍쳐 블로그 > lucky074님의 블로그 http://blog.nave...
blog.naver.com
호다닥 공부해보는 SOAP
Overview OpenAPI에 대해 포스팅을 적은지도 벌써 2달이 지났네요… 이번 포스팅에서는 SOAP에 대해서 알아보겠습니다.
gruuuuu.github.io
웹 서비스 명세화, WSDL
1. WSDL 소개 WSDL(Web Service Description Language)은 IBM, MS, 아리바에 의해 정의됐으며, 현재 WSDL 1.1 버전으로 W3C에 표준을 위해 제출된 상태이다. WSDL 스펙에서는 WSDL을 다음과 같이 정의한다. WSDL은 네트
jaewonsoft.tistory.com
XML , MSXML, WSDL, XSD이란 – XSL
Remark : XML 과 MSXML XML(Extensible Markup Language)은 웹에서 데이터를 사용하기 위한 범용 언어입니다. XML을 통하여 개발자는 매우 다양한 응용 프로그램으로부터 구조화된 데이터를 로컬 컴퓨팅 및 프
xslt.auctionpro.co.kr
[펌] WSDL정의및 구조분석
#WSDL(Web Service Description Language)란? 인터넷 표준기구 월드와이드웹컨소시엄(W3C)이 제정한 표준 중 하나로 웹서비스를 정의하기 위한 확장성표기언어(XML) 스키마, 즉 웹서비스를 사용하는 방법에
jethihmm.tistory.com

'Java' 카테고리의 다른 글
[Java] WebContent 와 /src/main/webapp의 차이점 (17) | 2025.01.26 |
---|---|
[이클립스] web.xml & Maven pom.xml 파일이 텍스트 에디터 형식으로 안 열릴 때 해결법 (8) | 2025.01.26 |
[Java] 자원을 자동으로 해제하는 try-with-resources 구문 (57) | 2024.12.26 |
[이클립스] Eclipse 깃허브 커밋 푸쉬 로그인 안됨 해결법 (can't connect to any~) (65) | 2024.12.14 |
[Java] 배열 사용자정의 정렬하는 법(내림차순, 람다식) (4) | 2024.11.12 |