์์ฒ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ ํ๋ฉด์ โํ ๋ฒ์โ ๋ ๋๋งํ์ง ์๋ ์ด์
์น ์๋น์ค๊ฐ ์ปค์ง์๋ก โ๋ฆฌ์คํธโ๋ ํญ๋ฐ์ ์ผ๋ก ๋์ด๋ฉ๋๋ค.
์ํ ๋ชฉ๋ก, ์๋ฆผํจ, ์ฑํ
๋ฉ์์ง, ํผ๋, ๋ก๊ทธ โ ๋ชจ๋ ๋ฆฌ์คํธ ํํ์
๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ฆฌ์คํธ ์์ดํ
์ด 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์๋ ์ผ๋ถ๋ง ์กด์ฌํ์ง๋ง,
๋ธ๋ผ์ฐ์ ๋ ์ ์ฒด ์คํฌ๋กค ๋์ด๋ฅผ ๊ฐ์์ผ๋ก ๊ณ์ฐํด ๋ง์น ์ ๋ถ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ฌ์ค๋๋ค.
| ์คํฌ๋กค ์ํ | ์ค์ DOM ๊ตฌ์ฑ |
|---|---|
| ์ด๊ธฐ | index 0~15 ํญ๋ชฉ๋ง ๋ ๋๋ง |
| ์๋๋ก ์คํฌ๋กค | index 10~25 ํญ๋ชฉ๋ง DOM ์ ์ง, ๋๋จธ์ง๋ ์ ๊ฑฐ |
| ๋๊น์ง ์คํฌ๋กค | index 985~1000 ํญ๋ชฉ๋ง ๋จ์ |

๋ฆฌ์คํธ ๊ฐ์ํ๋ ์ธ ๊ฐ์ง ํต์ฌ ์๋ฆฌ๋ก ์๋ํฉ๋๋ค.
โ Viewport ๊ณ์ฐ
scrollTop)์ ํ๋ฉด ๋์ด(clientHeight)๋ฅผ ์ด์ฉํดscrollTop=500์ด๋ฉด startIndex=10, endIndex=25 ์ ๋๋ก ๊ณ์ฐโก ๊ฐ์ง ์ปจํ ์ด๋ ๋์ด ์ ์ง
โข ํญ๋ชฉ ์ฌํ์ฉ(Recycling)

| ๋ฐฉ์ | ์ค๋ช | ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ์ฅ์ | ์ฃผ์์ฌํญ |
|---|---|---|---|---|
| Fixed Height | ํญ๋ชฉ์ ๋์ด๊ฐ ์ผ์ | react-window | ๊ณ์ฐ ๋จ์, ๋น ๋ฆ | ๋์ ๋์ด ๋ถ๊ฐ |
| Dynamic Height (Measured) | ๋์ด๋ฅผ ์ธก์ /์บ์ฑ | react-virtualized | ๋ค์ํ UI ์ง์ | ๊ตฌํ ๋ณต์ก |
| Infinite Scroll + Virtualization | ๋น๋๊ธฐ ๋ฐ์ดํฐ ๋ก๋ฉ ๋ณํฉ | react-virtualized + fetch | UX ๋ถ๋๋ฌ์ | ๊ฒฝ๊ณ ๊ด๋ฆฌ ํ์ |

Virtualization ์ ์ฉ ์ ๋ ๋๋ง ๋ณ๋ชฉ ๊ตฌ๊ฐ (DevTools Performance Timeline)
| ๊ตฌ๋ถ | |
|---|---|
| โ ์ฅ์ | - DOM ๋ ๋๋ง ์ต์ํ - ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ฐ์ - ๋ชจ๋ฐ์ผ ์คํฌ๋กค ํ๋ ์ ์ ์ง - ์ด๊ธฐ ๋ก๋ ์๋ ํฅ์ |
| โ ๏ธ ๋จ์ | - SEO(๊ฒ์์์ง)๊ฐ ์ ์ฒด ๋ฐ์ดํฐ ์ ๊ทผ ๋ถ๊ฐ - ํค๋ณด๋ ํฌ์ปค์ค ์ด๋ ์ ํญ๋ชฉ ์ธ๋ง์ดํธ ๋ฌธ์ - ๋์ ๋์ด ํญ๋ชฉ์์ ์์น ๊ณ์ฐ ์ด๋ ค์ |
๐งญ Tip:
๊ฐ์ํ๋ โ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํโ์ด์ง, ๋ฐ์ดํฐ ์์ฒญ ์ต์ ํ๋ ์๋๋๋ค.
API ํธ์ถ์ ๋ณ๋๋ก ํ์ด์ง๋ค์ด์ ยท์บ์ฑ๊ณผ ํจ๊ป ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
1. ํญ๋ชฉ ๋์ด
react-windowreact-virtualizedCellMeasurer ํ์ฉ2. ์คํฌ๋กค ์ปจํ ์ด๋ ๊ตฌ์กฐ
overflow: auto ๋๋ scroll์ด ์ง์ ๋ ๋ถ๋ชจ ํ์3. A11y (์ ๊ทผ์ฑ)
aria-live ์์ญ์ผ๋ก ์๊ฐ์ /๋
ผ๋ฆฌ์ ์์ ๋ณด์ 4. SEO
5. ํ ์คํธ ํฌ์ธํธ

Lazy Loading ๋์ ์๊ฐํ
600ร600 ์ด๋ฏธ์ง ๋ธ๋ก์ด ๋์ด๋์ด ์์ผ๋ฉฐ, ํ๋ฉด ์คํฌ๋กค์ ๋ฐ๋ผ ์๋ก์ด ์ด๋ฏธ์ง๊ฐ ๋ฑ์ฅํจ.jpg, .png)์ด ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์| ์ผ์ด์ค | ์ด์ |
|---|---|
| ์ผํ๋ชฐ ์ํ ๋ชฉ๋ก | ์ด๋ฏธ์งยทํ ์คํธ ํผํฉ, DOM ์ ๋ง์ |
| SNS ํผ๋ | ์ฌ์ฉ์ ์คํฌ๋กค ์ค์ฌ UI |
| ๋ฐ์ดํฐ ํ ์ด๋ธ | ๊ณ ์ ๋์ด ํ ๊ตฌ์กฐ |
| ๋ก๊ทธ/๋ฆฌ์คํธ๋ทฐ | ์ค์๊ฐ ์ ๋ฐ์ดํธ ๋ฐ์ |
| ๊ธฐ์ | ์ค๋ช |
|---|---|
| Lazy Loading | ์ด๋ฏธ์ง/๋น๋์ค ๋ก๋๋ฅผ ์คํฌ๋กค ์ง์ ์์ ์ผ๋ก ์ง์ฐ |
| Code Splitting | ์คํฌ๋กค ๊น์ ๊ตฌ๊ฐ์ ํ์ํ ๋ชจ๋์ ๋์ค์ ๋ก๋ |
| Memoization | ์คํฌ๋กค ์ ๋ถํ์ํ ์ฌ๋ ๋๋ง ๋ฐฉ์ง |
| IntersectionObserver | ๋ทฐํฌํธ ์ง์ ๊ฐ์ง (ํ์ด์ง ๋ก๋์ฉ) |
๋ฐ์ดํฐ ๋ฆฌ์คํธ ๊ฐ์ํ๋ ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ์ โ์๋ช
์คโ์
๋๋ค.
DOM์ด 1๋ง ๊ฐ๋ , 10๋ง ๊ฐ๋ , ์ฌ์ฉ์๊ฐ ๋ณด๋ ๊ฑด ํ๋์ ๋ณด์ด๋ ๋ช์ญ ๊ฐ๋ฟ์ด์ฃ .
Virtualization์ ์ฌ์ฉ์๊ฐ ์ฒด๊ฐํ๋ ๋ถ๋๋ฌ์์ ์ํด
๋ ๋๋ง ๋ฆฌ์์ค๋ฅผ โ์ง๊ธ ํ์ํ ๋ถ๋ถโ์๋ง ์ง์ค์ํค๋ ๊ธฐ์ ์
๋๋ค.
์ฆ, ์ด๊ฒ์ ๋จ์ํ ๋ ๋๋ง ํธ๋ฆญ์ด ์๋๋ผ
UX ์ค์ฌ ์ฑ๋ฅ ์ค๊ณ(Performance-Driven UX)์ ํต์ฌ์
๋๋ค.
'๋ ๋๋ง์ ๋ณด์ด๋ ๊ฒ๋ณด๋ค ๋ ๋ง๋ค'๋ผ๋ ๋ฌธ์ฅ์ ๊น์ด ๊ณต๊ฐํ์ต๋๋ค.
๋ธ๋ผ์ฐ์ ์ ์๋ ์๋ฆฌ๊น์ง ๊ตฌ์ฒด์ ์ผ๋ก ๋ค๋ค์ฃผ์
์ ์ ์ฒด ํ๋ฆ์ ์ดํดํ๊ธฐ ํจ์ฌ ์ฌ์ ์ต๋๋ค.
ํนํ ๋ ๋๋ง ๋ณ๋ชฉ ๊ตฌ๊ฐ ์์๋ฅผ ํจ๊ป ์ค๋ช
ํด์ฃผ์ ๋ถ๋ถ ๋๋ถ์, ์ค์ ํ๋ก์ ํธ์์ ์ด๋ป๊ฒ ์ ์ฉํ ์ง ๋จธ๋ฆฟ์์ ๊ทธ๋ ค๋ณผ ์ ์์์ต๋๋ค.
๋ค์ ํ๋ก์ ํธ์ ๊ผญ ์ฐธ๊ณ ํด๋ณด๊ณ ์ถ์ต๋๋ค. ์ข์ ๊ธ ๊ฐ์ฌํฉ๋๋ค!
๋จ์ํ ๋ณด์ด๋ ๋ถ๋ถ๋ง ๋ ๋๋งํ๋ค๋ ์ค๋ช ์์ ๊ทธ์น์ง ์๊ณ ,๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๋จ๊ณ๋ณ๋ก ๋ณ๋ชฉ ์์ธ์ ์ง์ด์ค ๋ถ๋ถ์ด ์ ๋ง ์ข์์ด์โบ๏ธ ํนํ Fixed Height / Dynamic Height / Infinite Scroll ์กฐํฉ์ ๋น๊ตํ ํ๋ ์ ๋ฆฌํด์ฃผ์ ์ ํ ๋์ ๋ณด๊ธฐ ์ฌ์ ์ต๋๋ค!