Websocket์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ ์ด์ค ์๋ฐฉํฅ ํต์
๐ก ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ฑฐ๋ ๋ฐ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ ๋น๋๊ฐ ๋๊ณ ๋๊ธฐ ์๊ฐ์ด ์งง์ผ๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ TCP ์ฐ๊ฒฐ์ ๋ง๋ค๊ณ ๋ ์ค ํ๋๊ฐ ์ฐ๊ฒฐ์ ๋์ ๋๊น์ง ๋ ๋ค ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์๋ค.
1) ์๋ฐฉํฅ ํต์ (Full-Duplex)
๋ฐ์ดํฐ ์ก์์ ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ํต์ ๋ฐฉ๋ฒ
ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์๋ก์๊ฒ ์ํ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค. (ํต์์ ์ธ HTTP ํต์ ์ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒฝ์ฐ์๋ง ์๋ฒ๊ฐ ์๋ตํ๋ ๋จ๋ฐฉํฅ ํต์ )
2) ์ค์๊ฐ ๋คํธ์ํน(Real Time-Networking)
์น ํ๊ฒฝ์์ ์ฐ์๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๋
ธ์ถํ๋ค.
์ฌ๋ฌ ๋จ๋ง๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๊ตํํ๋ค.
ex) ์ฑํ
, ์ฃผ์, ๋น๋์ค ๋ฐ์ดํฐ
Polling : ์ผ์ ์ฃผ๊ธฐ๋ก ์์ฒญ์ ์ก์ ํ๋ ๊ฒ.
์ค์๊ฐ ๋คํธ์ํน์์๋ ์ธ์ ํต์ ์ด ๋ฐ์ํ ์ง ์์ธก์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ๋ถํ์ํ ์์ฒญ๊ณผ ์ฐ๊ฒฐ์ ์์ฑํ๋ค.
์ฆ ๋ฐ๋๊ฒ ์๋๋ฐ๋ ์์ฒญ์ ๊ณ์ํ๊ณ ์๋ต๋ ๊ณ์ ํ๋ค.
Long Polling
Polling์ ๋จ์ ์ ํด์ํ๊ธฐ ์ํด์ ์๋ฒ์์ ์กฐ๊ธ ๋ ๋๊ธฐ๋ฅผ ํ๋ฉด์, ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์๋ต์ ํ๋ ๋ฐฉ์
์๋ต์ ๋ฐ์ผ๋ฉด ๋๊ณ ๋ค์ ์ฌ์์ฒญํ๋ค.
๊ฒฐ๊ตญ ๋ง์ ์์ ๋ฉ์์ง๊ฐ ์์์ง๋ฉด Polling๊ณผ ๋์ผํด์ง๋ค.
Streaming
์๋ฒ์ ์์ฒญ ๋ณด๋ด๊ณ ๋๊ธฐ์ง ์์ ์ฐ๊ฒฐ์ํ์์ ๋์์์ด ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ค.
ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก์ ๋ฐ์ดํฐ ์ก์ ์ด ์ด๋ ต๋ค.
๐ท๏ธ ์ธ ๊ฐ์ ๋ฐฉ์ ๋ชจ๋ HTTP๋ฅผ ํตํด ํต์ ํ๊ธฐ ๋๋ฌธ์ ์์ฒญ/์๋ต ๋ชจ๋ ํค๋๊ฐ ๋ถํ์ํ๊ฒ ํฌ๋ค๋ ๋จ์ ์ด ์๋ค.
โจ HTTP RESTful Api์์ ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์์ฒญํฉ๋๋ค. ์๋ฒ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ HTTP ์ํ ์ฝ๋(๋ฐ ๋ฐ์ดํฐ)๋ก ์๋ตํ๋ค.
๊ทธ๋ฌ๋ ์๋ฒ๊ฐ ๋ชจ๋ ํด๋ผ์ด์ธํธ์ ์๋ฆผ์ ๋ณด๋ด๋ ค๋ ๊ฒฝ์ฐ API๋ฅผ ํตํด ํจ์จ์ ์ด์ง ์๊ณ , ํด๋ผ์ด์ธํธ๋ ๊ธด ํด๋ง ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํด์ผํ๋ฉฐ ํด๋ผ์ด์ธํธ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์๋ง์ ๋ฐ์ดํฐ ๋ฐ ์๋ฒ ์๋ต์ ์๋ฒ์ ๊ณ์ ์์ฒญํ๋ค.
์ด ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์๋ฒ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ฐ ๋์ํ๋ค.
Websocket์ ์๋ฐฉํฅ ํต์ ์ ์์ฑํ๋ค. ์ฆ, ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ฑฐ๋ ๋ฐ์ ์ ์๋ค.
์ง๊ธ๊น์ง ์กด์ฌํ๋ ํต์ ๋ฐฉ๋ฒ๊ณผ WebSocket์ ๊ฒฐ์ ์ ์ธ ์ฐจ์ด๋ ํ๋กํ ์ฝ์ ์๋ค.
WebSocket ํ๋กํ ์ฝ์ ์ ์ ํ๋ฆฝ์ HTTP๋ฅผ ์ฌ์ฉํ์ง๋ง, ๊ทธ ํ์ ํต์ ์ WebSocket ๋ ์์ ํ๋กํ ์ฝ๋ก ์ด๋ฃจ์ด์ง๋ค. ๋ํ, header๊ฐ ์๋นํ ์์ overhead๊ฐ ์ ์ ํน์ง์ด ์๋ค.
์ฅ์๊ฐ ์ ์์ ์ ์ ๋ก ํ๊ธฐ ๋๋ฌธ์, ์ ์ํ ์ํ๋ผ๋ฉด ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ ์ก์ ์ด ๊ฐ๋ฅํ๋ค.
๋๋ถ์ด ๋ฐ์ดํฐ์ ์ก์ ๊ณผ ์์ ์ ๊ฐ๊ฐ ์ปค๋ฅ์ ์ ๋งบ์ ํ์๊ฐ ์์ด, ํ๋์ ์ปค๋ฅ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ก์์ ํ ์ ์๋ค.
- ์ค์๊ฐ ์๋ฐฉํฅ ๋ฐ์ดํฐ ํต์ ์ด ํ์ํ ๊ฒฝ์ฐ.
- ๋ง์ ์์ ๋์ ์ ์์๋ฅผ ์์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ.
- ๋ธ๋ผ์ฐ์ ์์ TCP ๊ธฐ๋ฐ์ ํต์ ์ผ๋ก ํ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ.
- ๊ฐ๋ฐ์์๊ฒ ์ฌ์ฉํ๊ธฐ ์ฌ์ด API๊ฐ ํ์ํ ๊ฒฝ์ฐ.
- ํด๋ผ์ฐ๋ ํ๊ฒฝ์ด๋ ์น์ ๋์ด SOA(Service Oriented Architecture) ๋ก ํ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ
๐ก WebSocket ์๋ฒ์ ์ข ๋ฅ
- pywebsocket(apache)
- phpwebsocket(php)
- jWebSocket(java,javascript)
- web-socket-ruby(ruby)
- Socket.IO(node.js)
STOMP๋ ๊ฐ๋จํ ํ ์คํธ ์งํฅ ๋ฉ์์ง ํ๋กํ ์ฝ
๐ก Spring์ STOMP ์ง์์ ์ฌ์ฉํ ๋ Spring WebSocket ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋ผ์ด์ธํธ์ ๋ํ STOMP ๋ธ๋ก์ปค ์ญํ ์ ํ๋ค.
๋ฉ์์ง๋ ๋ฉ์์ง ์ฒ๋ฆฌ ๋ฐฉ๋ฒ ๋๋ ๊ตฌ๋ ์ ์ถ์ ํ๊ณ , ๊ตฌ๋ ๋ ์ฌ์ฉ์์๊ฒ ๋ฉ์์ง๋ฅผ ๋ธ๋ก๋์บ์คํธํ๋ ๊ฐ๋จํ ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ธ๋ก์ปค๋ก ๋ผ์ฐํ ๋๋ค.
์ค์ ๋ฉ์์ง ๋ธ๋ก๋์บ์คํ ์ ์ํด ์ ์ฉ STOMP ๋ธ๋ก์ปค(์: RabbitMQ, ActiveMQ ๋ฑ)์ ํจ๊ป ์๋ํ๋๋ก Spring์ ๊ตฌ์ฑํ ์๋ ์๋ค.
์ด ๊ฒฝ์ฐ Spring์ ๋ธ๋ก์ปค์ ๋ํ TCP ์ฐ๊ฒฐ์ ์ ์งํ๊ณ , ๋ฉ์์ง๋ฅผ ๋ฆด๋ ์ดํ๋ฉฐ, ์ฐ๊ฒฐ๋ WebSocket ํด๋ผ์ด์ธํธ๋ก ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ค.
๋ฐ๋ผ์ Spring ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํฉ HTTP ๊ธฐ๋ฐ ๋ณด์, ๊ณตํต ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ ์น์ํ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ ๋ฉ์์ง ์ฒ๋ฆฌ ์์ ์ ์์กดํ ์ ์๋ค. @Controller
๊ทธ๋ฌ๋ ์น์์ผ์ HTML5์ ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์ ์ค๋๋ ๋ฒ์ ์ ์น ๋ธ๋ผ์ฐ์ ๋ ์น์์ผ์ ์ง์ํ์ง ์๋๋ค.
ํนํ ์๋ ์ ๋ฐ์ดํธ๊ฐ ๋์ง ์๋ ์ต์คํ๋ก๋ฌ ๊ตฌ ๋ฒ์ ์ฌ์ฉ์๋ค์ ์น์์ผ์ผ๋ก ์์ฑ๋ ์นํ์ด์ง๋ฅผ ๋ณผ ์ ์๋ค.
๋ฐ๋ผ์, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ์ฌ๋ฌ ๊ธฐ์ ์ค ํ๋๊ฐ Socket.io ์ด๋ค.
์นํ์ด์ง๊ฐ ์ด๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์น์์ผ์ ์ง์ํ๋ฉด ์น์์ผ ๋ฐฉ์์ผ๋ก ๋์ํ๊ณ , ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ผ๋ฉด ์ผ๋ฐ http๋ฅผ ์ด์ฉํด์ ์ค์๊ฐ ํต์ ์ ํ๋ด๋ด๋ ๊ฒ์ด๋ค.
Socket.io๋ node.js ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ๊ธฐ์ ๋ก, ๊ฑฐ์ ๋ชจ๋ ์น ๋ธ๋ผ์ฐ์ ์ ๋ชจ๋ฐ์ผ ์ฅ์น๋ฅผ ์ง์ํ๋ ์ค์๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์ด๊ฒ์ 100% ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ตฌํ๋์ด ์์ผ๋ฉฐ, ํ์กดํ๋ ๋๋ถ๋ถ์ ์ค์๊ฐ ์น ๊ธฐ์ ๋ค์ ์ถ์ํํด ๋๋๋ค.
๋ค์ ๋งํด, Socket.io๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ข ๋ฅ์ ์๊ด์์ด ์ค์๊ฐ ์น์ ๊ตฌํํ ์ ์๋๋ก ํ ๊ธฐ์ ์ด๋ค.
1) ํ๋ก๊ทธ๋จ ๊ตฌํ์ ๋ณด๋ค ๋ง์ ๋ณต์ก์ฑ ์ด๋ :
WebSocket์ HTTP์ ๋ฌ๋ฆฌ Stateful protocol์ด๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์ฐ๊ฒฐ์ ํญ์ ์ ์งํด์ผ ํ๋ฉฐ ๋ง์ฝ ๋ฐ์ ์์ ์ผ๋ก ์ฐ๊ฒฐ์ด ๋์ด์ก์ ๋ ์ ์ ํ๊ฒ ๋์ํด์ผ ํ๋ค. ์ด๋ ๊ธฐ์กด์ HTTP ์ฌ์ฉ ์์ ๋น๊ตํ์ ๋ ์ฝ๋ฉ์ ๋ณต์ก์ฑ์ ๊ฐ์ค์ํค๋ ์์ธ์ด ๋ ์ ์๋ค.
2) ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ Socket ์ฐ๊ฒฐ์ ์ ์งํ๋ค๋ ๊ฒ ์์ฒด๊ฐ ๋น์ฉ์ด ๋๋ ์ผ์ด๋ค. ํนํ๋ ํธ๋ํฝ์์ด ๋ง์ ์๋ฒ ๊ฐ์ ๊ฒฝ์ฐ์๋ CPU์ ํฐ ๋ถ๋ด์ด ๋ ์ ์๋ค.
3) ์ค๋๋ ๋ฒ์ ์ ์น ๋ธ๋ผ์ฐ์ ์์๋ ์ง์ํ์ง ์๋๋ค.(๋ฌผ๋ก SockJS ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์ ๊ฒฝ์ฐ์๋ Fallback option์ ์ ๊ณตํ๊ณ ์๋ค.) ์ฐธ๊ณ ๋ก ์ธํฐ๋ท ์ต์คํ๋ก์ด ๊ฐ์ ๊ฒฝ์ฐ์๋ 10 ๋ฒ์ ๋ถํฐ ์ง์ํ๋ค.
4) ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์ฐ๊ฒฐ์ด ๋์ด์ก์ ๋ ์์ฑ๋๋ ์๋ฌ ๋ฉ์ธ์ง๊ฐ ๊ตฌ์ฒด์ ์ด์ง ์์์ (์๋ฅผ ๋ค์ด ์ฌ๋ฌ๊ฐ์ง ๋ค๋ฅธ ์ด์ ๋ก ์ฐ๊ฒฐ์ด ๋์ด์ก๋๋ฐ ์๋ฌ ๋ฉ์ธ์ง๊ฐ ๊ฐ์ ๊ฒฝ์ฐ) ๋๋ฒ๊น ์ ํ๋๋ฐ ์ด๋ ค์์ด ๋ง๊ธฐ๋ ํ๋ค.
์ถ์ฒ : https://helptechcommunity.wordpress.com/2020/01/28/websocket-chat-application-using-spring-boot-and-react-js/
https://kyleyj.tistory.com/59
https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-%EC%9B%B9-%EC%86%8C%EC%BC%93-Socket-%EC%97%AD%EC%82%AC%EB%B6%80%ED%84%B0-%EC%A0%95%EB%A6%AC#http_vs_%EC%9B%B9_%EC%86%8C%EC%BC%93_%EC%B0%A8%EC%9D%B4%EC%A0%90