์ด๋ฒ ํฌ์คํ ์์๋ ์น ์์ผ์ผ๋ก ์ค์๊ฐ ์ฑํ ์ ๊ตฌํํ๊ธฐ ์ ์, ์น ์์ผ์ HTTP์ ์ด๋ค ์ ์ด ๋ค๋ฅด๊ณ ์ ์ค์๊ฐ ์ฑํ ์ ์น ์์ผ์ผ๋ก ๊ตฌํํด์ผ๋๋์ง ์ด์ ๋ฅผ ๋จผ์ ์์๋ณด๊ฒ ๋ค. ๊ทธ๋ฆฌ๊ณ ์น ์์ผ ์์์ ๋์ํ๋ ๋ฉ์์ง ํ๋กํ ์ฝ์ธ STOMP์ ๋ํด์๋ ์์๋ณด์
WebSocket์ด๋
ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ํ๋์ TCP ์ฐ๊ฒฐ์ ์ง์์ ์ผ๋ก ๊ณต์ ํ๋ฉด์ ์๋ฐฉํฅ์ผ๋ก ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ํด์ฃผ๋ ํ๋กํ ์ฝ์ด๋ค.
ํ ๋ฒ ์ฐ๊ฒฐ๋๋ฉด ๋๊ธฐ์น ์์ ์ฑ ์ ์ง๋๋ฉฐ, ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ ์๋ก ์ํ๋ ์์ ์ ๋ฐ๋ก ๋ฉ์์ง๋ฅผ push ํ ์ ์๋ค.
HTTP ๋ฐฉ์์ฒ๋ผ "์์ฒญ ํ ์๋ต" ๊ตฌ์กฐ์ ํด๋น๋์ง ์๊ธฐ ๋๋ฌธ์ ์ฑํ , ์๋ฆผ, ๊ฒ์, ๋ชจ๋ํฐ๋ง ๋ฑ ์ค์๊ฐ์ฑ์ด ํต์ฌ์ธ ์๋น์ค์์ ํ์์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
HTTP ํ๊ณ์ WebSocket์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ
HTTP๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋จ๋ฐฉํฅ Request-Response ๋ชจ๋ธ์ด๋ค.
์์ ์๋ ์ธํฐ๋ท์ด ๋จ์ํ๋ค. ๋จ์ ๊ธ ์ฝ๊ธฐ, ๋ฒํผ ํด๋ฆญ, ์ ๋ณด ๋ณด๊ธฐ ์ด ์ ๋๋ฉด ์ถฉ๋ถํ๋ค.
๊ทธ๋ฌ๋ค๊ฐ ์ธํฐ๋ท ์๋น์ค๋ ์ ์ ์ค์๊ฐ ์ฑํ , ์ค์๊ฐ ๊ฒ์, ๋ฐฉ์ก, ์ฃผ์ ๊ฐ๊ฒฉ ๋ณํ ๋ฑ ๋ค์ํด์ก๋ค.
์ด๋ฐ ๊ฑด ํ์ด์ง ๋ด์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ ๋๋ง๋ค ์ฆ์ ์ฌ์ฉ์์๊ฒ ์๋ ค์ค์ผ ํ๋ค.
์ด๋ฐ ์ค์๊ฐ์ฑ ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ์ HTTP๋ ๊ตฌ์กฐ์ ์ผ๋ก ํ๊ณ๊ฐ ์๋ค.
HTTP์ ํน์ง
- ๋จ๋ฐฉํฅ ํต์ : ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ(Request)์ ๋ณด๋ด์ผ๋ง ์๋ฒ๊ฐ ์๋ต(Response)์ด ๊ฐ๋ฅ
- ๋น์ฐ๊ฒฐ์ฑ(stateless): ์์ฒญ ๋จ์๋ก ์ฐ๊ฒฐ์ ๋งบ๊ณ ๋์
- ์๋ฒ -> ํด๋ผ์ด์ธํธ push ๋ถ๊ฐ
- ์ค์๊ฐ์ฑ์ฒ๋ผ ๋ณด์ด๋ ค๋ฉด Polling / Long Polling ๊ฐ์ ์ฐํ ๊ธฐ์ ํ์
- Polling: ์งง์ ์ฃผ๊ธฐ๋ก ๊ณ์ ์์ฒญํ๋ ๋ฐฉ์ → ๋ถํ์ํ ์์ฒญ์ด ์๋์ ์ผ๋ก ๋ง์์ง๋ค.
- Long Polling: ์๋ฒ๊ฐ ๋ณ๊ฒฝ์ด ์๊ธธ ๋๊น์ง ์๋ต์ ์ค๋ ๋ถ์ก๋ ๋ฐฉ์ → ์๋ฒ๋ ์ด ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฆฌ์์ค๋ฅผ ๊ณ์ ์ ์ ํ๊ฒ ๋๋ค.


๐ ์ด๋ฐ ๋ฐฉ์์ ์๋ฒ ๋ถํ๊ฐ ๋๊ณ ํ์ฅ์ฑ์ด ๋จ์ด์ง๋ฉฐ, ์๋ฒฝํ ์๋ฐฉํฅ ํต์ (์ค์๊ฐ ํต์ )์ ๋ณด์ฅํ์ง ์๋๋ค.
์ฆ, HTTP ๋ง์ผ๋ก๋ ์๋ฒ๊ฐ "์ง๊ธ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๋ก ๋ณด๋ด๊ณ ์ถ๋ค"ํ ๋ ๋ฐ๋ก ๋ณด๋ผ ๋ฐฉ๋ฒ์ด ์๋ค.
๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ์ด WebSocket์ด๋ค.
์น ์์ผ์ HTTP ๋ฐฉ์์ ์์ฒญ ํ ์๋ต ๊ตฌ์กฐ์์ ๋ฒ์ด๋๊ธฐ ์ํด์ ๋ง๋ค์ด์ก๋ค.
WebSocket์ ํน์ง
- TCP ๊ธฐ๋ฐ ์ง์ ์ฐ๊ฒฐ: ์ด๋ฐ ํธ๋์ ฐ์ดํฌ ํ ์ฐ๊ฒฐ ์ ์ง๋ก ์ค๋ฒํค๋ ์ต์ํ
- Full-Duplex ํต์ (์์ชฝ ๋ชจ๋ ์์ ๋กญ๊ฒ ๋ฉ์์ง ์ ์ก ๊ฐ๋ฅ)
- ๊ฐ๋ฒผ์ด ํ๋ ์ ๊ตฌ์กฐ๋ก ๋น ๋ฅธ ๋ฉ์์ง ์ ์ก
- HTTP ๋ฉ์์ง๋ ๋งค๋ฒ ์์ฒญ๋ง๋ค ์์ญ ์๋ฐฑ ๋ฐ์ดํธ์ ํค๋(Method, Host, Content-Type, Cookie ๋ฑ)๋ฅผ ํฌํจํด์ผ ํ๋ค.
- ์น ์์ผ์ ์ต์ด ์ฐ๊ฒฐ ๋๋ง HTTP ํค๋๊ฐ ๋ง๊ณ , ์ฐ๊ฒฐ ์ดํ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋๋ ์ต์ํ์ ํ๋ ์ ํค๋(2~10๋ฐ์ดํธ ์์ค)๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ HTTP๋ณด๋ค ํจ์ฌ ๊ฐ๋ณ๋ค.
STOMP (Simple Text Oriented Messaging Protocol)
STOMP๋ ์น ์์ผ ์์์ ๋์ํ๋ ๋ฉ์์ง ํ๋กํ ์ฝ์ด๋ค.
์น ์์ผ์ ๋จ์ํ ์๋ฐฉํฅ ํต์ ํต๋ก์ด๊ณ , STOMP๋ ๊ทธ ํต๋ก๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋ณด๋ด๊ณ /๊ตฌ๋ ํ ์ง ์ ํด์ฃผ๋ ๊ท์น์ด๋ค.
์์ ์น ์์ผ๋ง์ผ๋ก๋ ๋ฉ์์ง๋ฅผ ์ด๋๋ก ๋ณด๋ด๊ณ , ๋๊ฐ ๋ฐ๊ณ , ์ด๋ค ๋ฐฉ์ ํฌ์ ํ ์ง ๊ฐ์ ๋ฉ์์ง ๊ท์น์ด ์๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ , ์ก์ , ๋ธ๋ก๋์บ์คํธ, ๋ผ์ฐํ ์ง์ ๊ตฌํํด์ผ ํ๋ค. ๊ทธ๋์ STOMP ๊ฐ์ ๋ฉ์์ง ํ๋กํ ์ฝ์ ์น์ด์ ์ฌ์ฉํ๋ค.
์น ์์ผ ์์ฒด๋ ๊ทธ์ ์๋ฐฉํฅ ํ์ดํ๋ฅผ ๋ง๋ค์ด์ค ๋ฟ, ์ง์ ๊ตฌ๋ , ์ก์ , ๋ธ๋ก๋์บ์คํธ, ๋ผ์ฐํ ์ ์ง์ํ์ง ์๋๋ค.
HTTP ์์ REST์ฒ๋ผ, WebSocket ์์ STOMP๋ผ๊ณ ๋ณด๋ฉด ์ ํํ๋ค.
STOMP๊ฐ ์ ๊ณตํ๋ ๊ฒ๋ค
- CONNECT/DISCONNECT: ์ฐ๊ฒฐ ๊ด๋ฆฌ
- SUBSCRIBE: ํน์ ์ฑ๋(Tolic) ๊ตฌ๋
- SEND: ์๋ฒ๋ก ๋ฉ์์ง ์ ์ก
- MESSAGE: ์๋ฒ → ํด๋ผ์ด์ธํธ ๋ฉ์์ง ์ ๋ฌ
- ACK/NACK: ๋ฉ์์ง ์์ ํ์ธ
- PUB/SUB: ์ฑํ ๋ฐฉ๋ณ ๊ตฌ๋ /๋ฐํ ๋ฉ์ปค๋์ฆ. ํ์ฅ์ฑ/๋ค์ค ์๋ฒ ์ง์
๋ค์์ผ๋ก
์ง๊ธ๊น์ง ์น ์์ผ, STOMP์ด๋ ๋ฌด์์ธ์ง ์์๋ณด์๋ค. ๋ค์ ํฌ์คํ ๋ถํฐ๋ ์ง์ Spring Boot๋ฅผ ์ด์ฉํด์ ์ค์๊ฐ ์ฑํ ์ ๊ตฌํํด๋ณด์.
์ฐธ๊ณ
[Web] ์น ์์ผ(Web Socket)์ด๋? ๋ฑ์ฅ ๋ฐฐ๊ฒฝ๊ณผ ๋ชฉ์ , ๋์ ๋ฐฉ์ (feat. Polling, Long polling, Server-Sent Event)
๐ ๋ค์ด๊ฐ๋ฉฐ์ด๋ฒ ํฌ์คํ ์ ์น ์์ผ(Web Scoket)์ ๋ํ ํฌ์คํ ์ ํ๋ ค๊ณ ํฉ๋๋ค. ์ด ๊ธ์ ์ฝ์ผ์๋ ๋ถ๋ค์ ์๋ง ์น ์์ผ์ด ๋ฌด์์ธ์ง ์ ๋๋ ์๊ณ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ต๋๋ค. ์ค์๊ฐ ํต
yong-nyong.tistory.com