3.1. ์น์์ผ ์๊ฐ(Introduction to WebSocket)
์น์์ผ ํ๋กํ ์ฝ(RFC 6455)๋ ๋จ์ผ TCP ์ปค๋ฅ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์๋ฐฉํฅ ํต์ ์ฑ๋์ ์ค์ ํ๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. HTTP์ ๋ค๋ฅธ TCP ํ๋กํ ์ฝ์ด์ง๋ง ํฌํธ๋ฒํธ 80๊ณผ 443๋ฅผ ์ฌ์ฉํ๊ณ ๊ธฐ์กด ๋ฐฉํ๋ฒฝ ์ ์ฑ ์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก HTTP๋ฅผ ํตํด ๋์ํ๋๋ก ์ค๊ณ๋์๋ค.
์น์์ผ ์ํธ ์์ฉ์ HTTP ์์ฒญ์ HTTP Upgrade ํค๋๋ฅผ ์ฌ์ฉํ์ฌ ์
๊ทธ๋ ์ด๋ํ๋ ๊ฒ์ผ๋ก ์์๋๋ค. ๊ทธ๋ฌ๋ฉด ์น์์ผ ํ๋กํ ์ฝ๋ก ์ ํํ ์ ์๋ค.
๋ค์์ ์ด๋ฌํ ์ํธ์์ฉ์ ๋ณด์ฌ์ฃผ๋ ์์ ๋ค:
GET /spring-websocket-portfolio/portfolio HTTP/1.1
Host: localhost:8080
Upgrade: websocket (1)
Connection: Upgrade (2)
Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==
Sec-WebSocket-Protocol: v10.stomp, v11.stomp
Sec-WebSocket-Version: 13
Origin: http://localhost:8080
(1)
Upgradeํค๋ (2)Upgrade์ปค๋ฅ์ ์ฌ์ฉ
๋ณดํต์ 200 ์ํ์ฝ๋ ๋์ ์, ์น์์ผ ์๋ฒ๋ ์๋์ ๋น์ทํ ์์ํ์ ๋ฐํํ๋ค.
HTTP/1.1 101 Switching Protocols (1)
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp
(1) ํ๋กํ ์ฝ ์ ํ(switch)
ํธ๋์ ฐ์ดํฌ(handshake)์ ์ฑ๊ณตํ ํ์ HTTP ์ ๊ทธ๋ ์ด๋ ์์ฒญ์ ๊ธฐ๋ฐํ TCP ์์ผ์ ์๋ฒ ์ด๋ ค ์๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋๊ฐ ๊ณ์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
์น์์ผ์ ๋์ ๋ฐฉ์์ ๋ชจ๋ ์๊ฐํ๊ธฐ์๋ ์ด ๋ฌธ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ค. RFC 6455, HTML5์ ์น์์ผ ์ฑํฐ ๋๋ ์น์ ์๋ ๋ง์ ์๊ฐ์ ํํ ๋ฆฌ์ผ์ ์ฐธ๊ณ ํ๋ผ.
์น์์ผ ์๋ฒ๊ฐ ์น ์๋ฒ(์๋ฅผ ๋ค์ด, nginx) ๋ค์์ ์คํ์ค์ธ ๊ฒฝ์ฐ ์น์์ผ ์ ๊ทธ๋ ์ด๋ ์์ฒญ์ ์น์์ผ ์๋ฒ๋ก ์ ๋ฌํ๋๋ก ์๋ฒ ์ค์ ์ด ํ์ํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ด ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ์คํ๋๋ ๊ฒฝ์ฐ์๋ ์น์์ผ ์ง์๊ณผ ๊ด๋ จ๋ ํด๋ผ์ด๋ ์ ๊ณต์์ ์ง์ ์ฌํญ์ ํ์ธํ๋ผ.
3.1.1. HTTP vs ์น์์ผ(HTTP Versus WebSocket)
์น์์ผ์ด HTTP์ ํธํ ๊ฐ๋ฅํ๋๋ก ์ค๊ณ๋์๊ณ , HTTP ์์ฒญ์ผ๋ก ์์ํ๋๋ผ๋ ๋ ํ๋กํ ์ฝ์ ์ํคํ ์ฒ๋ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ด ๋งค์ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์ดํดํด์ผ ํ๋ค.
HTTP์ REST์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ URL์ ๋ชจ๋ธ๋งํ์ฌ ๊ฐ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ ์์ฉํ๊ธฐ ์ํด์ ํด๋ผ์ด์ธํธ๋ ์ด URL์ ์ ๊ทผํ์ฌ ์์ฒญ/์๋ต์ ํ๋ค. ์๋ฒ๋ ์์ฒญ์ HTTP URL, ๋ฉ์๋ ๊ทธ๋ฆฌ๊ณ ํค๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ ํ ํธ๋ค๋ฌ๋ก ๋ผ์ฐํ ํ๋ค.
๋ฐ๋๋ก ์น์์ผ์์๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๊ธฐ ์ปค๋ฅ์ ์ ์ํ URL์ด ํ๋๋ง ์๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ฉ์์ง๋ ๋์ผํ TCP ์ปค๋ฅ์ ์ ํตํด์ ํ๋ฅธ๋ค. ์ด๊ฒ์ ์์ ํ ๋ค๋ฅธ ๋น๋๊ธฐ์, ์ด๋ฒคํธ ์ค์ฌ(event-driven)์ ๋ฉ์์ง ์ํคํ ์ฒ๋ค.
์น์์ผ์ HTTP์ ๋ค๋ฅด๊ฒ ๋ฉ์์ง ๋ด์ฉ์ ๋ํด ๊ท์ ์ด ์๋ ์ ์์ค(low-level) ์ ์ก ํ๋กํ ์ฝ์ด๋ค. ์ฆ, ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ฉ์์ง ๊ด๋ จ ๊ท์ ์ ์ค๊ณํ์ง ์์๋ค๋ฉด, ๋ฉ์์ง๋ฅผ ๋ผ์ฐํ ํ๊ฑฐ๋ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์น์์ผ ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ HTTP ํธ๋ ์
ฐ์ดํฌ ์์ฒญ์ Sec-WebSocket-Protocol ํค๋๋ฅผ ํตํด์ ์์ ์์ค์ ๋ฉ์์ง ํ๋กํ ์ฝ
(์๋ฅผ ๋ค์ด, STOMP) ์ฌ์ฉ์ ๊ณ ๋ คํ ์๋ ์๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด, ์์ฒด์ ์ธ ์ปจ๋ฒค์
์ ๊ท์ ํด์ผ ํ๋ค.
3.1.2. ์น์์ผ์ ์ธ์ ์ฌ์ฉํ ๊น(When to Use WebSockets)
์น์์ผ์ ์นํ์ด์ง๋ฅผ ๋์ ์ด๊ณ ์ํธ์ ์ผ๋ก ๋ง๋ค ์ ์๋ค. ๊ทธ๋ฌ๋ ๋ง์ ๊ฒฝ์ฐ์ Ajax์ HTTP ์คํธ๋ฆฌ๋ฐ ๋๋ ๊ธด ํด๋ง(polling)์ ์กฐํฉ์ผ๋ก ๋ ๊ฐ๋จํ๊ณ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๋ด์ค, ๋ฉ์ผ ๊ทธ๋ฆฌ๊ณ ์์ ํผ๋๋ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํด์ผ ํ์ง๋ง ๋ช ๋ถ๋ง๋ค ํ ๋ฒ์ฉ ์ ๋ฐ์ดํธ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ ์ ์๋ค. ๋ฐ๋ฉด์ ํ์ , ๊ฒ์ ๊ทธ๋ฆฌ๊ณ ๊ธ์ต ์ฑ์ ํจ์ฌ ๋ ์ค์๊ฐ์ด์ด์ผ ํ๋ค.
์ง์ฐ ์๊ฐ(latency)๋ง์ด ๊ฒฐ์ ์ ์ธ ์์๋ ์๋๋ค. ๋ฉ์์ง ๋ณผ๋ฅจ์ด ์๋์ ์ผ๋ก ์๋ค๋ฉด(์๋ฅผ ๋ค์ด, ๋คํธ์ํฌ ์ฅ์ ๋ชจ๋ํฐ๋ง) HTTP ์คํธ๋ฆฌ๋ฐ ๋๋ ํด๋ง์ด ๋ ํจ๊ณผ์ ์ผ ์ ์๋ค. ์น์์ผ์ ์ฌ์ฉํ๋ ๊ฐ์ฅ ์ ํฉํ ๊ฒฝ์ฐ๋ ์งง์ ์ง์ฐ ์๊ฐ๊ณผ ๋์ ๋น๋ ๊ทธ๋ฆฌ๊ณ ๋์ ๋ณผ๋ฅจ์ ์กฐํฉ์ด๋ค.
๋ํ ์ธํฐ๋ท์ ๋ฒ์ด๋ ์ง์ ์ ์ดํ ์ ์๋ ํ๋ก์์ ์ ํ์ด ์น์์ผ์ ์ํธ์์ฉ์ ๋ฐฉํดํ ์ ์์์ ์ฃผ์ํด์ผ ํ๋ค. Upgrade ํค๋๋ฅผ ํต๊ณผํ๋๋ก
์ค์ ํ์ง ์์๊ฑฐ๋, ์ ํด(idle) ์ํ๋ก ์ค๋ ์ง์๋๋ ์ปค๋ฅ์
์ ๋ซ์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๋ฐฉํ๋ฒฝ ๋ด๋ถ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์น์์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ด
์ธ๋ถ ๊ณต๊ฐ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋จํ๋ค๋ ์๋ฏธ๋ค. (๊ทธ๋ฌ๋๊น, ์ ์คํ ์ฌ์ฉํ๋ผ)
๋ชฉ์ฐจ ๊ฐ์ด๋