FastCampus X Yanolja TechSchool

๊ธฐ์—… ์—ฐ๊ณ„ ํ”„๋กœ์ ํŠธ - ์ฑ„ํŒ…๋„๋ฉ”์ธ : ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2024. 1. 27.

๊ฐœ์š”

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

 

 

์ƒํ’ˆ์˜ ๊ฐ€๊ฒฉ์ œ์•ˆ

 

์ €ํฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์–‘๋„ ํŒ๋งค ์ƒํ’ˆ์— ๋Œ€ํ•œ ๋„ค๊ณ ๊ธฐ๋Šฅ์ด ์žˆ์—ˆ๊ณ , ์ด๋Ÿฐ ๋„ค๊ณ ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์ฑ„ํŒ… ์„œ๋น„์Šค ๋„์ž…์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๊ฒฉ ์ œ์•ˆํ•˜๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด 1๋Œ€1 ์ฑ„ํŒ…๋ฐฉ์ด ์ƒ๊ธฐ๊ณ  ๊ฐ€๊ฒฉ ๋„ค๊ณ ๋ฅผ ํ•  ์ˆ˜์žˆ๋Š” ์ฑ„ํŒ…์ด ๊ฐ€๋Šฅํ•ด์ง€์ฃ .

์ฑ„ํŒ… ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์„ค๊ณ„๋Š” ์•„๋ž˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์‹œ๊ณ , ์˜ค๋Š˜์€ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

https://programmer-may.tistory.com/189 

 

์•ผ๋†€์ž ํ…Œํฌ์Šค์ฟจ ํŒŒ์ด๋„ ํ”„๋กœ์ ํŠธ - ์ฑ„ํŒ… ๋„๋ฉ”์ธ ์„ค๊ณ„(์•ˆ ์ฝ์€ ๋ฉ”์‹œ์ง€ ์ˆ˜, ์ฑ„ํŒ…๋ฐฉ ์‚ญ์ œ, ์ฑ„ํŒ… ๋ฉ”

ํŒŒ์ด๋„ ํ”„๋กœ์ ํŠธ ์•ผ๋‚˜๋ฐ”๋‹ค ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜๋ฉด์„œ, ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ฐ๊ฐ ๊ฐ์ž์˜ ํŒŒํŠธ๋ฅผ ๋‚˜๋ˆ„๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ๋Š” ํŽ˜์ด์ง€ ํ™”๋ฉด์„ ์ค‘์‹ฌ์œผ๋กœ ํŒŒํŠธ๋ฅผ ๋‚˜๋ˆ  ๊ฐ์ž ๋งˆํฌ์—… ๋‹จ๊ณ„๋ฅผ ์‹œ

programmer-may.tistory.com

 

HTTP ๋ฅผ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์„œ๋น„์Šค

์ œ๊ฐ€ ๊ฐœ๋ฐœํ•œ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์„œ๋น„์Šค๋ฅผ ๋ง์”€๋“œ๋ฆฌ๊ธฐ ์•ž์„œ ์‹ค์‹œ๊ฐ„ ๊ธฐ์ˆ ๋“ค์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ–ˆ๋˜ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

API ๋งŒ๋“œ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ ์‹ค์‹œ๊ฐ„์„ฑ์„ ํ‰๋‚ด๋‚ด๋Š” HTTP ๊ธฐ์ˆ ๋กœ ํ’€๋ง์„ ๋งŽ์ด ์•Œ๊ณ  ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ’€๋ง ๋ง๊ณ ๋„ ๋” ์žˆ์ฃ !

HTTP ํ”„๋กœํ† ์ฝœ์„ ํ™œ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๊ธฐ์ˆ ์€ ํ’€๋ง ๋ง๊ณ ๋„ ๋กฑํ’€๋ง, ์ŠคํŠธ๋ฆฌ๋ฐ, SSE ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โ‡๏ธ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ 

1๏ธโƒฃ ํ’€๋ง

ํ’€๋ง(Polling) ๊ธฐ์ˆ ์€ ์ „ํ†ต์ ์ธ AJAX ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜๋˜ ๋ฐฉ์‹์œผ๋กœ, ์ฃผ๊ธฐ์ ์œผ๋กœ HTTP ์š”์ฒญ์„ ์„œ๋ฒ„์— ๋‚ ๋ ค์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ผ์ • ๊ฐ„๊ฒฉ๋งˆ๋‹ค ์š”์ฒญ์ด ์ด๋ค„์ง€๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋“  ์—†๋“  ์‘๋‹ต์„ ๋ฐ›๊ณ  ์ผ์ • ์‹œ๊ฐ„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋‹ค์Œ ์š”์ฒญ์„ ๋‚ ๋ฆฌ๊ณ  ์‘๋‹ต๋ฐ›๊ณ , ๋˜ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋‹ค์Œ ์š”์ฒญ์„ ๋‚ ๋ฆฌ๊ณ  ์‘๋‹ต๋ฐ›๊ณ  …์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๋งŒํผ ์˜ค๋ฒ„ํ—ค๋“œ๋„ ํฐ๋ฐ์š”. ๋งŒ์•ฝ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด ์“ธ๋ฐ์—†๋Š” ์š”์ฒญ์ด ๊ณ„์† ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด๊ณ  ์ด๋Š” ๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ์„ ๊ณ„์† ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ด๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹จ์ : ์„œ๋ฒ„์— ๋ฐ›์•„์•ผํ•  ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋”๋ผ๋„ ์ฃผ๊ธฐ์ ์ธ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ๊ณผ ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ผ์ • ๊ฐ„๊ฒฉ์„ ๊ฐ–๊ณ  ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฑธ๋กœ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•œ ๋Œ€์‹  ์ด ์ผ์ •๊ฐ„๊ฒฉ์— ๋Œ€ํ•œ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‹ค์‹œ๊ฐ„์„ฑ์„ ์ตœ๋Œ€ํ™”ํ•˜๊ณ ์ž ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฐ„๊ฒฉ์„ ์ค„์ด์ž๋‹ˆ ์š”์ฒญ ์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ์„œ ์„œ๋ฒ„์— ๋ถ€๋‹ด์ด ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ HTTP ํ—ค๋” ๋˜ํ•œ ๊ฐ™์ด ์ „์†ก๋˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ ๊ฐ„๊ฒฉ์„ ์ค„์ด๊ฒŒ ๋˜๋ฉด ๊ทธ๋งŒํผ ์„œ๋ฒ„๊ฐ€ ๋ฐ›๋Š” ๋ถ€ํ•˜๊ฐ€ ์ปค์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜๋Œ€๋กœ ์„œ๋ฒ„ ๋ถ€๋‹ด์„ ๋œ๊ณ ์ž ๊ฐ„๊ฒฉ์„ ๋Š˜๋ฆฌ๊ฒŒ ๋˜๋ฉด ์‹ค์‹œ๊ฐ„์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2๏ธโƒฃ ๋กฑํ’€๋ง

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

 

  • ์ง€์—ฐ๋œ ์‘๋‹ต: ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ์‘๋‹ต์„ ์ง€์—ฐ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์ฆ‰์‹œ ์žฌ์š”์ฒญ: ํด๋ผ์ด์–ธํŠธ๋Š” ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ์ฆ‰์‹œ ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์‹ค์‹œ๊ฐ„์„ฑ ํ–ฅ์ƒ: ํด๋ง๋ณด๋‹ค ์‹ค์‹œ๊ฐ„์„ฑ ์ธก๋ฉด์—์„œ ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

 

 

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

๋˜ํ•œ ๋‹ค์ˆ˜์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ์ ‘์†์„ ์‹œ๋„ํ•œ๋‹ค๋ฉด ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์ด ์ปค์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

3๏ธโƒฃ ์ŠคํŠธ๋ฆฌ๋ฐ

HTTP ์ŠคํŠธ๋ฆฌ๋ฐ(HTTP Streaming) ๋ฐฉ์‹์€ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์™„๋ฃŒํ•˜์ง€ ์•Š์€์ฑ„(์ฆ‰, ์„œ๋ฒ„์—์„œ ์š”์ฒญ์„ ๊ณ„์†ํ•ด์„œ ์—ด์–ด๋‘”์ฑ„๋กœ) ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์†ํ•ด์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ํ‘ธ์‹œํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋งค๋ฒˆ ์‘๋‹ต์„ ํ•  ๋•Œ๋งˆ๋‹ค ๊ณง ์ด์–ด ๋‹ค์‹œ ์š”์ฒญํ•ด์•ผ ํ•˜๋Š” (๋กฑ)ํ’€๋ง ๋ฐฉ์‹์— ๋น„ํ•ด ํšจ์œจ์ ์ด๋ฉฐ, ์„œ๋ฒ„์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ์€ ๊ฒฝ์šฐ์— ์œ ๋ฆฌํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ฃผ๋กœ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ(์˜ˆ: ๋น„๋””์˜ค, ์˜ค๋””์˜ค)๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ „์†กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

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

  • ๋‹จ์ : ์„œ๋ฒ„๊ฐ€ ์ผ๋ฐฉ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ Response๋ฅผ ์ „๋‹ฌํ•  ๋ฟ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ์˜ ๋ฐ์ดํ„ฐ ์†ก์‹ ์€ ์–ด๋ ต๋‹ค(๋‹จ ๋ฐฉํ–ฅํ†ต์‹ )๋Š” ์ . Polling, Long Polling๋ณด๋‹ค ๋” ๋ณต์žกํ•˜๋‹ค๋Š” ์ .

 

4๏ธโƒฃ SSE

๋‹จ๋ฐฉํ–ฅ ํ†ต์‹  ๊ธฐ์ˆ ์ธ SSE(Server Sent Events)๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ํšจ์œจ์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. SSE ๋˜ํ•œ HTTP๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ธฐ์ˆ ์ด์ง€๋งŒ, ํด๋ง·๋กฑ ํด๋ง๊ณผ๋Š” ๋‹ฌ๋ฆฌ, SSE๋Š” ์„œ๋ฒ„๊ฐ€ ์›ํ•  ๋•Œ ์–ธ์ œ๋“  ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ “์„œ๋ฒ„๊ฐ€ ์›ํ•  ๋•Œ”๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ, ์ฆ‰ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋์„๋•Œ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. 

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

 

  • ์ž๋™ ์žฌ์—ฐ๊ฒฐ: ์—ฐ๊ฒฐ์ด ๋Š์–ด์งˆ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์žฌ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.( ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ EventSource ๊ฐ์ฒด ์‚ฌ์šฉ )
  • ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜: ์ฃผ๋กœ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์  : ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ง€์†์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์€ ๋ณ„๋„์˜ ์š”์ฒญ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.(๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ )

๋น„๊ต์š”์•ฝ

๋ฐฉ์‹ ์—ฐ๊ฒฐ ์ง€์†์„ฑ ๋ฐ์ดํ„ฐ ์ „์†ก ์ฃผ์ฒด ์‹ค์‹œ๊ฐ„์„ฑ
ํด๋ง ์ง€์†์ ์ด์ง€ ์•Š์Œ ํด๋ผ์ด์–ธํŠธ ๋‚ฎ์Œ
๋กฑ ํด๋ง ์ง€์†์ ์ด์ง€ ์•Š์Œ ํด๋ผ์ด์–ธํŠธ ์ค‘๊ฐ„
์ŠคํŠธ๋ฆฌ๋ฐ ์ง€์†์ ์ž„ ์„œ๋ฒ„ ๋†’์Œ
SSE ์ง€์†์ ์ž„ ์„œ๋ฒ„ ๋†’์Œ

 

 

 

๐Ÿช„ ๋ฌธ์ œํ•ด๊ฒฐ

์ด๋ ‡๊ฒŒ HTTP ๋ฅผ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๊ธฐ์ˆ ์€ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ์— ๊ฐ๊ฐ์˜ ๋‹จ์ ์ด ์žˆ์–ด, ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ธฐ์ˆ ๋กœ ์“ฐ๊ธฐ์— ์• ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค.

 

ํ’€๋ง, ๋กฑํ’€๋ง :  ๋ถˆํ•„์š”ํ•œ ์ง€์†์  ์š”์ฒญ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ์— ์‹ฌํ•œ ํŠธ๋ž˜ํ”ฝ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ, SSE : ์—ฐ๊ฒฐ์„ ๋งบ๊ณ ๋‚œ ๋’ค์—” ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก ์—†์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์„œ๋ฒ„ํ•œํ…Œ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ์ด๋ผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋„ ๋ฐ์ดํ„ฐ ์ „์†ก์‹œ์—” ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ๋ณด๋‚ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„ ๋ณด์•˜๊ณ , ์›น์†Œ์ผ“ ๊ธฐ์ˆ ์„ ์ฐพ์•„, ๊ณต๋ถ€ํ•˜๊ณ  ์ ์šฉํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

 

โ‡๏ธ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ 

์›น์†Œ์ผ“

์›น์†Œ์ผ“์€ ์ง„์ •ํ•œ ์˜๋ฏธ์˜ ์–‘๋ฐ˜ํ–ฅ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์ดˆ๊ธฐ ํ•ธ๋“œ์…ฐ์ดํฌ ๊ณผ์ •์—์„œ HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ดํ›„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์€ HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์ธ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ์ฑ„๋„์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

 

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

์›น์†Œ์ผ“์˜ ํŠน์ง•

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

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

 

 

STOMP

์›น์†Œ์ผ“์˜ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์„ ์•Œ ์ˆ˜ ์—†๋‹ค๋ผ๋Š” ๋‹จ์ ์„ ์œ„ํ•ด์„œ ๋ณด์กฐ ํ”„๋กœํ† ์ฝœ์ธ STOMP ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

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

 

STOMP์˜ ์ฃผ์š” ํŠน์ง•

  1. ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ: STOMP๋Š” ๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ๋กœ, ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ฉ”์‹œ์ง• ํŒจํ„ด ์ง€์›: Pub/Sub(๋ฐœํ–‰/๊ตฌ๋…) ํŒจํ„ด, ํ์ž‰, ํŠธ๋žœ์žญ์…˜ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๋ฉ”์‹œ์ง• ํŒจํ„ด์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ฉ€ํ‹ฐ ํ”„๋กœํ† ์ฝœ ์ง€์›: STOMP๋Š” ์›น์†Œ์ผ“ ์™ธ์—๋„ TCP, WebSocket, HTTP ๋“ฑ์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์ค‘์•™ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ์‚ฌ์šฉ: RabbitMQ, ActiveMQ ๊ฐ™์€ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์™€ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์›น์†Œ์ผ“๊ณผ STOMP์˜ ๊ฒฐํ•ฉ

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

 

  • ์›น์†Œ์ผ“: ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • STOMP: ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ์™€ ํŒจํ„ด์„ ํ‘œ์ค€ํ™”ํ•˜์—ฌ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

 

์Šคํ”„๋ง์—์„œ ์›น์†Œ์ผ“๊ณผ STOMP ๊ธฐ์ˆ  ํ™œ์šฉ

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

 

์•„๋ž˜๋Š” ์ œ๊ฐ€ ์ปค์Šคํ…€ํ•œ ์›น์†Œ์ผ“ ์ปจํ”ผ๊ทธ์ž…๋‹ˆ๋‹ค.

package kr.co.fastcampus.yanabada.common.config;

import kr.co.fastcampus.yanabada.common.handler.StompHandler;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@RequiredArgsConstructor
@EnableWebSocketMessageBroker
public class WebSockConfig implements WebSocketMessageBrokerConfigurer {

    private final StompHandler stompHandler;

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/sub");
        config.setApplicationDestinationPrefixes("/pub");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws-stomp").setAllowedOriginPatterns("*");
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(stompHandler);
    }
}

 

 

  • enableSimpleBroker("/sub"): ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” /sub ๊ฒฝ๋กœ๊ฐ€ ๊ตฌ๋… ๊ฒฝ๋กœ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • setApplicationDestinationPrefixes("/pub"): ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ๋กœ์˜ ์ ‘๋‘์‚ฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” /pub ๊ฒฝ๋กœ๊ฐ€ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • addEndpoint("/ws-stomp"): WebSocket ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด WebSocket ์—ฐ๊ฒฐ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • setAllowedOriginPatterns("*"): CORS ์„ค์ •์„ ํ†ตํ•ด ํŠน์ • ๋„๋ฉ”์ธ์—์„œ์˜ ์ ‘๊ทผ์„ ํ—ˆ์šฉ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋ชจ๋‘๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜์ง€๋งŒ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ํŠน์ • ๋„๋ฉ”์ธ๋งŒ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

๋‹ค์Œ์€ ์ œ๊ฐ€ ๋งŒ๋“  ์ฑ„ํŒ… ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

@RestController
@RequestMapping("/v1/chats")
@RequiredArgsConstructor
public class ChatController {

    @Value("${chatroom.topic.prefix}")
    private String chatroomTopicPrefix;

    private final ChatService chatService;

    private final SimpMessagingTemplate messagingTemplate;

    @MessageMapping("/message")
    public void message(ReceivedChatMessage message) {
        messagingTemplate.convertAndSend(
            chatroomTopicPrefix + message.chatRoomCode(),
            chatService.saveChatMessage(message)
        );
    }
}

 

 

  • @MessageMapping("/message"): STOMP ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ /{์„ค์ • ๊ฒฝ๋กœ}/message ๊ฒฝ๋กœ๋กœ ์ „์†ก๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ  /{์„ค์ • ๊ฒฝ๋กœ} ์€ WebSockConfig์—์„œ ์„ค์ •๋œ setApplicationDestinationPrefixes ๊ฐ’์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.(์ € ๊ฐ™์€ ๊ฒฝ์šฐ /pub ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.)
  • messagingTemplate.convertAndSend(...): SimpMessagingTemplate์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋ฅผ ํŠน์ • ์ฃผ์ œ๋กœ ๋‹ค์‹œ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. (๊ตฌ๋… ์ฃผ์ฒด์—๊ฒŒ ์ „์†ก)

โžก๏ธ ๋ฉ”์„ธ์ง€ ๋ฐœํ–‰ (โ€ป ์ฃผ์˜ ํŒ๋งค์ž -> ๊ตฌ๋งค์ž ๋ฉ”์„ธ์ง€ ์†ก์‹ ์ด ์•„๋‹Œ, ํด๋ผ์ด์–ธํŠธ -> ์„œ๋ฒ„ ์ž…๋‹ˆ๋‹ค.)

์ฑ„ํŒ… ๋ฉ”์„ธ์ง€ ๋ฐœํ–‰๊ณผ ๊ตฌ๋… ๊ฒฝ๋กœ์— ๋Œ€ํ•ด์„  ์ฑ„ํŒ… ๋„๋ฉ”์ธ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ๋ถ„๊ณผ ํ˜‘์˜ํ•˜์—ฌ ๊ฒฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•  ๋•Œ๋Š”

wss://{์„œ๋ฒ„ ์—”๋“œํฌ์ธํŠธ}/ws-stomp

๋กœ ์›น์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ๋งบ์€ ํ›„,

/pub/message

๊ฒฝ๋กœ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐœํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

โฌ…๏ธ ๋ฉ”์„ธ์ง€ ๊ตฌ๋… (โ€ป ์ฃผ์˜ ํŒ๋งค์ž -> ๊ตฌ๋งค์ž ๋ฉ”์„ธ์ง€ ์ˆ˜์‹ ์ด ์•„๋‹Œ, ์„œ๋ฒ„-> ํด๋ผ์ด์–ธํŠธ ์ž…๋‹ˆ๋‹ค.)

ํ™˜๊ฒฝ๋ณ€์ˆ˜์— /sub/chatroom ์„ ๋ช…์‹œํ•ด ๋†จ๊ธฐ ๋•Œ๋ฌธ์— chatroomTopicPrefix ๋กœ ๋ฐ›๊ณ , ์ „์†ก๋œ ์ฑ„ํŒ…๋ฐฉ ๋ฃธ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ,

/sub/chatroom/{chatRoomCode}

๊ฒฝ๋กœ๋กœ ์ฑ„ํŒ…๋ฐฉ์— ๋‚ด๊ฐ€ ๋ณด๋‚ธ ๊ทธ๋ฆฌ๊ณ  ์ƒ๋Œ€๋ฐฉ์ด ๋ณด๋‚ธ ๋ฉ”์„ธ์ง€๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ตฌ๋…ํ•˜์—ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด ๊ฒฝ์šฐ๋„ ์›น์†Œ์ผ“ ์—ฐ๊ฒฐ์ด ์„ ํ–‰ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด {chatRoomCode} ๋ฅผ ๊ฐ€์ง„ ์ฑ„ํŒ… ๋ฐฉ์—์„œ ๋‚ด๊ฐ€ ๋ณด๋‚ธ ๊ทธ๋ฆฌ๊ณ  ์ƒ๋Œ€๋ฐฉ์ด ๋ณด๋‚ธ ๋ฉ”์„ธ์ง€๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐœํ–‰ ๋ฐ ๊ตฌ๋…์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœจ ๊ฒฐ๊ณผ๋ฌผ

 

โœ๏ธ ์ •๋ฆฌ

  1. ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜์„œ๋ฅผ ํ†ตํ•ด์„œ, ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…์˜ ํ•„์š”์„ฑ์„ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.
  2. ์Šคํ”„๋ง MVC๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HTTP ๊ธฐ๋ฐ˜์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— HTTP ํ™œ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๊ธฐ์ˆ ์„ ํƒ์ƒ‰ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
  3. ํ•˜์ง€๋งŒ ๊ฐ๊ฐ์˜ ๊ธฐ์ˆ ๋“ค์€ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์„œ๋น„์Šค์˜ ๊ธฐ์ˆ ๋กœ ์“ฐ๊ธฐ์—๋Š” ์น˜๋ช…์ ์ธ ๋‹จ์ ๋“ค์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  4. ๋‹ค๋ฅธ ๊ธฐ์ˆ ์„ ์ฐพ์œผ๋ฉฐ ์›น์†Œ์ผ“ ๊ณผ STOMP๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , Spring์—์„œ๋„ ์ด ๊ธฐ์ˆ ์„ ์ง€์›ํ•ด์ค€๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.
  5. ์›น์†Œ์ผ“ + STOMP ๋ฅผ ํ†ตํ•ด ์ง„์ •ํ•œ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ๊ณผ ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ์™€ ํŒจํ„ด์„ ํ‘œ์ค€ํ™”ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿง‘‍๐Ÿ’ป ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

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

HTTP ํ”„๋กœํ† ์ฝœ๊ณผ HTTP ๋ฅผ ํ™œ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๊ธฐ์ˆ , ์›น์†Œ์ผ“, STOMP๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋ง‰์—ฐํ•˜๊ฒŒ ๊ธฐ์ˆ ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์ด ๊ธฐ์ˆ ์„ ์™œ ์จ์•ผํ•˜๋Š”์ง€, ์–ด๋–ค ์ด์ ์ด ์žˆ๋Š”์ง€ ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์•„ ๋งค์šฐ ๋ฟŒ๋“ฏํ•˜๊ณ  ๊ธฐ๋ปค์Šต๋‹ˆ๋‹ค.

 

๋Œ“๊ธ€