Websocket & STOMP ๋ž€?

๋‚˜๋‚˜'s Brainยท2023๋…„ 9์›” 3์ผ
0

๊ฐœ๋…Study

๋ชฉ๋ก ๋ณด๊ธฐ
1/21

๐Ÿ“Œ Websocket๋ž€?

Websocket์€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ „์ด์ค‘ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ 

๐Ÿ’ก ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ๋นˆ๋„๊ฐ€ ๋†’๊ณ  ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์งง์œผ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— TCP ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค๊ณ  ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์—ฐ๊ฒฐ์„ ๋Š์„ ๋•Œ๊นŒ์ง€ ๋‘˜ ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœจ๐Ÿšจ Websocket ์˜ ํŠน์ง•

1) ์–‘๋ฐฉํ–ฅ ํ†ต์‹ (Full-Duplex)
๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ†ต์‹  ๋ฐฉ๋ฒ•
ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ์—๊ฒŒ ์›ํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š”๋‹ค. (ํ†ต์ƒ์ ์ธ HTTP ํ†ต์‹ ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ์—๋งŒ ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹  )

2) ์‹ค์‹œ๊ฐ„ ๋„คํŠธ์›Œํ‚น(Real Time-Networking)
์›น ํ™˜๊ฒฝ์—์„œ ์—ฐ์†๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋…ธ์ถœํ•œ๋‹ค.
์—ฌ๋Ÿฌ ๋‹จ๋ง๊ธฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ตํ™˜ํ•œ๋‹ค.
ex) ์ฑ„ํŒ…, ์ฃผ์‹, ๋น„๋””์˜ค ๋ฐ์ดํ„ฐ

โžก๏ธ ์›น ์†Œ์ผ“ ์ด์ „์˜ ๋น„์Šทํ•œ ๊ธฐ์ˆ 

Polling : ์ผ์ • ์ฃผ๊ธฐ๋กœ ์š”์ฒญ์„ ์†ก์‹ ํ•˜๋Š” ๊ฒƒ.
์‹ค์‹œ๊ฐ„ ๋„คํŠธ์›Œํ‚น์—์„œ๋Š” ์–ธ์ œ ํ†ต์‹ ์ด ๋ฐœ์ƒํ• ์ง€ ์˜ˆ์ธก์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ๊ณผ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•œ๋‹ค.
์ฆ‰ ๋ฐ”๋€๊ฒŒ ์—†๋Š”๋ฐ๋„ ์š”์ฒญ์„ ๊ณ„์†ํ•˜๊ณ  ์‘๋‹ต๋„ ๊ณ„์† ํ•œ๋‹ค.

Long Polling
Polling์˜ ๋‹จ์ ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„œ๋ฒ„์—์„œ ์กฐ๊ธˆ ๋” ๋Œ€๊ธฐ๋ฅผ ํ•˜๋ฉด์„œ, ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์‘๋‹ต์„ ํ•˜๋Š” ๋ฐฉ์‹
์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ๋Š๊ณ  ๋‹ค์‹œ ์žฌ์š”์ฒญํ•œ๋‹ค.
๊ฒฐ๊ตญ ๋งŽ์€ ์–‘์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์Ÿ์•„์ง€๋ฉด Polling๊ณผ ๋™์ผํ•ด์ง„๋‹ค.

Streaming
์„œ๋ฒ„์— ์š”์ฒญ ๋ณด๋‚ด๊ณ  ๋Š๊ธฐ์ง€ ์•Š์€ ์—ฐ๊ฒฐ์ƒํƒœ์—์„œ ๋Š์ž„์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค.
ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ์˜ ๋ฐ์ดํ„ฐ ์†ก์‹ ์ด ์–ด๋ ต๋‹ค.

๐Ÿท๏ธ ์„ธ ๊ฐœ์˜ ๋ฐฉ์‹ ๋ชจ๋‘ HTTP๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ/์‘๋‹ต ๋ชจ๋‘ ํ—ค๋”๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.


๐Ÿ”– HTTP๋ฅผ ํ†ตํ•œ Websocket

โœจ HTTP RESTful Api์—์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  HTTP ์ƒํƒœ ์ฝ”๋“œ(๋ฐ ๋ฐ์ดํ„ฐ)๋กœ ์‘๋‹ตํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์„œ๋ฒ„๊ฐ€ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋ ค๋Š” ๊ฒฝ์šฐ API๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์ด์ง€ ์•Š๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” ๊ธด ํด๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜์ž๋งˆ์ž ๋ฐ์ดํ„ฐ ๋ฐ ์„œ๋ฒ„ ์‘๋‹ต์„ ์„œ๋ฒ„์— ๊ณ„์† ์š”์ฒญํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ๋™์ž‘ํ•œ๋‹ค.

Websocket์€ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์ƒ์„ฑํ•œ๋‹ค. ์ฆ‰, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿšจ HTTP vs ์›น ์†Œ์ผ“ ์ฐจ์ด์ 

์ง€๊ธˆ๊นŒ์ง€ ์กด์žฌํ–ˆ๋˜ ํ†ต์‹ ๋ฐฉ๋ฒ•๊ณผ WebSocket์˜ ๊ฒฐ์ •์ ์ธ ์ฐจ์ด๋Š” ํ”„๋กœํ† ์ฝœ์— ์žˆ๋‹ค.

WebSocket ํ”„๋กœํ† ์ฝœ์€ ์ ‘์† ํ™•๋ฆฝ์— HTTP๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ทธ ํ›„์˜ ํ†ต์‹ ์€ WebSocket ๋…์ž์˜ ํ”„๋กœํ† ์ฝœ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ๋˜ํ•œ, header๊ฐ€ ์ƒ๋‹นํžˆ ์ž‘์•„ overhead๊ฐ€ ์ ์€ ํŠน์ง•์ด ์žˆ๋‹ค.

์žฅ์‹œ๊ฐ„ ์ ‘์†์„ ์ „์ œ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ ‘์†ํ•œ ์ƒํƒœ๋ผ๋ฉด ํด๋ผ์ด์–ธํŠธ๋‚˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ์†ก์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋”๋ถˆ์–ด ๋ฐ์ดํ„ฐ์˜ ์†ก์‹ ๊ณผ ์ˆ˜์‹ ์— ๊ฐ๊ฐ ์ปค๋„ฅ์…˜์„ ๋งบ์„ ํ•„์š”๊ฐ€ ์—†์–ด, ํ•˜๋‚˜์˜ ์ปค๋„ฅ์…˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹  ํ•  ์ˆ˜ ์žˆ๋‹ค.

โžก๏ธ WebSocket ์†Œ์ผ“์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

  • ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ.
  • ๋งŽ์€ ์ˆ˜์˜ ๋™์‹œ ์ ‘์†์ž๋ฅผ ์ˆ˜์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ.
  • ๋ธŒ๋ผ์šฐ์ €์—์„œ TCP ๊ธฐ๋ฐ˜์˜ ํ†ต์‹ ์œผ๋กœ ํ™•์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ.
  • ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด API๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ.
  • ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์ด๋‚˜ ์›น์„ ๋„˜์–ด SOA(Service Oriented Architecture) ๋กœ ํ™•์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

๐Ÿ’ก WebSocket ์„œ๋ฒ„์˜ ์ข…๋ฅ˜

  • pywebsocket(apache)
  • phpwebsocket(php)
  • jWebSocket(java,javascript)
  • web-socket-ruby(ruby)
  • Socket.IO(node.js)

๐Ÿ“Œ STOMP๋ž€?

STOMP๋Š” ๊ฐ„๋‹จํ•œ ํ…์ŠคํŠธ ์ง€ํ–ฅ ๋ฉ”์‹œ์ง• ํ”„๋กœํ† ์ฝœ

๐Ÿ’ก Spring์˜ STOMP ์ง€์›์„ ์‚ฌ์šฉํ•  ๋•Œ Spring WebSocket ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ STOMP ๋ธŒ๋กœ์ปค ์—ญํ• ์„ ํ•œ๋‹ค.

๋ฉ”์‹œ์ง€๋Š” ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ๋˜๋Š” ๊ตฌ๋…์„ ์ถ”์ ํ•˜๊ณ , ๊ตฌ๋…๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ธŒ๋กœ์ปค๋กœ ๋ผ์šฐํŒ…๋œ๋‹ค.

์‹ค์ œ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…์„ ์œ„ํ•ด ์ „์šฉ STOMP ๋ธŒ๋กœ์ปค(์˜ˆ: RabbitMQ, ActiveMQ ๋“ฑ)์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก Spring์„ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ด ๊ฒฝ์šฐ Spring์€ ๋ธŒ๋กœ์ปค์— ๋Œ€ํ•œ TCP ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ณ , ๋ฉ”์‹œ์ง€๋ฅผ ๋ฆด๋ ˆ์ดํ•˜๋ฉฐ, ์—ฐ๊ฒฐ๋œ WebSocket ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

๋”ฐ๋ผ์„œ Spring ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ†ตํ•ฉ HTTP ๊ธฐ๋ฐ˜ ๋ณด์•ˆ, ๊ณตํ†ต ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์นœ์ˆ™ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์ž‘์—…์— ์˜์กดํ•  ์ˆ˜ ์žˆ๋‹ค. @Controller


๐Ÿ“Œ Socket.io ?

๊ทธ๋Ÿฌ๋‚˜ ์›น์†Œ์ผ“์€ HTML5์˜ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ž˜๋œ ๋ฒ„์ „์˜ ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์›น์†Œ์ผ“์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํŠนํžˆ ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์ต์Šคํ”Œ๋กœ๋Ÿฌ ๊ตฌ ๋ฒ„์ „ ์‚ฌ์šฉ์ž๋“ค์€ ์›น์†Œ์ผ“์œผ๋กœ ์ž‘์„ฑ๋œ ์›นํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ์—ฌ๋Ÿฌ ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜๊ฐ€ Socket.io ์ด๋‹ค.

์›นํŽ˜์ด์ง€๊ฐ€ ์—ด๋ฆฌ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น์†Œ์ผ“์„ ์ง€์›ํ•˜๋ฉด ์›น์†Œ์ผ“ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ณ , ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €๋ผ๋ฉด ์ผ๋ฐ˜ http๋ฅผ ์ด์šฉํ•ด์„œ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ํ‰๋‚ด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

Socket.io๋Š” node.js ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ธฐ์ˆ ๋กœ, ๊ฑฐ์˜ ๋ชจ๋“  ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ๋ชจ๋ฐ”์ผ ์žฅ์น˜๋ฅผ ์ง€์›ํ•˜๋Š” ์‹ค์‹œ๊ฐ„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

์ด๊ฒƒ์€ 100% ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ˜„์กดํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‹ค์‹œ๊ฐ„ ์›น ๊ธฐ์ˆ ๋“ค์„ ์ถ”์ƒํ™”ํ•ด ๋†“๋Š”๋‹ค.

๋‹ค์‹œ ๋งํ•ด, Socket.io๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฅ˜์— ์ƒ๊ด€์—†์ด ์‹ค์‹œ๊ฐ„ ์›น์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๊ธฐ์ˆ ์ด๋‹ค.


๐Ÿšฉ WebSocket ์‚ฌ์šฉ์˜ ์–ด๋ ค์šด ์ 

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

profile
"๋กœ์ปฌ์—์„  ๋ฌธ์ œ์—†์—ˆ๋Š”๋ฐโ€ฆ?"

0๊ฐœ์˜ ๋Œ“๊ธ€