"매 보이는 것만 그린다". 100k row를 한 번에 mount 하면 DOM이 죽는다. Windowing 으로 viewport 안 ~30개만 render → scroll 시 recycle. 2026 표준은 TanStack Virtual / react-virtuoso, content-visibility CSS, 그리고 React 19의 <Activity> (offscreen).
매 핵심
매 왜 가상화가 필수인가
DOM node 1개 ≈ 1-5KB memory + layout/paint cost.
10k+ row mount → 수백 MB heap, scroll jank, INP > 500ms.
constvirtualizer=useVirtualizer({count: rows.length,getScrollElement:()=>parentRef.current,estimateSize:()=>80,// 매 best guess
measureElement: el=>el.getBoundingClientRect().height,// 매 actual measure
overscan: 8,});
CSS content-visibility (zero-JS virtualization)
.row{content-visibility:auto;contain-intrinsic-size:048px;/* 매 placeholder size */}
브라우저가 viewport 밖 element를 자동으로 skip layout/paint. React 없이도 효과.