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) ์ƒํƒœ๋กœ ์˜ค๋ž˜ ์ง€์†๋˜๋Š” ์ปค๋„ฅ์…˜์„ ๋‹ซ์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Š” ๋ฐฉํ™”๋ฒฝ ๋‚ด๋ถ€์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์›น์†Œ์ผ“์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์™ธ๋ถ€ ๊ณต๊ฐœ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•˜๋‹ค๋Š” ์˜๋ฏธ๋‹ค. (๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•˜๋ผ)


๋ชฉ์ฐจ ๊ฐ€์ด๋“œ