๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ๋ ๊ฑด React ์ฑ๋ฅ ์ต์ ํ์ ์ฃผ์ ๊ณผ์ ์ค ํ๋์ ๋๋ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ๋ ๋, ์์ ์ปดํฌ๋ํธ๊ฐ ์๋์น ์๊ฒ ๋ค์ ๋ ๋๋ง๋๋ ๋ฌธ์ ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์์ ์ฃผ๋ ๋ถ์ฒญ๊ฐ์ด์ฃ . ๊ฐ๋ น, ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๊ฐ์ด ๋ ๋๋ง๋ง๋ค ์๋ก ์์ฑ๋๋ ํจ์๊ฐ ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌ๋๋ฉด, React๋ ํด๋น ์ฐธ์กฐ๊ฐ ๋ณ๊ฒฝ๋์๋ค๊ณ ํ๋จํด ๋ถํ์ํ ์์ ์ ๋ฐ๋ณตํ๊ฒ ๋ฉ๋๋ค๐ท๐ปโโ๏ธ โ๏ธ
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๋๊ตฌ๊ฐ ๋ฐ๋ก useCallback
์
๋๋ค. useCallback
์ ํน์ ํจ์์ ์ฐธ์กฐ๋ฅผ ๊ณ ์ ํ์ฌ, ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ์๋ง ์๋ก์ด ํจ์๋ฅผ ์์ฑํ๋๋ก ์ ํํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ปดํฌ๋ํธ ๊ฐ props ์ ๋ฌ ๊ณผ์ ์์ ๋ถํ์ํ ๋ ๋๋ง์ ๋ฐฉ์งํ๊ณ , ์ฑ๋ฅ ์ต์ ํ๋ฅผ ๋ฌ์ฑํ ์ ์๋๋ก ๋์์ค๋๋ค.
ํ์ง๋ง useCallback
์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋๊ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์, ๋จ์ฉํ์ง ์๊ณ ์ ์ฌ์ ์์ ํ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ ์ ํ์ง ์์ ์ํฉ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ์คํ๋ ค ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด์ ์ฆ๊ฐ์ํค๋ ๋ถ๋ฉ๋์ด ๋์ด ๋์์ฌ ์ ์์ต๋๋ค ๐ช๐ฅ
์ด๋ฒ ํฌ์คํธ์์๋ useCallback
์ ์๋ฆฌ์ ๋ฉ๋ชจ์ด์ ์ด์
์ ํตํด React ์ ํ๋ฆฌ์ผ์ด์
์ ๋์ฑ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ณ ์ ํฉ๋๋ค.
useCallback
React์์ useCallback
์ ๋ฉ๋ชจ์ด์ ์ด์
(Memoization)
์ ํตํด ํจ์ ์ฐธ์กฐ๋ฅผ ๊ณ ์ ํ์ฌ ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํฉ๋๋ค. ๋ฉ๋ชจ์ด์ ์ด์
์ ๋์ผํ ์
๋ ฅ์ ๋ํด ์ด์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ , ๋์ผํ ์
๋ ฅ์ด ๋ค์ ์ ๊ณต๋ ๊ฒฝ์ฐ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฌํ์ฉํ๋ ์ต์ ํ ๊ธฐ๋ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณต์กํ ๊ณ์ฐ์ด ํฌํจ๋ ํจ์๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด์ผ ํ๋ ๊ฒฝ์ฐ, ๋ฉ๋ชจ์ด์ ์ด์
์ ๋ถํ์ํ ์ฐ์ฐ์ ์ค์์ผ๋ก์จ ์ฒ๋ฆฌ ์๊ฐ์ ๋จ์ถํฉ๋๋ค.
React์์ ๋ฉ๋ชจ์ด์ ์ด์
์ ํนํ ์ปดํฌ๋ํธ ๋ ๋๋ง๊ณผ ๊ด๋ จ๋ ํจ์ ์ฐธ์กฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก React๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ์๋ก์ด ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๊ณผ์ ์์ ์๋ก์ด ์
๋ ฅ์ด ์๋๋ผ๋ ๋์ผํ ํจ์๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์์ฑ๋๋ฉด ๋ฆฌ์์ค ๋ญ๋น๋ก ์ด์ด์ง ์ ์๋๋ฐ์, ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ญํ ์ ํ๋ ๊ฒ์ด ๋ฐ๋ก useCallback
์
๋๋ค.
useCallback
์ ์ด๋ป๊ฒ ๋์ํ ๊น?
useCallback
์ ํจ์ ์ฐธ์กฐ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํ์ฌ, ์์กด์ฑ ๋ฐฐ์ด์ ํฌํจ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์๋ ํ ๋์ผํ ์ฐธ์กฐ๋ฅผ ์ ์งํฉ๋๋ค. ์ด๋ฅผ ํตํด React๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋๋๋ผ๋ ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋ ํจ์์ ์ฐธ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์์์ ๊ฐ์งํ์ฌ ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํฉ๋๋ค.
const handleClick = useCallback(() => {
console.log("ํด๋ฆญ !");
}, []); // ์์กด์ฑ ๋ฐฐ์ด์ด ๋น์ด ์์ด ํจ์ ์ฐธ์กฐ๊ฐ ๊ณ ์ ๋จ
์ ์ฝ๋์์ handleClick
ํจ์๋ useCallback
์ ํตํด ๋ฉ๋ชจ์ด์ ์ด์
๋๋ฏ๋ก, ์์กด์ฑ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋์ง ์๋ ํ ๋์ผํ ์ฐธ์กฐ๋ฅผ ์ ์งํฉ๋๋ค. ์ด ํจ์๊ฐ ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌ๋๋ฉด, ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ ๋๋ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์์์ ๊ธฐ์กด ์ฐธ์กฐ๋ฅผ ์ ์งํ์ฌ ๋ ๋๋ง์ด ๋ถํ์ํ๊ฒ ๋ฐ์ํ๋ ๊ฒ์ ํผํ ์ ์์ต๋๋ค.
useCallback
์ ๋ฉ๋ชจ์ด์ ์ด์
์ด ์ค์ํ ์ด์
React๋ ์ปดํฌ๋ํธ์ ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด props์ ์ํ ๋ณ๊ฒฝ ์ฌ๋ถ๋ฅผ ์์ ๋น๊ต(===
์ฐ์ฐ์)๋ก ํ๋จํฉ๋๋ค. ์ด ๋น๊ต๋ ํจ์์ ๋ก์ง ์์ฒด๊ฐ ์๋ ํจ์๊ฐ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค. ๊ทธ๋ฌ๋ ํจ์๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ์๋ก ์์ฑ๋๋ฏ๋ก, ๋์ผํ ๋ก์ง์ ๊ฐ์ง ํจ์๋ผ๋ ์ฐธ์กฐ๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์ฐธ์กฐ ๋ณ๊ฒฝ์ React๊ฐ props๊ฐ ๋ณ๊ฒฝ๋์๋ค๊ณ ์ฐฉ๊ฐํ๊ฒ ๋ง๋ค์ด ๋ถํ์ํ ๋ ๋๋ง์ ๋ฐ์์ํค๋ ์ฃผ์ ์์ธ์ด ๋ฉ๋๋ค.
useCallback
์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ ๋์ผํ ํจ์ ์ฐธ์กฐ๋ฅผ ์์์ ์ ๋ฌํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ํนํ ๋ถ๋ชจ์ ์์ ๊ฐ์ ๋ณต์กํ props ์ ๋ฌ ๊ตฌ์กฐ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํฌํจ๋ ์ํฉ์์ ๊ทธ ํจ๊ณผ๊ฐ ๋๋๋ฌ์ง๋๋ค. ์์ ์ปดํฌ๋ํธ๋ ์ ๋ฌ๋ฐ์ props๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ ๋ ๋ ๋๋ง์ ์๋ตํ๊ธฐ ๋๋ฌธ์, ๋์ผํ ํจ์ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ฑ๋ฅ ์ต์ ํ์ ํต์ฌ์ด ๋ฉ๋๋ค.
useCallback
์ฌ์ฉ์ ์ ์์ ์ด๋ ๋ฏ useCallback
์ ํจ์ ์ฐธ์กฐ๋ฅผ ๊ณ ์ ํ์ฌ ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ๋ ๋๊ตฌ์
๋๋ค. ํ์ง๋ง ๋ฉ๋ชจ์ด์ ์ด์
์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ๊ฐ๋ก ์๋นํ๋ฉฐ, ์๋ชป๋ ์ฌ์ฉ์ ์ฑ๋ฅ ์ ํ๋ ์ฝ๋ ๋ณต์ก์ฑ ์ฆ๊ฐ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ด ๋๋ฌธ์ ์ผ๋ถ ๊ฐ๋ฐ์๋ค์ ์ฌ์ฉ์ ๊บผ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌ ์์ฃ ๐
๐ป ์ด๋ฒ ์ฑํฐ์์๋ useCallback
์ด ์ ์ ํ์ง ์์ ๊ฒฝ์ฐ์, ์ฌ์ฉ ์ ์ ์ํด์ผ ํ ์ ์ ๋ค๋ฃจ์ด๋ณด๊ณ ์ ํฉ๋๋ค.
๋จ์ํ ์ปดํฌ๋ํธ์์์ ๋ถํ์ํ ์ฌ์ฉ
๋ด๋ถ์ ์ผ๋ก๋ง ์ฌ์ฉ๋๋ ํจ์์ useCallback
์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ถ๋ถ ๋ถํ์ํฉ๋๋ค. ํจ์๊ฐ ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌ๋์ง ์๋๋ค๋ฉด, ๋ ๋๋ง ์๋ง๋ค ์๋ก ์์ฑ๋๋๋ผ๋ ์ฑ๋ฅ์ ์ค์ง์ ์ธ ์ํฅ์ ๋ฏธ์น์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
function Counter() {
const [count, setCount] = useState(0);
const increment = () => {
setCount((prev) => prev + 1);
};
return <button onClick={increment}>๋๋ฌ๋ณด์</button>;
}
์ ์ฝ๋์์ increment
ํจ์๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์๋ง ์ฌ์ฉ๋๋ฉฐ ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋์ง ์์ต๋๋ค. ์ด๋ฐ ์ํฉ์์ useCallback
์ ์ฌ์ฉํ๋ฉด ํจ์ ์ฐธ์กฐ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํ๋๋ผ ์คํ๋ ค ๋ฉ๋ชจ๋ฆฌ์ CPU ์์์ ๋ญ๋นํ๊ฒ ๋ฉ๋๋ค.
๋ ๋๋ง ๋น์ฉ์ด ๋ฎ์ ์ปดํฌ๋ํธ
์ปดํฌ๋ํธ์ ๋ ๋๋ง์ด ๋จ์ํ๋ค๋ฉด, useCallback
์ผ๋ก ํจ์ ์ฐธ์กฐ๋ฅผ ๊ณ ์ ํ๋๋ผ๋ ์ป๋ ์ด์ ์ด ๊ฑฐ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋จ์ํ ๋ฒํผ์ด๋ ํ
์คํธ ์์๋ฅผ ๋ ๋๋งํ๋ ์ปดํฌ๋ํธ๋ ๋ ๋๋ง ์์ฒด์ ๋น์ฉ์ด ๋งค์ฐ ๋ฎ๊ธฐ ๋๋ฌธ์, ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ฌ๋ ๋๋ง์ ๋ฐ๋ผ ๋ค์ ๋ ๋๋ง๋๋๋ผ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฑฐ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
function SimpleButton({ onClick }) {
return <button onClick={onClick}>Click me</button>;
}
์ด ๊ฒฝ์ฐ, useCallback
์ผ๋ก props๋ฅผ ๊ณ ์ ํ๋๋ผ๋ ๋ ๋๋ง ์ฑ๋ฅ์ ์ฐจ์ด๋ฅผ ์ฒด๊ฐํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ด๋ ๋ฏ ๋ ๋๋ง ๋น์ฉ์ด ๋ฎ์ ์ปดํฌ๋ํธ๋ ์ฝ๋์ ๋จ์์ฑ์ ์ ์งํ๋ ๊ฒ์ด ๋ ๋์ ์ ํ์ผ ์ ์์ต๋๋ค.
์์กด์ฑ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ
useCallback
์ ์ฌ์ฉํ ๋ ์์กด์ฑ ๋ฐฐ์ด์ ํจ์ ์ฐธ์กฐ์ ์
๋ฐ์ดํธ ์กฐ๊ฑด์ ์ ์ํฉ๋๋ค. ์ด ๋ฐฐ์ด์ด ์๋ชป ์ค์ ๋๋ฉด, ์ํ ๋ณ๊ฒฝ์ด ์ ๋๋ก ๋ฐ์๋์ง ์๊ฑฐ๋ ๋ถํ์ํ ์
๋ฐ์ดํธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์์กด์ฑ ๋ฐฐ์ด์ ๋น์๋๋ฉด ์ํ๋ props ๋ณ๊ฒฝ์ด ํจ์์ ๋ฐ์๋์ง ์์ ์์์น ๋ชปํ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
const handleClick = useCallback(() => {
console.log(count); // ์ด ์ฝ๋๋ ์ต์ ์ํ๋ฅผ ์ฐธ์กฐํ์ง ์์ ์ ์์
}, []); // ์์กด์ฑ ๋ฐฐ์ด์ count๋ฅผ ์ถ๊ฐํ์ง ์์
์ ์ฝ๋์์๋ count
๊ฐ ์์กด์ฑ ๋ฐฐ์ด์ ํฌํจ๋์ง ์์๊ธฐ ๋๋ฌธ์, handleClick
ํจ์๋ ๋ ๋๋ง ์์ ์ ์ด๊ธฐ count
๊ฐ์ ์ฐธ์กฐํฉ๋๋ค. ์ด๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ต์ ๊ฐ์ ๋ฐ์ํ์ง ์๋ ์ค๋ฅ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์์กด์ฑ ๋ฐฐ์ด์ ํ์ํ ๊ฐ์ ์ถ๊ฐํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ง๋ง, ์ถ๊ฐํ ๊ฐ์ด ๋ง์์ง๋ฉด ๋ฐฐ์ด ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง๊ณ ์ฝ๋ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค. ๋ฐ๋ผ์ useCallback
์ ์ฌ์ฉํ ๋๋ ์์กด์ฑ ๋ฐฐ์ด์ ์ค์ ์ด ํจ์์ ์๋์ ์ผ์นํ๋์ง ํญ์ ์ ์คํ ๊ฒํ ํด์ผ ํฉ๋๋ค.
๊ฐ๋ฒผ์ด ํจ์ ๋ก์ง
useCallback
์ ๋ณต์กํ๊ฑฐ๋ ๋ฐ๋ณต์ ์ธ ์ฐ์ฐ์ ์ํํ๋ ํจ์์์ ํจ๊ณผ์ ์ด์ง๋ง, ๋ก์ง์ด ๋จ์ํ ํจ์์์๋ ์คํ๋ ค ๋น์ฉ์ด ๋ ์ปค์ง ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฝ์ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋ ๊ฐ๋จํ ๊ฐ ๋ณ๊ฒฝ๋ง ์ํํ๋ ํจ์๋ผ๋ฉด ๋ฉ๋ชจ์ด์ ์ด์
์์ฒด๊ฐ ๋น์ฉ์ด ๋ ํด ์ ์์ต๋๋ค.
const logMessage = useCallback(() => {
console.log("๋ฐฉ๊ฐ๋ฐฉ๊ฐ");
}, []);
์ ์ฝ๋์์ logMessage
ํจ์๋ ๋จ์ํ ์ฝ์ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋ ์ญํ ์ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ, ๋ฉ๋ชจ์ด์ ์ด์
์ ์ํด ์ถ๊ฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ๊ณ ์์กด์ฑ์ ๊ด๋ฆฌํด์ผ ํ๋ ๋น์ฉ์ด ํจ์ ์์ฑ ๋น์ฉ๋ณด๋ค ๋ ํด ์ ์์ต๋๋ค. ํจ์ ์คํ ์๊ฐ์ด 1ms ์ดํ๋ก ์ธก์ ๋๊ฑฐ๋, ๋ฐ๋ณต ํธ์ถ์ด ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น์ง ์๋ ์ํฉ์์๋ useCallback
์ ์ฌ์ฉํ์ง ์๋ ํธ์ด ๋ ์ ์ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ ์ํฉ์์๋ ์ด๋ค ๋์์ด ์์๊น์?๐ก
์ฐ์ , ๋จ์ํ ํจ์๋ ๋ ๋๋ง ๋น์ฉ์ด ๋ฎ์ ์ปดํฌ๋ํธ์์๋ useCallback
์ ์์ ํ ์๋ตํ๊ณ React์ ๊ธฐ๋ณธ ๋ ๋๋ง ํ๋ฆ์ ๋งก๊ธฐ๋ ๊ฒ์ด ๊ฐ์ฅ ํจ์จ์ ์
๋๋ค. React๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋งค์ฐ ํจ์จ์ ์ธ ๋ ๋๋ง ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ฉฐ, ๋จ์ํ ์์
์์๋ ์ต์ ํ๋ณด๋ค ์ฝ๋ ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ์ฐ์ ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ํ, ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ๋ณต์กํ ์ํฉ์์๋ ํจ์ ์ฐธ์กฐ๋ฅผ ๊ณ ์ ํ๊ธฐ๋ณด๋ค๋ ํด๋น ๋ก์ง์ ๋ณ๋์ ํ
์ด๋ Context
๋ก ๋ถ๋ฆฌํ์ฌ ์์กด์ฑ์ ๋ช
์์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ๋ ์ข์ ์ ๊ทผ๋ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, React Context
๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ์ ๋ก์ง์ ์ ์ญ์ ์ผ๋ก ๊ณต์ ํ ์ ์์ด props ๋๋ฆด๋ง ์์ด๋ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
const CounterContext = React.createContext();
function CounterProvider({ children }) {
const [count, setCount] = useState(0);
const increment = () => setCount((prev) => prev + 1);
return (
<CounterContext.Provider value={{ count, increment }}>
{children}
</CounterContext.Provider>
);
}
function CounterButton() {
const { increment } = useContext(CounterContext);
return <button onClick={increment}>ํด๋ฆญ !</button>;
}
์ ์์ ์์ increment
๋ Context
๋ฅผ ํตํด ๊ด๋ฆฌ๋๋ฏ๋ก, ์์กด์ฑ ๋ฐฐ์ด ์ค์ ์ ๋ถ๋ด ์์ด ์ฐธ์กฐ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, useCallback
์ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๊ณ , ๋์์ด ๋ ๋์ ์ ํ์ผ ์ ์๋ ์ํฉ์์๋ ๊ณผ๊ฐํ ์๋ตํ๊ฑฐ๋ ๋ค๋ฅธ ์ต์ ํ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
useCallback
์ ์ฌ์ฉ ์ฌ๋ก์ด๋ ๋ฏ ์ฌ์ฉ์ ์ ์คํด์ผํ๋ useCallback
์ด์ง๋ง, ์ ์ ํ ๋งฅ๋ฝ์์ ํ์ฉํ๋ค๋ฉด useCallback
์ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ ์ต์ ํ์ ํฐ ๋์์ ์ค ์ ์์ต๋๋ค. ๊ฐ๋ น ์ด๋ฒคํธ ํธ๋ค๋ฌ, API ํธ์ถ, ์ํ ๊ด๋ฆฌ ๋ฑ ๋ค์ํ ์ํฉ์์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉ๋ ์ ์๋๋ฐ์. ์ด๋ฒ ์ฑํฐ์์๋ useCallback
์ ๋ฐํ์ผ๋ก ์ต์ ํ๋ฅผ ์ด๋ฃฐ ์ ์๋ ๋ช ๊ฐ์ง ๋ํ์ ์ธ ์ฌ๋ก๋ฅผ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ ์ต์ ํ
useCallback
์ ์์ ์ปดํฌ๋ํธ๊ฐ React.memo
๋ก ๊ฐ์ธ์ ธ ์๊ณ , ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์์๊ฒ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ๋ฌํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค. React.memo
๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋๋ props๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ, ์์ ์ปดํฌ๋ํธ์ ๋ ๋๋ง์ ๋ฐฉ์งํฉ๋๋ค. ํ์ง๋ง ํจ์๋ JavaScript์์ ์ฐธ์กฐํ ๋ฐ์ดํฐ์ด๋ฏ๋ก, ๋ ๋๋ง ์๋ง๋ค ์๋ก์ด ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ๋๋๋ฐ์. ์ด๋ ์์ ์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ ๋๋ง์ ์ ๋ฐํ ์ ์์ต๋๋ค.
function Parent() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
setCount((prev) => prev + 1);
}, []);
return (
<div>
<button onClick={() => setCount(count + 1)}>๋๋ฌ๋ณด์</button>
<Child onClick={handleClick} />
</div>
);
}
const Child = React.memo(({ onClick }) => {
return <button onClick={onClick}>๋๋ฌ๋ด์ </button>;
});
์ ์ฝ๋์์ handleClick
ํจ์๋ useCallback
์ ํตํด ์ฐธ์กฐ๊ฐ ๊ณ ์ ๋ฉ๋๋ค. ์ฆ, ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋ handleClick
์ ์ฐธ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฏ๋ก, React.memo
๋ก ๊ฐ์ธ์ง ์์ ์ปดํฌ๋ํธ๋ ๋ ๋๋ง๋์ง ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ถํ์ํ ์ฐ์ฐ์ ์ค์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
API ํธ์ถ ์ต์ ํ
useCallback
์ API ํธ์ถ์ ๊ด๋ฆฌํ๋ ํจ์์์๋ ํฐ ์ญํ ์ ํฉ๋๋ค. API ํธ์ถ ํจ์๊ฐ ์๋ก ์์ฑ๋๋ฉด, ํด๋น ํจ์๋ฅผ ์์กด์ฑ ๋ฐฐ์ด์ ํฌํจํ useEffect
๊ฐ ๋ถํ์ํ๊ฒ ์คํ๋ ์ ์์ต๋๋ค. ์ด๋ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์์ฒญํ๊ฑฐ๋, ๋คํธ์ํฌ ํธ๋ํฝ์ ์ฆ๊ฐ์ํฌ ์ํ์ ๋ถ๋ฌ์ต๋๋ค.
function Fetcher() {
const fetchData = useCallback(async (endpoint) => {
const response = await fetch(endpoint);
const data = await response.json();
console.log(data);
}, []);
useEffect(() => {
fetchData('/api/data');
}, [fetchData]);
return <div>๋ฐ์ดํฐ fetch ์ค ...</div>;
}
์ ์ฝ๋์์ fetchData
๋ useCallback
์ ํตํด ์ฐธ์กฐ๊ฐ ๊ณ ์ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด useEffect
์ ์์กด์ฑ ๋ฐฐ์ด์ด ๋ถํ์ํ ์
๋ฐ์ดํธ๋ก ์ธํด ๋ฐ๋ณต ์คํ๋์ง ์์ต๋๋ค. ํนํ, API ํธ์ถ์ด ๋น๋ฒํ๊ฑฐ๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ์ค์ํ ๊ฒฝ์ฐ, ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ถํ์ํ ํธ์ถ์ ๋ฐฉ์งํ๊ณ ์์ ์ฑ์ ํ๋ณดํ ์ ์์ต๋๋ค.
์ํ ๊ด๋ฆฌ์ Reducer ์ต์ ํ
์ํ ๊ด๋ฆฌ๋ฅผ ์ํ useReducer
ํ
์ ์ฌ์ฉํ ๋, dispatch
ํจ์์ ํจ๊ป ๋ณต์กํ ์ก์
์ ์ฒ๋ฆฌํด์ผ ํ ๊ฒฝ์ฐ useCallback
์ ์ํ ์
๋ฐ์ดํธ ๋ก์ง์ ์ฐธ์กฐ๋ฅผ ๊ณ ์ ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ํ ์
๋ฐ์ดํธ ํจ์๊ฐ ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋ ๋ ์ฐธ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๋ถํ์ํ ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
function Counter() {
const [state, dispatch] = useReducer((state, action) => {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
default:
return state;
}
}, { count: 0 });
const increment = useCallback(() => {
dispatch({ type: 'increment' });
}, [dispatch]);
return (
<div>
<p>Count: {state.count}</p>
<button onClick={increment}>๋๋ฌ๋ดฅ</button>
</div>
);
}
์ฌ๊ธฐ์ increment
ํจ์๋ useCallback
์ผ๋ก ๋ฉ๋ชจ์ด์ ์ด์
๋์ด dispatch
์ ํจ๊ป ์ฐธ์กฐ๊ฐ ๊ณ ์ ๋ฉ๋๋ค. ์ด๋ก ์ธํด, ์ํ ์
๋ฐ์ดํธ๋ฅผ ์ํํ๋ ์์ ์ปดํฌ๋ํธ์ increment
๋ฅผ props๋ก ์ ๋ฌํ๋๋ผ๋ ์ฐธ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉฐ, ์์ ์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
React ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฑ๋ฅ ์ต์ ํ๋ ๋จ์ํ ๋ ๋๋ง ์๋๋ฅผ ๋์ด๋ ๋ฌธ์ ๋ฅผ ๋์ด, ๋์์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. useCallback
์ ์ด๋ฌํ ์ต์ ํ์์ ํต์ฌ์ ์ธ ๋๊ตฌ๋ก, ์ฐธ์กฐ ๊ณ ์ ์ ํตํด ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ณ , ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ์์ ์ ์ผ๋ก ๋์ํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ๋์ต๋๋ค.
์ด๋ฌํ useCallback
์ ์ฌ์ฉํ๋ ๋ฐ์๋ ๋ถ๋ช
ํ ๊ธฐ์ค๊ณผ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. ์๋ชป๋ ์ฌ์ฉ์ ๋ฉ๋ชจ๋ฆฌ ์๋น์ ์ฝ๋ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํฌ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฐ๋์ ์์กด์ฑ ๋ฐฐ์ด๊ณผ ํจ์ ์ฐธ์กฐ์ ์ํฅ์ ์ ์คํ ๊ฒํ ํด์ผ ํฉ๋๋ค. ๋ํ, ์ฑ๋ฅ ์ต์ ํ์ ํจ๊ณผ๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ฆํ๋ ๊ณผ์ ๋ ํ์์ ์
๋๋ค.
ํ์ง๋ง ์ด๋ useCallback
์์ฒด์ ๋ฌธ์ ๊ฐ ์๋๋ผ, ์ฌ์ฉ์๊ฐ ์ด๋ฅผ ์ด๋ค ๋งฅ๋ฝ์์ ์ด๋ป๊ฒ ์ ์ฉํ๋๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๋ฌธ์ ์
๋๋ค. ์ ์ ํ ์ฌ์ฉ ์กฐ๊ฑด๊ณผ ๋ช
ํํ ๋ชฉ์ ์ด ์๋ค๋ฉด, useCallback
์ ์ฌ์ ํ ์ฑ๋ฅ ์ต์ ํ์ ํ๋ฅญํ ๋๊ตฌ๊ฐ ๋ ์ ์์ต๋๋ค ๐ ๏ธ
์ด๋ฒ ์ํฐํด์์๋ useCallback
์ ์๋ฆฌ์ ์ ์์ , ๊ทธ๋ฆฌ๊ณ ํจ๊ณผ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ณด์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ด ๋๊ตฌ๊ฐ ๊ฐ์ง ๊ฐ๋ฅ์ฑ๊ณผ ํ๊ณ๋ฅผ ๋ช
ํํ ์ดํดํ๊ณ , ์ ์ฌ์ ์์ ํ์ฉํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. useCallback
, ์ด์ ๋๋ฌด ๋ฏธ์ํ์ง ๋ง์ธ์ ~! โค๏ธโ๐ฉน
์ธ๋ํ ใทใท