-
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' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ

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
