ํฌ์ค์ฝ X ์ฝ๋ฉ์จ 7๊ธฐ 9์ฃผ์ฐจ ch3. React (Hooks - useMemo, useCallback)
- react state์ ์๋ช ์ฃผ๊ธฐ ๊ธฐ๋ฅ์ ์ฐ๋ํ ์ ์๊ฒ ํด์ฃผ๋ ํจ์
(ํด๋์ค ์ปดํฌ๋ํธ์์๋ง ๊ฐ๋ฅํ๋
state(์ํ๊ด๋ฆฌ) ์ lifecycle(๋ผ์ดํ์ฌ์ดํด)์ด ๊ฐ๋ฅํ๋๋ก ๋๋ ๊ธฐ๋ฅ)
- class ์์์๋ ๋์X
๋์ , class์์ด react๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ
- ํ์ง๋ง, ์ด๋ฏธ ์ง๋์ ์ปดํฌ๋ํธ๋ฅผ
๋ชจ์กฐ๋ฆฌ ์ฌ์์ฑํ๋ ๊ฒ์ ๊ถ์ฅ X
- ์ต์์ ๋จ๊ณ์์๋ง ํธ์ถ ๊ฐ๋ฅ
(์ต์์ ์ปดํฌ๋ํธ X,
๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค์ฒฉ๋ ํจ์ ๋ด๋ถ์์ ํธ์ถํ๋ฉด ์๋๋ ๊ฒ!)
- Hook์ ์ค๋ก์ง Reactํจ์ํ ์ปดํฌ๋ํธ ์์์๋ง
ํธ์ถ ๊ฐ๋ฅ
์ข ๋ฅ
- useState()
: ํจ์ํ ์ปดํฌ๋ํธ์์ ์ํ๊ด๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ
: ๋์ ์ํ ๊ด๋ฆฌ
: ํด๋์ค ํ ์ปดํฌ๋ํธ์ state
- useEffect()
: sideEffect๋ฅผ ์ํ (mount, unmount, update)
: ํด๋์คํ ์ปดํฌ๋ํธ์ componentDidMount์
componentDidUpdate๊ฐ ํฉ์ณ์ง ํํ
: ์ปดํฌ๋ํธ๊ฐ rendering๋ ๋๋ง๋ค ํน์ ์์ ์ ์ํ
: Mount(์ต์ด rendering) ๋ ๋๋ง ์คํ
useEffect(()=>{
console.log("์ฒ์ ๋ ๋๋ง ๋ ๋๋ง ์คํ๋จ!");
}, []);
: ๋น ๋ฐฐ์ด์ด ์์ผ๋ฉด ํ๋ฒ๋ง ์คํ๋๊ณ ๋ง๋ค๋ ๋ป!
useEffect(()=>{
console.log(name);
}, [name]);
: ํน์ ๊ฐ์ด ๋ฐ๋ ๋๋ง ์คํํ๋ค๋ ๋ป
useEffect(()=>{
console.log("effect");
console.log(name);
return ()=>{
console.log("cleanup");
console.log(name);
};
});
: ์ปดํฌ๋ํธ๊ฐ update๋๊ธฐ ์ง์ ์ ์์ ์ ์ํ
-> cleanup(๋ท์ ๋ฆฌ ํจ์) ์ด์ฉ
- useRef()
: ํจ์ํ ์ปดํฌ๋ํธ์์ ref๋ฅผ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๋ Hook
: useRef()๋ ์ธ์๋ก ๋ฐ์ ๊ฐ์ผ๋ก ์ด๊ธฐํ๋
๋ณ๊ฒฝ ๊ฐ๋ฅํ ref๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
: ref.current ๋ก ํ์ฌ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด์ ์ ๊ทผ ๊ฐ๋ฅ
useMemo, callback
useMemo๋ ์ปดํฌ๋ํธ์ ์ฑ๋ฅ์ ์ต์ ํ์ํฌ ์ ์๋
๋ํ์ ์ธ react hooks ์ค ํ๋์ด๋ค.
useMemo์์ memo๋ Memoization์ ๋ปํ๋ค.
๊ธฐ์กด์ ์ํํ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ์ด๋๊ฐ์ ์ ์ฅํด ๋๊ณ
๋์ผํ ์ ๋ ฅ์ด ๋ค์ด์ค๋ฉด ์ฌํ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ
ํจ์ํ ์ปดํฌ๋ํธ๋?
ํจ์ํ ์ปดํฌ๋ํธ๋ ๊ทธ๋ฅ ํจ์์.
์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋๋ค๋ ๊ฒ์ ๋๊ตฐ๊ฐ๊ฐ ๊ทธ ํจ์(์ปดํฌ๋ํธ)๋ฅผ ํธ์ถํ์ฌ์ ์คํ๋๋ ๊ฒ์ ๋งํจ
ํจ์๊ฐ ์คํ๋ ๋๋ง๋ค ๋ด๋ถ์ ์ ์ธ๋์ด ์๋ ํํ์(๋ณ์, ๋ ๋ค๋ฅธ ํจ์ ๋ฑ) ๋
๋งค๋ฒ ๋ค์ ์ ์ธ๋์ด ์ฌ์ฉ๋จ
์ปดํฌ๋ํธ๋ ์์ ์ state๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋,
๋ถ๋ชจ์๊ฒ์ ๋ฐ๋ props๊ฐ ๋ณ๊ฒฝ๋์์ ๋๋ง๋ค
๋ฆฌ๋ ๋๋ง ๋๋ค.
์ฌ์ง์ด ํ์ ์ปดํฌ๋ํธ์ ์ต์ ํ ์ค์ ์ ํด์ฃผ์ง ์์ผ๋ฉด
๋ถ๋ชจ์๊ฒ์ ๋ฐ๋ props๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ผ๋
๋ฆฌ๋ ๋๋ง ๋๋๊ฒ ๊ธฐ๋ณธ!
์ฌ๊ธฐ์ ๋ฐ์ํ๋ ๋ฌธ์ !
์๋ฅผ ๋ค์ด state, props๊ฐ ์ฌ๋ฌ๊ฐ์ง๋ผ๋ฉด?
๊ทธ ์ฌ๋ฌ๊ฐ์ง state, props๊ฐ ์ ๋ถ ์ฌ ๋๋๋ง ๋๋ค๋ฉด?
๊ต์ฅํ ๋น ํจ์จ์ ์ด๋ค!
useMeomo๋ฅผ ์ฌ์ฉํ๋ฉด?
์ฒ์์ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด์
์ปดํฌ๋ํธ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๋ ๋๋ง์ด ๋์ด๋ ๊ณ์ calculate๋ฅผ ๋ค์ ํธ์ถํ์ง ์๊ณ
์ด์ ์ ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์์ ๊บผ๋ด์์
์ฌ์ฌ์ฉํ ์ ์๊ฒํ๋ค.
๊ทธ๋์ ์์์ ์ธ๊ธํ, ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ ๋ ์๊ธฐ๋ ๋ฌธ์ ์ ์
ํด๊ฒฐ ํ ์ ์๋ค!
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
: ๊ณต์ ํํ์ด์ง์ ๋์จ ๊ฒ!
//๋๋๋ง ๊ณผ์ ์์ list๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ์คํ
const avg = useMemo(() => {
return avgFunc(list);
}, [list]);
์ด๋ฐ ์์ผ๋ก ์ฌ์ฉ!
useCallback ๋ฅผ ์ฌ์ฉํ๋ฉด?
const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);
ํด๋น ์ฝ๋๋ ๊ณต์ ํํ์ด์ง์์ ์ ๊ณตํด์ฃผ๋
useCallback์์์ฝ๋!
//useCallback()
//๋ฐ๋ณตํด์ ์์ฑ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๋ฅผ useCallback์ผ๋ก ๊ฐ์ธ์ฃผ๋ฉด
//ํจ์๋ฅผ ๊ธฐ์ตํด์ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋๋๋ง๋๋ ๊ธฐ์กด์ ๊ธฐ์ตํ๊ณ ์๋
//๊ธฐ์กด ํจ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ
const withCallback = useCallback(() => {
console.log("withCallback", count);
setCount(count + 1);
}, [count]);
์ด๋ฐ ์์ผ๋ก ์ฌ์ฉ!
๊ทธ๋ ๋ค๋ฉด useCallback๊ณผ useMemo์ ์ฐจ์ด์ ์??
๊ณตํต์ : ์ฑ๋ฅ ์ต์ ํ
์ฐจ์ด์ :
useMemo : '๊ฐ'์ ์ฌ์ฌ์ฉ
: ๊ฐ์ ์ฌ์ฌ์ฉ์ ์ํด ์ ๋ฌ๋ ํจ์๋ฅผ ์คํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅ
useCallback : 'ํจ์'๋ฅผ ์ฌ์ฌ์ฉ
: ํจ์์ ์ฌ์ฌ์ฉ์ ์ํด ์ ๋ฌ๋ 'ํจ์ ์์ฒด'๋ฅผ ์ ์ฅ