[React] ์ฑ๋ฅ ์ต์ ํ useCallback์ ๋ํด์ ์์๋ณด๊ธฐ
๐ ๋ค์ด๊ฐ๋ฉฐ
์ด์ ๊ธ React.memo ๊ธ์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ํจ์๋ฅผ props๋ก ๋ฐ์ ๋ ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ useCallback์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
useCallback์ด๋ โ
๋จผ์ React์์ useCallback์ ๋ฆฌ๋ ๋๋ง ์ฌ์ด์ ํจ์ ์ ์๋ฅผ ์บ์ ํ ์ ์๊ฒ ํด์ฃผ๋ React ํ ์ ๋๋ค.
์ฆ, useCallback ํ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํฌ๋ํธ ์คํ ์ ๋ฐ์ ๊ฑธ์ณ ํจ์๋ฅผ ์ ์ฅํ ์ ์๊ฒ ํ๋ ํ ์ผ๋ก React์ ํจ์๋ฅผ ์บ์ฑํ๊ณ ๋งค ์คํ๋ง๋ค ํด๋น ํจ์๋ฅผ ์ฌ์์ฑ๋๋ ์ํฉ์ ๋ง์ ์ ์์ต๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
์บ์ฑํ๋ ค๋ ํจ์๋ฅผ useCallback์ผ๋ก ๋ํ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
// Button.js
const Button = ({ onClick }) => {
console.log('Button RUNNING');
return <button onClick={onClick}>ํด๋ฆญ</button>;
};
export default React.memo(Button);
// App.js
import React, { useState, useCallback } from 'react';
function App() {
const [toggleState, setToggleState] = useState(false);
console.log('APP RUNNING');
const toggleStateHandler = useCallback(() => {
setToggleState((prev) => !prev);
}, []);
return (
<div className="app">
<Button onClick={toggleStateHandler}>Toggle State</Button>
</div>
);
}
export default App;
ํจ์๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ๋ฉด useCallback์ ์บ์ฑ๋ ํจ์๋ฅผ ๋ฐํํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ์ด App ์ปดํฌ๋ํธ๊ฐ ๋ค์ ์คํ๋๋ฉด useCallback์ด React์ ์บ์ ๋ ํจ์๋ฅผ ์ฐพ์์ ๊ฐ์ ํจ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด useCallback๊ณผ React.memo ๋๋ถ์ ๋ฌด๋ถ๋ณํ ๋ฆฌ๋ ๋๋ง์ ๋ง์ ์ ์๊ฒ ๋ฉ๋๋ค.
์์กด์ฑ ๋ฐฐ์ด
useEffect์ ๋ง์ฐฌ๊ฐ์ง๋ก, useCallback์ ๋ ๋ฒ์งธ ์ธ์๊ฐ ํ์ํฉ๋๋ค.
๋ฐ๋ก useCallback ํธ์ถ์ ๋ํ ์์กด์ฑ ๋ฐฐ์ด์ ๋๋ค.
์ด ์์กด์ฑ ๋ฐฐ์ด์ useEffect์ ๊ฐ์ ๊ฒ์ ์๋ฏธํ๊ณ ํจ์๋ฅผ ๊ฐ์ผ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ๋ ๋ชจ๋ ๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, ๋น ๋ฐฐ์ด์ ๋ฃ๊ฒ ๋๋ฉด ์ฒซ ํธ์ถ ์ดํ ์ฌ ํธ์ถ ๋์ง ์์ต๋๋ค.
์ฌ์ฉํ๋ฉด ์ข์ ์ํฉ
- ํจ์ ์์ฒด๊ฐ ๋งค์ฐ ๋ณต์กํ๊ฑฐ๋, ๊ณ์ฐ์ ๋ํด์ ๋น์ฉ์ด ๋ง์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ
- ์์ ์ปดํฌ๋ํธ์ ํจ์๋ฅผ props๋ก ๋๊ธธ ๋, ๋ถํ์ํ ๋ ๋๋ง์ด ์ผ์ด๋๋ค๊ณ ํ๋จ๋๋ ๊ฒฝ์ฐ
useCallback๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์ฉ์ ๋ฐ๋ฅธ ๋น์ฉ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ํฉ์ ๋ง์ง ์๊ฒ useCallback์ ๋จ๋ฐํ๋ ๊ฒ์ ๋ ์ข์ง ์์ ์ฑ๋ฅ์ ๋ณด์ผ ์ ์์ต๋๋ค.