๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
๐“๐จ๐๐š๐ฒ ๐ˆ ๐‹๐ž๐š๐ซ๐ง

์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ตฌํ˜„ ํ•˜๊ธฐ : 0. ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„๊ณผ ๋ฐฉ๋ฒ•๋ก  ๋น„๊ต

by DevIseo 2025. 12. 1.

์ด์ „์—๋Š” ์„œ๋น„์Šค์— ์•Œ๋ฆผ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฑ„๋„์ด ์กด์žฌํ•˜์ง€ ์•Š์•˜๋‹ค.

์„œ๋น„์Šค ๋‚ด์— ๊ธฐ์กด์— ์ง€์›ํ•˜๋˜ ๋ถ„์„๊ณผ ๊ด€๋ จ๋œ ์„œ๋น„์Šค ์™ธ์— SBOM์„ ํ™œ์šฉํ•œ ์„œ๋น„์Šค์˜ ๊ณต์œ  ๊ธฐ๋Šฅ์ด ์ƒ๊ธฐ๊ฒŒ ๋˜๋ฉด์„œ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์ด ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ์ถ”๊ฐ€ ๋˜์—ˆ๋‹ค. 

 

 

์ฃผ์š” ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

  • ์ด๋ฒคํŠธ ์ˆ˜์‹  ์—ฌ๋ถ€ ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜
  • ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ
  • ์ด๋ฒคํŠธ ์‚ญ์ œ ์‹œ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ

 

์š”๊ตฌ ์‚ฌํ•ญ ๋ถ„์„

 โœ… ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ
  • ๋ฐ์ดํ„ฐ ์ „์†ก ํ๋ฆ„
    • case 1 : ํด๋ผ์ด์–ธํŠธ → ์„œ๋ฒ„ (์š”์ฒญ)
    • case 2 : ์„œ๋ฒ„ → ํด๋ผ์ด์–ธํŠธ
โœ… ์ด๋ฒคํŠธ ์ˆ˜์‹  ์—ฌ๋ถ€ ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜, ์ด๋ฒคํŠธ ์‚ญ์ œ ์‹œ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ
  • ๋ฐ์ดํ„ฐ ์š”์ฒญ/์ „์†ก ํ๋ฆ„
    • ํด๋ผ์ด์–ธํŠธ ๋™์ž‘ → ์„œ๋ฒ„ (์š”์ฒญ)
    • ์‹ค์‹œ๊ฐ„์„ฑ์ด ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ ๋™์ž‘์— ๋”ฐ๋ฅธ ์„œ๋ฒ„ ์š”์ฒญ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ๊ณผ ๋ณ„๊ฐœ๋กœ ์ƒ๊ฐ
    • ๊ธฐ์กด REST ์š”์ฒญ์„ ํ†ตํ•œ ๊ตฌํ˜„

๋”ฐ๋ผ์„œ, ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์ฒ˜๋ฆฌ์˜ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ์•Œ๋ฆผ ๋ฐœ์ƒ ์‹œ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ณ ๋ ค

 

๊ตฌํ˜„ ๋ฐฉ๋ฒ•๋ก  ๋น„๊ต

๋ฐฉ์‹ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์žฅ์  ๋‹จ์  ์šฐ๋ฆฌ ์š”๊ตฌ(์„œ๋ฒ„→ํด๋ผ ๋‹จ๋ฐฉํ–ฅ) ์ ํ•ฉ๋„ ์šด์˜ ๋‚œ์ด๋„
Polling ํด๋ผ์ด์–ธํŠธ → ์„œ๋ฒ„ (๋‹จ๋ฐฉํ–ฅ ์š”์ฒญ) ๊ตฌํ˜„ ์‰ฌ์›€, ์ธํ”„๋ผ ๋‹จ์ˆœ ๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ↑, ์‘๋‹ต ์ง€์—ฐ(๊ฐ„๊ฒฉ ๋งŒํผ) โ–ณ(๊ฐ€๋Šฅ์€ ํ•จ) โ˜…โ˜†โ˜†
Long polling ํด๋ผ์ด์–ธํŠธ → ์„œ๋ฒ„ (๋‹จ๋ฐฉํ–ฅ ์š”์ฒญ) ์ง€์—ฐ↓, ํ”„๋ก์‹œ/๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์นœํ™” ์—ฐ๊ฒฐ/ํ•ด์ œ ๋ฐ˜๋ณต ์˜ค๋ฒ„ํ—ค๋“œ โ—‹ โ˜…โ˜…โ˜†
SSE (Server-Sent Events) ์„œ๋ฒ„ → ํด๋ผ์ด์–ธํŠธ(๋‹จ๋ฐฉํ–ฅ ํ‘ธ์‹œ) ๋‹จ๋ฐฉํ–ฅ push ์ตœ์ , ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ์ง€์›(EventSource), HTTP/LB ์นœํ™”, ์ž๋™์žฌ์—ฐ๊ฒฐ ๋ฐ”์ด๋„ˆ๋ฆฌ×, ์ฑ„ํŒ…๊ฐ™์€ ์Œ๋ฐฉํ–ฅ์—๋Š” ๋ถ€์ ํ•ฉ โ—Ž (๊ถŒ์žฅ) โ˜…โ˜…โ˜†
WebSocket ํด๋ผ์ด์–ธํŠธ ↔ ์„œ๋ฒ„(์–‘๋ฐฉํ–ฅ ์†Œํ†ต) ์™„์ „ํ•œ ์–‘๋ฐฉํ–ฅ, ์ง€์—ฐ ์ตœ์†Œ LB/ํ”„๋ก์‹œ/์Šค์ผ€์ผ๋ง ๋ณต์žก์„ฑ↑, ํ—ฌ์Šค/๋ฐฑํ”„๋ ˆ์…” ์„ค๊ณ„ ํ•„์š” โ–ณ(์˜ค๋ฒ„์ŠคํŽ™) โ˜…โ˜…โ˜…
  1. polling
    • ๋‹จ์ˆœํžˆ ์ผ์ • ์ฃผ๊ธฐ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ตฌ์กฐ
    • ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒคํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์ผ ๋•Œ๋„ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์„ ๊ณ„์† ๋ณด๋‚ด์•ผ ํ•จ
    • Polling ์ฃผ๊ธฐ๊ฐ€ ๊ธธ์–ด์งˆ ์ˆ˜๋ก ๋ฐ์ดํ„ฐ์˜ ์‹ค์‹œ๊ฐ„์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๋Š” ๋ฌธ์ œ
    • ๊ตฌํ˜„ ๋‚œ์ด๋„ ์šฉ์ด (์ด๋ฏธ ๋ถ„์„ ์ง„ํ–‰์ค‘ ํผ์„ผํŠธ์—์„œ ํ™œ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ฐฉ์‹)
  2. long polling
    • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•ด ์„œ๋ฒ„๊ฐ€ ๋ฐ”๋กœ ์‘๋‹ต์„ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ Connection์„ ์œ ์ง€
    • Polling๋ฐฉ์‹๋ณด๋‹ค๋Š” ์‹ค์‹œ๊ฐ„์„ฑ์ด ์ฆ๊ฐ€ํ•˜๋ฉด์„œ๋„ ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
    • ๋‹ค๋งŒ ๊ฒฐ๊ตญ์€ ์‘๋‹ต์ด ์˜ฌ ์ˆ˜๋„ ์žˆ๋Š” ์ƒํ™ฉ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค๋Š” ์ ์€ polling ๋ฐฉ์‹๊ณผ ๋™์ผ
  3. SSE(Server Sent Event)
    • HTML5 ํ‘œ์ค€๊ธฐ์ˆ ๋กœ์„œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์—†์ด๋„ ์„œ๋ฒ„ -> ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ
      • ์ตœ์ดˆ ์—ฐ๊ฒฐ ์‹œ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•จ
    • ์•ž์„  ๋‘ ๊ธฐ์ˆ ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์‹ค์‹œ๊ฐ„ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ 
    • HTTP๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฉํ™”๋ฒฝ ๊ฐœ๋ฐฉ ๋“ฑ์˜ ์ ˆ์ฐจ ๋ถˆํ•„์š”
  4. websocket
    • ์›น์†Œ์ผ“์€ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์ง€์›ํ•˜๋Š” Layer 7 ํ”„๋กœํ† ์ฝœ
    • SSE๋ณด๋‹ค๋Š” ์กฐ๊ธˆ ๋” ์–‘๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„์„ฑ์„ ๋ณด์žฅ

 

 

๐ŸฅŠ SSE vs WebSockets

๋‘ ๊ธฐ์ˆ  ๋ชจ๋‘ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ, ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘ ๋ฐฉ์‹์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  • WebSockets
    • ์–‘๋ฐฉํ–ฅ(full-duplex) ํ†ต์‹ ์„ ์ง€์›ํ•œ๋‹ค.
    • ์ฆ‰, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋Ÿฐ ํŠน์„ฑ ๋•๋ถ„์— **์–‘๋ฐฉํ–ฅ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ์„œ๋น„์Šค(์˜ˆ: ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด ๊ฒŒ์ž„)**์— ์ ํ•ฉ
  • SSE (Server-Sent Events)
    • ์„œ๋ฒ„๊ฐ€ ์ผ๋ฐฉ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก(push) ํ•  ์ˆ˜๋งŒ ์žˆ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ€๋ฒผ์šด ์„ ํƒ์ง€

๐ŸฅŠ SSE vs Polling

  • Long Polling
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„์— “์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‚˜์š”?” ํ•˜๊ณ  ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹
    • ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋”๋ผ๋„ ๊ณ„์† ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•˜๋ฏ€๋กœ ๋น„ํšจ์œจ์ 
  • SSE
    • ํ•œ ๋ฒˆ ์—ฐ๊ฒฐ์„ ๋งบ์€ ๋’ค, ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ํด๋ผ์ด์–ธํŠธ๋กœ ์ง์ ‘ ํ‘ธ์‹œ
    • ๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ์˜ ๋ฐ˜๋ณต ์š”์ฒญ์ด ํ•„์š” ์—†๊ณ , ๋„คํŠธ์›Œํฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝ

 

 

๊ฒฐ๋ก 

ํ•ญ๋ชฉ ์ถ”์ฒœ ๋ฐฉ์‹ ๋น„๊ณ 

ํ•ญ๋ชฉ ์ถ”์ฒœ ๋ฐฉ์‹ ๋น„๊ณ 
์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ (์‹ ๊ทœ ์ด๋ฒคํŠธ ๋ฐœ์ƒ) SSE ์„œ๋ฒ„ → ํด๋ผ์ด์–ธํŠธ ๋‹จ๋ฐฉํ–ฅ ํ‘ธ์‹œ
์ด๋ฒคํŠธ ์ฝ์Œ/์‚ญ์ œ ์ฒ˜๋ฆฌ REST API ํด๋ผ์ด์–ธํŠธ ์•ก์…˜์— ๋”ฐ๋ผ ์š”์ฒญ ๋ฐœ์ƒ
  • ๊ธฐ์กด ์„œ๋น„์Šค์˜ ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ๋ถ„์„ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ ๊ธฐ๋Šฅ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•˜๋Š” Polling ๋ฐฉ์‹์ด ์ ํ•ฉ (์ผ์‹œ์  ์ƒํƒœ ํ™•์ธ ๋ชฉ์ ).
  • ๋ฐ˜๋ฉด, ํ—ค๋”์—์„œ ์ „์—ญ์ ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์€ ํด๋ผ์ด์–ธํŠธ์˜ ์ง€์†์ ์ธ ์š”์ฒญ ์—†์ด ์„œ๋ฒ„๊ฐ€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ‘ธ์‹œํ•ด์•ผ ํ•˜๋ฏ€๋กœ → SSE(Server-Sent Events) ๋ฐฉ์‹์ด ๊ฐ€์žฅ ์ ํ•ฉ.

 

 

Reference

https://kangs-develop.tistory.com/40

https://sanghee01.tistory.com/186

https://velog.io/@galmegi/5.-์•Œ๋žŒ๊ธฐ๋Šฅ-๊ตฌํ˜„

https://velog.io/@tkddn_dev8430/์‹ค์‹œ๊ฐ„-ํ†ต์‹ -์–ด๋–ป๊ฒŒ-ํ• ๋ž˜-ํด๋ง๋ถ€ํ„ฐ-WebSocket๊นŒ์ง€

https://sol-aftercoding.tistory.com/entry/STOMP๋ž€-WebSocket๊ณผ์˜-์ฐจ์ด

https://leejincha.tistory.com/264

๋Œ“๊ธ€