[Spring/WebSocket] WebSocket

์ญŒยท2025๋…„ 6์›” 18์ผ

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
18/26

๐Ÿ’กWebSocket

โœ…WebSocket์ด๋ž€?

WebSocket์ด๋ž€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ณ  ์–‘๋ฐฉํ–ฅ ํ† ์ธ์ด ๊ฐ€๋Šฅํ•œ ํ”„๋กœํ† ์ฝœ์„ ๋œปํ•œ๋‹ค.
์š”์ฒญ-์‘๋‹ต ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด http์™€ ๋‹ฌ๋ฆฌ ์›น์†Œ์ผ“์€ ์ƒˆ๋กœ์šด์—ฐ๊ฒฐ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ง€์†์ ์œผ๋กœ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์œ ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค.
์ฑ„ํŒ…, ์˜จ๋ผ์ธ, ์ฃผ์‹์‹œ์„ธ ๋“ฑ์„ ์˜ˆ์‹œ๋กœ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์›น์†Œ์ผ“๋„ ์„œ๋ฒ„ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์ดˆ์— ํ•œ๋ฒˆ์€ http ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.


โœ…์Šคํ”„๋ง์—์„œ ์›น์†Œ์ผ“์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋‘๊ฐ€์ง€

1. Spring WebSocket

  • ์—ฐ๊ฒฐ๋งŒ ์ œ๊ณตํ•˜๊ณ  ํ•ธ๋“ค๋Ÿฌ๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
  • ๋‹จ์ˆœ ๋ฌธ์ž์—ด(ํ…์ŠคํŠธ/๋ฐ”์ด๋„ˆ๋ฆฌ)๋งŒ ์ฃผ๊ณ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ˆ˜ ์›น์†Œ์ผ“์ด ๋” ๊ฐ€๋ณ๋‹ค

2. Spring WebSocket + STOMP

  • STOMP(Simple Text Oriented Messaging Protocol) : ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ ๋ฉ”์‹œ์ง€ ์ „์†ก ํ”„๋กœํ† ์ฝœ
  • ํŠน์ง• : ์ฑ„ํŒ…๋ฐฉ(์ฑ„๋„) ๊ตฌ๋ถ„, ๊ตฌ๋…/๋ฐœํ–‰, ๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ…์„ STOMP์—์„œ ์ž๋™ ์ฒ˜๋ฆฌ
  • WebSocket ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๋ฉ”์‹œ์ง• ํ”„๋กœํ† ์ฝœ. ๋ฉ”์‹œ์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ์ฃผ๊ณ ๋ฐ›์„์ง€์˜ ๊ทœ์น™์ด ์ •ํ•ด์ ธ ์žˆ๋‹ค.

2-1. STOMP๊ฐ€ ํ•ด์ฃผ๋Š” ์ผ

  • ๋ฉ”์‹œ์ง€ ๋ชฉ์ ์ง€(/topic/chat/room1, /queue/alert ๋“ฑ)๋ฅผ ํ—ค๋”์— ๋ช…์‹œ
    -> ์–ด๋””๋กœ ๋ผ์šฐํŒ…ํ•ด์•ผ ํ•  ์ง€ ์„œ๋ฒ„๊ฐ€ ์‰ฝ๊ฒŒ ํŒŒ์•…
  • SUBSCRIBE, UNSUBSCRIBE, SEND ๋“ฑ ๋ช…๋ น์–ด๋กœ ๊ตฌ๋ถ„
    -> ํด๋ผ์ด์–ธํŠธ๊ฐ€ "๊ตฌ๋…๋งŒ", "๋ฉ”์‹œ์ง€๋งŒ ๋ณด๋‚ด๊ธฐ", "ํ•ด์ œ" ๋“ฑ ์—ญํ•  ๋ถ„๋ฆฌ
  • ํ—ค๋”/๋ฐ”๋”” ๋ถ„๋ฆฌ
    -> ์ธ์ฆ, ํƒ€์ž…, ์šฐ์„ ์ˆœ์œ„ ๋“ฑ ๋ถ€๊ฐ€ ์ •๋ณด(ํ—ค๋”)์— ์ถ”๊ฐ€๊ฐ€๋Šฅ
  • ๋ธŒ๋กœ์ปค๊ฐ€ ๊ฐ ์ฑ„๋„ ๊ตฌ๋…์ž์—๊ฒŒ๋งŒ ์ž๋™์œผ๋กœ ๋ฉ”์‹œ์ง€ ๋ถ„๋ฐฐ

2-2. STOMP ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ

2-3. STOMP๋ฅผ ๋งŽ์ด ์“ฐ๋Š” ์ด์œ 

  1. ์ƒ์‚ฐ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ
    • ์ฑ„ํŒ…๋ฐฉ, ์•Œ๋ฆผ, ๊ตฌ๋…/์ทจ์†Œ, ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๋‹ค ๋‚ด์žฅํ•˜๊ณ  ์žˆ์Œ
  2. ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์‹ค์ˆ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์ ์Œ
    • ์„ธ์…˜ ๊ด€๋ฆฌ, ์ฑ„ํŒ…๋ฐฉ ๊ด€๋ฆฌ, ์‚ฌ์šฉ์ž ๋งคํ•‘, ๋ชฉ์ ์ง€ ๋ผ์šฐํŒ… ๋“ฑ์„ ๋‹ค ์ฝ”๋“œ๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด ํ…Œ์ŠคํŠธ/์œ ์ง€๋ณด์ˆ˜/ํ˜‘์—… ์‹œ ๋ฌธ์ œ ๋ฐœ์ƒ
  3. ํ™•์žฅ์„ฑ/๋ณ€๊ฒฝ ์šฉ์ด
    • 1:1 ์ฑ„ํŒ…๋ฐฉ, 1:N ๊ทธ๋ฃน๋ฐฉ, ํ† ํ”ฝ๋ณ„ ์•Œ๋ฆผ ๋“ฑ์„ STOMP๋Š” ๊ฒฝ๋กœ๋งŒ ๋ฐ”๊พธ๋ฉด ์ ์šฉ ๊ฐ€๋Šฅ
  • ์ˆœ์ˆ˜ ์›น์†Œ์ผ“์€ ๋‚ด๋ถ€ ์ฝ”๋“œ ๊ตฌ์กฐ๋„ ์ „๋ถ€ ๋ณ€๊ฒฝํ•ด์•ผํ•จ.

2-4. ๊ทธ๋ž˜๋„ ์ˆœ์ˆ˜ WebSocket์„ ์จ์•ผํ•˜๋Š” ์ƒํ™ฉ์€?

  1. ์ดˆ๊ณ ์„ฑ๋Šฅ/์ดˆ๊ฒฝ๋Ÿ‰ ํ†ต์‹ ์ด ํ•„์š”ํ•  ๋•Œ
    ->๊ฒŒ์ž„์„œ๋ฒ„,์ดˆ์ €์ง€์—ฐ ์‹ค์‹œ๊ฐ„ ์„œ๋น„์Šค
    ->ms ๋‹จ์œ„์˜ ๋ ˆ์ดํ„ด์‹œ๊ฐ€ ์ค‘์š”ํ•œ ์ƒํ™ฉ
    ->์ตœ๋Œ€ํ•œ "๊ฐ€๊ณต"์„ ์—†์• ๊ณ  ํŒจํ‚ท ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
    (STOMP๋Š” ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„, ํ—ค๋” ๋“ฑ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์กฐ๊ธˆ์ด๋ผ๋„ ์žˆ์Œ)

  2. ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ๋ฅผ ์ง์ ‘ ์ปค์Šคํ…€ํ•ด์•ผ ํ•  ๋•Œ
    ->์‚ฌ๋‚ด ์ „์šฉ ๋ฉ”์‹œ์ง€ ํฌ๋งท, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ‘œ์ค€, ๋ฐ”์ด๋„ˆ๋ฆฌ ์ „์šฉ ๋“ฑ

  3. ์•„์ฃผ ๋‹จ์ˆœํ•œ ์„œ๋น„์Šค
    ->์ฑ„๋„/๊ตฌ๋…/๋ฐฉ ๊ธฐ๋Šฅ์ด ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ
    ->๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ์šฉ ๋ฐ๋ชจ ์„œ๋ฒ„ ๋“ฑ


โœ…์ˆœ์ˆ˜ WebSocket VS STOMP WebSocket

profile
๋ฐฐ์šฐ๊ณ  ๊ธฐ๋กํ•˜๋ฉฐ ์„ฑ์žฅํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค!

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