์ฐธ๊ณ ์ฌ์ดํธ
• ๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์ - useMemo
๐ useMemo
useMemo๋ ์ฌ๋ ๋๋ง ๊ฐ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ *์บ์(Cache)ํ ์ ์๋ React Hook์ด๋ค.
๋น์ฉ์ด ๋ง์ด ๋๋ ์ฌ๊ณ์ฐ์ ๊ฑด๋๋ฐ๊ธฐ ์ํ์ฌ ์ฌ์ฉํ๋ค.
*์บ์(Cache): ์ปดํจํฐ ๊ณผํ์์ ๋ฐ์ดํฐ๋ ๊ฐ์ ๋ฏธ๋ฆฌ ๋ณต์ฌํด ๋๋ ์์ ์ฅ์๋ก ๋ฐ์ดํฐ ์ ๊ทผํ๋ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๊ฑฐ๋ ๋ค์ ๊ณ์ฐํ๋ ์๊ฐ์ ์ ์ฝํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฌ์ฉ
์ถ์ฒ: Wikipedia
๋ฐํ๊ฐ์ ์บ์ฑํ๋ ๊ฒ์ ๋ฉ๋ชจ์ด์ ์ด์ (memoization)์ด๋ผ๊ณ ๋ ํ๋ฉฐ, ์ด๊ฒ์ด ์ด Hook์ด ๋ถ๋ฆฌ๋ ์ด์ ์ด๋ค.
๐ข ์ฐธ์กฐ
useMemo ์ฌ๋ ๋๋ง ๊ฐ์ ๊ณ์ฐ์ ์บ์ํ๋ ค๋ฉด ๊ตฌ์ฑ ์์์ ์ต์์ ์์ค์์ ํธ์ถํ๋ค.
const cachedValue = useMemo(calculateValue, [dependencies])
๐ฆ Parameters
• calculateValue: ์บ์ํ๋ ค๋ ๊ฐ์ ๊ณ์ฐํ๋ ํจ์์ด๋ค.
์์ํด์ผํ๊ณ , ์ธ์๋ฅผ ์ทจํ์ง ์์์ผํ๋ฉฐ, ๋ชจ๋ ์ ํ์ ๊ฐ์ ๋ฐํํด์ผํ๋ค.
React๋ ์ด๊ธฐ ๋ ๋๋ง ์ค ํจ์๋ฅผ ํธ์ถํ๊ณ , ๋ค์ ๋ ๋๋ง์์ dependencies๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ๋์ผํ ๊ฐ์ ๋ฐํํ๋ค.
• dependencies: calculateValue(ํจ์)์ฝ๋ ๋ด๋ถ์์ ์ฐธ์กฐ๋๋ ๋ชจ๋ ๋ฐ์ ๊ฐ์ ๋ชฉ๋ก์ด๋ค.
๋ฐ์ํ ๊ฐ์๋ props, state ๋ฐ ๊ตฌ์ฑ ์์ ๋ณธ์ฒด ๋ด๋ถ์ ์ง์ ์ ์ธ๋ ๋ชจ๋ ๋ณ์์ ํจ์๊ฐ ํฌํจ๋๋ค.
๐ Return
์ด๊ธฐ ๋ ๋๋ง ์ ์ธ์ ์์ด useMemo ํธ์ถํ cacluateValue(ํจ์)์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
๋ค์ ๋ ๋๋ง์์ dependencies๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ์ด๋ฏธ ์ ์ฅ๋ ๊ฐ์ ๋ฐํํ๊ณ , ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ calculateValue๋ฅผ ๋ค์ ํธ์ถํ์ฌ ๋ฐํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
โ ๏ธ ์ฃผ์์ฌํญ
• useMemo๋ Hook์ด๋ฏ๋ก ์ปดํฌ๋ํธ ์ต์์ ์์ค ์ด๋ ์์ฒด Hook์์๋ง ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
• Strict(์๊ฒฉ) ๋ชจ๋์์๋ useMemo๊ฐ ๋ ๋ฒ ํธ์ถ๋์ง๋ง, ํ๋ก๋์ ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
• React๋ ํน๋ณํ ์ด์ ๊ฐ ์๋ ํ ์บ์๋ ๊ฐ์ ๋ฒ๋ฆฌ์ง ์๋๋ค.
โ๏ธ ์ฌ์ฉ
• ๋น์ฉ์ด ๋ง์ด ๋๋ ์ฌ๊ณ์ฐ ๊ฑด๋๋ฐ๊ธฐ
• ๊ตฌ์ฑ์์ ๋ฆฌ-๋ ๋๋ง ๊ฑด๋๋ฐ๊ธฐ
... PT ๋ฐ๊ณ ์์ ์์ฑํ ์์
๊ณต์ ๋ฌธ์ ์์๊ฐ ๊ธธ์ด ๊ตฌ๋
์๋ถ๊ป์ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์์๋ฅผ ์๋ก ๋ง๋ค์ด๋ณด๊ณ ์์ต๋๋ค.
To Be Develop...
import React, { useMemo, useRef, useState } from "react";
import "./App.css";
// ์ฐ์ฐ์ด 3์ด ๊ฑธ๋ฆฌ๋ ํจ์๊ฐ ์๋ค๊ณ ํ ๋,
function delayFunc(
preVal: number,
target: React.MutableRefObject<HTMLInputElement>
) {
const startTime = Date.now();
setTimeout(() => {
if (target) {
console.log(Date.now() - startTime);
target.current.value = (preVal + 1).toString();
}
}, 3000);
}
function basicFunc(preVal: number) {
console.log("๋น ๋ฅธ ํจ์ ์ฌ๊ณ์ฐ");
return preVal + 1;
}
export function DelayMemo() {
const delayInputRef = useRef<React.MutableRefObject<HTMLInputElement> | null>(
null
);
const [value, setValue] = useState<number>(0);
const [memo, setMemo] = useState<number>(0);
const basic = basicFunc(value);
const memoization = useMemo(() => {
return delayFunc(memo, delayInputRef);
}, [memo]);
// const memoization = delayFunc(memo, delayInputRef);
return (
<>
<div>
<div>
value <input value={basic} readOnly />
</div>{" "}
<div>
memoization <input ref={delayInputRef} value={memoization} readOnly />
</div>
</div>
<br />
<div>
<button
onClick={() => {
setValue((prev) => {
return prev + 1;
});
}}
style={{ margin: "0 10px" }}
>
Value Up
</button>
<button
onClick={() => {
setMemo((prev) => {
return prev + 1;
});
}}
style={{ margin: "0 10px" }}
>
Dependence Up
</button>
</div>
</>
);
}
export default App;
์ฝ๋๋ฅผ ํ์ธํ๋ฉด 30๋ฒ์งธ ์ค์ useMemo()๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ๋๋ง๋ง๋ค ๊ณ์ ํธ์ถ๋๋๋ก ๋์ด์๊ณ , 34๋ฒ ์งธ ์ค์ useMemo()๋ฅผ ์ฌ์ฉํ์ฌ memo๋ผ๋ ๊ฐ์ ์์กดํ์ฌ ๋ค์ ํธ์ถํ๊ณ ์๋ค.
์ฃผ์์ ํ๋์ฉ ํ์ด๊ฐ๋ฉด์ ์คํํด๋ณด์.
useMemo()๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋์ด๋ค.
์์กด๊ฐ(memo)๋ฅผ ์ฌ๋ฆฌ์ง๋ ์์๋๋ฐ Console์ฐฝ์ ํ์ธํด๋ณด๋ฉด, 3์ด๊ฐ ๊ฑธ๋ฆฌ๋ ๋ฌด๊ฑฐ์ด ํจ์๋ฅผ ํธ์ถํ๊ณ ์๋ค.
useMemo()๋ฅผ ํ์ฑํํ์ฌ ์คํํด๋ณด๋ฉด
์์กด์ฑ ์๋ value๊ฐ์ up ์ํค๊ณ ์๊ฐ ๊ณ์ฐ์ ์ํด startTime์ ์ ์ฅํ๋ค.
๊ทธ ์ดํ์ ์ฐํ ์ฝ์์ 3์ด๊ฐ ์ง๋ฌ์์๋ ๋ก๊ทธ๊ฐ ์ฐํ์ง ์์ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ฐ์๋ค.
๋ก๊ทธ๊ฐ ์ฐํ์ง์์๋ค๋ ๊ฒ์ ์ฆ, value๊ฐ์ up ์์ผฐ์์๋ delay์ฐ์ฐ ํจ์๊ฐ ์คํ๋์ง ์์๋ค๋ ๊ฒ์ด๋ค.
์์กด์ฑ๊ฐ์ ์ฌ๋ฆฌ๋ ๋น์ฐํ useMemo()๋ก ํธ์ถํ์ง ์๋ ๋น ๋ฅธ ํจ์๊ฐ ์คํ๋์ด ๋ก๊ทธ๊ฐ ์ฐํ๊ณ 3์ด ๋ค ๋๋ ์ด๊ฐ ์๋ ํจ์์ ๋ก๊ทธ๊ฐ ์ฐํ๋ค.
์ด๋ก์จ ๋ ๋๋ง๋ง๋ค ์ฐ์ฐ์ ๋ฌด๋ฆฌ๊ฐ ์๋ ๊ฐ์ ์บ์ํ์ฌ ์ฑ๋ฅ์ ์ ํ๋ฅผ ๋ณด๊ฐํ ์ ์๋ค.
'Framework > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ React ] useContext์ ๋ํด ์์๋ณด์. (2) | 2024.04.08 |
---|---|
[ React ] useCallback์ ๋ํด ์์๋ณด์. (0) | 2024.04.05 |
[ React ] useRef์ ๋ํด ์์๋ณด์. (0) | 2024.04.04 |
[ React ] useEffect()๋ฅผ ์ฌ์ฉํด๋ณด์. (feat. TypeScript) (0) | 2024.03.11 |
[ React ] useState()๋ฅผ ํ์ฉํด๋ณด์. (feat. TypeScript) (0) | 2024.03.11 |