๐ [React] windowing ๊ธฐ๋ฒ์ ํตํ ์ฑ๋ฅ ์ต์ ํ feat.react-virtualized
DOM์ ๊ทธ๋ฆด ์๋ฆฌ๋จผํธ๊ฐ ๋งค์ฐ๋งค์ฐ ๋ง์ ๋ ์ ๋ธ๋ผ์ฐ์ ์ ์ฑ๋ฅ์ ์์ข์์ง๊น?
๋ฌธ์ ์ํฉ
๊ฒ์์ด๋ฅผ ์ ๋ ฅํ ์ ์๋ input๊ณผ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ dropdown ๋ด๋ถ์ ๋ณด์ฌ์ง๋ ์ปดํฌ๋ํธ์์, ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋ง์ ๊ฒฝ์ฐ(1000๋ช ์ด์) ๋ธ๋ผ์ฐ์ ๊ฐ ๋์ ๋๊ฒ ๋๋ ค์ง๋ฉฐ ์ฌ์ฉ์์ ์ธํฐ๋ ์ ์ ์ํ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ฐ ๋งค์ฐ ๋๋ ค์ง๋ ํ์์ด ๋ฐ์ํ๋ค.
Input์ ํฌ์ปค์ค๊ฐ ์กํ๋ ์๋, ๊ฒ์์ด ์ ๋ ฅ ํ ๋ฐ์๋๋ ์๋, ์ ๋ ฅ์ด ์๋ฃ๋ ์ดํ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ํ๋ ์๋(์ด๊ฑด ๋๋ฌด ๋๋ ค์ ์์ ๊ฒฐ๊ณผ๋ ๋ณด์ฌ์ง์ง ์์์)๊ฐ ๋งค์ฐ ๋๋ ธ๋๋ฐ, ์ฒ์ ํด๋น ๋ฌธ์ ๋ฅผ ๋ง์ฃผํ์ ๋๋ DOM์ ๋ถ์ ์๋ฆฌ๋จผํธ 1000๊ฐ๋ ์ปดํจํฐ ์ ์ฅ์์ ๊ทธ๋ ๊ฒ ๋ง์ ๊ฒ๋ ์๋ํ ๋ฐ ๋๋์ฒด ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ(์ธํฐ๋ ์ )์ด ์ด๋ ๊ฒ๊น์ง ๋๋ ค์ก์ง? ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
์ธก์ ํ ์ ์์ผ๋ฉดโฆ
์ฐ์ ์ด๋ค ์ํฉ์ธ์ง ์ ํํ๊ฒ ํ์ธํ๊ธฐ ์ํด ํฌ๋กฌ ๊ฐ๋ฐ์๋๊ตฌ๋ฅผ ์ด์๋ค.
์ธก์ ๋๊ตฌ: chorme dev tools - lighthouse, performance
๋ฐ์ดํฐ ๊ฐ์(dropdown item): ์ฝ 1,300๊ฐ
์๋๋ฆฌ์ค:
์ฒซ ๋ ๋๋ง ์ดํ input ํด๋ฆญ > ๋๋กญ๋ค์ด์ด ์ด๋ฆฌ๋ฉด ๊ฒ์์ด ์
๋ ฅ > ๊ฒ์ ๊ฒฐ๊ณผ ๊ธฐ๋ค๋ฆฐ ํ ์ข
๋ฃ
ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ - Lighthouse๋ฅผ ํตํด ์ธก์ ํ ๋ณด๊ณ ์ lighthouse-before.html.zip
๋ญ์ง ์ ๋ชฐ๋ผ๋ ์ผ๋จ ํ๋ฉด์ด ๋๋ฆฌ๊ตฌ๋~ 9์ด ์ ๋ ์ง์ฐ์ด ์์๊ฒ ๊ตฌ๋~ ๋ฅผ ์ ์ ์๋ค.
๐ง tl;dr
๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋๋กญ ๋ค์ด์ 1000๊ฐ ์ด์์ ๋ชฉ๋ก์ ๊ทธ๋ฆฌ๊ฒ ๋๋ฉฐ DOM์ ๋ถ์ ์๋ฆฌ๋จผํธ๋ค์ด ๋งค์ฐ ๋ง์์ง๊ณ , ์ด์ ๋ฐ๋ผ ๋ธ๋ผ์ฐ์ ๊ฐ ์คํํด์ผ ํ๋ ์คํฌ๋ฆฝํธ์ ์์ด ์ด๋ง๋ฌด์ํ๊ฒ ์ฆ๊ฐํจ.
๋ฌผ๋ก ๊ทธ๋ฅ ํ ์คํธ๋ง ๋ค์ด์๋ div ํ๊ทธ๋ผ๋ฉด 1,000๊ฐ๋ 2,000๊ฐ๋ ๊ทธ๋ ๊ฒ ๋ฌด๊ฑฐ์ด ์์ ์ด ์๋์ง๋ง,
- ๋๋กญ๋ค์ด์ผ๋ก ์ด๋ฆฌ๋ ๋ฉ๋ด ๋ด๋ถ์ ์์ดํ ์ด๋ฏ๋ก ๋ค๋ฅธ ๊ฒฝ์ฐ์ ๋นํด ์ฐ์ฐํ ๊ฒ์ด ๋ ๋ง์
- Dropdown Item์์ Text๋ง ์กด์ฌํ๋ ๊ฒ์ด ์๋๋ผ ์ปดํฌ๋ํธ๋ฅผ ๊ทธ๋ฆฌ๊ณ ์์
-
<div>{item.name}<div>
๋ง ๊ทธ๋ฆด ๊ฒฝ์ฐ ์ธํฐ๋์ ์ง์ฐ์ด ํฌ๊ฒ ์์์ฌ๊ธฐ์ CSS๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, ์กฐ๊ธ๋ง ๋ ๋ฌด๊ฒ๊ฒ ๊ตฌ์ฑํด๋ ๋ฐ๋ก ์ง์ฐ ์๊ฐ์ด ๋์ด๋๋ ๊ฒ๋ ํ์ธํ๋ค.
-
๊ฐ๊ฐ์ ์ฑ๋ฅ ์ธก์ ์งํ๋ฅผ ์กฐ๊ธ ๋ ์ดํด๋ณด์!
Total Blocking Time(TBT)
TBT๋ ๋ง์ฐ์ค ํด๋ฆญ, ํ๋ฉด ํญ ๋๋ ํค๋ณด๋ ๋๋ฆ๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ ๋ ฅ์ผ๋ก๋ถํฐ ํ์ด์ง๊ฐ ์๋ตํ์ง ๋ชปํ๋๋ก ์ฐจ๋จ๋ ์ด ์๊ฐ์ ์ธก์ ํฉ๋๋ค.
scripting ์์ ์ผ๋ก ๋ถ๋ฅ๋๋ Script Evaluation ์์ ์ผ๋ก ์ธํด Input์ ์ธํฐ๋ ์ ์ด ์ง์ฐ๋๊ณ ์๋ ์ํฉ
Interaction to Next Paint (INP)
INP๋ ์ฌ์ฉ์๊ฐ ํ์ด์ง์์ ์ํํ ๋ชจ๋ ์ํธ ์์ฉ์ ๋๊ธฐ ์๊ฐ์ ๊ด์ฐฐํ๊ณ ๋ชจ๋ (๋๋ ๊ฑฐ์ ๋ชจ๋ ) ์ํธ ์์ฉ์ด ์๋์ ์๋ ๋จ์ผ ๊ฐ์ ๋ณด๊ณ ํฉ๋๋ค.
- ์ข์ INP๋?
![inpStandard](https://user-images.githubusercontent.com/89910087/231199303-fa9cb995-b83a-4d8c-9368-fab4114a258e.png)
์ ๊ธ์ ๋ฐ๋ฅด๋ฉด 500ms ๋ง ๋์ด๋ POOR Responsiveness๋ผ๋๋ฐ ์ฌ๊ธฐ๋ ๋ฌด๋ ค 6,400ms..
๋ณด๊ณ ์์ ๋ฐ๋ฅด๋ฉด ๊ฐ์ฅ ๋ง์ ๋ณ๋ชฉ์ด ์ผ์ด๋๊ณ ์๋ ๋ถ๋ถ์ด Scripting ์์
, ์ ํํ๊ฒ๋ Script Evaluation
์์
์ด๋ค. ์ด๋ก ์ธํด Input์ ์ด๋ฒคํธ๊ฐ ์ง์ฐ๋๊ณ ์๋ค๊ณ ๋ณผ ์ ์๊ฒ ๋ค.
๊ทธ๋ ๋ค๋ฉด Script Evaluation
์์
์ ์ค์ธ๋ค๋ฉด ์ธํฐ๋ ์
์ง์ฐ๋ ์์ฐ์ค๋ฝ๊ฒ ํด๊ฒฐ ๋ ๊ฒ ๊ฐ๋ค!
-
Script evaluation์ด ๋ญ ํ๋ ์์ ์ธ๋ฐ?
GPT์๊ฒ ๋ฌผ์ด๋ดค์ต๋๋ค.
์คํฌ๋ฆฝํธ ํฌ๊ธฐ๊ฐ ๋งค์ฐ ํด ๊ฒฝ์ฐ
script evaluation
์์ ์ ๋งค์ฐ ๋ง์ ์๊ฐ์ด ์์๋๋ฏ๋ก ํ์ด์ง๊ฐ ๋๋ ค์ง ์ ์๋ค๊ณ ํฉ๋๋ค. -
๊ทธ๋์ ์ต์ ํ๊ฐ ๊ฐ๋ฅํด?
- ๋ค, ์ฌ๊ธฐ์์ ๋งค์ฐ ๋ง๊ณ ๋ค์ํ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ณ ์์ต๋๋ค!
- ์ถ๊ฐ๋ก, ์ด์น๊ตฌ๋ ๋ต๋ณ ์์ฃผ ์ ํด์ค๋๋ค.
์ ์ผ ์ฒ์์ผ๋ก ์๊ฐํ๋ ๋ฐฉ๋ฒ์ด
Limiting the number of DOM elements
๋ค์.
๋ชฉํ๋
๊ฐ์์ ๊ฒ์ ํด๋ฆญ ์ ๋๋กญ๋ค์ด์ด ์ง์ฒด ์์ด ๊ทธ๋ ค์ง๊ณ ์ดํ ๊ฒ์์ด๋ฅผ ์ ๋ ฅํ ๋๋ ์ฌ์ฉ์ ์ ์ฅ์์ ๋ณ๋์ ์ง์ฐ์ ๋๋ผ์ง ์๋๋ก INP์๊ฐ์ ๊ฐ์ ํ๋ ๊ฒ์ด๋ค.
- 1์ฐจ ๋ชฉํ: 500ms ์ดํ์ interection latency
- 2์ฐจ ๋ชฉํ: 200ms ์ดํ์ interection latency
๋ณธ๊ฒฉ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด์
์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ํ๋ก์ ํธ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ํ์ํ ๊ฒ์ ๋ฌด์์ธ๊ฐ์?
์์์ ์ดํด๋ดค๋ TBT๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ด ์์๊น? ๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ์๋์ ๊ฐ์ ๋ฐฉ์์ ์ ์ํ๋ค.
๋ถํ์ํ JS ๋ก๋ฉ ๋ฐ ์คํ??ย ยป> windowing!
๊ณต์ ๋ฌธ์ - ์ฑ๋ฅ ์ต์ ํ ํํธ์์๋ Windowing
๊ธฐ๋ฒ(List Virtualization
์ด๋ผ๊ณ ๋ ํจ)์ ์๊ฐํ๊ณ ์๋ค.
windowing ์ด๋?
concept of only rendering or write the visible portion in the currentย โwindowโ to theย DOM. The number of items that rendered at first time are smaller than the original one.
๊ทธ๋ ค์ผ ํ ์๋ฆฌ๋จผํธ๊ฐ ์๋ฌด๋ฆฌ ๋ง์๋ ์ค์ ๋ก DOM์ ๋ถ๋ ์์๋ ํ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ชฉ๋ก ๊ฐ์๊ฐ ๋ ๋ง์์ง๋๋ผ๋ ์ฑ๋ฅ์ ์ฐจ์ด๊ฐ ์๋ค.
๊ธฐ์กด ํ๋ก์ ํธ ๋ด์ react-virtualized๊ฐ ์ด๋ฏธ ์ค์น ๋์ด ์์ด ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค. (react-window๊ฐ ๋ ์๊ณ ๊ฐ๋ณ์ง๋ง ์ง์ํ๋ ๊ธฐ๋ฅ์ด ์ ์. react-virtualized๊ฐ ์ฌ์ฉ๋์ด ๋ ๋ง์)
์๊ฐํด๋ดค๋ ๋ค๋ฅธ ํด๊ฒฐ์ฑ
- API ์๋ต ์๋ต ํ์ด์ง๋ค์ด์
- ํ์ด์ง๋ค์ด์ ๋ ํ๋์ ๋ฐฉ๋ฒ์ด๊ฒ ์ง๋ง, ๋ณ๋ ์ฅ์น ์์ด ํ์ด์ง๋ค์ด์ ๋ง ์ ์ฉํ ๊ฒฝ์ฐ ๋ชฉ๋ก ๊ฐ์ฅ ํ๋จ๊น์ง ์ ๋ณด๋ฅผ ๋ถ๋ฌ์จ ๊ฒฝ์ฐ ๋๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋จ. ๋ฐ๋ผ์ ๋ค๋ฅธ ๋ฐฉ์์ ์ฐพ๊ฒ ๋์๊ณ , windowing ์ ์ฉ์ผ๋ก ์ต์ข ๊ฒฐ์
๊ฒฐ๊ณผ
windowing ์ ์ฉํ ํ์ด์ง์ ๋ํ ๋ณด๊ณ ์
๋ชฉํํ๋ INP 200ms ์ดํ๋ก ๊ฐ์ ๋์๊ณ , ์ค์ ๋ก๋ ์ฌ๋ฌ ์ด๋ฒคํธ๋ค์ ๋ํ ์ง์ฐ์ด ์ ํ ๋๊ปด์ง์ง ์์๋ค!
Before
After
performance ํญ์์๋ ์ฐจ์ด๋ฅผ ์ฝ๊ฒ ํ์ธํ ์ ์๋ค.
- ๋์ ๋๋ ๊ธด task๋ค์ด ๋ชจ๋ ์ฌ๋ผ์ง
- ๊ฐ task๋ฅผ ์ฒ๋ฆฌํ๋ ์๋๊ฐ ๋งค์ฐ ๋นจ๋ผ์ง
- ์๋จ ํ์๋ผ์ธ(box ์์ญ)์ ๊ฐ๋ ์ฑ์ฐ๋ ๋ ธ๋์ ์์ญ๋ค(์๋ ํ์ด์ฐจํธ์์ ๋ณด์ด๋ scripting ์์ )์ด ๋งค์ฐ ์ค์ด๋ฌ
โ ์์น์์ผ๋ก ์ฝ 90% ์ด์ ๋นจ๋ผ์ง
# ์นดํ ๊ณ ๋ฆฌ
- BOJ 36
- Algorithm 12
- CodingTest 11
- Web 9
- Javascript 8
- Vue 7
- React 7
- DBProject 4
- Python 3
- Tech-interview 3
- Express 3
- Next 3
- Github 2
- Django 2
- C 1
- C++ 1
- WebGame 1