์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…์— WebSocket์ด ๊ผญ ํ•„์š”ํ• ๊นŒ? Polling์œผ๋กœ ๋‹ค์‹œ ๋งŒ๋“  ๋ผ์ด๋ธŒ ์ฑ„ํŒ…

doyeon
  • #Backend
  • #Polling
  • #Redis
  • #AWS
  • #Migration
  • #Fromm

๋“ค์–ด๊ฐ€๋ฉฐ

์•ˆ๋…•ํ•˜์„ธ์š”. ํ”„๋กฌ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ด๋„์—ฐ์ž…๋‹ˆ๋‹ค.

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

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

๊ฒฐ๊ตญ ์ €ํฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฑด ๋ฒ”์šฉ ๋ฉ”์‹ ์ €๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ผ์ด๋ธŒ ๋ฐฉ์†ก์˜ ํŠน์„ฑ์— ๋งž๋Š” ์ผํšŒ์„ฑ ์ฑ„ํŒ… ์‹œ์Šคํ…œ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—” โ€œ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…์„ ์ง์ ‘ ๋งŒ๋“ ๋‹คโ€๊ณ  ํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ WebSocket์„ ๋– ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค. SSE๋„ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ Pushํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ HTTP ๊ธฐ๋ฐ˜์ด๋ผ ์œ ๋ ฅํ•œ ํ›„๋ณด์˜€๊ณ ์š”. ๊ทธ๋Ÿฐ๋ฐ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋‹ค์‹œ ๋“ค์—ฌ๋‹ค๋ณด๋‹ˆ ๊ตณ์ด ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•ด์•ผ ํ•  ์ด์œ ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. 1~2์ดˆ ์ •๋„์˜ ์ง€์—ฐ์€ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ๊ฑฐ๋“ ์š”.

์ด ๊ธ€์—์„œ๋Š” ์™ธ๋ถ€ ์ฑ„ํŒ… ์†”๋ฃจ์…˜์„ ์ž์ฒด Polling ์„œ๋น„์Šค๋กœ ์žฌ๊ตฌ์ถ•ํ•˜๋ฉด์„œ ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ๊ธฐ์ˆ ์„ ์„ ํƒํ–ˆ๋Š”์ง€, ๋ฉ”์‹œ์ง€ ์šฐ์„ ์ˆœ์œ„์™€ ์กฐํšŒ ์ •์ฑ…์„ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ–ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์ค‘์— ๋ฐœ๊ฒฌํ•œ cursor ์ง€์—ฐ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ๊ณต์œ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์š”๊ตฌ์‚ฌํ•ญ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ •์˜ํ•˜๊ธฐ

์ž์ฒด ๊ตฌ์ถ•์„ ๊ฒ€ํ† ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๋จผ์ € ํ•œ ๊ฑด โ€œ๊ธฐ์กด ์™ธ๋ถ€ ์†”๋ฃจ์…˜์„ ๊ทธ๋Œ€๋กœ ๋ณต์ œํ•˜์žโ€๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ผ์ด๋ธŒ ์ฑ„ํŒ…์— ์ •๋ง ํ•„์š”ํ•œ ๊ฒŒ ๋ญ”์ง€ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๋Š” ๊ฑฐ์˜€์Šต๋‹ˆ๋‹ค.

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

์ •๋ฆฌํ•˜๊ณ  ๋‚˜๋‹ˆ ํ•œ ๊ฐ€์ง€ ์‚ฌ์‹ค์ด ๋ˆˆ์— ๋“ค์–ด์™”์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฐ™์€ ์ค‘์š”๋„๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์•„ํ‹ฐ์ŠคํŠธ ๋ฉ”์‹œ์ง€๋Š” ํŒฌ ๋ชจ๋‘๊ฐ€ ๊ผญ ๋ด์•ผ ํ•˜์ง€๋งŒ, ํŒฌ ๋ฉ”์‹œ์ง€๋Š” ์งง์€ ์‹œ๊ฐ„์— ๊ธ‰๊ฒฉํžˆ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด๊ณผ API๊ฐ€ ์ตœ์‹  ํ๋ฆ„์„ ์ž˜ ๋ณด์—ฌ์ฃผ๋ ค๋ฉด ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์–ด๋А ์ •๋„ ์ œ์–ดํ•ด์•ผ ํ–ˆ๊ณ ์š”.

๊ทธ๋ ‡๋‹ค๋ฉด ์„œ๋ฒ„๋„ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋ฅผ ๋˜‘๊ฐ™์ด ๋‹ค๋ฃฐ ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ•ํ•œ ์ „๋‹ฌ ๋ณด์žฅ์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์™€ ํŠธ๋ž˜ํ”ฝ ๋ณ€๋™์ด ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ„๋ฉด ์‹œ์Šคํ…œ์ด ํ›จ์”ฌ ๋‹จ์ˆœํ•ด์งˆ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

WebSocket, SSE, Polling ๋น„๊ตํ•˜๊ธฐ

WebSocket์€ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ๊ณผ ๋‚ฎ์€ ์ง€์—ฐ์ด ์ค‘์š”ํ•œ ์ฑ„ํŒ… ์„œ๋น„์Šค์— ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์—ฐ๊ฒฐ์„ ๊ณ„์† ์œ ์ง€ํ•ด์•ผ ํ•˜๋‹ค ๋ณด๋‹ˆ ์žฌ์—ฐ๊ฒฐ, ์„œ๋ฒ„ ํ™•์žฅ, ์„ธ์…˜ ๋ถ„์‚ฐ ๊ฐ™์€ ์šด์˜ ๋ณต์žก๋„๊ฐ€ ๋”ฐ๋ผ์˜ต๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ๋ฉ”์‹œ์ง€ ์ „์†ก ์ž์ฒด๋Š” HTTP API๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ˆ˜์‹ ๋งŒ์„ ์œ„ํ•ด ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋Š” ๊ฑด ์ข€ ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ WebSocket๋งŒ ๊ฒ€ํ† ํ•˜์ง„ ์•Š์•˜์Šต๋‹ˆ๋‹ค. SSE์™€ Polling๋„ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๋ฉด์„œ ์‹ค์ œ PoC์™€ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๊นŒ์ง€ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ์‹์žฅ์ ๊ณ ๋ คํ•  ์ 
WebSocket์–‘๋ฐฉํ–ฅ ํ†ต์‹ , ๋‚ฎ์€ ์ง€์—ฐ์—ฐ๊ฒฐ ๋ถ„์‚ฐ, ์žฌ์—ฐ๊ฒฐ, ์„ธ์…˜ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•จ
SSEHTTP ๊ธฐ๋ฐ˜์˜ ๋‹จ๋ฐฉํ–ฅ Push, ๋›ฐ์–ด๋‚œ ์‹ค์‹œ๊ฐ„์„ฑ์žฅ๊ธฐ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•  ์„œ๋ฒ„์™€ ์žฌ์—ฐ๊ฒฐ ํ›„ ์ƒํƒœ ๋ณต๊ตฌ๊ฐ€ ํ•„์š”ํ•จ
PollingStateless REST API, ์žฅ์•  ๋ณต๊ตฌ์™€ ํ™•์žฅ์ด ๋‹จ์ˆœํ•จ๋นˆ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๋ฉฐ Polling ์ฃผ๊ธฐ๋งŒํผ ์ง€์—ฐ๋จ

SSE PoC๋Š” ECS๊ฐ€ Redis Pub/Sub๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ์— ์ด๋ฒคํŠธ๋ฅผ Pushํ•˜๋Š” ๊ตฌ์กฐ์˜€์Šต๋‹ˆ๋‹ค. ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ๋‹ค๋…€์˜ค๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ๊ฐ€ ๋Š๊ฒผ์„ ๋•Œ๋ฅผ ์œ„ํ•ด Redis Stream๊ณผ ๋ณต๊ตฌ API๋„ ํ•จ๊ป˜ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ฎ์€ ๋ถ€ํ•˜์—์„œ SSE๋Š” ์ˆ˜ ms ์ˆ˜์ค€์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•ด ์‹ค์‹œ๊ฐ„์„ฑ๋งŒ ๋”ฐ์ง€๋ฉด ๊ฐ€์žฅ ์ข‹์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 5,000๋ช… ์ด์ƒ์˜ ๊ณ ๋ถ€ํ•˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ง€์—ฐ์ด ๊ธ‰๊ฒฉํžˆ ๋Š˜์—ˆ๊ณ  ์žฌ์—ฐ๊ฒฐ๋„ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ์ˆ˜์— ๋งž์ถฐ ECS ์šฉ๋Ÿ‰์„ ๊ณ„ํšํ•ด์•ผ ํ–ˆ๊ณ , ๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค ์—ฐ๊ฒฐ ์žฌ์„ค์ •๊ณผ ์ƒํƒœ ๋ณต๊ตฌ๋„ ์‹ ๊ฒฝ ์จ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Polling์€ ๋ฉ”์‹œ์ง€๊ฐ€ ์—†์–ด๋„ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๊ณ  1~2์ดˆ์˜ ์ง€์—ฐ์ด ์žˆ์—ˆ์ง€๋งŒ, ๋ถ€ํ•˜๊ฐ€ ๋Š˜์–ด๋‚˜๋„ ์ง€์—ฐ์„ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์ด Statelessํ•˜๋‹ˆ๊นŒ ๋„คํŠธ์›Œํฌ๊ฐ€ ์ž ๊น ๋Š๊ฒจ๋„ ๋‹ค์Œ Polling์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณต๊ตฌ๋˜๊ณ , ์„œ๋ฒ„ ์žฌ์‹œ์ž‘์ด ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋น„์šฉ๋„ Polling์ด ์œ ๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. SSE๋Š” ๋ผ์ด๋ธŒ๊ฐ€ ์—†๋Š” ์‹œ๊ฐ„์—๋„ ECS ์ธ์Šคํ„ด์Šค๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜์ง€๋งŒ, Polling์€ Lambda ๊ธฐ๋ฐ˜์ด๋ผ ์‹ค์ œ ์š”์ฒญ์ด ์—†์œผ๋ฉด ์ปดํ“จํŒ… ๋น„์šฉ์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋ผ์ด๋ธŒ ํšŸ์ˆ˜์™€ ํ‰๊ท  ์‹œ์ฒญ ์ธ์›์„ ๊ธฐ์ค€์œผ๋กœ ์ถ”์‚ฐํ•ด๋ดค์„ ๋•Œ๋„ Polling์ด ๊ฐ€์žฅ ์ €๋ ดํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์„ ํƒ ๊ธฐ์ค€์€ โ€œ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ์‹โ€์ด ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ์ง€์—ฐ ์•ˆ์—์„œ ์šด์˜ ๋ณต์žก๋„์™€ ๋น„์šฉ์ด ๊ฐ€์žฅ ๋‚ฎ์€ ๋ฐฉ์‹์„ ๊ณจ๋ž๊ณ , ๋‹ค์Œ ์กฐ๊ฑด๋“ค์ด Polling๊ณผ ์ž˜ ๋งž์•„๋–จ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

  • 1~2์ดˆ์˜ ์ง€์—ฐ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฉ”์‹œ์ง€๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ์‘๋‹ต ํฌ๊ธฐ์™€ ์กฐํšŒ ๋ฒ”์œ„๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„œ๋ฒ„๋ฆฌ์Šค ์ธํ”„๋ผ๋ฅผ ์ด์šฉํ•ด ์š”์ฒญ๋Ÿ‰์— ๋”ฐ๋ผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”์‹œ์ง€ ์กฐํšŒ์™€ ๋ฐฉ ์ƒํƒœ ์กฐํšŒ์˜ ์ฃผ๊ธฐ๋„ ๋”ฐ๋กœ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค.

Polling ๋Œ€์ƒ์ฃผ๊ธฐ์ด์œ 
ํ˜ธ์ŠคํŠธ์˜ ๋ฉ”์‹œ์ง€ ์กฐํšŒ1์ดˆ๋ฐฉ์†ก ์ง„ํ–‰์ž๊ฐ€ ํŒฌ ๋ฐ˜์‘์„ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•ด์•ผ ํ•จ
์‹œ์ฒญ์ž์˜ ๋ฉ”์‹œ์ง€ ์กฐํšŒ2์ดˆ์ฒด๊ฐ ์‹ค์‹œ๊ฐ„์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์š”์ฒญ ์ˆ˜๋ฅผ ์ค„์ž„
๋ฐฉ ์ƒํƒœ5์ดˆ์ข‹์•„์š”, ์–ผ๋ฆฌ๊ธฐ, ๋ฎคํŠธ, ๋ฐด์€ ๋ฉ”์‹œ์ง€๋ณด๋‹ค ๋‚ฎ์€ ์กฐํšŒ ๋นˆ๋„๋กœ ์ถฉ๋ถ„ํ•จ

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ 1์ดˆ๋งˆ๋‹ค ์š”์ฒญํ•˜๋Š” ๋Œ€์‹ , ๋ณ€ํ™” ๋นˆ๋„์™€ ์ค‘์š”๋„์— ๋”ฐ๋ผ ์ฃผ๊ธฐ๋ฅผ ๋‚˜๋ˆ  ๋ถˆํ•„์š”ํ•œ ๋ถ€ํ•˜๋ฅผ ์ค„์˜€์Šต๋‹ˆ๋‹ค.

์ „์ฒด ์•„ํ‚คํ…์ฒ˜

๋ผ์ด๋ธŒ ์ฑ„ํŒ… Polling ์•„ํ‚คํ…์ฒ˜

๋ผ์ด๋ธŒ ์ฑ„ํŒ… Polling ์„œ๋น„์Šค์˜ ๋ฉ”์‹œ์ง€ ์ „์†ก ๋ฐ ์กฐํšŒ ๊ตฌ์กฐ

์ „์ฒด ์‹œ์Šคํ…œ์€ API Gateway, Lambda, SQS, Redis๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ํŒฌ ๋ฉ”์‹œ์ง€๋Š” API Gateway์—์„œ ๋ฐ”๋กœ SQS๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ๋กœ์—๋Š” Lambda๋ฅผ ๋”ฐ๋กœ ๋‘์ง€ ์•Š์•˜๋Š”๋ฐ์š”. API Gateway์˜ AWS ์„œ๋น„์Šค ์ง์ ‘ ํ†ตํ•ฉ์„ ์‚ฌ์šฉํ•ด JWT Authorizer๋ฅผ ํ†ต๊ณผํ•œ ์š”์ฒญ ๋ณธ๋ฌธ์„ SQS-SendMessage๋กœ ์ „๋‹ฌํ•˜๊ณ , ์ดํ›„ Lambda Consumer๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒ€์ฆํ•ด Redis์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

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

๋ฐ˜๋ฉด ์•„ํ‹ฐ์ŠคํŠธ์™€ ์šด์˜์ž ๋ฉ”์‹œ์ง€๋Š” ๋ณ„๋„์˜ Lambda๋ฅผ ํ†ตํ•ด Redis์— ๋ฐ”๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๋ฉ”์‹œ์ง€ ํ ํŠธ๋ž˜ํ”ฝ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋Šฆ์–ด์ง€๋Š” ๊ฑธ ๋ง‰๊ธฐ ์œ„ํ•ด ๊ฒฝ๋กœ๋ฅผ ๋ถ„๋ฆฌํ•œ ๊ฒ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ๋ฉ”์‹œ์ง€: Client -> API Gateway -> SQS -> Lambda -> Redis
์ค‘์š” ๋ฉ”์‹œ์ง€: Client -> API Gateway -> Lambda -> Redis
๋ฉ”์‹œ์ง€ ์ˆ˜์‹ : Client -> API Gateway -> Lambda -> Redis

์ข‹์•„์š”๋„ ๋ชจ๋“  ํด๋ฆญ์„ ์ฆ‰์‹œ ๋™๊ธฐํ™”ํ•  ํ•„์š”๋Š” ์—†์–ด์„œ, ํด๋ผ์ด์–ธํŠธ์—์„œ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ฆ๊ฐ€๋Ÿ‰์„ ๋ชจ์•„ ์ „์†กํ•˜๊ณ  SQS์™€ Lambda๋ฅผ ํ†ตํ•ด Redis ์นด์šดํ„ฐ์— ๋ฐ˜์˜ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

Redis Sorted Set๊ณผ Cursor

๋ผ์ด๋ธŒ ์ฑ„ํŒ… ๋ฐ์ดํ„ฐ๋Š” ๋ฐฉ์†ก ์ค‘์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. RDB์— ์˜๊ตฌ ์ €์žฅํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค Redis์— ์งง๊ฒŒ ๋ณด๊ด€ํ•˜๋Š” ํŽธ์ด ์š”๊ตฌ์‚ฌํ•ญ์— ํ›จ์”ฌ ์ž˜ ๋งž์•˜์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€๋Š” Redis Sorted Set์— ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. score์—๋Š” ์„œ๋ฒ„๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•œ ์‹œ๊ฐ์„, member์—๋Š” ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Key: live_chat:{roomId}:messages:{priority}
Score: createdAt
Member: { messageId, content, userId, nickname, createdAt }
TTL: 24์‹œ๊ฐ„

ํด๋ผ์ด์–ธํŠธ๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธํ•œ cursor๋ฅผ ๋‹ค์Œ ์š”์ฒญ์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

GET /live-chat/{roomId}/messages?cursor=1710000000000

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

์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์กฐํšŒ ์ •์ฑ…์€ ๋‹ฌ๋ฆฌ ๊ฐ€์ ธ๊ฐ”์Šต๋‹ˆ๋‹ค.

์šฐ์„ ์ˆœ์œ„ ๋†’์€ ๋ฉ”์‹œ์ง€

์•„ํ‹ฐ์ŠคํŠธ์™€ ์šด์˜์ž์˜ ๋ฉ”์‹œ์ง€๋Š” cursor ์ดํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

ZRANGEBYSCORE live_chat:{roomId}:messages:high cursor+1 +inf

์ค‘์š” ๋ฉ”์‹œ์ง€๋Š” ์ˆ˜๊ฐ€ ๋งŽ์ง€ ์•Š๊ณ  ์ „๋‹ฌ์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•ด์„œ ๋ˆ„๋ฝ ์—†์ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ๋ฉ”์‹œ์ง€

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

์กฐํšŒ ๊ธฐ์ค€: cursor ์ดํ›„ ๋ฐ์ดํ„ฐ
์ •๋ ฌ ๊ธฐ์ค€: ์ตœ์‹  ๊ตฌ๊ฐ„ ์šฐ์„ 
์‘๋‹ต ๊ธฐ์ค€: ๊ณ ์ •๋œ pageSize ์•ˆ์—์„œ ๊ตฌ์„ฑ

์กฐํšŒ ๊ฒฐ๊ณผ๋Š” ์‹œ๊ฐ„์ˆœ์œผ๋กœ ๋‹ค์‹œ ์ •๋ ฌํ•œ ๋’ค ์šฐ์„ ์ˆœ์œ„ ๋†’์€ ๋ฉ”์‹œ์ง€์™€ ํ•ฉ์ณ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ์ด ๊ธ‰์ฆํ•ด๋„ ์‘๋‹ต ํฌ๊ธฐ์™€ Lambda ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„ ์•ˆ์— ๋จธ๋ฌผ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€ ์‚ญ์ œ ์ด๋ฒคํŠธ๋„ ๋ณ„๋„์˜ Sorted Set์— deletedAt์„ score๋กœ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€์™€ ์‚ญ์ œ ์ด๋ฒคํŠธ๋ฅผ ํ•จ๊ป˜ ์กฐํšŒํ•œ ํ›„ ๊ฐ€์žฅ ์ตœ์‹  ์‹œ๊ฐ์„ ๋‹ค์Œ cursor๋กœ ์‚ฌ์šฉํ•˜์—ฌ, ์‚ญ์ œ ์ด๋ฒคํŠธ๋งŒ ๋ฐœ์ƒํ•œ Polling์—์„œ๋„ cursor๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ „์ง„ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

30์ดˆ ์ „ ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•œ ์ด์œ 

๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์ค‘์— ๊ฐ€์ƒ ํด๋ผ์ด์–ธํŠธ๋ฅผ 500๋ช…์—์„œ 1,000๋ช…์œผ๋กœ ๋Š˜๋ฆฌ์ž ์ด์ƒํ•œ ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. Polling API ์‘๋‹ต ์‹œ๊ฐ„์€ ์ •์ƒ์ธ๋ฐ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž์‹ ์ด ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค์‹œ ์ˆ˜์‹ ํ•˜๊ธฐ๊นŒ์ง€์˜ Round Trip์ด ์ ์  ๊ธธ์–ด์ง€๋”๋‹ˆ 30์ดˆ๋ฅผ ๋„˜์–ด๊ฐ”์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—” ๋ฉ”ํŠธ๋ฆญ ์„ค์ •์„ ์˜์‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ธก์ • ๊ตฌ๊ฐ„์„ ๋Š˜๋ ค๋ณด๋‹ˆ ํ…Œ์ŠคํŠธ๊ฐ€ ์ง„ํ–‰๋ ์ˆ˜๋ก ์ง€์—ฐ์ด ์„ ํ˜•์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. API๊ฐ€ ๋А๋ฆฐ ๊ฒŒ ์•„๋‹ˆ๋ผ ํด๋ผ์ด์–ธํŠธ์˜ cursor๊ฐ€ ํ˜„์žฌ ์‹œ๊ฐ์„ ๋”ฐ๋ผ์žก์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋˜ ๊ฒ๋‹ˆ๋‹ค.

๋‹น์‹œ ์ผ๋ฐ˜ ๋ฉ”์‹œ์ง€๋Š” cursor ์งํ›„ ๊ตฌ๊ฐ„๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ€๋Š” ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด: cursor ์งํ›„ ๊ตฌ๊ฐ„๋ถ€ํ„ฐ ์ˆœ์ฐจ ์กฐํšŒ

ํŠธ๋ž˜ํ”ฝ์ด ์ˆœ๊ฐ„์ ์œผ๋กœ ์กฐํšŒ ํ•œ๋„๋ฅผ ๋„˜์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฏธ ์˜ค๋ž˜๋œ ๊ตฌ๊ฐ„์„ ๊ณ„์† ๋”ฐ๋ผ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๊ฐ€ ์Œ“์ด๋Š” ์†๋„๋ฅผ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋”ฐ๋ผ๊ฐ€์ง€ ๋ชปํ•˜๋‹ˆ, cursor๋Š” ์˜์›ํžˆ ํ˜„์žฌ ์‹œ์ ์„ ๋”ฐ๋ผ์žก์„ ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ ์‹œ๋„ํ•œ ๊ฑด cursor ์ดํ›„ ๋ฒ”์œ„๋ฅผ ๋„“๊ฒŒ ์กฐํšŒํ•œ ๋’ค ๋‹ค์Œ cursor๋ฅผ ์ตœ์‹  ์‹œ์ ์œผ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ์€ ์ค„์—ˆ์ง€๋งŒ, ํŠธ๋ž˜ํ”ฝ์ด ์ปค์ง€๋ฉด Redis์—์„œ ์ฝ์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ์™€ Lambda ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ๋Š” ์กฐํšŒ ๋ฐฉํ–ฅ์„ ๋’ค์ง‘์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ: ์ตœ์‹  ๊ตฌ๊ฐ„ ๊ธฐ์ค€ ์กฐํšŒ

์ตœ์‹  ๊ตฌ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์กฐํšŒํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์–‘์„ ์ œํ•œํ•˜๋ฉด์„œ๋„ cursor๋ฅผ ํ˜„์žฌ ์‹œ์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ด๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ • ํ›„ ๋™์ผํ•œ ์กฐ๊ฑด์—์„œ Round Trip์ด 5์ดˆ ์ด๋‚ด๋กœ ์ค„์—ˆ๊ณ , 3,000๋ช…ยท5,000๋ช… ์กฐ๊ฑด์—์„œ๋„ ๊ฐ™์€ ๋ฒ”์œ„ ์•ˆ์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฑธ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์•ฑ์—์„œ๋Š” ๊ธฐ์กด ๊ตฌ์กฐ๋ฅผ ์ตœ๋Œ€ํ•œ ์œ ์ง€ํ•˜๊ธฐ

์„œ๋ฒ„๋ฅผ ๊ต์ฒดํ•˜๋Š” ๋™์•ˆ ์•ฑ์˜ ๋ผ์ด๋ธŒ ํ™”๋ฉด ์ „์ฒด๋ฅผ ๋’ค์—Ž๊ณ  ์‹ถ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์•ฑ์—๋Š” ์ฑ„ํŒ… ๋ฐ์ดํ„ฐ์†Œ์Šค ์ธํ„ฐํŽ˜์ด์Šค ๋’ค์— ์™ธ๋ถ€ ์†”๋ฃจ์…˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋”ฐ๋ฅด๋Š” Polling ๊ตฌํ˜„์ฒด๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

if chatProvider == .fromm {
    liveChatDataSource = PollingLiveChatDataSource(apiService: liveChatAPIService)
} else {
    liveChatDataSource = ExternalLiveChatDataSource()
}

๋ฉ”์‹œ์ง€ ์ˆ˜์‹ ์€ SDK์˜ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ ๋Œ€์‹  Polling ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์กด ์ŠคํŠธ๋ฆผ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. UI์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์„œ ์™”๋Š”์ง€ ์•Œ ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

์ ์ง„์  ์ „ํ™˜์„ ์œ„ํ•ด App Config์— ์ „์ฒด ์ ์šฉ ์—ฌ๋ถ€์™€ ๋Œ€์ƒ ์•„ํ‹ฐ์ŠคํŠธ ๋ชฉ๋ก๋„ ๋’€์Šต๋‹ˆ๋‹ค.

{
  "apply_all": false,
  "apply_target_list": ["artist-id"]
}

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

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

๋งˆ์น˜๋ฉฐ

์‹ค์‹œ๊ฐ„ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ํ•ด์„œ ๊ผญ WebSocket์ด๋‚˜ SSE๊ฐ€ ์ •๋‹ต์€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

๋ฌผ๋ก  ์™„์ „ํ•œ ๋ฉ”์‹œ์ง€ ์ˆœ์„œ ๋ณด์žฅ์ด๋‚˜ ์•„์ฃผ ๋‚ฎ์€ ์ง€์—ฐ, ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ํ•ต์‹ฌ์ด๋ผ๋ฉด WebSocket์ด ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋น ๋ฅด๊ฒŒ Pushํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•˜๋‹ค๋ฉด SSE๋„ ์ถฉ๋ถ„ํžˆ ์ข‹์€ ์„ ํƒ์ด๊ณ ์š”. ํ•˜์ง€๋งŒ ์š”๊ตฌ์‚ฌํ•ญ์ด ํ—ˆ์šฉํ•œ๋‹ค๋ฉด Polling์€ ์ถฉ๋ถ„ํžˆ ๋‹จ์ˆœํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋น„์šฉ ํšจ์œจ์ ์ธ ์„ ํƒ์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ์ž‘์—…์—์„œ ๊ฐ€์žฅ ํฌ๊ฒŒ ๋ฐฐ์šด ๊ฑด, ๊ธฐ์ˆ ์„ ๊ต์ฒดํ•  ๋•Œ ๊ธฐ์กด ์†”๋ฃจ์…˜์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ์šฐ๋ฆฌ ์„œ๋น„์Šค๊ฐ€ ์‹ค์ œ๋กœ ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๋‹ค์‹œ ๋ฌป๋Š” ๊ณผ์ •์ด ๋จผ์ €๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

โ† ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

Art Changes Life

๋…ธ๋จธ์Šค์™€ ํ•จ๊ป˜ ์—”ํ„ฐํ…Œํฌ ์‚ฐ์—…์„ ํ˜์‹ ํ•ด๋‚˜๊ฐˆ ๋ฉค๋ฒ„๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ฑ„์šฉ ์ค‘์ธ ๊ณต๊ณ  ๋ณด๊ธฐ