-
React.memo, useMemo, useCallback ์ธ์ ์จ์ผ ํ ๊น?๐ป๊ฐ๋ฐ/React 2024. 9. 22. 18:47728x90
1. ์น์์ ๋ ๋๋ง์ด๋?
- ์น ๋ธ๋ผ์ฐ์ ๊ฐ HTML, CSS, Javascript ๋ฑ์ ์น ์์์ ํด์ํด ์ฌ์ฉ์์๊ฒ ์์์ ์ผ๋ก ํ์ํ๋ ๊ณผ์
- ์ฃผ์ ๋จ๊ณ
- HTML ํ์ฑ -> DOM(Document Object Model) ํธ๋ฆฌ ์์ฑ
DOM: ๋ฌธ์ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ด๋ ํธ๋ฆฌ ํํ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ, ๊ฐ ์์๋ ๋ ธ๋๋ก ํํ - CSS ํ์ฑ -> CSSOM(CSS Object Model) ํธ๋ฆฌ ์์ฑ
์คํ์ผ ๊ท์น์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ์์์ ์ ์ฉ๋ ์คํ์ผ ์ ๋ณด ํฌํจ - Render ํธ๋ฆฌ ์์ฑ
DOM + CSSOM = Render ํธ๋ฆฌ
ํ๋ฉด์ ์ค์ ๋ก ํ์๋ ์์๋ง ํฌํจ, ๊ฐ ์์ ์คํ์ผ ํฌํจ(display: none ์ด๋ฉด ํฌํจ ์๋จ) - Layout (Reflow)
๊ฐ ์์ ์์น์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ ๊ณผ์ , ํ๋ฉด ๋ฐฐ์น ๊ฒฐ์ (DOM, CSSOM์ด ๋ณ๊ฒฝ๋๋ฉด ๋ค์ ์ํ๋จ) - Painting
Layout(๊ณ์ฐ)์ด ์๋ฃ๋๋ฉด ์ค์ ๋ก ํ๋ฉด์ ์์, ํ ์ค์ฒ, ๊ทธ๋ฆผ์ ๋ฑ ์๊ฐ์ ์์๋ฅผ ํฝ์ ๋ก ๋ณํ, =๋ ์ด์ด ์์ฑ, ์ค์ ๋ก ์ฌ์ฉ์ ํ๋ฉด์ ๋ณด์ด๋ ๊ฒ์ด ์๋(DOM, CSSOM์ด ๋ณ๊ฒฝ๋๋ฉด ๋ค์ ์ํ๋จ) - Compositing
์ฌ๋ฌ ๋ ์ด์ด๋ฅผ ๊ฒฐํฉํด ์ต์ข ํ๋ฉด ์์ฑ, GPU ์ฌ์ฉํด ์ฑ๋ฅ ์ต์ ํ ๊ฐ๋ฅ, ์ ๋๋ฉ์ด์ , transform ๋ฑ์ ์์๋ ๋ณ๋ ๋ ์ด์ด๋ก ์ฒ๋ฆฌ
- HTML ํ์ฑ -> DOM(Document Object Model) ํธ๋ฆฌ ์์ฑ
2. ๋ ๋๋ง์ ์์ฃผ ๋ง์ด ํ๊ฒ ๋๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ์๊ธธ๊น?
- ์๋ ์ ํ
๋ ๋๋ง์ CPU์ GPU ์์์ ์๋ชจํ๋ ์์ , ๋ถํ์ํ๊ฒ ๋ ๋๋ง์ ์์ฃผ ๋ง์ดํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ์๋๊ฐ ๋๋ ค์ง - ์์ ์ฌ์ฉ๋ ๋ง์์ง
๋ฉ๋ชจ๋ฆฌ์ CPU ์ฌ์ฉ๋์ด ๋ง์์ง, ํนํ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ ์ ์ฌ์ ๊ธฐ๊ธฐ์์ ์ฑ๋ฅ์ด ์ ํ๋จ - ์ธํฐํ์ด์ค ๋๊น
๋ ๋๋ง์ด ์์ฃผ ๋ฐ์ํ๋ฉด UI๊ฐ ๊น๋นก์ด๊ฑฐ๋ ๋๋ ค์ง ์ ์์ - ์ง์ฐ ์๊ฐ ์ฆ๊ฐ
๋ ๋๋ง์ด ๋๋ฉด ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ํ ๋ฐ์ ์๊ฐ์ด ๋๋ ค์ ธ, ์ฌ์ฉ์๊ฐ ๋๋ผ๋ ์ง์ฐ ์๊ฐ์ด ์ฆ๊ฐ
=> ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณต! ๋ ๋๋ง์ ์ต์ํํ๋ฉด ๋ฐ๋๋ก ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณต
3. ๋ฆฌ์กํธ์ ๋ ๋๋ง ๋ชจ๋ธ&๋ฌธ์
- ๋ ๋๋ง ๋ชจ๋ธ
๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ํ(state)๋ props๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํจ - ๋ฌธ์
- ๋ถํ์ํ ๋ ๋๋ง: ์ํ๋ props๊ฐ ๋ณ๊ฒฝ๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ , ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ฉด ์์ ์ปดํฌ๋ํธ๋ ๋ค์ ๋ ๋๋ง๋จ
- ๋น์ผ ๊ณ์ฐ: ํน์ ์ปดํฌ๋ํธ์์ ์ํํ๋ ๊ณ์ฐ์ด ๋ณต์กํ๊ฑฐ๋ ์๊ฐ์ด ๋ง์ด ์์๋๋ ๊ฒฝ์ฐ, ๋งค๋ฒ ๋ ๋๋งํ ๋๋ง๋ค ์ด ๊ณ์ฐ์ ๋ฐ๋ณตํ๋ ๊ฒ์ ๋นํจ์จ์ ์
4. ๋ฆฌ์กํธ์์ ๋ ๋๋ง์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ
- ์ปดํฌ๋ํธ ๋ฉ๋ชจ์ด์ ์ด์
- React.memo: ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ props๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ ์ฌ๋ ๋๋ง ๋ฐฉ์ง
- PureComponent: ํด๋์คํ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋๋ฉฐ, props์ state๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ ์ฌ๋ ๋๋ง ๋ฐฉ์ง
- useMemo ๋ฐ useCallback ํ
- useMemo: ๊ณ์ฐ ๋น์ฉ์ด ํฐ ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ๋๋ง ์ฌ๊ณ์ฐ
- useCallback: ํจ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋์ง ์๋ ํ ๋์ผํ ํจ์ ๋ฐํ(์์ ์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ ๋๋ง ๋ฐฉ์ง)
- ๋ ๋๋ง ์ต์ ํ
- ์กฐ๊ฑด๋ถ ๋ ๋๋ง: ํ์ํ ๋๋ง ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋๋ก ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ์ฌ์ฉ(์: {isVisible && <ChildComponent />})
- ๋ฆฌ์คํธ ํค ์ต์ ํ: ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ ๋ ๊ณ ์ ํ ํค๋ฅผ ์ ๊ณตํ์ฌ ๋ฆฌ์กํธ๊ฐ ์ด๋ค ํญ๋ชฉ์ด ๋ณ๊ฒฝ๋์๋์ง ์ฝ๊ฒ ์ถ์ ํ ์ ์๋๋ก ํจ
- ์ํ ๊ด๋ฆฌ ์ต์ ํ
- ์ํ ๋ถ๋ฆฌ: ์ํ๋ฅผ ์ฌ๋ฌ ๊ฐ์ ์์ ์ํ๋ก ๋ถ๋ฆฌํ์ฌ ๋ณ๊ฒฝ์ด ํ์ํ ๋ถ๋ถ๋ง ๋ ๋๋ง
- ์ํ ๋์ด์ฌ๋ฆฌ๊ธฐ: ๊ณตํต๋ ์ํ๋ฅผ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ๋์ด์ฌ๋ ค ์์ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ๋ ๋๋ง๋์ง ์๋๋ก ํจ
- Lazy Loading ๋ฐ Code Splitting
- React.lazy์ Suspense: ์ปดํฌ๋ํธ๋ฅผ ํ์ํ ๋๋ง ๋ก๋ํ์ฌ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์ค์
- Dynamic Import: ์ฝ๋ ์คํ๋ฆฌํ ์ ํตํด ํ์ํ ๋ชจ๋๋ง ๋ก๋ํ์ฌ ์ฑ๋ฅ ํฅ์
- ๋ถํ์ํ ๋ ๋๋ง ๋ฐฉ์ง
- shouldComponentUpdate: ํด๋์คํ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ์ฌ ํน์ ์กฐ๊ฑด์์๋ง ๋ ๋๋งํ๋๋ก ์ ์ด
- React Profiler: ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ถ์ํ๊ณ , ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ๋ ๋๋ง๋๋์ง ํ์ธ ๊ฐ๋ฅ
- ์ต์ ํ๋ ์ด๋ฒคํธ ํธ๋ค๋ง
- ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ต์ ํ: ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ ๋ถํ์ํ ๋ ๋๋ง์ ๋ฐฉ์ง
- CSS ๋ฐ ์ด๋ฏธ์ง ์ต์ ํ
- CSS ์ต์ ํ: CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ CSS ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์คํ์ผ์ ์ต์ ํ
- ์ด๋ฏธ์ง ์ต์ ํ: ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ , ํ์ํ ๋๋ง ๋ก๋ํ์ฌ ์ฑ๋ฅ์ ํฅ์
5. React.memo, useMemo, useCallback ์ธ์ ์จ์ผ ํ ๊น?
1. React.memo
- ์ฉ๋: ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ ๋ถํ์ํ ๋ ๋๋ง์ ๋ฐฉ์ง
- ์ธ์ ์ฌ์ฉํ๋:
- ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ํ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋์ง๋ง, ์์ ์ปดํฌ๋ํธ์ props๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ๊ฒฝ์ฐ.
- ๋ ๋๋ง ๋น์ฉ์ด ํฐ ์ปดํฌ๋ํธ์ผ ๋.
- ๋ฆฌ์คํธ ์์ดํ ๊ณผ ๊ฐ์ด ๋ ๋ฆฝ์ ์ธ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ.
- ์ฃผ์ํ ์ :
- props๊ฐ ์์ ๋น๊ต๋ก๋ง ํ์ธ๋๋ฏ๋ก, ๊ฐ์ฒด๋ ๋ฐฐ์ด์ props๋ก ์ ๋ฌํ ๋๋ ์ฃผ์
- ๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์์ฑํ๋ฉด, React.memo๊ฐ ํจ๊ณผ๋ฅผ ๋ฐํํ์ง ๋ชปํ ์ ์์
- ์ฑ๋ฅ ์ต์ ํ๊ฐ ํ์ํ์ง ์์ ๊ฐ๋จํ ์ปดํฌ๋ํธ์ ์ฌ์ฉํ๋ฉด ์คํ๋ ค ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํจ
2. useMemo
- ์ฉ๋: ๊ณ์ฐ ๋น์ฉ์ด ํฐ ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ ๋ถํ์ํ ์ฌ๊ณ์ฐ์ ๋ฐฉ์ง
- ์ธ์ ์ฌ์ฉํ๋:
- ๋ณต์กํ ๊ณ์ฐ์ ์ํํ๋ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ๊ณ ์ถ์ ๋.
- ๋ ๋๋ง ์ค์ ๊ณ์ฐํด์ผ ํ๋ ๊ฐ์ด ์๊ณ , ๊ทธ ๊ฐ์ด ํน์ ์์กด์ฑ ๋ฐฐ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ๋ค์ ๊ณ์ฐ๋๋๋ก ํ๊ณ ์ถ์ ๋.
- ์ฃผ์ํ ์ :
- ๋ฉ๋ชจ์ด์ ์ด์ ์ด ํญ์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ฒ์ ์๋
- ๊ฐ๋จํ ๊ณ์ฐ์ ๊ฒฝ์ฐ, ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ค๋ฒํค๋๊ฐ ๋ ํด ์ ์์
- ์์กด์ฑ ๋ฐฐ์ด์ ์ ๊ด๋ฆฌํด์ผ ํ๋ฉฐ, ๋๋ฝ๋ ์์กด์ฑ์ผ๋ก ์ธํด stale closure ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์
3. useCallback
- ์ฉ๋: ํจ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ ๋ถํ์ํ ํจ์ ์ฌ์์ฑ์ ๋ฐฉ์ง
- ์ธ์ ์ฌ์ฉํ๋:
- ์์ ์ปดํฌ๋ํธ์ props๋ก ํจ์๋ฅผ ์ ๋ฌํ ๋, ํด๋น ํจ์๊ฐ ์์ฃผ ์ฌ์์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ถ์ ๋.
- ํน์ ์์กด์ฑ ๋ฐฐ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ํจ์๋ฅผ ์๋ก ์์ฑํ๊ณ ์ถ์ ๋.
- ์ฃผ์ํ ์ :
- useCallback์ ์ฌ์ฉํ๋ค๊ณ ํด์ ํญ์ ์ฑ๋ฅ์ด ํฅ์๋๋ ๊ฒ์ ์๋
- ๊ฐ๋จํ ํจ์์ ๊ฒฝ์ฐ, ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ค๋ฒํค๋๊ฐ ๋ ํด ์ ์์
- ์์กด์ฑ ๋ฐฐ์ด์ ์ ๊ด๋ฆฌํด์ผ ํ๋ฉฐ, ๋๋ฝ๋ ์์กด์ฑ์ผ๋ก ์ธํด stale closure ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์
์์ฝ
- React.memo: ์ปดํฌ๋ํธ์ ๋ ๋๋ง ์ต์ ํ. props๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ.
- useMemo: ๊ณ์ฐ๋ ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์ . ๋ณต์กํ ๊ณ์ฐ์ด ํ์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉ.
- useCallback: ํจ์์ ๋ฉ๋ชจ์ด์ ์ด์ . ์์ ์ปดํฌ๋ํธ์ ํจ์๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉ.
'๐ป๊ฐ๋ฐ > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ