์›น ์†Œ์ผ“(WebSocket)์ด๋ž€ - Spring Boot & STOMP๋กœ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ตฌํ˜„ํ•˜๊ธฐ (1/2)

2025. 11. 17. 15:56ยทSpring

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์›น ์†Œ์ผ“์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์—, ์›น ์†Œ์ผ“์€ HTTP์™€ ์–ด๋–ค ์ ์ด ๋‹ค๋ฅด๊ณ  ์™œ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…์€ ์›น ์†Œ์ผ“์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ๋˜๋Š”์ง€ ์ด์œ ๋ฅผ ๋จผ์ € ์•Œ์•„๋ณด๊ฒ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์›น ์†Œ์ผ“ ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๋ฉ”์‹œ์ง€ ํ”„๋กœํ† ์ฝœ์ธ STOMP์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„๋ณด์ž

 

WebSocket์ด๋ž€

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ํ•˜๋‚˜์˜ TCP ์—ฐ๊ฒฐ์„ ์ง€์†์ ์œผ๋กœ ๊ณต์œ ํ•˜๋ฉด์„œ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

ํ•œ ๋ฒˆ ์—ฐ๊ฒฐ๋˜๋ฉด ๋Š๊ธฐ์น˜ ์•Š์€ ์ฑ„ ์œ ์ง€๋˜๋ฉฐ, ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋กœ ์›ํ•˜๋Š” ์‹œ์ ์— ๋ฐ”๋กœ ๋ฉ”์‹œ์ง€๋ฅผ push ํ•  ์ˆ˜ ์žˆ๋‹ค.

HTTP ๋ฐฉ์‹์ฒ˜๋Ÿผ "์š”์ฒญ ํ›„ ์‘๋‹ต" ๊ตฌ์กฐ์— ํ•ด๋‹น๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฑ„ํŒ…, ์•Œ๋ฆผ, ๊ฒŒ์ž„, ๋ชจ๋‹ˆํ„ฐ๋ง ๋“ฑ ์‹ค์‹œ๊ฐ„์„ฑ์ด ํ•ต์‹ฌ์ธ ์„œ๋น„์Šค์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 

 

HTTP ํ•œ๊ณ„์™€ WebSocket์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

HTTP๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹จ๋ฐฉํ–ฅ Request-Response ๋ชจ๋ธ์ด๋‹ค.

์˜ˆ์ „์—๋Š” ์ธํ„ฐ๋„ท์ด ๋‹จ์ˆœํ–ˆ๋‹ค. ๋‹จ์ˆœ ๊ธ€ ์ฝ๊ธฐ, ๋ฒ„ํŠผ ํด๋ฆญ, ์ •๋ณด ๋ณด๊ธฐ ์ด ์ •๋„๋ฉด ์ถฉ๋ถ„ํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์ธํ„ฐ๋„ท ์„œ๋น„์Šค๋Š” ์ ์  ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ์‹ค์‹œ๊ฐ„ ๊ฒŒ์ž„, ๋ฐฉ์†ก, ์ฃผ์‹ ๊ฐ€๊ฒฉ ๋ณ€ํ™” ๋“ฑ ๋‹ค์–‘ํ•ด์กŒ๋‹ค.

์ด๋Ÿฐ ๊ฑด ํŽ˜์ด์ง€ ๋‚ด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ฆ‰์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ ค์ค˜์•ผ ํ•œ๋‹ค.

 

์ด๋Ÿฐ ์‹ค์‹œ๊ฐ„์„ฑ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ธฐ์—” HTTP๋Š” ๊ตฌ์กฐ์ ์œผ๋กœ ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

 

HTTP์˜ ํŠน์ง•

  • ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ(Request)์„ ๋ณด๋‚ด์•ผ๋งŒ ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต(Response)์ด ๊ฐ€๋Šฅ
  • ๋น„์—ฐ๊ฒฐ์„ฑ(stateless): ์š”์ฒญ ๋‹จ์œ„๋กœ ์—ฐ๊ฒฐ์„ ๋งบ๊ณ  ๋Š์Œ
  • ์„œ๋ฒ„ -> ํด๋ผ์ด์–ธํŠธ push ๋ถˆ๊ฐ€
  • ์‹ค์‹œ๊ฐ„์„ฑ์ฒ˜๋Ÿผ ๋ณด์ด๋ ค๋ฉด Polling / Long Polling ๊ฐ™์€ ์šฐํšŒ ๊ธฐ์ˆ  ํ•„์š”
    • Polling: ์งง์€ ์ฃผ๊ธฐ๋กœ ๊ณ„์† ์š”์ฒญํ•˜๋Š” ๋ฐฉ์‹ → ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์ด ์••๋„์ ์œผ๋กœ ๋งŽ์•„์ง„๋‹ค.
    • Long Polling: ์„œ๋ฒ„๊ฐ€ ๋ณ€๊ฒฝ์ด ์ƒ๊ธธ ๋•Œ๊นŒ์ง€ ์‘๋‹ต์„ ์˜ค๋ž˜ ๋ถ™์žก๋Š” ๋ฐฉ์‹ → ์„œ๋ฒ„๋Š” ์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ„์† ์ ์œ ํ•˜๊ฒŒ ๋œ๋‹ค.

Polling ๋ฐฉ์‹
Long Polling ๋ฐฉ์‹

 

๐Ÿ‘‰ ์ด๋Ÿฐ ๋ฐฉ์‹์€ ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ๋Š˜๊ณ  ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง€๋ฉฐ, ์™„๋ฒฝํ•œ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ (์‹ค์‹œ๊ฐ„ ํ†ต์‹ )์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

์ฆ‰, HTTP ๋งŒ์œผ๋กœ๋Š” ์„œ๋ฒ„๊ฐ€ "์ง€๊ธˆ ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ”๋กœ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค"ํ•  ๋•Œ ๋ฐ”๋กœ ๋ณด๋‚ผ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด WebSocket์ด๋‹ค.

์›น ์†Œ์ผ“์€ HTTP ๋ฐฉ์‹์˜ ์š”์ฒญ ํ›„ ์‘๋‹ต ๊ตฌ์กฐ์—์„œ ๋ฒ—์–ด๋‚˜๊ธฐ ์œ„ํ•ด์„œ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

 

WebSocket์˜ ํŠน์ง•

  • TCP ๊ธฐ๋ฐ˜ ์ง€์† ์—ฐ๊ฒฐ: ์ดˆ๋ฐ˜ ํ•ธ๋“œ์…ฐ์ดํฌ ํ›„ ์—ฐ๊ฒฐ ์œ ์ง€๋กœ ์˜ค๋ฒ„ํ—ค๋“œ ์ตœ์†Œํ™”
  • Full-Duplex ํ†ต์‹  (์–‘์ชฝ ๋ชจ๋‘ ์ž์œ ๋กญ๊ฒŒ ๋ฉ”์‹œ์ง€ ์ „์†ก ๊ฐ€๋Šฅ)
  • ๊ฐ€๋ฒผ์šด ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ๋กœ ๋น ๋ฅธ ๋ฉ”์‹œ์ง€ ์ „์†ก
    • HTTP ๋ฉ”์‹œ์ง€๋Š” ๋งค๋ฒˆ ์š”์ฒญ๋งˆ๋‹ค ์ˆ˜์‹ญ ์ˆ˜๋ฐฑ ๋ฐ”์ดํŠธ์˜ ํ—ค๋”(Method, Host, Content-Type, Cookie ๋“ฑ)๋ฅผ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค.
    • ์›น ์†Œ์ผ“์€ ์ตœ์ดˆ ์—ฐ๊ฒฐ ๋•Œ๋งŒ HTTP ํ—ค๋”๊ฐ€ ๋งŽ๊ณ , ์—ฐ๊ฒฐ ์ดํ›„ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ๋Š” ์ตœ์†Œํ•œ์˜ ํ”„๋ ˆ์ž„ ํ—ค๋”(2~10๋ฐ”์ดํŠธ ์ˆ˜์ค€)๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— HTTP๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ€๋ณ๋‹ค.

 

 

STOMP (Simple Text Oriented Messaging Protocol)

STOMP๋Š” ์›น ์†Œ์ผ“ ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๋ฉ”์‹œ์ง€ ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

์›น ์†Œ์ผ“์€ ๋‹จ์ˆœํžˆ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ํ†ต๋กœ์ด๊ณ , STOMP๋Š” ๊ทธ ํ†ต๋กœ๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ณด๋‚ด๊ณ /๊ตฌ๋…ํ• ์ง€ ์ •ํ•ด์ฃผ๋Š” ๊ทœ์น™์ด๋‹ค.

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

์›น ์†Œ์ผ“ ์ž์ฒด๋Š” ๊ทธ์ € ์–‘๋ฐฉํ–ฅ ํŒŒ์ดํ”„๋ฅผ ๋งŒ๋“ค์–ด์ค„ ๋ฟ, ์ง์ ‘ ๊ตฌ๋…, ์†ก์‹ , ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ, ๋ผ์šฐํŒ…์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

HTTP ์œ„์˜ REST์ฒ˜๋Ÿผ, WebSocket ์œ„์˜ STOMP๋ผ๊ณ  ๋ณด๋ฉด ์ •ํ™•ํ•˜๋‹ค.

 

STOMP๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋“ค

  • CONNECT/DISCONNECT: ์—ฐ๊ฒฐ ๊ด€๋ฆฌ
  • SUBSCRIBE: ํŠน์ • ์ฑ„๋„(Tolic) ๊ตฌ๋…
  • SEND: ์„œ๋ฒ„๋กœ ๋ฉ”์‹œ์ง€ ์ „์†ก
  • MESSAGE: ์„œ๋ฒ„ → ํด๋ผ์ด์–ธํŠธ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ
  • ACK/NACK: ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ํ™•์ธ
  • PUB/SUB: ์ฑ„ํŒ…๋ฐฉ๋ณ„ ๊ตฌ๋…/๋ฐœํ–‰ ๋ฉ”์ปค๋‹ˆ์ฆ˜. ํ™•์žฅ์„ฑ/๋‹ค์ค‘ ์„œ๋ฒ„ ์ง€์›

 

๋‹ค์Œ์œผ๋กœ

์ง€๊ธˆ๊นŒ์ง€ ์›น ์†Œ์ผ“, STOMP์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์•˜๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…๋ถ€ํ„ฐ๋Š” ์ง์ ‘ Spring Boot๋ฅผ ์ด์šฉํ•ด์„œ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…์„ ๊ตฌํ˜„ํ•ด๋ณด์ž.

 

 

 

 

 

์ฐธ๊ณ 

 

[Web] ์›น ์†Œ์ผ“(Web Socket)์ด๋ž€? ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ๊ณผ ๋ชฉ์ , ๋™์ž‘ ๋ฐฉ์‹ (feat. Polling, Long polling, Server-Sent Event)

๐Ÿ“– ๋“ค์–ด๊ฐ€๋ฉฐ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ์›น ์†Œ์ผ“(Web Scoket)์— ๋Œ€ํ•œ ํฌ์ŠคํŒ…์„ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์„ ์ฝ์œผ์‹œ๋Š” ๋ถ„๋“ค์€ ์•„๋งˆ ์›น ์†Œ์ผ“์ด ๋ฌด์—‡์ธ์ง€ ์ •๋„๋Š” ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ํ†ต

yong-nyong.tistory.com

 

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring] @Secured ์‚ฌ์šฉ ์‹œ AccessDeniedException์ด CustomAccessDeniedHandler์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š” ์ด์œ   (0) 2026.01.08
[Spring] Swagger์—์„œ MultipartFile + DTO ๋™์‹œ ์š”์ฒญ ์‹œ application/octet-stream ์˜ค๋ฅ˜ ํ•ด๊ฒฐํ•˜๊ธฐ  (0) 2026.01.08
[Spring] ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก ๋ฐฉ์‹๊ณผ ์‹ฑ๊ธ€ํ†ค ๋ณด์žฅ ์›๋ฆฌ @Component vs @Bean  (0) 2025.12.22
์›น ์†Œ์ผ“(WebSocket)์ด๋ž€ - Spring Boot & STOMP๋กœ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ตฌํ˜„ํ•˜๊ธฐ (2/2)  (1) 2025.11.18
'Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Spring] @Secured ์‚ฌ์šฉ ์‹œ AccessDeniedException์ด CustomAccessDeniedHandler์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š” ์ด์œ 
  • [Spring] Swagger์—์„œ MultipartFile + DTO ๋™์‹œ ์š”์ฒญ ์‹œ application/octet-stream ์˜ค๋ฅ˜ ํ•ด๊ฒฐํ•˜๊ธฐ
  • [Spring] ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก ๋ฐฉ์‹๊ณผ ์‹ฑ๊ธ€ํ†ค ๋ณด์žฅ ์›๋ฆฌ @Component vs @Bean
  • ์›น ์†Œ์ผ“(WebSocket)์ด๋ž€ - Spring Boot & STOMP๋กœ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ตฌํ˜„ํ•˜๊ธฐ (2/2)
enjoy89
enjoy89
์ถค์„ ์ถ”๋ฉฐ ์ ˆ๋ง์ด๋ž‘ ์‹ธ์šธ๊ฑฐ์•ผ ๐ŸŽต
  • enjoy89
    ๊ฐœ๋ฐœ์ผ์ง€ ๐ŸŒฑ
    enjoy89
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (32)
      • Java (8)
      • Spring (5)
      • Server (2)
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (0)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (8)
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ (1)
      • TIL (6)
      • ํšŒ๊ณ  (1)
      • ๊ธฐํƒ€ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    redis
    ์ถ”์ƒํ™” ํด๋ž˜์Šค
    WebSocket
    Spring Boot
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค
    java
    @Secured
    ๋ฐฑ์ค€
    Stomp
    application/octet-stream
    spring security
    immutable
    rabbitmq
    Program arguments
    MQ
    DP
    Pub/Sub
    GC
    Til
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
enjoy89
์›น ์†Œ์ผ“(WebSocket)์ด๋ž€ - Spring Boot & STOMP๋กœ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ตฌํ˜„ํ•˜๊ธฐ (1/2)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”