React rendering performance test - TEAM-ARK/inflearn-clone-front GitHub Wiki
์ด๋ฒ์ styled components๋ฅผ ์ฌ์ฉ ์ re-rendering ๋๋ ๊ฒ์ ํ์ธํ๋ค. ํ์ง๋ง react์์ re-rendering ๋๋ ๊ฒ๊ณผ ์ค์ ๋ธ๋ผ์ฐ์ ์์ re-rendering ๋๋ ๊ฒ์ ๋ฌ๋๋ค. virtual dom์ด ์ค์ ๋ก ๋ณ๊ฒฝ๋ ์์ญ๋ง re-rendering์ ํ๋๋ก ํ๋ค. ๊ทธ๋๋ react์์ re-rendering ์์ญ์ผ๋ก ์กํ๋ ๊ฒ์ ๊ทธ ํจ์๋ฅผ ๋ค์ ์คํํ๋ฉด์ ์คํ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์์ด ๋ง์์ง๋ ๊ฒ๊ณผ ๊ฐ๋ค. ์ด๊ฒ์ด ์ค์ ๋ก ์ฑ๋ฅ์ ์ผ๋ง๋ ์ฐจ์ด๊ฐ ์๋์ง ํ ์คํธ๋ฅผ ํด๋ณด๋ ค ํ๋ค.
์ด๋ฒ์ ๋ ๋๋ง ๊ด๋ จํด์ ๊ฐ์ ํ ์ฝ๋๋ฅผ ์ ์ฉํ๊ธฐ ์ ๊ณผ ์ ์ฉ ํ์ ์ฑ๋ฅ์ ์ธก์ ํด๋ณด์๋ค.
๊ฐ์ ์ ์ฝ๋๋ก ํ ์คํธ
ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ React Profiler
ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ Performance
๊ฐ์ ํ ์ฝ๋๋ก ํ ์คํธ
ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ React Profiler
ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ Performance
๋น๊ต ๋ฐ ๋ถ์
- ์ง๋๋ฒ ๋ ๋๋ง ๊ด๋ จ ๊ธ์์ ์์๋ดค์ง๋ง ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ์์ ๋ ๋๋ง ๋๋ ๋ถ๋ถ์์ ์ฐจ์ด๋ ์์๋ค.
์ค์ ๋ ๋๋ง ํ์
๊ฐ์ ์ ์ฝ๋๋ก ์ค์ ๋ ๋๋ง
๊ฐ์ ํ ์ฝ๋๋ก ์ค์ ๋ ๋๋ง
๊ทธ๋ฌ๋ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ํด๋ณด๋ฉด ์ ์๋ฏธํ ์ฐจ์ด๊ฐ ๋ฌ๋ค. ๋ฆฌ์กํธ ํ๋กํ์ผ๋ฌ๋ก ์ธก์ ํ ๊ฒฝ์ฐ์ 10๋ฐฐ์ ๋ ์ฐจ์ด๊ฐ ๋ฌ๊ณ ๋ธ๋ผ์ฐ์ ์์ ์ฑ๋ฅํ ์คํธ๋ฅผ ํ ๊ฒฝ์ฐ 3~4๋ฐฐ ์ฐจ์ด๊ฐ ๋ฌ๋ค.
์ฌ๋์ด ๋ถ๋๋ฝ๊ฒ ๋๋ผ๋ ํ๋ ์์ด 60Hz, 16.7ms์ธ์ ์ ๊ฐ์ํ๋ฉด ๊ฐ์ ์ ์ฝ๋์ ๋ ๋๋ง ์๊ฐ์ ์ฝ 47ms, ์ฝ 21Hz๋ก ๋งค์ฐ ๋๋ฆฐ๋ฐ๋ฉด
๊ฐ์ ํ ์ฝ๋์ ๋ ๋๋ง ์๊ฐ์ ์ฝ 11.3ms, ์ฝ 88Hz๋ก ์๋นํ ๋ถ๋๋ฌ์ด ํธ์ด์๋ค.
๊ฐ์ ์ ์ฝ๋์ useMemo ์ฌ์ฉ
useMemo(() => {
return lectureData.courseInfo?.category?.map((item) => (
<CourseCommonButton
key={item.id}
id={item.id}
text={item.name}
selectedId={selectedCategoryId}
setSelectedId={setSelectedCategoryId}
/>
));
}, [lectureData.courseInfo?.category, selectedCategoryId])
- useMemo๋ฅผ ์ ์ฉํ ๋ถ๋ถ์ re-rendering์ด ๋์ง ์์๊ณ ๋ ๋๋ง ์๊ฐ๋ ์ค์ด๋ค์๋ค.
- ๋ฆฌ์กํธ ํ๋กํ์ผ๋ฌ : 10ms -> 6~8ms๋ก ์ฝ๊ฐ ์ค์ด๋ ๋ชจ์ต์ ๋ณด์๋ค.
- ํฌ๋กฌ ํผํฌ๋จผ์ค : 48ms -> 31.4ms
- ํค๋ ์ชฝ ๊น์ง useMemo๋ฅผ ์ฌ์ฉํ์ง ์์์ผ๋ ๋ชจ๋ styled-components๊ฐ ์ ์ฉ๋ ๋ถ๋ถ์ useMemo๋ฅผ ์ ์ฉํ๋ค๋ฉด ๋ ์ค์ด๋ค ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
๊ฒฐ๋ก
๋ ๋๋ง์ด ๋๋ฆฐ ๊ฒ์ด ์ฒด๊ฐ์ด ๋์ด ์ต์ ํ๋ฅผ ํด์ผ๋๋ค๋ฉด styled components๋ฅผ ์ฌ์ฉํ ๊ณณ์ ์ ๋ถ useMemo๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ปดํฌ๋ํธ ๋ถ๋ฆฌ ์ ์ต๋ํ useState๋ฅผ ์ฌ์ฉ์ ์์ ํ๊ณ useRef๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค.