๐Ÿ’ญ ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ ๊ฐ€์ƒํ™” (Virtualization)

Yujin Jungยท2025๋…„ 11์›” 12์ผ

์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ํ™”๋ฉด์— โ€œํ•œ ๋ฒˆ์—โ€ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š” ์ด์œ 


๐Ÿ’ญ ๋“ค์–ด๊ฐ€๋ฉฐ

์›น ์„œ๋น„์Šค๊ฐ€ ์ปค์งˆ์ˆ˜๋ก โ€œ๋ฆฌ์ŠคํŠธโ€๋Š” ํญ๋ฐœ์ ์œผ๋กœ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.
์ƒํ’ˆ ๋ชฉ๋ก, ์•Œ๋ฆผํ•จ, ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€, ํ”ผ๋“œ, ๋กœ๊ทธ โ€” ๋ชจ๋‘ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ์ด 1,000๊ฐœ๋งŒ ๋„˜์–ด๋„ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ˆจ์ด ์ฐน๋‹ˆ๋‹ค.
์Šคํฌ๋กค์ด ๋ฒ„๋ฒ…์ด๊ณ , ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์น˜์†Ÿ๊ณ , TTI(๋Œ€ํ™” ๊ฐ€๋Šฅ ์‹œ์ )์€ ์ง€์—ฐ๋ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ๋“ฑ์žฅํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ ๊ฐ€์ƒํ™”(Data List Virtualization)์ž…๋‹ˆ๋‹ค.
ํ•œ๋งˆ๋””๋กœ ๋งํ•˜๋ฉด โ€œ๋ณด์ด๋Š” ๋งŒํผ๋งŒ ๋ Œ๋”๋งํ•œ๋‹คโ€๋Š” ๊ธฐ์ˆ ์ด์ฃ .


๐Ÿ’ญ ๋ Œ๋”๋ง์€ โ€˜๋ณด์ด๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ๋‹คโ€™

์ผ๋ฐ˜์ ์ธ ๋ฆฌ์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

function List({ items }) {
  return (
    <div>
      {items.map((item) => (
        <div className="row" key={item.id}>
          {item.title}
        </div>
      ))}
    </div>
  );
}

๋ฐ์ดํ„ฐ๊ฐ€ 1,000๊ฐœ๋ผ๋ฉด <div>๊ฐ€ 1,000๊ฐœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ์€ 10~15๊ฐœ์— ๋ถˆ๊ณผํ•˜์ฃ .

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค:

๋‹จ๊ณ„๋น„์šฉ์„ค๋ช…
Layout๋†’์ดยทํญ ๊ณ„์‚ฐ๋ชจ๋“  1,000๊ฐœ DOM ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ
Paintํ”ฝ์…€ ๊ทธ๋ฆฌ๊ธฐ๋ณด์ด์ง€ ์•Š๋Š” ์˜์—ญ๋„ ํŽ˜์ธํŠธ ํ์— ํฌํ•จ
Memory์œ ์ง€๋น„์šฉ๊ฐ ๋…ธ๋“œ์˜ ์ฐธ์กฐ, ์Šคํƒ€์ผ, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์œ ์ง€
JS Reflow์—ฐ์‡„ํšจ๊ณผ์Šคํฌ๋กค ์‹œ ๋งค๋ฒˆ ์Šคํƒ€์ผยท๋ ˆ์ด์•„์›ƒ ์žฌ๊ณ„์‚ฐ

๊ฒฐ๊ณผ์ ์œผ๋กœ ์Šคํฌ๋กค์ด ๋ฒ„๋ฒ…์ด๊ณ ,
๋ชจ๋ฐ”์ผ์—์„œ๋Š” ๋ Œ๋”๋ง ์ค‘๋‹จ(Frozen Frame)์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

  • DOM ๋…ธ๋“œ ์ฆ๊ฐ€์— ๋”ฐ๋ผ JS Heap๊ณผ FPS๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ƒ์Šนยทํ•˜๋ฝ
  • ๋ Œ๋”๋ง ๋ถ€ํ•˜๊ฐ€ ๋ˆ„์ ๋˜๋ฉฐ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ Reflow/Repaint๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ํŒจํ„ด ํ™•์ธ
    ๐Ÿ‘‰ โ€œDOM์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๊ธ‰๊ฒฉํžˆ ์ฆ๊ฐ€ํ•œ๋‹คโ€

๐Ÿ’ญ โ€œ๊ฐ€์ƒํ™”(Virtualization)โ€๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ ๊ฐ€์ƒํ™”๋Š” ๋‹ค์Œ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค.

โ€œ๋ณด์ด๋Š” ์˜์—ญ(๋ทฐํฌํŠธ) + ์ฃผ๋ณ€ ๋ฒ„ํผ๋งŒ ๋ Œ๋”๋งํ•˜๊ณ , ๋‚˜๋จธ์ง€๋Š” ๊ฐ€์งœ ๋†’์ด๋กœ ๋Œ€์ฒดํ•œ๋‹ค.โ€

์ฆ‰, ์‹ค์ œ DOM์—๋Š” ์ผ๋ถ€๋งŒ ์กด์žฌํ•˜์ง€๋งŒ,
๋ธŒ๋ผ์šฐ์ €๋Š” ์ „์ฒด ์Šคํฌ๋กค ๋†’์ด๋ฅผ ๊ฐ€์ƒ์œผ๋กœ ๊ณ„์‚ฐํ•ด ๋งˆ์น˜ ์ „๋ถ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋™์ž‘ ๊ฐœ๋…

์Šคํฌ๋กค ์ƒํƒœ์‹ค์ œ DOM ๊ตฌ์„ฑ
์ดˆ๊ธฐindex 0~15 ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋ง
์•„๋ž˜๋กœ ์Šคํฌ๋กคindex 10~25 ํ•ญ๋ชฉ๋งŒ DOM ์œ ์ง€, ๋‚˜๋จธ์ง€๋Š” ์ œ๊ฑฐ
๋๊นŒ์ง€ ์Šคํฌ๋กคindex 985~1000 ํ•ญ๋ชฉ๋งŒ ๋‚จ์Œ

  • ์™ผ์ชฝ(Regular Scrolling): ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์•„์ดํ…œ(item 998~item 1006)์ด ์‹ค์ œ DOM์— ๋ Œ๋”๋ง๋˜์–ด ์žˆ์–ด, ํ•ญ๋ชฉ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ๊ณผ ํŽ˜์ธํŠธ ๋น„์šฉ์ด ๊ธ‰์ฆํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋ฅธ์ชฝ(Virtualized Scrolling): ํ˜„์žฌ ํ™”๋ฉด(visible viewport) ์•ˆ์˜ ํ•ญ๋ชฉ(item 1000~item 1005)๋งŒ ์‹ค์ œ DOM์— ์กด์žฌํ•˜๋ฉฐ, ์œ„์•„๋ž˜ ํ•ญ๋ชฉ์€ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฐ€์ƒ์˜ ํŒจ๋”ฉ ๊ณต๊ฐ„์œผ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.
    ๐Ÿ‘‰ โ€œ๋ณด์ด๋Š” ๋ถ€๋ถ„๋งŒ ๋ Œ๋”๋งโ€ํ•จ์œผ๋กœ์จ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ๋ถ€ํ•˜๋ฅผ ํฌ๊ฒŒ ์ค„์ด๊ณ  FPS๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ญ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ ‡๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค (์ž‘๋™ ์›๋ฆฌ)

๋ฆฌ์ŠคํŠธ ๊ฐ€์ƒํ™”๋Š” ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์›๋ฆฌ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

โ‘  Viewport ๊ณ„์‚ฐ

  • ํ˜„์žฌ ์Šคํฌ๋กค ์œ„์น˜(scrollTop)์™€ ํ™”๋ฉด ๋†’์ด(clientHeight)๋ฅผ ์ด์šฉํ•ด
    โ€œ์ง€๊ธˆ ๋ณด์—ฌ์ค˜์•ผ ํ•  ํ•ญ๋ชฉ์˜ ์ธ๋ฑ์Šค ๋ฒ”์œ„โ€๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ: scrollTop=500์ด๋ฉด startIndex=10, endIndex=25 ์ •๋„๋กœ ๊ณ„์‚ฐ

โ‘ก ๊ฐ€์งœ ์ปจํ…Œ์ด๋„ˆ ๋†’์ด ์œ ์ง€

  • ์‹ค์ œ ๋ Œ๋”๋ง๋œ ํ•ญ๋ชฉ ์™ธ์—๋„,
    ๋ฆฌ์ŠคํŠธ ์ „์ฒด ๋†’์ด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ๋‹จ/ํ•˜๋‹จ์— padding element(๋นˆ div)๋ฅผ ๋‘ก๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์Šคํฌ๋กค๋ฐ” ๊ธธ์ด๋Š” ์‹ค์ œ ์ „์ฒด ๋ฐ์ดํ„ฐ์™€ ๋™์ผํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

โ‘ข ํ•ญ๋ชฉ ์žฌํ™œ์šฉ(Recycling)

  • ์Šคํฌ๋กคํ•  ๋•Œ๋งˆ๋‹ค DOM์„ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ๊ธฐ์กด ๋…ธ๋“œ์˜ ์œ„์น˜์™€ ๋‚ด์šฉ๋งŒ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, DOM ์ˆ˜๋Š” ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€๋˜๋ฉฐ ์Šคํฌ๋กค๋งŒ ๊ฐ€์ƒ์ ์œผ๋กœ โ€œ์ด๋™โ€ํ•ฉ๋‹ˆ๋‹ค.

    ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ (Critical Rendering Path)
  • Network ๋‹จ๊ณ„: HTML, CSS, JS ํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ๋จ
  • DOM & CSSOM ์ƒ์„ฑ: HTML โ†’ DOM, CSS โ†’ CSSOM ๊ตฌ์กฐ๋กœ ํŒŒ์‹ฑ
  • Render Tree ๊ฒฐํ•ฉ: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ค ์š”์†Œ๋ฅผ ์–ด๋–ค ์Šคํƒ€์ผ๋กœ ๊ทธ๋ฆด์ง€ ๊ฒฐ์ •
  • Layout: ๊ฐ ์š”์†Œ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐ
  • Paint: ํ”ฝ์…€ ๋‹จ์œ„๋กœ ํ™”๋ฉด์— ์‹ค์ œ๋กœ ๊ทธ๋ ค์ง
    ๐Ÿ‘‰ Virtualization์€ ์ด ์ค‘ Layout โ†’ Paint ๊ตฌ๊ฐ„์—์„œ์˜ ์ž‘์—…๋Ÿ‰์„ ์ค„์—ฌ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ชจ๋“  ๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ์„ ๋งค๋ฒˆ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋„๋ก ํ•˜์—ฌ ์Šคํฌ๋กค ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ํ•ต์‹ฌ ์ตœ์ ํ™” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๐Ÿ’ญ ๊ตฌํ˜„ ๋ฐฉ์‹ ๋น„๊ต

๋ฐฉ์‹์„ค๋ช…๋Œ€ํ‘œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์žฅ์ ์ฃผ์˜์‚ฌํ•ญ
Fixed Heightํ•ญ๋ชฉ์˜ ๋†’์ด๊ฐ€ ์ผ์ •react-window๊ณ„์‚ฐ ๋‹จ์ˆœ, ๋น ๋ฆ„๋™์  ๋†’์ด ๋ถˆ๊ฐ€
Dynamic Height (Measured)๋†’์ด๋ฅผ ์ธก์ •/์บ์‹ฑreact-virtualized๋‹ค์–‘ํ•œ UI ์ง€์›๊ตฌํ˜„ ๋ณต์žก
Infinite Scroll + Virtualization๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋ณ‘ํ•ฉreact-virtualized + fetchUX ๋ถ€๋“œ๋Ÿฌ์›€๊ฒฝ๊ณ„ ๊ด€๋ฆฌ ํ•„์š”

๐Ÿ’ญ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ตฌ๊ฐ„ ์˜ˆ์‹œ


Virtualization ์ ์šฉ ์ „ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ตฌ๊ฐ„ (DevTools Performance Timeline)

  • ๋…ธ๋ž€์ƒ‰(Rendering): Layout ๋ฐ ์Šคํƒ€์ผ ์žฌ๊ณ„์‚ฐ(Recalculate Style) ๋‹จ๊ณ„ โ€” DOM์ด ๋งŽ์„์ˆ˜๋ก ๋นˆ๋ฒˆํžˆ ๋ฐœ์ƒ
  • ๋นจ๊ฐ„์ƒ‰(Painting): ํ”ฝ์…€์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •(Repaint) โ€” ์Šคํฌ๋กค์ด๋‚˜ ํ™”๋ฉด ๊ฐฑ์‹  ์‹œ ์ž์ฃผ ํ˜ธ์ถœ
  • ๋ณด๋ผ์ƒ‰(Scripting): JavaScript ๋กœ์ง ์‹คํ–‰
    ๐Ÿ‘‰ Rendering๊ณผ Painting์ด ์ด˜์ด˜ํžˆ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ํ™”๋ฉด ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๋น„ํšจ์œจ์ ์ธ ์ƒํƒœ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    ๐Ÿ‘‰ Virtualization์„ ์ ์šฉํ•˜๋ฉด ์ด ๊ณผ์ • ์ค‘ ๋ถˆํ•„์š”ํ•œ Layout/Paint ํ˜ธ์ถœ์ด ์ œ๊ฑฐ๋˜์–ด, ๋ Œ๋”๋ง ๋ถ€ํ•˜๊ฐ€ ์ค„๊ณ  FPS๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ญ ์žฅ๋‹จ์ 

๊ตฌ๋ถ„
โœ… ์žฅ์ - DOM ๋ Œ๋”๋ง ์ตœ์†Œํ™”
- ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ์†Œ
- ๋ชจ๋ฐ”์ผ ์Šคํฌ๋กค ํ”„๋ ˆ์ž„ ์œ ์ง€
- ์ดˆ๊ธฐ ๋กœ๋“œ ์†๋„ ํ–ฅ์ƒ
โš ๏ธ ๋‹จ์ - SEO(๊ฒ€์ƒ‰์—”์ง„)๊ฐ€ ์ „์ฒด ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋ถˆ๊ฐ€
- ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค ์ด๋™ ์‹œ ํ•ญ๋ชฉ ์–ธ๋งˆ์šดํŠธ ๋ฌธ์ œ
- ๋™์  ๋†’์ด ํ•ญ๋ชฉ์—์„œ ์œ„์น˜ ๊ณ„์‚ฐ ์–ด๋ ค์›€

๐Ÿงญ Tip:
๊ฐ€์ƒํ™”๋Š” โ€œ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”โ€์ด์ง€, ๋ฐ์ดํ„ฐ ์š”์ฒญ ์ตœ์ ํ™”๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
API ํ˜ธ์ถœ์€ ๋ณ„๋„๋กœ ํŽ˜์ด์ง€๋„ค์ด์…˜ยท์บ์‹ฑ๊ณผ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’ญ ์‹ค์ œ ์ ์šฉ ์‹œ ๊ณ ๋ ค ์‚ฌํ•ญ

1. ํ•ญ๋ชฉ ๋†’์ด

  • ๊ณ ์ • ๋†’์ด๋ฉด react-window
  • ์œ ๋™ ๋†’์ด๋ฉด react-virtualized
  • ๊ฐ€๋ณ€ ์ฝ˜ํ…์ธ ๋Š” CellMeasurer ํ™œ์šฉ

2. ์Šคํฌ๋กค ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์กฐ

  • ๋ฐ˜๋“œ์‹œ overflow: auto ๋˜๋Š” scroll์ด ์ง€์ •๋œ ๋ถ€๋ชจ ํ•„์š”
  • ์ƒํ•˜ padding element๋กœ ์Šคํฌ๋กค ๋†’์ด ๋ณด์ •

3. A11y (์ ‘๊ทผ์„ฑ)

  • ๋ณด์ด์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์€ ์Šคํฌ๋ฆฐ๋ฆฌ๋” ํƒ์ƒ‰ ๋ถˆ๊ฐ€
  • ๊ฐ€์ƒํ™” ์‹œ aria-live ์˜์—ญ์œผ๋กœ ์‹œ๊ฐ์ /๋…ผ๋ฆฌ์  ์ˆœ์„œ ๋ณด์ •

4. SEO

  • ๊ฒ€์ƒ‰์—”์ง„ ํฌ๋กค๋Ÿฌ๋Š” JS ์‹คํ–‰ ์—†์ด HTML๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์Œ โ†’ SSR ๋˜๋Š” CSR ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ „๋žต ํ•„์š”

5. ํ…Œ์ŠคํŠธ ํฌ์ธํŠธ

  • ์Šคํฌ๋กค ์‹œ CPU ์ ์œ ์œจ
  • Reflow/Repaint ํšŸ์ˆ˜
  • Long task ๋ฐœ์ƒ ์—ฌ๋ถ€


Lazy Loading ๋™์ž‘ ์‹œ๊ฐํ™”

  • ์™ผ์ชฝ: ์—ฌ๋Ÿฌ ๊ฐœ์˜ 600ร—600 ์ด๋ฏธ์ง€ ๋ธ”๋ก์ด ๋‚˜์—ด๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ™”๋ฉด ์Šคํฌ๋กค์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๊ฐ€ ๋“ฑ์žฅํ•จ
  • ์˜ค๋ฅธ์ชฝ: Chrome DevTools์˜ Network ํƒญ์—์„œ,
    ์Šคํฌ๋กค ์‹œ์ ๋งˆ๋‹ค ์ƒˆ ์ด๋ฏธ์ง€ ์š”์ฒญ(.jpg, .png)์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ
    ๐Ÿ‘‰ Lazy Loading์€ ๋ทฐํฌํŠธ ์•ˆ์— ๋“ค์–ด์˜จ ์ด๋ฏธ์ง€๋งŒ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ, ํŽ˜์ด์ง€ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ์ ˆ๊ฐํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

๐Ÿ’ญ Virtualization์ด ํŠนํžˆ ํšจ๊ณผ์ ์ธ ๊ฒฝ์šฐ

์ผ€์ด์Šค์ด์œ 
์‡ผํ•‘๋ชฐ ์ƒํ’ˆ ๋ชฉ๋ก์ด๋ฏธ์ง€ยทํ…์ŠคํŠธ ํ˜ผํ•ฉ, DOM ์ˆ˜ ๋งŽ์Œ
SNS ํ”ผ๋“œ์‚ฌ์šฉ์ž ์Šคํฌ๋กค ์ค‘์‹ฌ UI
๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”๊ณ ์ • ๋†’์ด ํ–‰ ๊ตฌ์กฐ
๋กœ๊ทธ/๋ฆฌ์ŠคํŠธ๋ทฐ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ๋ฐœ์ƒ

๐Ÿ’ญ Virtualization๊ณผ ํ•จ๊ป˜ ์“ฐ๋ฉด ์ข‹์€ ๊ธฐ์ˆ 

๊ธฐ์ˆ ์„ค๋ช…
Lazy Loading์ด๋ฏธ์ง€/๋น„๋””์˜ค ๋กœ๋“œ๋ฅผ ์Šคํฌ๋กค ์ง„์ž… ์‹œ์ ์œผ๋กœ ์ง€์—ฐ
Code Splitting์Šคํฌ๋กค ๊นŠ์€ ๊ตฌ๊ฐ„์— ํ•„์š”ํ•œ ๋ชจ๋“ˆ์„ ๋‚˜์ค‘์— ๋กœ๋“œ
Memoization์Šคํฌ๋กค ์‹œ ๋ถˆํ•„์š”ํ•œ ์žฌ๋ Œ๋”๋ง ๋ฐฉ์ง€
IntersectionObserver๋ทฐํฌํŠธ ์ง„์ž… ๊ฐ์ง€ (ํŽ˜์ด์ง• ๋กœ๋“œ์šฉ)

๐Ÿ’ญ ๋งˆ๋ฌด๋ฆฌ

๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ ๊ฐ€์ƒํ™”๋Š” ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ์˜ โ€œ์ƒ๋ช…์ค„โ€์ž…๋‹ˆ๋‹ค.
DOM์ด 1๋งŒ ๊ฐœ๋“ , 10๋งŒ ๊ฐœ๋“ , ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ๊ฑด ํ•œ๋ˆˆ์— ๋ณด์ด๋Š” ๋ช‡์‹ญ ๊ฐœ๋ฟ์ด์ฃ .

Virtualization์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ฒด๊ฐํ•˜๋Š” ๋ถ€๋“œ๋Ÿฌ์›€์„ ์œ„ํ•ด
๋ Œ๋”๋ง ๋ฆฌ์†Œ์Šค๋ฅผ โ€œ์ง€๊ธˆ ํ•„์š”ํ•œ ๋ถ€๋ถ„โ€์—๋งŒ ์ง‘์ค‘์‹œํ‚ค๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์ด๊ฒƒ์€ ๋‹จ์ˆœํ•œ ๋ Œ๋”๋ง ํŠธ๋ฆญ์ด ์•„๋‹ˆ๋ผ
UX ์ค‘์‹ฌ ์„ฑ๋Šฅ ์„ค๊ณ„(Performance-Driven UX)์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

profile
๋งค์ผ๋งค์ผ ์กฐ๊ธˆ์”ฉ ์„ฑ์žฅํ•˜๋ ค ๋…ธ๋ ฅํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค!

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2025๋…„ 11์›” 13์ผ

๋‹จ์ˆœํžˆ ๋ณด์ด๋Š” ๋ถ€๋ถ„๋งŒ ๋ Œ๋”๋งํ•œ๋‹ค๋Š” ์„ค๋ช…์—์„œ ๊ทธ์น˜์ง€ ์•Š๊ณ ,๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๋‹จ๊ณ„๋ณ„๋กœ ๋ณ‘๋ชฉ ์›์ธ์„ ์งš์–ด์ค€ ๋ถ€๋ถ„์ด ์ •๋ง ์ข‹์•˜์–ด์š”โ˜บ๏ธ ํŠนํžˆ Fixed Height / Dynamic Height / Infinite Scroll ์กฐํ•ฉ์„ ๋น„๊ตํ•œ ํ‘œ๋„ ์ •๋ฆฌํ•ด์ฃผ์…”์„œ ํ•œ ๋ˆˆ์— ๋ณด๊ธฐ ์‰ฌ์› ์Šต๋‹ˆ๋‹ค!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2025๋…„ 11์›” 13์ผ

'๋ Œ๋”๋ง์€ ๋ณด์ด๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ๋‹ค'๋ผ๋Š” ๋ฌธ์žฅ์— ๊นŠ์ด ๊ณต๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ธŒ๋ผ์šฐ์ €์˜ ์ž‘๋™ ์›๋ฆฌ๊นŒ์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค๋ค„์ฃผ์…”์„œ ์ „์ฒด ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ธฐ ํ›จ์”ฌ ์‰ฌ์› ์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ตฌ๊ฐ„ ์˜ˆ์‹œ๋ฅผ ํ•จ๊ป˜ ์„ค๋ช…ํ•ด์ฃผ์‹  ๋ถ€๋ถ„ ๋•๋ถ„์—, ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉํ• ์ง€ ๋จธ๋ฆฟ์†์— ๊ทธ๋ ค๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ํ”„๋กœ์ ํŠธ์— ๊ผญ ์ฐธ๊ณ ํ•ด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ