๐ 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 ์ ์ฉ
๋นํ์ ํ์์ด์ง๋ง ๋น๋์ ๋ง์ ์ํ์.