๐ Before Start
ํ์ดํน๋ค ํ๋ก์ ํธ๊ฐ ์ ์ ์์ด ๋ง๋ฌด๋ฆฌ๋๊ณ ์ค์๊ฐ ์ฑํ
์ ๊ตฌํํ๋ฉฐ ์์ฌ์ด ์ ์ด ๊ณ์ํด์ ๋งด๋์๋ค. ๋ฉค๋ฒ ๋ฐ์ดํฐ๊ฐ ์ค์๊ฐ์ผ๋ก ์
๋ฐ์ดํธ ๋์์ ๋ ์ฑํ
๋ด์ญ ์ ์ฒด๋ฅผ ๋ ๋๋ง ํด์ผํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฏธ ๋ชจ๋ ์๋ฒ๊ฐ ๋ด๋ ค๊ฐ ๋ง๋น์ ์ด๋ป๊ฒ ํด์ผํ ์ง ๋ง๋งํ ๋ถ๋ถ๋ ์์์ง๋ง ํผ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด windowing์ ์ ์ฉํด๋ณด๊ณ ๋ ๋๋ง ์ฑ๋ฅ์ ๋น๊ตํ ํ, ๊ธฐ์กด ํ์ดํน๋ค ์ฝ๋์ ์ ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค. ๋ฉ์ธ์ ๋จธ์ง๋ ํ์ง ์์๋ค. ํน์ ๋ชจ๋ฅด๋...
๋ฆฌ์กํธ ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด ์์ฒญ๋๊ฒ ๊ธด ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ๋ ๊ฒฝ์ฐ ๊ฐ์ํ windowing์ ๊ถ์ฅํ๋ค๊ณ ๋์์๋ค. ๋ฆฌ์คํธ ์ ์ฒด๊ฐ ์๋ ๋ถ๋ถ์ ๋ ๋๋งํด ์์ฑ๋๋ DOM ์์์ ์๋ฅผ ์ค์ด๊ณ ์ฌ๋ ๋๋ง ํ๋ ์๊ฐ์ ์ค์ผ ์ ์๋ค๊ณ ํ๋ค.
react-virtualized VS react-window๋ฆฌ์กํธ์ ์๋์ ๊ธฐ๋ฒ์ ์ ์ฉํ ์ ์๋ ๋ํ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ react-window์ react-virtualized๊ฐ ์๋ค. ๋ ๋ค ๋๊ฐ์ ๊ฐ๋ฐ์๊ฐ ๋ง๋ค์๋๋ฐ, react-virtualized์ ๋ถํ์ํ ๊ธฐ๋ฅ๊ณผ ์ปดํฌ๋ํธ๊ฐ ๋ง์ ๋ ๋น ๋ฅด๊ณ ์ฉ๋์ด ์์ react-window๋ฅผ ๋ง๋ค์๋ค๊ณ ํ๋ค. ๊ทธ๋์ ๋๋ react-window๋ฅผ ์ฌ์ฉํ๋ค. ๊ณต์๋ฌธ์๋ ์ ๋์์์ด ์ฝ๊ฒ ์ ์ฉํ ์ ์๋ค.
์ฐ์ 10000๊ฐ์ ๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ ๋ฉค๋ฒ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์์ ๋๋ฅผ ์ฌํํ๊ณ ์ ๋ฒํผ์ ๋๋ ์ ๋ ์ ๋ถ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ก ๊ต์ฒด๋๊ฒ๋ ๋ง๋ค์๋ค.
๐ ๊ธฐ์กด ์ฝ๋
{
// ์๋ต
return (
<div>
<div className="chat-list">
{chatList.map((chat) => {
return <ListItem chat={chat} key={chat.key} />
})}
</div>
<button onClick={handleClick}>๋ฉค๋ฒ ๋ณ๊ฒฝ</button>
</div>
)
}
๐ windowing ์ ์ฉ
import { FixedSizeList as List } from 'react-window'
// ์๋ต
return (
<>
<div className="chat-list">
<List
height={300}
itemCount={chatList.length}
itemSize={20}
itemData={chatList}
>
{Column}
</List>
</div>
<button onClick={handleClick}>๋ฉค๋ฒ ๋ณ๊ฒฝ</button>
</>
)
}
const Column = (props) => {
return (
<div className={props.index % 2 ? 'odd' : 'even'} style={props.style}>
{props.index}
{props.data[props.index].content}
</div>
)
}
export default App
Lighthouse ๊ณต์๋ฌธ์์ ๊ฐ ์งํ๋ณ ์ค๋ช ์ด ์์ธํ๊ฒ ๋์์๋ค. Lighthouse 10์ ๊ธฐ์ค์ผ๋ก ์ฑ๋ฅ ์ธก์ ๊ธฐ์ค์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.

| Metric | ์ค๋ช |
|---|---|
| First Contentful Paint | ํ์ด์ง ์ฒ์ ๋ก๋๋ ์์ ๋ถํฐ ํ์ด์ง ์ฝํ ์ธ ์ ์ผ๋ถ๊ฐ ํ๋ฉด์ ๋ ๋๋ง๋๋ ์์ ๊น์ง์ ์๊ฐ |
| Speed Index | ํ์ด๊ฐ ๋ก๋๋ ๋ ์ฝํ ์ธ ๊ฐ ์ผ๋ง๋ ๋นจ๋ฆฌ ํ์๋๋์ง์ ์๊ฐ |
| Largest Contentful Paint | ํ์ด์ง๊ฐ ์ฒ์ ๋ก๋๋ ์์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ํฐ ์ด๋ฏธ์ง ๋๋ ํ ์คํธ ๋ธ๋ก์ ๋ ๋๋ง ์๊ฐ |
| Total Blocking Time | ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ํธ์์ฉํ ์ ์์ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ |
| Cumulative Layout Shift | ์ฌ์ฉ์๊ฐ ์์์น ๋ชปํ ๋ ์ด์์ ๋ณ๊ฒฝ์ ๊ฒฝํํ๋ ๋น๋ |
[FCP์ Speed Index์ ์ฐจ์ด]
FCP
- ์ฒซ ๋ฒ์งธ ์ฝํ
์ธ ๊ฐ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ๊ทธ๋ ค์ง๊ธฐ ์์ํ๋ ์๊ฐ.
- ์ฌ์ฉ์๋ ์นํ์ด์ง๊ฐ ๋ก๋๋๊ณ ์๋์ง ์ธ์ํ ์ ์๋ค.
Speed Index
- ํ์ด์ง๊ฐ ๋ก๋๋๊ณ ํ๋ฉด์ด ์ผ๋ง๋ ๋น ๋ฅด๊ฒ ์ฑ์์ง๋์ง ์ธก์ ํ ์๊ฐ.
- ์ฌ์ฉ์๋ ํ์ด์ง ์ ์ฒด๋ฅผ ์ธ์ํ๊ณ ์ํธ์์ฉํ ์ ์๋ค.
๐ ๊ธฐ์กด ์ฝ๋

๐ windowing ์ ์ฉ

TBT์ Speed Index์์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๊ฐ ๋ฌ๋ค. TBT๋ ํ๋ฉด์ด ๋ก๋๋๊ณ ๋ ์ดํ์ ์ฌ์ฉ์๊ฐ ์ค์ง์ ์ผ๋ก ํ์ด์ง์ ์ํธ์์ฉํ ์ ์์ ๋๊น์ง์ ์๊ฐ์ ์ธก์ ํ ๊ฒ์ด๋ค. Lighthouse ์ฑ๋ฅ ์ธก์ ์์ ๊ฐ์ฅ ๋ง์ ์ ์๋ฅผ ์ฐจ์งํ๊ณ ์๋ค.
TBT๋ ๊ฒฐ๊ตญ FCP์ TTI์ ์๊ฐ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ ๊ฒ์ด๋ค. ์ฒซ ์ฝํ
์ธ ๊ฐ ํ๋ฉด์ ๊ทธ๋ ค์ง๊ณ (FCP) ์ฌ์ฉ์๊ฐ ๊ทธ๊ฒ์ ํด๋ฆญํ์ ๋(TTI) ์๋ฌด๋ฐ ๋ฐ์์ด ์๋ ์๊ฐ์ด ๊ธธ์ด์ง ์๋ก TBT๋ ๊ธธ์ด์ง๊ณ ์ฑ๋ฅ ์ ์๋ ๋ฎ์์ง๋ค. ๋ด ์ฝ๋์์๋ ๋ ๋๋งํ๋ ๋
ธ๋์ ๊ฐ์๊ฐ ๋ค๋ฅด๋ค๋ณด๋ TBT ์ ์์์ ์ฐจ์ด๊ฐ ๋๋ค๊ณ ํ๋จํ๋ค. ๋ ๋๋ง ํด์ผํ๋ ์์๊ฐ ๋ง์์ง ์๋ก ์ฌ์ฉ์์ ์
๋ ฅ์ ๊ฐ์งํ ์ ์๋ ์๊ฐ์ด ๋ฆ์ถฐ์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฉค๋ฒ ๋ฐ์ดํฐ๊ฐ ์ค์๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋๊ณ , ๋ณ๊ฒฝ์ ๋ฐ์ํด ๋ ๋๋งํ๋ ๋์ ์ฌ์ฉ์๊ฐ ์ฑํ
์ ์ก ๋ฒํผ์ ๋๋ฅธ๋ค๋ฉด ์๋ฌด๋ฐ ๋ฐ์๋ ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
[ TTI (Time To Interative) ]
์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ํธ์์ฉํ ์ ์๋ ์๊ฐ
TBT ์ ์๋ ์ด๋ป๊ฒ ๊ฐ์ ํ ์ ์์๊น? TBT ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด ๋ถํ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ค์ด๋ผ๊ณ ๋์จ๋ค. ๋ฉ์ธ ์ค๋ ๋๊ฐ ํ์ด์ง๋ฅผ ๋ก๋ํ๋ ๊ฒ๊ณผ ์๊ด ์๋ ๋ถํ์ํ ์์
์ ํ๋๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋นํจ์จ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ค์ฌ์ผํ๋ค๊ณ ๊ถ์ฅํ๋ค.

React Profiler๋ก๋ ๋ ๋๋ง ์ฑ๋ฅ์ ์ธก์ ํด๋ดค๋ค.
๐ ๊ธฐ์กด ์ฝ๋

๐ windowing ์ ์ฉ

์ ํด ์ํ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์์
์ ์ํํ์ง ์๋ ์ํ๋ฅผ ๋งํ๋ค. ์ ํด ์๊ฐ์ด ๊ธธ ์๋ก ์ฌ์ฉ์ ์
๋ ฅ์ ๋น ๋ฅด๊ฒ ๋ฐ์ํ ์ ์์ด ์ฌ์ฉ์ ๊ฒฝํ์ด ๋จ์ด์ง๋ค. ์์ ๋งํ TBT์ ๊ฐ๋ค๊ณ ๋ณผ ์ ์๊ฒ ๋ค.
๐ ๊ธฐ์กด ์ฝ๋

๐ windowing ์ ์ฉ

๋นํ์ ํ์์ด์ง๋ง ๋น๋์ ๋ง์ ์ํ์.