WebSocket - Spring boot (2)

์žฅ์ˆญํ˜ยท2024๋…„ 1์›” 16์ผ

WebSocket์˜ ํŠน์ง•

๐Ÿ”™๐Ÿ”šํŠน์ง•

  • WebSocket์€ ํ•˜๋‚˜์˜ URL์„ ํ†ตํ•ด Connection์ด ๋งบ์–ด์ง€๊ณ , ํ›„์—๋Š” ํ•ด๋‹น Connection์œผ๋กœ๋งŒ ํ†ต์‹ ํ•œ๋‹ค.

  • WebSocket์€ Connection์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ€์šฉ Port ์ˆ˜๋งŒํผ์˜ Client์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

STOMP(Simple Text Oriented Messaging Protocol)

์›น์†Œ์ผ“ ๋งŒ์„ ์ด์šฉํ•œ๋‹ค๋ฉด

Websocket์€ ๋ฉ”์‹œ์ง• ๋ฐฉ์‹๋งŒ ์ž˜ ์ •์˜ํ•œ๋‹ค๋ฉด ์ข‹์€ Server/Client ์†Œ์ผ“ ์„œ๋ฒ„๋ฅผ ์™„์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ, ๋‹จ์ˆœํ•œ ํ†ต์‹  ๊ตฌ์กฐ๋กœ ์ธํ•ด WebSocket๋งŒ์„ ์ด์šฉํ•ด ์†Œ์ผ“์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ํ•ด๋‹น ๋ฉ”์„ธ์ง€๊ฐ€ ์–ด๋–ค ์š”์ฒญ์ธ์ง€, ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ์ฑ„ํŒ…๋ฐฉ๊ณผ ์„ธ์…˜์„ ์ผ์ผ์ด ๊ตฌํ˜„ํ•˜๊ณ  ๋ฉ”์„ธ์ง€ ๋ฐœ์†ก ๋ถ€๋ถ„์„ ๊ด€๋ฆฌํ•˜๋Š” ์ถ”๊ฐ€ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๐Ÿ”™๐Ÿ”šํŠน์ง•

  • ๊ฐ„๋‹จํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง• ํ”„๋กœํ† ์ฝœ์ด๋ผ ๋ถ€๋ฅธ๋‹ค.

  • ๋ฉ”์‹œ์ง€์˜ ๋ฐœํ–‰์ž์™€ ๊ตฌ๋…์ž๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ๊ณผ ๋ฐ›๋Š” ์‚ฌ๋žŒ์ด ๊ตฌ๋ถ„๋œ๋‹ค.

    • ์ฑ„ํŒ…๋ฐฉ ์ƒ์„ฑ : pub / sub ๊ตฌํ˜„์„ ์œ„ํ•œ Topic์ด ์ƒ์„ฑ๋จ

    • ์ฑ„ํŒ…๋ฐฉ ์ž…์žฅ : Topic ๊ตฌ๋…

    • ์ฑ„ํŒ…๋ฐฉ์—์„œ ๋ฉ”์„ธ์ง€๋ฅผ ์†ก์ˆ˜์‹  : ํ•ด๋‹น Topic์œผ๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ์†ก์‹ (pub), ๋ฉ”์„ธ์ง€๋ฅผ ์ˆ˜์‹ (sub)

  • ์–ธ์–ด-์ค‘๋ฆฝ์ ์ด๋‹ค. ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์— ๋ฉ”์‹œ์ง€๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

  • ํ”„๋ ˆ์ž„ ๊ธฐ๋ฐ˜์ด๋‹ค.

COMMAND
header1:value1
header2:value2
Body^@
---------------------------------------------------------------------------------------------------

COMMAND : SEND, SUBSCRIBE๋ฅผ ์ง€์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
header : ๊ธฐ์กด์˜ WebSocket์œผ๋กœ๋Š” ํ‘œํ˜„์ด ๋ถˆ๊ฐ€๋Šฅํ•œ header๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
destination : ์ด ํ—ค๋”๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜(SEND), ๊ตฌ๋…(SUBSCRIBE)ํ•  ์ˆ˜ ์žˆ๋‹ค
  • Stomp ํ”„๋กœํ† ์ฝœ์€ WebSocket ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค.
  • STOMP๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฉ”์„ธ์ง€์˜ ํ—ค๋”์— ๊ฐ’์„ ์ค„ ์ˆ˜ ์žˆ์–ด ํ—ค๋” ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ†ต์‹  ์‹œ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅ
  • STOMP๋Š” TCP ๋˜๋Š” WebSocket ๊ฐ™์€ ์–‘๋ฐฉํ–ฅ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • Message Payload์—๋Š” Text or Binary ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

SUBSCRIBE
SUBSCRIBE frame์€ ์ฃผ์–ด์ง„ destination์— ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. SEND frame๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Subscribe๋Š” client๊ฐ€ ๊ตฌ๋…ํ•˜๊ธฐ ์›ํ•˜๋Š” ๋ชฉ์ ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” "destination" ํ—ค๋”๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค. ๊ฐ€์ž…๋œ ๋Œ€์ƒ์—์„œ ์ˆ˜์‹ ๋œ ๋ชจ๋“  ๋ฉ”์„ธ์ง€๋Š” ์ดํ›„ MESSAGE frame๋กœ์„œ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค.

SUBSCRIBE

Subscribe frame์€ ์ฃผ์–ด์ง„ destination์— ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. subscribe๋Š” ๊ตฌ๋…ํ•˜๊ธฐ ์›ํ•˜๋Š” ๋ชฉ์ ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” "destination" ํ—ค๋”๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค. ๊ฐ€์ž…๋œ ๋Œ€์ƒ์—์„œ ์ˆ˜์‹ ๋œ ๋ชจ๋“  ๋ฉ”์„ธ์ง€๋Š” ์ดํ›„ MESSAGE frame๋กœ์„œ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค.

id: 0
destination: /queue/foo
ack: client

^@

๋‹จ์ผ ์—ฐ๊ฒฐ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ตฌ๋…์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ตฌ๋… ID๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด "id"ํ—ค๋”๊ฐ€ ํ”„๋ ˆ์ž„์— ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค.

์ถœ์ฒ˜ :
https://velog.io/@hoyun7443/WebSocket%EC%9D%98-Stomp
https://growth-coder.tistory.com/157
https://supawer0728.github.io/2018/03/30/spring-websocket/

profile
์ฝ”๋”ฉ ๊ธฐ๋ก

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