๐ ๋ฆฌ์กํธ์ ์ฑ๋ฅ ๋ณด์ฅ๋ฐฉ์
์ ๋ฒ ๋ฉด์ ์๊ฐ์ ๋ฆฌ์กํธ์ ๋ํ ์ง๋ฌธ์ด ๋ค์ด์์ ๋, ์๋ค๊ณ ์์ ํ์ง๋ง ๋์๋ณด๋ ๋๋ฌด ๋ถ์กฑํ์๋ ๋ชจ์ต์ ๋ฆฌ์กํธ ๋ฌธ์ ์์ฒด๋ฅผ ๋ค์ ๊ผผ๊ผผํ ์ฝ๊ณ ์ ๋ฆฌํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ๊ทธ์ค์ ์ด๋ฒ์ ๊ธฐ๋ณธ ๋์์๋ฆฌ์ ์ฑ๋ฅ๊ณผ ๊ด๋ จ๋ useMemo์ useCallback์ ๋ํด ์ ๋ฆฌํด ๋ณด๋ ค ํ๋ค.
โ ์ ๋ฆฌ์กํธ๋ฅผ ์จ์ผ ํ ๊น?
๋จผ์ ๋ฆฌ์กํธ๋ฅผ ์ฐ๋ฉด์ ๋ด๊ฐ ์ ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๋์ง์ ๋ํด์ ๋ง์ด ๊ณ ๋ฏผํ์ง ๋ชปํ๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋ด๊ฐ ๋๋ ๋ฆฌ์กํธ์ ์ฅ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ๋ค๋ ์ ์ด์๋ค. ๋ฌผ๋ก Vue๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ง๋ง ๋ฆฌ์กํธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ์ข ๋ ์์ ๋กญ๊ฒ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ์ ์ฌ์ฉํ๊ธฐ ์ํด์, ์๋ฐ์คํฌ๋ฆฝํธ ์์ฒด๋ฅผ ์ข ๋ ๊ณต๋ถํ๊ฒ ๋์๋ค. ์ด์ ์ด ์คํ๋ ค ๋ฌ๋ ์ปค๋ธ๊ฐ ๋ฎ๋ค๋ ์ ์์ Vue์ ์ฅ์ ์ด ๋ ์ ์์ง๋ง ํ๋์ ์ธ์ด๋ฅผ ์ ๋ง ์ํ๊ณ ์ถ์๋ ๋์๊ฒ ์์ด์๋ ๋ฆฌ์กํธ์ ์ฅ์ ์ด ๋์๋ค.
Vue์ React๋ฅผ ๋ชจ๋ ์ฌ์ฉํด๋ณด์๋ค๋ฉด ๋ ์ ์ ๋ฆฌํ ์ ์์ ๊ฒ ๊ฐ์, ์ดํ์ ์กฐ๊ธ์ฉ ์๋ํ๋ฉด์ ์ง์ ๋๊ปด๋ณด๊ณ ์ ๋ฆฌํด๋ณด๋ฉด ์ข์ ์ฃผ์ ๋ผ๊ณ ์๊ฐ๋์๋ค.
โ ๋ฆฌ์กํธ๊ฐ ํด๊ฒฐํ๊ณ ์ถ์๋ ๋ฌธ์
์ด์ ์ CSR๊ณผ SSR ๊ธ๊ณผ Critical Rendering path์ ๋ํด ๊ธ์ ์ฐ๋ฉด์ ์ ๋ฆฌํ์ง๋ง SPA์ MPA(Multi Page Application)์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋์ค๊ฒ ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ค. MPA์ ๋ฌธ์ ์ ์ ํ์ด์ง ์ด๋์ ๋ฐ๋ผ HTML ์ ์ฒด๋ฅผ ์๋กญ๊ฒ ๊ฐ์ ธ์์ผ ํ๋ ๋ถํ์ํ ๋น์ฉ์ด ๋ฐ์ํ๋ค๋ ์ ์ด์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ๋์ html์ javascript์ ์ด์ฉํด ๋์ ์ผ๋ก DOM์์๋ฅผ ๋ณํํ๋SPA (Single Page Application) ๋ฐฉ์์ด ์ ์๋์๊ณ ์ฌ๊ธฐ์ ๋ํ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฐ๋ก ๋ฆฌ์กํธ์ด๋ค.
ํ์ง๋ง SPA๋ DOM์์๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ง์ ๊ฑด๋๋ฆฌ๊ธฐ ๋๋ฌธ์ Critical Rendering Path์์ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ทธ๋ ค์ค์ผํ๋layout -paint- composite๊ณผ์ ์ด ๋ค์ ์ผ์ด๋์ผ ํด์ ์ฑ๋ฅ์ด ํฐ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค. ์ด๋ฌํ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ฆฌ์กํธ๋ ์์ฒด์ ์ธ V-DOM์ ์ด์ฉํ Reconcilation์ผ๋ก ํด๊ฒฐํ๋ค. ๋๊ฐ์ง์ ๋ํด์ ์์๋ณด์.
๐ V-DOM๊ณผ Reconcilation
V-DOM์ ๋ฆฌ์กํธ ์์ฒด์ ๊ฐ์์ DOM์ด๋ค. ๋ฆฌ์กํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก UI๋ฅผ ์
๋ฐ์ดํธ ํ๊ธฐ ์ํด, DOM์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ํ๋ฅผ ์ฌ์ฉํ๋ค. ์ด ์ํ์ ๋ฐ๋ผ ๋งค๋ฒ DOM์์ฒด๊ฐ ๋ฐ๋๊ฒ ๋๋ค๋ฉด ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ๋ ์์ฒด์ ์ผ๋ก V-DOM์ ์
๋ฐ์ดํธ ํด์ผํ ๋ถ๋ถ์ ๋จผ์ ๋ฐ์ํ๋ค. ์ด๋ V-DOM์ DOM์ ๋ฐ์ํ ํ์ด๋ฐ์ ๊ด๋ฆฌํด์ฃผ๋ ์ค์ผ์ค๋ฌ๊ฐ ์์ด, ์ ์ ํ ํ์ด๋ฐ์ V-DOM๊ณผ ์ค์ DOM์ ๋น๊ตํด ํ์ํ ๋ถ๋ถ์ ๋ฐ์ํ๋๋ฐ ์ด๊ฒ์ Reconcilation์ด๋ผ๊ณ ํ๋ค.
์ด๋ ๊ฒ V-DOM์์ฒด๋ก ๋๋๋ง์ ํ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋น์ฉ์ด ์ ๊ฒ ๋ค๋ฉด์ ๋งค๋ฒ DOM์ ์ ๋ฐ์ดํธํ์ง ์๊ณ ํ์ํ DOM๋ณํ๋ฅผ ๋ชจ์์ ํ๋ฒ์ ์ฒ๋ฆฌํด ์ฑ๋ฅ์ ์ต์ ํํ๋ค. ์ด๋ฌํ ๊ณผ์ ์ด ์ด์ ์ ๋ง์ด ์ฐ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ JQuery์ ์ฐจ์ด๊ฐ ๋๋ ๋ถ๋ถ์ผ๋ก DOM์ ์ง์ ๋ณ๊ฒฝํ๋ JQuery์ ๋ฌ๋ฆฌ ํ์ํ ๋ณํ๋ฅผ ๋น๊ตํ๊ณ ๊ทธ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธํด ํจ์ฌ ์ฑ๋ฅ์ด ์ข๋ค.
Reconcilation์ V-DOM์ ์ด์ฉํด ์ค์ DOM๊ณผ ๋น๊ตํด ๋ฐ์ํ๋ ๊ณผ์ ์ด๋ผ๊ณ ์ ์ํ ์ ์๋ค. ์ด๋ ์ค์ํ ์ ์ ๋น๊ตํ๋ ๊ฒ ์์ฒด์๋ ์ฑ๋ฅ์ด ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค๋ ์ ์ด๋ค. ๋ฆฌ์กํธ ํํ์ด์ง์ ๋น๊ต ์๊ณ ๋ฆฌ์ฆ์ผ๋ก state of art algorithm์ ์ด์ฉํ๋ค๋ฉด O(n^3)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ํฐ ๋ฌธ์ ๊ฐ ๋๋ค๊ณ ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ๋ ์ฑ๋ฅ์ ๊ณ ๋ คํ ๋น๊ต๋ฅผ ์ํด ๋๊ฐ์ง ๊ฐ์ ์ ํ๋ค.
์ฒซ๋ฒ์งธ๋ element์ type์ด ๋ฌ๋ผ์ง๋ฉด ๋ค๋ฅธ ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค๋ ๊ฒ์ด๊ณ , ๋๋ฒ์งธ๋ก ๊ฐ๋ฐ์๊ฐ ์ง์ child element์ key๋ฅผ ์ด์ฉํด ๋ฐ๋์ง ์์ ๊ณณ์ ์๋ ค์ค ์ ์๋ค๋ ์ ์ด๋ค. ์ด ๋๊ฐ์ง ๊ฐ์ ์ ํตํด์ reconcilation์ O(n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๊ฒ ๋๋ค.
๊ฐ๊ฐ์ ๋ํด ์์ธํ ์ ๋ฆฌํด๋ณด์
Elements Of Different Types
๋จผ์ element์ tag ์์ฒด๊ฐ ๋ฌ๋ผ์ง๋ค๋ฉด, ์๋ฅผ ๋ค๋ฉด <a> ์์ <button>์ผ๋ก ๋ฐ๋์๋ค๊ณ ํ๋ฉด ์์์ ๋ ์ด์ ๋น๊ตํ์ง ์๊ณ ๊ฑฐ๊ธฐ์ ๋ฐ๋ก ์๋ก์ด DOM ํธ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์๋ ์์ ์์๋ค์ด ์
๋ฐ์ดํธ๋๋ค. ์ด๋ tag๋ ๊ฐ์ง๋ง className๊ณผ ๊ฐ์ attribute๊ฐ ๋ฌ๋ผ์ง ๊ฒฝ์ฐ์๋ DOM์์๋ ๊ทธ๋๋ก ๋๊ณ attribute๋ง ๋ฐ๊ฟ ๋ฐ์ํ๋ค.
Key
key๋ฅผ ์ ํด์ฃผ์ด์ผ ํ ๋๋ ๋ณดํต ๋ฐฐ์ด์ ์์๋ฅผ mappingํด์ค ๋ ์ฌ์ฉํ๋ค. ์ด๋ key๋ฅผ ์ ๋ฌํ์ง ์์ผ๋ฉด ๋ฆฌ์กํธ๋ error๋ฅผ ๋์ง๋ค. ๊ทธ ์ด์ ๋ ๊ฐ์ tag๊ฐ ๋ฐ๋ณต๋๋ ์ํฉ์์ ์์๋ง์ ์ด์ฉํ๊ฒ ๋๋ฉด DOM์์๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ์ ์ฒด๋ฅผ ๋ค ๋ณ๊ฒฝํด์ผํ๋ ๋ถํ์ํ ๋น์ฉ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
// DOM
<ul>
<li>Duke</li>
<li>Villanova</li>
</ul>
// VDOM
<ul>
<li>Connecticut</li>
<li>Duke</li>
<li>Villanova</li>
</ul>์ ์ฝ๋์ ๊ฐ์ ๊ฒฝ์ฐ react๋ ์์๋ง์ผ๋ก ๋น๊ตํด ๋ชจ๋ ์์๊ฐ ๋ค ๋ฐ๋์๋ค๊ณ ์ดํดํ๊ณ ์ ์ฒด๋ฅผ ๋ค ์๋กญ๊ฒ DOM์์๋ฅผ ๋ง๋ ๋ค. ์ด์ ์ ํด๊ฒฐํ๊ธฐ ์ํด์ key๋ฅผ ์ด์ฉํ๋ค๋ฉด ๋ด๋ถ ์์์๋ ์๊ด์์ด key๊ฐ์ด ๋ฐ๋ ์์๋ง ์ฐพ์์ DOM์ ์ ๋ฐ์ดํธํด ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ณ ์ ํ ๊ฐ์ผ๋ก key๋ฅผ ์ ํด์ฃผ๋ ๊ฒ์ด ์ค์ํ๋ฉฐ key๋ก index๋ฅผ ์ง์ ๋๊ธฐ๋ฉด ์๋๋ค๋ ๊ฒ์ด ์ดํด๊ฐ ๋์๋ค.
<ul>
<li key="2015">Duke</li>
<li key="2016">Villanova</li>
</ul>
<ul>
<li key="2014">Connecticut</li>
<li key="2015">Duke</li>
<li key="2016">Villanova</li>
</ul>๐ฒ Reconcilation ํผํ๊ธฐ
๋ฆฌ์กํธ์ ๊ธฐ๋ณธ์๋ฆฌ๋ ์ํ์ props๊ฐ ๋ฐ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋๋๋งํ๋ ๊ฒ์ด๋ค. ์์ ์ ๋ฆฌํ ๋ด์ฉ๋ค์ ์ด๋ฌํ ๋ณํ๋ก V-DOM๊ฐ ๋ฐ๋์์ ๋ V-DOM๊ณผ ์ค์ DOM์ ์ด๋ป๊ฒ ๋น๊ตํด์ ๋ฐ์ํ๋์ ๊ดํ ๊ฒ์ด์๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ์ต์ ํํด์ ๋ฆฌ๋๋๋ง์ ํ๋คํด๋ ๋ฆฌ๋๋๋ง ์์ฒด๋ ๋น์ฉ์ด ๋๋ ์์ ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ UI์์ฒด๋ฅผ ์ฌ์ฌ์ฉํด, ๋ฆฌ๋๋๋ง ์์ฒด๋ฅผ ์ค์ฌ์ค ์ ์๋ค๋ฉด ๋ ์ข์ ๋ฐฉ๋ฒ์ด ๋๋ค.
๊ธฐ์กด์ UI๋ฅผ ์ฌ์ฌ์ฉํ ์ง๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ฑ๋ฅ์ ๊ณ ๋ คํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฆฌ์กํธ๋ React.Memo์ useCallback,useMemo API๋ฅผ ์ง์ํ๋ค.
React.Memo
๋ฆฌ์กํธ์ ๊ธฐ๋ณธ ์๋ฆฌ์ ๋ฐ๋ผ์ ์ํ๊ฐ ๋ฐ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ์ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ชจ๋ ๋ฆฌ๋๋๋ง์ ํด์ผ ํ์ง๋ง, ์์ ์์ ์ค์์ ์ ๋ฌ๋ฐ์ props๊ฐ ๋ณํ์ง ์์์ UI๋ฅผ ๋ณํํ์ง ์์๋ ๋๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค. ์ด๋ด ๋๋ ์ด์ UI๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ธ๋ฐ ์ด๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด React.Memo์ด๋ค.
import { memo } from "react"
function SomeComponent(props) {
// ...
}
const MemoizedComponent = memo(SomeComponent)React.memo๋ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๋ HOC (Higher Order Component)๋ก ์ปดํฌ๋ํธ์ ์ด์ props์ state ๋ณํ๋ก ์ฌ์ฉ๋ props ๋น๊ตํด์ ์ฐจ์ด๊ฐ ์์ ๋์๋ง ๋ฆฌ๋๋๋ง์ ํ๊ฒํ๋ค.์ด๋ ์ค์ํ ๊ฒ์ props๋ฅผ ๋น๊ตํ๋ ๋ฐฉ์์ธ๋ฐ ์์ ๋น๊ต๋ฅผ ํตํด ๋น๊ตํ๋ค.
์์ ๋น๊ต์ ๋ถ๋ณ์ฑ
์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๊ต๋ ๋ฐ์ดํฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ด์ฉํด ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค. ์์ํ์ ๊ฒฝ์ฐ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ์์ฒด๋ก ๋น๊ตํด๋ ๋๋ค.
ํ์ง๋ง ๊ฐ์ฒด ํ์ ์ ํด๋น ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ณ ์๋ ์ฐธ์กฐ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๋ด๋ถ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋์ผํด, ์ฃผ์๊ฐ๋ง์ ๋น๊ตํ๋ ๊ฒ์ด ์๋๋ผ ๋ด๋ถ ๊ฐ์ด ๋ณํ๋์ง ์ผ์ผ์ด ํ์ธํด์ผ ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ์์๋ ๋น๊ต์ ํธ์๋ฅผ ์ํด์ ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ ์งํค๋ ๋ฐฉ์์ ์ด์ฉํ๋ค. ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ ์งํค๊ฒ ๋๋ฉด ๋ด๋ถ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๊ธฐ ์ํด์๋ ์๋ก์ด ๊ฐ์ฒด๋ก ๋ฐ๊พธ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ํ ํ์ ๊ณผ ๊ฐ์ด ์ฃผ์๊ฐ๋ง์ผ๋ก๋ ๋น๊ต๊ฐ ๊ฐ๋ฅํ๊ฒ ๋๋ค.
๊ทธ๋์ ๋ฆฌ์กํธ์์ ๊ฐ์ฒด์ํ๋ฅผ ๋ณํ ์ํค๊ธฐ ์ํด์๋ state๋ฅผ ์ง์ mutateํ๋ ๊ฒ ์๋๋ผ, setState๋ฅผ ๊ตฌ์กฐ๋ถํดํ ๋น์ ์ด์ฉํ ๋ฐฉ์์ผ๋ก ์ํ๋ณํ๋ฅผ ํ๋ค. ๊ตฌ์กฐ๋ถํดํ ๋น์ key๋ก ์ ๋ฌ๋ ๊ฐ์ ๊ฐ์ง๋ง ๊ฐ์ธ๊ณ ์๋ ๊ฐ์ฒด๋ ์๋กญ๊ฒ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ์๊ฒ ์ํ๋ณํ๋ฅผ ์๋ ค์ค ์ ์๊ณ , ์์์ผ๋ก ๊ฐ์ ์ ๋ฌํ์ ๋ ๋ฐ๋ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธ ํ ์ ์๊ฒ ๋๋ค.
props ์์ฒด๋ ๋งค๋ฒ ๋๋๋ง์ ๋ฐ๋ผ ์๋กญ๊ฒ ๋ง๋ค์ด์ ธ ๋น๊ต๊ฐ ์๋ฏธ๊ฐ ์๋ค. ๋น๊ต๋ฅผ ์ํด์๋ props ๋ด๋ถ์ key๋ฅผ ๋๋ฉด์ ๋น๊ต๋ฅผ ํ๊ฒ ๋๋๋ฐ ๊ฐ๋ค ์ค์์ ํ๋๋ผ๋ false๊ฐ ๋์ค๊ฒ ๋๋ค๋ฉด ๋ฆฌ๋๋๋ง์ด ํ์ํ๋ค๊ณ ํ๋จํ๊ณ ๋ฆฌ๋๋๋ง์ ํ๋ค.
useCallback๊ณผ useMemo
React.Memo๋ ์ปดํฌ๋ํธ ์์ฒด์ props๋ฅผ ์ด์ฉํด์ ๋ฆฌ๋๋๋ง์ ํด์ผํ ์ง๋ฅผ ๊ณ ๋ฏผํ๋ค๋ฉด, ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด๋๊ณ ๋ถํ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ง์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก, useCallback๊ณผ useMemo๊ฐ ์๋ค.
ํจ์ํ ์ปดํฌ๋ํธ๋ ๋งค ๋ฆฌ๋๋๋ง๋๋ง๋ค ์๋กญ๊ฒ ์คํ๋๊ธฐ ๋๋ฌธ์, ๊ทธ๋๋ง๋ค ๋ณ์์ ํจ์๊ฐ ์๋กญ๊ฒ ์์ฑ๋๋ ํน์ง์ ๊ฐ์ง๋ค. ๋ง์ฝ์ ์ด ๋ณ์๋ค๊ณผ ํจ์๊ฐ ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌ๋๋ค๋ฉด React.Memo๋ก ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๋๋ผ๋ ์ ๋ฌ๋๋ ๊ฐ์ด ๊ณ์ํด์ ์๋ก์ด ๊ฐ์ผ๋ก ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ React.Memo๋ก ๊ฐ์ธ์ง ์ปดํฌ๋ํธ๋ ๋ฆฌ๋๋๋ง์ด ๋ ์ ์๋ค.
useMemo(callbackFunction, deps)
useMemo๋ ๊ฐ์ ์ ์ฅํ ์ ์๋ ํจ์๋ก ๋ฐํํ๋ ๊ฐ์ ์ ์ฅํ๊ฒ ๋๊ณ , deps๋ก ์ ๋ฌ๋ ๊ฐ์ด ๋ณํ ๋๋ง ์๋กญ๊ฒ ์์ฑํ๋ค.
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b])useCallback(callbackFunction, deps)
useCallback์ useMemo๋ก ์ ์ฅํ๋ ํจ์๋ฅผ ์ข ๋ ๊ฐ๋จํ๊ฒ ์ ์ฅํ ์ ์๊ฒ ๋์์ฃผ๋ api๋ก, useMemo์ ๋์ผํ๊ฒ deps๋ก ์ ๋ฌ๋ ๊ฐ์ด ๋ณํ ๋ ์๋กญ๊ฒ ์์ฑ๋๋ค.
const memorizedFunction = useMemo(() => () => console.log("Hello World"), [])
const memorizedFunction = useCallback(() => console.log("Hello World"), [])