์ด ๊ธ์ When to useCallback & useMemo hooks ? ์ ๋ฒ์ญ๊ธ์ ๋๋ค. (์ด๋ฏธ์ง ํฌํจ)
๊ฐ๋ฐ์์ ์๋ช , ์ดํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ์ต์ ํ
์ฑ๋ฅ ์ต์ ํ๋ ๊ฐ๋ฐ์๋ผ๋ฉด ๋๊ตฌ๋ ์ดํ๋ฆฌ์ผ์ด์ ๋น๋ ์ดํ ๋ง์ฃผํ๊ฒ ๋๋ ํํ ์ด์์ด๋ค. ํ์ง๋ง ๊ฐ๋ฐํ ๋๋ ์๋ฒฝํ๊ฒ ๋์ํ๋ ์์คํ ์ด ๋ฐฐํฌ ํ ์ด์ ์์ ๋ ๋๋ ค์ง๋ ๋๋์ด ๋๋ ๊ฑด ๋จ์ํ ์ฐฉ๊ฐ์ผ๊น?
๊ฐ๋ฐ ๋ชจ๋์ผ ๋ ๋ ๋น ๋ฅด๊ฒ ๋๊ปด์ง๋ ์ด์
์ดํ๋ฆฌ์ผ์ด์ ์ด ๊ฐ๋ฐ ๋ชจ๋์ผ ๋๋ ๋ชจ๋ ํ์ผ๋ค์ด ๋ก์ปฌ ๋จธ์ ์ฆ, ๋ด ์ปดํจํฐ๋ฅผ ํตํด ๋ก์ปฌ ํฌํธ 3000๋ฒ(React ๊ธฐ์ค)์ ํธ์คํ ์ด ๋๋ค. ๋ก์ปฌ์์ ๊ฐ๋ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ธํฐ๋ท ์๋์ ๊ทธ๋ค์ง ์ํฅ์ ๋ฐ์ง ์๋ ๊ฒฝ์ฐ, ๋ฒ๋ค ํ์ผ๋ค์ ๋ค์ด๋ก๋ ๋ฐ๋ ๊ฒ์ ๊ต์ฅํ ํจ์จ์ ์ด๋ฉฐ ๋น ๋ฅด๊ฒ ๋์ํ๋ค. ํ์ง๋ง ์ด์ ์์๋ ์ธํฐ๋ท์ด ๊ต์ฅํ ๋๋ฆฐ ๊ณณ์ ์ํ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ๊ฒฝ์ฐ ์ธํฐ๋ท ์๋๊ฐ ํฐ ์ด์๋ฅผ ๋ฐ์ํ ์ ์๋ ๊ฒ์ด๋ค.
ํ์ํ์ง ์๋ค๋ฉด ์ฐจ๋ผ๋ฆฌ ํ์ง ์๋ ๊ฒ์ด ๋ซ๋ค
์ฑ๋ฅ ์ต์ ํ์๋ ํญ์ ๋น์ฉ์ด ๋ค์ง๋ง ๊ทธ๋ ๋ค๊ณ ํด์ ํญ์ ์ด์ ์ด ์๋ ๊ฒ๋ ์๋๋ค.
๋๋ฌธ์ ํ์ํ์ง๋ ์์ผ๋ฉด์ ์ฌ์ ์ ๋ฏธ๋ฆฌ ์ต์ ํ ์ฝ๋๋ฅผ ์์ฑํ์ง ๋ง์. ๊ทธ๋ฆฌ๊ณ ํ๋นํ ์ด์ ์์ด ๊ตฌ๊ธ๋ง์ ํ๋ฉฐ ์๊ฒ ๋ ์ฑ๋ฅ ์ต์ ํ ํ๋ค์ ๋์ด๊ฐ์ง ๋ง์. ์ ๋ง๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ด์๋๊ณ ์๊ณ , ๊ทธ ์ค์์๋ ์ ๋ง๋ก ๋๋ฆฌ๋ค๊ณ ์๊ฐ๋๋ ๋ถ๋ถ์ ์ฝ๋๋ง ์ต์ ํ๋ฅผ ํ์. ํ์๊ฐ ์์์๋ ์ด๋์ ์ฃผ์๋ค์ ์ง์๋ค์ ์์คํ ์ ์ ์ฉํ๋ ๊ฒ์ ์ง์ํด์ผ ํ๋ค.
์ฝ๋๋ฅผ ์ต์ ํ ํ๋ค๋ ๊ฒ์ ๋ชจ๋ ์ฝ๋ ๋ผ์ธ์ ๋น์ฉ์ด ์๋ฐ๋๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก ์ต์ ํ๋ ์คํ๋ ค ์ฝ๋๋ฅผ ๋๋ ค์ง๊ฒ ํ ์ ์๋ค. ๋ฐ๋ผ์ ๊ณผํ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ํด์๋ ์๋๋ค. ์ฝ๋๋ฅผ ์ธก์ ํ๊ณ ์ ๋ง๋ก ๋๋ฆฐ์ง ํ์ธ ํ ์ต์ ํ๋ฅผ ์์ํด์ผ ํ๋ค. ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋๋ ค์ง๊ธฐ ์์ํ๊ณ , ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฑธ ์์์ฐจ๋ ธ์ ๋๋ง ์ฑ๋ฅ ์ต์ ํ๋ฅผ ํ๋๋ฐ ์ด ๋, ๋จผ์ ํด๊ฒฐ์ฑ ์ ์ฐพ๊ธฐ ๋ณด๋ค๋ ์ ๋๋ ค์ง๊ณ ์๋์ง ์์ธ์ ์ฐพ์์ผ ํ๋ค.
useCallback์ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
useCallback
์ ํจ์๋ฅผ ๊ธฐ์ตํ๋ค๊ฐ ์ฌ์ฌ์ฉํ๋๋ก(๋ฉ๋ชจ์ด์ ์ด์
) ๋์์ฃผ๋ ํ
์ด๋ค.
๋ฆฌ์กํธ์์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋๋ฉด ๊ทธ ์์ ์์ ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๊ฐ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๋ฆฌ๋ ๋๋ง ๋ ๋๋ง๋ค ์์ ์ปดํฌ๋ํธ๋ ๋งค๋ฒ ๋ด๋ถ ๋์๋ค์ ๋ค์ ์คํํ๊ฒ ๋๋ค. ์ด ๋ useCallback
์ ์ฌ์ฉํด์ ํจ์์ ๋ถํ์ํ ์ฌ์คํ ์ด์๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๋จผ์ useCallback
์ ์ ์ฉํ์ง ์์ ์์ ์ด๋ค.
import React, { useState } from "react";
const set = new Set();
export default function App() {
const [count, setCount] = useState(0);
const increase = () => setCount(count + 1);
const printLog = () => console.log("re-execute");
set.add(printLog);
console.log(set);
return (
<div className="App">
<p>{count}</p>
<button onClick={increase}>Add</button>
<button onClick={printLog}>Print</button>
</div>
);
}
Add ๋ฒํผ์ ํด๋ฆญํด count
๊ฐ ์ฆ๊ฐํ๋ฉด App ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋ ๋๋ฉด์ ๋ด๋ถ์ increase
ํจ์์ printLog
ํจ์์ ์ ์ธ๊ณผ ํธ์ถ๋ ๋ฐ๋ณตํด์ ์คํ๋๋ค. ๋ฐ๋ผ์ Add ๋ฒํผ์ 3๋ฒ ํด๋ฆญํด์ count
๊ฐ 0์์ 2๋ก ์ฆ๊ฐํ์ ๋ ๋ก๊ทธ๋ฅผ ํ์ธํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค. ๋ฒํผ์ ํ ๋ฒ ํด๋ฆญํ ๋๋ง๋ค printLog
ํจ์๊ฐ ์๋กญ๊ฒ ์ ์ธ๋์ด์ Set์ ๋ํด์ง๊ณ ์๋ค. (StrictMode๋ก ์ธํด ๋ ๋ฒ์ฉ ์คํ๋๊ณ ์๋ ๊ฑด ๋ฌด์ ๋ฐ๋)
increase
ํจ์๋ ๋ณ๊ฒฝ๋๋ state์ธ count๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ์ฆ๊ฐํ๋ฉด ํจ๊ป ์ฌ์์ฑ ๋์ด์ ์คํ๋์ด์ผ ํ๋ ํจ์๊ฐ ๋ง๋ค. ํ์ง๋ง printLog
ํจ์์ ๊ฒฝ์ฐ ์ฒซ ์คํ ์ดํ ๋ด๋ถ์ ์ผ๋ก ๋์์ด ๋ณ๊ฒฝ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋งค๋ฒ ์๋กญ๊ฒ ์์ฑํ ํ์๊ฐ ์๋ค. ๋ฐ๋ก ์ด๋ด ๋ useCallback
์ ์ฌ์ฉํด ์ต์ ํ๋ฅผ ํด์ฃผ๋ ๊ฒ์ด๋ค!
import React, { useState, useCallback } from "react";
const set = new Set();
export default function App() {
const [count, setCount] = useState(0);
const increase = () => setCount(count + 1);
const printLog = useCallback(() => console.log('re-execute'), []); // 1๏ธโฃ
set.add(printLog); // 2๏ธโฃ
console.log(set);
return (
<div className="App">
<p>{count}</p>
<button onClick={increase}>Add</button>
<button onClick={printLog}>Print</button>
</div>
);
}
๊ทธ๋ผ ์ด์ count
๊ฐ ์ฆ๊ฐํด๋ ๏ธ1๏ธโฃ์์๋ printLog
ํจ์๊ฐ ์ฌ์ ์ธ ๋์ง ์๊ณ ์ฒ์ ์์ฑ๋๋ ํจ์๋ฅผ ์ฌ์ฌ์ฉํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ค๋ณต๋ ๊ฐ์ ํ์ฉํ์ง ์๋ Set์ ์๋ฃ๊ตฌ์กฐ ํน์ฑ์, ๋ฆฌ๋ ๋ ๋ ๋๋ง๋ค 2๏ธโฃ์์ printLog
ํจ์๋ฅผ set
์ ๋ํด๋ ํจ์์ ์ฐธ์กฐ๊ฐ์ด ์ฒ์๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ค๋ณต๋์ด ๋ํด์ง์ง ์๋๋ค.
์ฝ์์ ํ์ธํด๋ณด๋ฉด ๋ช ํํด์ง๋ค. App ์ปดํฌ๋ํธ๊ฐ ์ต์ด ๋ง์ดํธ ๋ ๋ ํจ์๊ฐ ์์ฑ๋์ด ๋ํด์ง ๋ค, ๊ทธ ์ดํ๋ถํฐ๋ ํจ์๋ฅผ ์ฌ์ฌ์ฉํ๊ณ ์์์ ํ์ธํ ์ ์๋ค.
'๐ป๐ > ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ๋๋ํ๊ฒ useMemo ์ฌ์ฉํ๊ธฐ (0) | 2022.10.09 |
---|---|
[JS] JavaScript์์ HTML ์์๋ฅผ ๋ง๋๋ 3๊ฐ์ง ๋ฐฉ๋ฒ (0) | 2022.10.02 |
[TS] ๋น ๊ฐ์ฒด์ ๋ํ ์ฌ๋ฐ๋ฅธ ํ์ (0) | 2022.09.03 |
[react-youtube] videoId์ ๋ฐ๋ผ ์์์ด ๋ณ๊ฒฝ๋์ง ์์ ๋ (0) | 2022.09.02 |
[JS] ํด๋ก์ (Closure) ํ์ฉํ๊ธฐ (0) | 2022.08.28 |