ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
๐—›๐—ผ๐˜„ ๐—ฑ๐—ผ ๐˜†๐—ผ๐˜‚ ๐—ฝ๐—ฟ๐—ฒ๐˜ƒ๐—ฒ๐—ป๐˜ ๐—จ๐—œ ๐—น๐—ฎ๐—ด ๐˜„๐—ต๐—ฒ๐—ป ๐—ฟ๐—ฒ๐—ฐ๐—ฒ๐—ถ๐˜ƒ๐—ถ๐—ป๐—ด ๐—ผ๐˜ƒ๐—ฒ๐—ฟ ๐Ÿญ๐Ÿฌ๐Ÿฌ ๐—ช๐—ฒ๐—ฏ๐—ฆ๐—ผ๐—ฐ๐—ธ๐—ฒ๐˜ ๐—ฒ๐˜ƒ๐—ฒ๐—ป๐˜๐˜€ ๐—ฝ๐—ฒ๐—ฟ ๐˜€๐—ฒ๐—ฐ๐—ผ๐—ป๐—ฑ?
Dev.toDev.to
Frontend

์ดˆ๋‹น 100ํšŒ ์ด์ƒ์˜ WebSocket ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ UI ๋ Œ๋”๋ง ์ตœ์ ํ™” ์„ค๊ณ„

๐—›๐—ผ๐˜„ ๐—ฑ๐—ผ ๐˜†๐—ผ๐˜‚ ๐—ฝ๐—ฟ๐—ฒ๐˜ƒ๐—ฒ๐—ป๐˜ ๐—จ๐—œ ๐—น๐—ฎ๐—ด ๐˜„๐—ต๐—ฒ๐—ป ๐—ฟ๐—ฒ๐—ฐ๐—ฒ๐—ถ๐˜ƒ๐—ถ๐—ป๐—ด ๐—ผ๐˜ƒ๐—ฒ๐—ฟ ๐Ÿญ๐Ÿฌ๐Ÿฌ ๐—ช๐—ฒ๐—ฏ๐—ฆ๐—ผ๐—ฐ๐—ธ๐—ฒ๐˜ ๐—ฒ๐˜ƒ๐—ฒ๐—ป๐˜๐˜€ ๐—ฝ๐—ฒ๐—ฟ ๐˜€๐—ฒ๐—ฐ๐—ผ๐—ป๐—ฑ?

Kiran2026๋…„ 5์›” 18์ผ2๋ถ„intermediate

Context

์ดˆ๋‹น 100ํšŒ ์ด์ƒ์˜ ๊ณ ๋นˆ๋„ WebSocket ์ด๋ฒคํŠธ ์ˆ˜์‹  ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ถ€ํ•˜ ๋ถ„์„. ๋งค ์ด๋ฒคํŠธ๋งˆ๋‹ค ๋ฐœ์ƒํ•˜๋Š” DOM ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•œ ๊ณผ๋„ํ•œ Reflow ๋ฐ Repaint๊ฐ€ UI Lag์˜ ๊ทผ๋ณธ ์›์ธ์œผ๋กœ ์ž‘์šฉํ•˜๋Š” ๊ตฌ์กฐ์  ํ•œ๊ณ„ ์กด์žฌ.

Technical Solution

  • Event Stream๊ณผ ๋ Œ๋”๋ง ์Šค๋ ˆ๋“œ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•œ Decoupling ๊ตฌ์กฐ ์„ค๊ณ„
  • Throttling ๋ฐ Buffering ๊ธฐ๋ฒ•์„ ์ ์šฉํ•œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์ฃผ๊ธฐ ์ œํ•œ ๋ฐ ๋ฐ์ดํ„ฐ ์ง‘์•ฝ ์ฒ˜๋ฆฌ
  • requestAnimationFrame ๊ธฐ๋ฐ˜์˜ DOM Batch Update๋ฅผ ํ†ตํ•œ ๋ธŒ๋ผ์šฐ์ € ๋ฆฌํ”„๋ ˆ์‹œ ๋ ˆ์ดํŠธ ๋™๊ธฐํ™”
  • Web Worker ๋„์ž…์œผ๋กœ ๋ฐ์ดํ„ฐ ํŒŒ์‹ฑ ๋ฐ ์ „์ฒ˜๋ฆฌ ๋กœ์ง์„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์˜คํ”„๋กœ๋“œํ•˜์—ฌ ์—ฐ์‚ฐ ๋ณ‘๋ชฉ ์ œ๊ฑฐ
  • Virtualization ์ ์šฉ์„ ํ†ตํ•œ ๋ Œ๋”๋ง ๋Œ€์ƒ DOM ๋…ธ๋“œ ์ˆ˜ ์ตœ์†Œํ™” ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ๊ฐœ์„ 
  • React ํ™˜๊ฒฝ ๋‚ด Mutable Ref ํ™œ์šฉ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ State ๊ธฐ๋ฐ˜ Re-render Cascade ๋ฐฉ์ง€

- ๊ณ ๋นˆ๋„ ๋ฐ์ดํ„ฐ ์ˆ˜์‹  ์‹œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์ฃผ๊ธฐ๋ฅผ 10~15 FPS๋กœ ์ œํ•œํ•˜๋Š” Throttling ์ ์šฉ ๊ฒ€ํ†  - ๋ฌด๊ฑฐ์šด ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋กœ์ง์˜ Web Worker ์ด๊ด€ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํŒ๋‹จ - ๋Œ€๋Ÿ‰์˜ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง ์‹œ Windowing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์ž…์„ ํ†ตํ•œ DOM ์ตœ์ ํ™” ์ˆ˜ํ–‰ - DOM ์ง์ ‘ ์กฐ์ž‘ ์‹œ DocumentFragment๋ฅผ ํ™œ์šฉํ•œ ๋‹จ์ผ Append ์ž‘์—… ์ˆ˜ํ–‰

์›๋ฌธ ์ฝ๊ธฐ