์ฐธ์กฐ(์ด๋ฏธ์ง ํฌํจ): When to useCallback & useMemo hooks ?
์ด ๊ธ์ [React] ๋๋ํ๊ฒ useCallback ์ฌ์ฉํ๊ธฐ์์ ์ด์ด์ง๋ ๊ธ์ด๋ค.
๋ฆฌ์กํธ์ ์ฑ๋ฅ ์ต์ ํ์ ๋ํ ์ด์ผ๊ธฐ์ useCallback
ํ
์ ์ฌ์ฉํด ์ต์ ํ ํ ์์๋ฅผ ๋ณด๊ณ ์ถ๋ค๋ฉด, ์ ๊ธ์ ๋จผ์ ๋ณด๊ณ ์ค๊ธฐ๋ฅผ ์ถ์ฒํ๋ค!
useMemo๋
useMemo
๋ ์ฌ์ฌ์ฉ๋(memoized) ๊ฐ์ ๋ฐํํ๋ ํ
์ด๋ค. ์ด ํ
์ ๋ฐ์ดํฐ์ ๋ง์ ๊ฐ๊ณต์ด ํ์ํ ๋ ์ ํฉํ๋ค. ์๋ฅผ ๋ค๋ฉด, ๋ณต์กํ ์ํ์ ๊ณ์ฐ์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ ๊ณ์ฐํ๋๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๋ก์ง์ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ๊ฐ ์ด์ ํด๋น๋๋ค.
๋จผ์ ์ด ํจ์๋ ์ปดํฌ๋ํธ์ ์ฒซ ๋ ๋ ๋ ์คํ๋๊ณ , ์ดํ ๋ฆฌ๋ ๋๊ฐ ๋ ๋๋ง๋ค ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํด ๋ณด์ฌ์ค๋ค. ๋งค๋ฒ ํจ์๋ฅผ ์คํํด์ ๋ด๋ถ ๋ก์ง์ ๋ค์ ๊ณ์ฐํ๋ ๊ฒ์ด ์๋๋ค.
์ธ์ useMemo๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?
๋จผ์ useMemo
๋ฅผ ์ ์ฉํ์ง ์์ ์์ ๋ฅผ ์ดํด๋ณด์.
import React, { useState } from "react";
export default function App() {
const [immutableNum, setImmutableNum] = useState(0);
const [count, setCount] = useState(0);
const increase = () => {
console.log("Click Add button!");
setCount(count + 10);
};
const caculateComplexValue = () => {
console.log("I am doing complex calculation...๐ค");
return (immutableNum + 2 * 2 * 99999 * 999999) / 0.213213213;
};
return (
<div className="App">
<p>count: {count}</p>
<button onClick={increase}>Add</button>
<p>Complex Value: {caculateComplexValue()}</p>
</div>
);
}
Add ๋ฒํผ์ ํด๋ฆญํ๋ฉด count
์ ๊ฐ์ด ์ฆ๊ฐํ๊ณ , App ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋๋ฉด์ Complex Value์ ํด๋น๋๋ DOM์ ๋ค์ ๊ทธ๋ฆฌ๊ธฐ ์ํด caculateComplexValue
ํจ์๊ฐ ์ฌ์คํ๋๋ค. ๋ฐ๋ผ์ Add ๋ฒํผ์ 2๋ฒ ํด๋ฆญํด์ count๊ฐ 0์์ 20์ผ๋ก ์ฆ๊ฐํ์ ๋ ๋ก๊ทธ๋ฅผ ํ์ธํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค. ๋ฒํผ์ ํด๋ฆญํ ๋๋ง๋ค caculateComplexValue
ํจ์๋ ํจ๊ป ์คํ๋์ด ๋ก๊ทธ๊ฐ ์ฐํ๊ณ ์๋ค.
caculateComplexValue
ํจ์๊ฐ ๊ณ์ฐ์ ํ์ํ ๊ฐ์ immutableNum
์ผ๋ก ๋ฒํผ์ ํด๋ฆญํด๋ ๋ณ๊ฒฝ๋์ง ์๋ ๊ฐ์ด๋ค. ์ฆ, ํ์ฌ Complex Value๋ ๋ณ๊ฒฝ๋ ์ผ์ด ์๋ ๊ฐ์์๋ ๋งค๋ฒ caculateComplexValue
ํจ์๊ฐ ์ฌ์คํ๋์ด ๋ถํ์ํ๊ฒ ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณตํ๊ณ ์๋ ๊ฒ์ด๋ค. ์ด๋ด ๋ useMemo
ํ
์ ์ฌ์ฉํด ๊ฐ์ ์ฌ์ฌ์ฉํ๋ฉด ๋๋ค!
useMemo ์ฌ์ฉํ๊ณ ์ฑ๋ฅ ์ต์ ํํ๊ธฐ
import React, { useState, useMemo } from "react";
export default function App() {
const [immutableNum, setImmutableNum] = useState(0);
const [count, setCount] = useState(0);
const increase = () => {
console.log("Click Add button!");
setCount(count + 10);
};
const caculateComplexValue = useMemo(() => {
console.log("I am doing complex calculation...๐ค");
return (immutableNum + 2 * 2 * 99999 * 999999) / 0.213213213;
}, [immutableNum]); // 1๏ธโฃ
return (
<div className="App">
<p>count: {count}</p>
<button onClick={increase}>Add</button>
<p>Complex Value: {caculateComplexValue}</p> {/* 2๏ธโฃ */}
</div>
);
}
useMemo
ํ
์ผ๋ก ๊ฐ์ธ๋ฉด์ ์์กด์ฑ ๋ฐฐ์ด์ ์ฐธ์กฐํ๊ณ ์๋ ์ํ immutableNum
์ ์ถ๊ฐํ๋ค(1๏ธโฃ). ๋ฐ๋ผ์ ์ด์ caculateComplexValue
์ ๋ด๋ถ ๊ณ์ฐ ๋ก์ง์ immutableNum
์ ๊ฐ์ด ๊ฐ๋ค๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋ ๋์ด๋ ๋ค์ ์คํ๋์ง ์๊ณ , ์ด์ ์ ๊ณ์ฐํ๋ ๊ฐ์ ์ฌ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ด๋ค.
๋์ด์ caculateComplexValue
ํจ์ ๋ด๋ถ์ ๋ก๊ทธ๊ฐ ์ฐํ์ง ์๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
๋ง์ง๋ง์ผ๋ก ์ ์ํ ๊ฒ์ caculateComplexValue
๊ฐ ๋์ด์ ํจ์๊ฐ ์๋๋ผ ํจ์์ ๋ฐํ๊ฐ์ ๋ค๊ณ ์๋ ๋ณ์๋ผ๋ ์ ์ด๋ค. useMemo
ํ
์์์ ์ต๋ช
์ ํ์ดํ ํจ์๋ฅผ ํธ์ถํ์ฌ ์ด๋ฏธ ๋ด๋ถ ๋ก์ง์ ์คํํ ์ํ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ JSX ์์์ ์ด์ ์ฒ๋ผ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ ์๋๋ผ ๋ณ์๋ฅผ ์ฐธ์กฐ(2๏ธโฃ)ํด์ผ ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์๋๋ค.
'๐ป๐ > ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TS] ์ ํธ๋ฆฌํฐ ํ์ ๋ค (0) | 2022.10.09 |
---|---|
[JS] JavaScript์์ HTML ์์๋ฅผ ๋ง๋๋ 3๊ฐ์ง ๋ฐฉ๋ฒ (0) | 2022.10.02 |
[React] ๋๋ํ๊ฒ useCallback ์ฌ์ฉํ๊ธฐ (0) | 2022.10.02 |
[TS] ๋น ๊ฐ์ฒด์ ๋ํ ์ฌ๋ฐ๋ฅธ ํ์ (0) | 2022.09.03 |
[react-youtube] videoId์ ๋ฐ๋ผ ์์์ด ๋ณ๊ฒฝ๋์ง ์์ ๋ (0) | 2022.09.02 |