Memoization
์ด๋ ๊ธฐ์กด์ ์ํํ ์ฐ์ฐ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ด๋๊ฐ์ ์ ์ฅํด๋๊ณ ๋์ผํ ์
๋ ฅ์ด ๋ค์ด์ค๋ฉด ์ฌํ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ด๋ค.
์ ์ ํ๊ฒ ํ์ฉํ๋ฉด ์ค๋ณต์ฐ์ฐ์ ํผํ ์ ์๊ธฐ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ์ต์ ํ ํ ์ ์๋ค.
useMemo
๋ ๋ฆฌ์กํธ์์ ์ปดํฌ๋ํธ์ ์ฑ๋ฅ์ ์ต์ ํํ๋๋ฐ ์ฌ์ฉ๋๋ ํ
์ด๊ณ , ๋ฉ๋ชจ์ด์ ์ด์
๋ ๊ฐ์ ๋ฐํํ๋ ํจ์์ด๋ค.
const value = useMemo(() => fn, [deps])
์ฌ๊ธฐ์ ์์กด์ฑ๋ฐฐ์ด์ ๊ฐ์ด ๋ณํ๊ฒ ๋๋ค๋ฉด ํจ์๋ฅผ ์คํํ๊ณ , ๊ทธ ํจ์์ ๋ฐํ ๊ฐ์ ๋ฐํํด์ค๋ค.
์ปดํฌ๋ํธ๋ state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ ๋๋ง๋๋๋ฐ, ์ด๋๋ง๋ค ๋ค๋ฅธ ํจ์๊ฐ ๋ถํ์ํ๊ฒ ์ฌํธ์ถ๋๋ค๋ฉด ๋งค์ฐ ๋นํจ์จ์ ์ผ ๊ฒ์ด๋ค.
๋๋ฌธ์ useMemo
ํ
์ ์ฌ์ฉํ์ฌ ๋ ๋๋ง -> ์ปดํฌ๋ํธ ํจ์ ํธ์ถ -> memoize๋ ํจ์ ์ฌ์ฌ์ฉํ๋ ์์๋ฅผ ๊ฑฐ์น๋ค.
๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ ๊ฒฝ์ฐ ํน์ ๋ณ์๊ฐ ๋ณํ ๋๋ง ussMemo์ ๋ฑ๋กํ ํจ์๊ฐ ์คํ๋๋๋ก ์ฒ๋ฆฌํ๋ฉด ๋ถํ์ํ ์ฐ์ฐ์ ํ์ง ์๊ฒ ๋๋ค.
React.memo๋ Highter-Oredr Component(HOC) = ๊ณ ์ฐจ ์ปดํฌ๋ํธ์ด๋ค.
๊ณ ์ฐจ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ์ฉ๋๊ณ ์ปจํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ ์ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
const NewComponent = higherOrderComponent(WrappedComponent);
์ผ๋ฐ ์ปดํฌ๋ํธ๋ ์ธ์๋ก ๋ฐ์ props๋ฅผ UI์ ํ์ฉํ๋ ๋ฐ๋ฉด์ ๊ณ ์ฐจ ์ปดํฌ๋ํธ๋ ์ธ์๋ก ๋ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์๋ก์ด ๋ณ๋์ ์ปดํฌ๋ํธ๋ก ๋ง๋ ๋ค.
๋ React.memo๋ ์๋์ ๊ฐ์ ๊ผญ ํ์ํ ์ํฉ์์๋ง ์ฌ์ฉํ๋ค.
const MyComponent = React.memo((props) => {
return (/*์ปดํฌ๋ํธ ๋ ๋๋ง ์ฝ๋*/)}
);
const TextView = React.memo( ({text}) =>{
useEffect(()=>{
console.log(`UpdateText :: Text : ${text}`)
})
return <div>{text}</div>
});
const CountView = React.memo( ({count}) =>{
useEffect(()=>{
console.log(`UpdateCount :: Count : ${count}`)
})
return <div>{count}</div>
});
[React๊ณต์๋ฌธ์]
props๊ฐ ๊ฐ๋ ๋ณต์กํ ๊ฐ์ฒด์ ๋ํ์ฌ ์์ ๋น๊ต๋ง์ ์ํํ๋ ๊ฒ์ด ๊ธฐ๋ณธ ๋์์ ๋๋ค. ๋ค๋ฅธ ๋น๊ต ๋์์ ์ํ๋ค๋ฉด, ๋ ๋ฒ์งธ ์ธ์๋ก ๋ณ๋์ ๋น๊ต ํจ์๋ฅผ ์ ๊ณตํ๋ฉด ๋ฉ๋๋ค.
const areEqual = (prevProps, nextProps) =>{
return true; // ์ด์ props์ ํ์ฌ props๊ฐ ๊ฐ๋ค = ๋ฆฌ๋ ๋๋ง x
return false; // ์ด์ props์ ํ์ฌ Props๊ฐ ๋ค๋ฅด๋ค = ๋ฆฌ๋ ๋๋ง o
}
์ด๋ฌํ ์ํฉ์์ CountView
๊ฐ ์
๋ฐ์ดํธ๋๋ฉด CountView
์ TextView
๋ชจ๋ ๋ฆฌ๋ ๋๋ง ๋๋ค. CountView
๋ง ์
๋ฐ์ดํธ์ํค๊ณ TextView
๋ฅผ ์
๋ฐ์ดํธ ์ํค์ง ์๊ณ ์ถ์๋๋ useMemo
์ React.memo
๋ฅผ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ค!