<DemoOutput show={false} />
App
μ»΄ν¬λνΈμμ DemoOutput
μ»΄ν¬λνΈλ‘ μ λ¬νλ show
λΆλΆμ λ€μ λΆλ¬μ€λ©΄, Reactλ show
μν(state) κ°μ΄ λ°λ λμλ§ DemoOutput
μ»΄ν¬λνΈλ₯Ό 리λ λλ§μ ν μ μλ€λ©΄ μ΄κ²μ΄ νΉμ ν μν©μ΄λΌκ³ λ§ν μ μμ κ²μ΄λ€. κ·Έλ λ€λ©΄, μ°λ¦¬λ μ΄λ»κ² React μ 'νΉμ ν μν©' μΌ λλ§ μμ μ»΄ν¬λνΈλ₯Ό 리λ λλ§ ν μ μλλ‘ μ§μν μ μμκΉ?
λ¨Όμ , propsκ° λ°λμλμ§ νμΈν μ»΄ν¬λνΈλ₯Ό μ§μ ν λ€
const DemoOutput = (props) => {
console.log("DemoOutput RUNNUNG");
return <MyParagraph>{props.show ? "This is New!" : ""}</MyParagraph>;
};
export default DemoOutput;
const DemoOutput = (props) => {
console.log("DemoOutput RUNNUNG");
return <MyParagraph>{props.show ? "This is New!" : ""}</MyParagraph>;
};
export default React.memo(DemoOutput);
μ΄λ κ² React.memo()
λ‘ warpμ ν΄μ£Όλ κ²μ ν¨μν μ»΄ν¬λνΈμμλ§ κ°λ₯νλ€. ν΄λμ€ κΈ°λ°μ μ»΄ν¬λνΈμ κ²½μ° μλνμ§ μλλ€.
React.memo()
λ ν¨μν μ»΄ν¬λνΈλ₯Ό μ΅μ ννλ€. μ΄ memo()
λ μ΄λ€ μν μ ν κΉ? React.memo()
λ μΈμλ‘ λ€μ΄κ° μ»΄ν¬λνΈμ μ΄λ€ propsκ° μ
λ ₯λλμ§λ₯Ό νμΈνκ³ , μ
λ ₯λλ λͺ¨λ propsμ μλ‘μ΄ κ°μ νμΈν λ€ μ΄λ₯Ό κΈ°μ‘΄μ props κ°κ³Ό λΉκ΅νλλ‘ Reactμ μ λ¬νλ μν μ νλ€. κ·Έλ¦¬κ³ propsμ κ°μ΄ λ°κΎΈλ κ²½μ°μλ§ μ»΄ν¬λνΈλ₯Ό μ¬μ€ν λ° μ¬νκ° νλ€.
μ¦, λΆλͺ¨ μ»΄ν¬λνΈκ° λ³κ²½λμμ§λ§ React.memo()
λ‘ κ°μΌ μ»΄ν¬λνΈμ propsκ° λ³νμ§ μμλ€λ©΄ μ΄ μ»΄ν¬λνΈμ μ¬μ€νμ 건λλ°κ² λλ κ²μ΄λ€.
μ μ₯νκ³ μ½μμ νμΈν΄λ³΄μ. μ΅μ΄μ μ΄ν리μΌμ΄μ
μ΄ λ λλ§λλ©΄, DemoOutput
μ»΄ν¬λνΈμμ μΆλ ₯νλ ν
μ€νΈμΈ "DemoOutput RUNNUNG" λ ν¨κ» μΆλ ₯λλ€. νμ§λ§ μ½μμ μ΄κΈ°νν λ€ λ²νΌμ λλ₯΄λ©΄ "APP RUNNING" μ "Button RUNNING" λ μΆλ ₯λμ§λ§ "DemoOutput RUNNUNG"λ μΆλ ₯λμ§ μλ κ²μ λ³Ό μ μλ€. MyParagraph
μ»΄ν¬λνΈλ React.memo()
λ‘ κ°μΌ DemoOutput
μ»΄ν¬λνΈμ μμ μ»΄ν¬λνΈμ΄λ―λ‘ μ΄ λν μΆλ ₯λμ§ μλλ€.
μ΄λ κ², λΆνμν μ¬λ λλ§μ νΌνκΈ° μν΄ React.memo()
λ₯Ό μ¬μ©νμ¬ μ΅μ νλ₯Ό μ§ννλ€. κ·Έλ¦¬κ³ μ°λ¦¬λ μ¬κΈ°μ μλ‘μ΄ μ§λ¬Έμ λ§μ£ΌμΉκ² λλ€. μ΄λ κ² λ λλ§ μ΅μ νκ° κ°λ₯νλ€λ©΄, μ λͺ¨λ μ»΄ν¬λνΈμ μ μ©νμ§ μλ κ±ΈκΉ?
React.memo()
λ μ΄ν리μΌμ΄μ
μ λ³κ²½μ΄ μΌμ΄λ λλ§λ€ λ°μνλ€. κ·Έλ¦¬κ³ App
μ»΄ν¬λνΈκ° λ λλ§μ΄ λ λλ§λ€ React.memo()
λ‘ κ°μΌ μ»΄ν¬λνΈλ‘ μ΄λνμ¬, κΈ°μ‘΄μ props κ°κ³Ό μλ‘μ΄ props κ°μ λΉκ΅νλ€. κ·Έλ¬λ©΄ Reactλ μ¬κΈ°μ λ κ°μ§ μμ
μ΄ νμνλ€. λ¨Όμ , κΈ°μ‘΄μ props κ°μ μ μ₯ν 곡κ°μ΄ νμνκ³ λΉκ΅νλ μμ
μ΄ μ²« λ²μ§Έμ΄κ³ λλ²μ§Έλ‘ μ΄ κ°κ°μ μμ
μμ κ°λ³μ μΈ μ±λ₯ λΉμ©μ΄ νμνλ€. λ°λΌμ μ΄ μ±λ₯ ν¨μ¨μ μ΄λ€ μ»΄ν¬λνΈλ₯Ό μ΅μ ννλλμ λ°λΌ λ¬λΌμ§λ€.React.memo()
λ‘ μ΄λ£¨μ΄μ§λ μ±λ₯ λΉμ©μ κ΅νμ°λ¦¬κ° React.memo()
λ₯Ό μ¬μ©νμ¬ νΉμ μ»΄ν¬λνΈλ₯Ό κ°μΌλ€λ©΄, λ§€λ² μ»΄ν¬λνΈλ₯Ό 리λ λλ§νλ λ°μ νμν μ±λ₯ λΉμ©κ³Ό, React.memo()
λ‘ κ°μΌ νΉμ μ»΄ν¬λνΈμ propsλ₯Ό λΉκ΅νλ μ±λ₯ λΉμ©μ μλ‘ λ§λ°κΎΈλ κ²κ³Ό λμΌνλ€.
κ·Έλ¦¬κ³ μ΄λ° λΉμ©μ νΉμ μ»΄ν¬λνΈμ νμν propsμ κ°―μμ ν΄λΉ μ»΄ν¬λνΈμ 볡μ‘λ, κ·Έλ¦¬κ³ ν΄λΉ μ»΄ν¬λνΈκ° κ°μ§κ³ μλ μμ μ»΄ν¬λνΈμ μ«μμ λ°λΌ λ¬λΌμ§λ κ²μ΄λ―λ‘ λ μ€ μ΄λ μͺ½μ λΉμ©μ΄ νμ λλ€κ³ λ§νλ κ²μ λΆκ°λ₯νλ€. λ¬Όλ‘ , μμ μ»΄ν¬λνΈκ° λ§μμ μ»΄ν¬λνΈ νΈλ¦¬κ° ν¬λ€λ©΄ μ΄ React.memo()
λ λ§€μ° μ μ©νκ² μ°μΌ μ μμ§λ§ λ§μ΄λ€. λν μ»΄ν¬λνΈ νΈλ¦¬μ μμμ μμΉν΄ μλ€λ©΄ μ 체 μ»΄ν¬λνΈ νΈλ¦¬μ λν λΆνμν μ¬λ λλ§μ λ§μ μ μλ€.
const DemoOutput = (props) => {
console.log("DemoOutput RUNNUNG");
return <MyParagraph>{props.show ? "This is New!" : ""}</MyParagraph>;
};
export default React.memo(DemoOutput);
DemoOutput
μ»΄ν¬λνΈλ₯Ό React.memo()
λ‘ κ°μΈλ©΄μ μλμ μΌλ‘ DemoOutput
μ»΄ν¬λνΈμ μμ μ»΄ν¬λνΈμΈ MyParagraph
μ»΄ν¬λνΈμ 리λ λλ§λ νΌν μ μλ κ²μ²λΌ λ§μ΄λ€.React.memo()
κ° νμνμ§ μλ κ²½μ°μμ μ¬λ‘μλ λ°λλ‘ λΆλͺ¨ μ»΄ν¬λνΈλ₯Ό 맀 λ² μ¬νκ°ν λλ§λ€ μ»΄ν¬λνΈμ λ³νκ° μκ±°λ propsμ κ°μ΄ λ³νν μ μλ κ°λ₯μ±μ΄ λμ μ»΄ν¬λνΈλΌλ©΄ React.memo()
λ©μλλ ν¬κ² μλ―Έλ₯Ό κ°μ§ λͺ»ν κ²μ΄λ€. μλνλ©΄ React.memo()
λ©μλλ₯Ό μ¬μ©νλλΌλ, ν΄λΉ μ»΄ν¬λνΈμ μ¬λ λλ§μ΄ μ΄λ»κ²λ μ΄λ£¨μ΄μ§κΈ° λλ¬Έμ΄λ€. λ¬Όλ‘ props κ°μ μΆκ°μ μΈ λΉκ΅μ λν λΉμ©μ μλ μ μμμ§λ λͺ¨λ₯΄κ² μ§λ§ μ΄μ¨λ μ€λ²ν€λλ‘ λ°μνλ λΉμ©λ κ³ λ €ν΄λ³Έλ€λ©΄ κ΅³μ΄ React.memo()
λ₯Ό μ¬μ©ν νμλ μμ κ²μ΄λ€.
React.memo()
κ° νμνμ§ μλ κ²½μ°λ λ μλ€. λ§€μ° μμ μ΄ν리μΌμ΄μ
, νΉμ λ§€μ° μμ μ»΄ν¬λνΈ νΈλ¦¬μ κ²½μ°μλ κ΅³μ΄ React.memo()
λ‘ νΈλ¦¬μ κ°μ§λ₯Ό μλΌλ΄λ κ²μ΄ ν¬κ² μλ―Έκ° μκΈ° λλ¬Έμ΄λ€. μ΄λ λ―, λͺ¨λ μ»΄ν¬λνΈλ₯Ό React.memo()
λ‘ λ©νν νμλ μλ€. κ²½μ°μ λ°λΌμ μ»΄ν¬λνΈ νΈλ¦¬μμ μλΌλΌ μ μλ μμμ μ£Όμ μ»΄ν¬λνΈλ₯Ό μ νν΄μ μ¬μ©νλ κ² μ’μ κ²μ΄λ€. μ΄λ κ² μ ν©ν μ©λλ‘ React.memo()
λ₯Ό κ³¨λΌ μ¬μ©νλ€λ©΄, λͺ¨λ μ»΄ν¬λνΈλ₯Ό React.memo()
λ‘ κ°μΈλ κ²λ³΄λ€λ μ΄μ¨λ ν¨μ¬ ν¨μ¨μ μΌ κ²μ΄λ€. (μ€λ²ν€λλ λ°©μ§ν μ μλ€.)
React.memo()
λ₯Ό μ μ©νλ κ² μ’μκΉ?Button
μ»΄ν¬λνΈλ νΈλ¦¬κ±° μ»΄ν¬λνΈμ΄κΈ° λλ¬Έμ React.memo()
λ₯Ό μ μ©νλ κ² μ³μμ§ μλμ§μ λν΄ λ
Όν μ μμμ§λ λͺ¨λ₯Έλ€.const Button = (props) => {
console.log("Button RUNNING");
return (
<button
type={props.type || "button"}
className={`${classes.button} ${props.className}`}
onClick={props.onClick}
disabled={props.disabled}
>
{props.children}
</button>
);
};
Button
μ»΄ν¬λνΈλ λ€μ λ³κ²½λ μΌμ΄ μλ€λ κ²μ μκ³ μμΌλ―λ‘ λ§€λ² λ¦¬λ λλ§ λλ κ²μ λΆνμνλ€λ μ¬μ€μ λΆλͺ
νλ€. Button
μ»΄ν¬λνΈλ₯Ό React.memo()
λ‘ κ°μΈλ³΄μ.const Button = (props) => {
console.log("Button RUNNING");
return (
<button
type={props.type || "button"}
className={`${classes.button} ${props.className}`}
onClick={props.onClick}
disabled={props.disabled}
>
{props.children}
</button>
);
};
export default React.memo(Button);
Button
μ»΄ν¬λνΈλ₯Ό React.memo()
λ‘ κ°μκ³ , λμ΄μ 리λ λλ§μ΄ λμ§ μλλ‘ μμ
νλ€. νμ§λ§ μ μ΄λ° μΌμ΄ λ°μνλ κ±ΈκΉ?const Button = (props) => {
console.log("Button RUNNING");
return (
<button
type={props.type || "button"}
className={`${classes.button} ${props.className}`}
onClick={props.onClick}
disabled={props.disabled}
>
{props.children}
</button>
);
};
export default React.memo(Button);
Button
μ»΄ν¬λνΈλ₯Ό νμΈν΄λ³΄λ©΄ μμλ onClick
μ΄λΌλ propsμ children
μ΄λΌλ props λ₯Ό κ°μ§κ³ μλ€. νμ§λ§ μ΄ λ λͺ¨λ κ°μ λΆλ³ κ°μ΄λ€. children
μΌλ‘ λ°λ ν
μ€νΈλ λμΌνκ³ , onClick
μ΄λΌλ ν¨μλ λμΌνλ€. κ·Έλ¦¬κ³ μ΄κ²μ Reactμμ ννκ² λ°μνλ μ€λ₯ μ€ νλμ΄λ€.function App() {
const [showParagraph, setShowParagraph] = useState(false);
console.log("APP RUNNING");
const toggleParagraphHandler = () => {
setShowParagraph((prevParagraph) => !prevParagraph);
};
return (
<div className="app">
<h1>Hi there!</h1>
<DemoOutput show={false} />
<Button onClick={toggleParagraphHandler}>Toggle Paragraph!</Button>
</div>
);
}
App
μ»΄ν¬λνΈλ₯Ό 보면, μ΄μ¨κ±΄ ν¨μμ΄κΈ° λλ¬Έμ λ§μΉ μΌλ°μ μΈ μλ°μ€ν¬λ¦½νΈ ν¨μμ²λΌ μ¬μ€νλλ κ±Έ μ μ μλ€. μλνλ©΄ κ²°κ΅ μ΄κ²μ μν(state)κ° λ°λλ©΄ μΌλ°μ μΈ μλ°μ€ν¬λ¦½νΈ ν¨μμ κ°κΈ° λλ¬Έμ΄λ€. μ¬κΈ°μ μ‘°κΈ λ€λ₯Έ μ μ App
μ»΄ν¬λνΈ ν¨μλ μ¬μ©μκ° μλ Reactμ μν΄ νΈμΆλλ€λ κ² λΏμ΄λ€. κ·Έλ μ§λ§ μ¬μ ν μΌλ° ν¨μμ²λΌ μ€νλλλ° μ΄ λ§μΈ μ¦μ¨, μ½λκ° λ€μ μ€νλλ€λ μλ―Έμ΄λ€. μ΄κ²μ λ¬΄μ¨ λ»μΌκΉ?const toggleParagraphHandler = () => {
setShowParagraph((prevParagraph) => !prevParagraph);
};
Button
μ onClick
μ΄λΌλ propsλ‘ μ λ¬λλ μ΄ ν¨μλ λ§€λ² μ¬μμ±λλ€. μ΄λ App
ν¨μμ λͺ¨λ λ λλ§ λλ λͺ¨λ μ€ν μ¬μ΄ν΄μμ λ§€λ² μλ‘μ΄ ν¨μλΌλ λ»μ΄λ€. μ°λ¦¬κ° μ΄ν리μΌμ΄μ
μ΄ λ λλ§ λ λλ§λ€ λ§€λ² μλ‘ λ§λ€μ΄μ§λ μμμ΄κ³ , μ¬μ¬μ©λμ§ μλλ€λ μλ―Έμ΄λ€.App
μ»΄ν¬λνΈμμ μ€νλλ ν¨μλ 리λ λλ§ λ λλ§λ€ λͺ¨λ μλ‘ λ§λ€μ΄μ§λ€App
μ»΄ν¬λνΈκ° 리λ λλ§ λ λλ§λ€ App
μ»΄ν¬λνΈ λ΄λΆμ μλ λͺ¨λ μ½λ μμ λ€μ μ€νλλ―λ‘ λΉμ°νκ²λ μλ‘μ΄ ν¨μμ μμλ€μ΄ λ§λ€μ΄μ§λ€. toggleParagraphHandler
ν¨μ μμ μ΄μ μ λ λλ§ λμλ toggleParagraphHandler
ν¨μκ° μλλ©°, κ·Έμ κ°μ κΈ°λ₯μ νλ μλ‘μ΄ toggleParagraphHandler
ν¨μμΌ λΏμ΄λ€. μ΄μ²λΌ, App
μ»΄ν¬λνΈ ν¨μκ° μ€νλ λλ§λ€ λ§λ€μ΄μ§λ μμμ ν¨μλ λͺ¨λ μλ‘μ΄ μμμ ν¨μμ΄λ€.<DemoOutput show={false} />
DemoOutput
μ»΄ν¬λνΈμ false
λ₯Ό props λ‘ μ λ¬ν λμλ μμ μ€λͺ
ν μμλ€μ΄ λͺ¨λ ν΄λΉλλ€. κ·Έλ μ§λ§ Button
μ»΄ν¬λνΈμ²λΌ React.memo()
λ‘ κ°μΌ DemoOutput
μ»΄ν¬λνΈλ 리λ λλ§ λμ§ μλλ€. App
μ»΄ν¬λνΈ ν¨μκ° λ¦¬λ λλ§ λ λλ§λ€ false
κ° μμ λ§€λ² μλ‘ λ§λ€μ΄μ§λλ°λ λΆκ΅¬νκ³ λ§μ΄λ€. κ·Έλ λ€λ©΄, μ DemoOutput
μ»΄ν¬λνΈμ κ°μ κ²½μ°μ²λΌ 보μ΄λ Button
μ»΄ν¬λνΈλ§ 리λ λλ§ λλ κ²μΌκΉ? false
propsμλ λκ° λ€λ₯Έ κ²μΌκΉ?DemoOutput
μ»΄ν¬λνΈμ Button
μ»΄ν¬λνΈμμ μ°¨μ΄μ DemoOutput
μ props λ‘ μ λ¬νλ false
λ Boolean κ°μ΄κ³ , λ¬Έμμ΄ λλ μ«μμ΄ κ°μ μλ°μ€ν¬λ¦½νΈμ μμκ°μΌλ‘ μ·¨κΈλλ€. React.memo()
λ propsμ κ°μ νμΈνκ³ props.show
λ₯Ό μ
λ°μ΄νΈ μ΄μ μ props.show
μ λΉκ΅νλ€.<DemoOutput show={false} />
props.show
μ μ¬μ€νλμ΄ μμ±λ μ΅μ κ° props.show
λ₯Ό λΉκ΅νλλ° μ΄ μμ
μ μΌλ° λΉκ΅ μ°μ°μλ₯Ό ν΅ν΄ μ΄λ£¨μ΄μ§λ€. κ·Έλ¦¬κ³ μ΄ μΌλ°μ μΈ λΉκ΅ μ°μ°μλ λΉκ΅ κ°μ΄ μμκ° λμμλ§ μ¬λ°λ₯΄κ² λΉκ΅-κ³μ°ν μ μκ² λλ€.React.memo()
λ μΌλ° λΉκ΅ μ°μ°μλ₯Ό ν΅ν΄ λΉκ΅ κ³μ°νλ€false === false;
// true
"hi" === "hi";
// true
[1, 2] === [1, 2];
// false
<Button onClick={toggleParagraphHandler}>Toggle Paragraph!</Button>
Button
μ props λ‘ λ겨주λ ν¨μλ₯Ό 보μ. μ§μ μ κ±°λ‘ νλ―μ΄ μλ°μ€ν¬λ¦½νΈμμ ν¨μλ νλμ κ°μ²΄μ΄λ©° μ°Έμ‘° κ°μ λΆκ³Όνλ€. App
μ»΄ν¬λνΈ ν¨μκ° μ¬μ€νλ λλ§λ€ ν¨μ λ΄λΆμ μλ μ½λλ€μ μ¬μ°½μ‘° λλ©°, μ΄ toggleParagraphHandler
ν¨μ μμ μλ‘ λ§λ€μ΄μ§λ€. κ·Έλ¦¬κ³ React.memo()
λ‘ κ°μΌ Button
μ»΄ν¬λνΈλ μ΄μ μ μμ±λ props.onClick
κ³Ό μλ‘κ² μμ λ μ΅μ κ°μΈ props.onClick
κ³Ό λΉκ΅νκ² λλ€. κ·Έλ¦¬κ³ λΉμ°νκ²λ μ΄ λκ°μ λΉκ΅κ΅° κ°λ€μ κ°μ λ΄μ©μ κ°μ§κ³ μλ€κ³ νλλΌλ μλ°μ€ν¬λ¦½νΈ λ΄μμλ λμΌν κ°μ΄ μλλΌκ³ μ·¨κΈν κ²μ΄λ€. (μ°Έμ‘° κ°μ λΉκ΅νλ κ²μ΄κΈ° λλ¬Έμ΄λ€.)React.memo()
κ° νλ μΌμ props μ κ°μ νμΈνκ³ , μ΄μ μ props μ κ°μ₯ μ΅κ·Όμ props μ€λ
μ·μ λΉκ΅νλ€. κ·Έλ¦¬κ³ μ΄ λΉκ΅ μμ
μ μΌλ°μ μΈ λΉκ΅ μ°μ°μλ₯Ό ν΅ν΄ μ΄λ€μ§λ€. μΌλ°μ μΈ μμ κ°μ΄λΌλ©΄ μ΄λ° μΌλ°μ μΈ λΉκ΅ μ°μ°μλ₯Ό ν΅ν΄μ λΉκ΅κ° κ°λ₯ν κ²μ΄λ€. νμ§λ§ λ°°μ΄μ΄λ κ°μ²΄, ν¨μλ₯Ό λΉκ΅νλ€λ©΄ λ§μ΄ λ¬λΌμ§λ€. λ°°μ΄μ΄λ κ°μ²΄, ν¨μλ μ°Έμ‘° κ°μ΄κΈ° λλ¬Έμ μΌλ°μ μΈ λΉκ΅ μ°μ°μλ₯Ό ν΅ν΄μλ λμΌν κ°μΌλ‘ μ·¨κΈνμ§ μκΈ° λλ¬Έμ΄λ€.React.memo()
μ μλλ°©μ μ¦, μλ°μ€ν¬λ¦½νΈ λ΄μμ λΉκ΅μ°μ°μλ₯Ό ν΅ν΄ μ΄λ£¨μ΄μ§λ μλλ°©μμ μ΄ν΄νκ³ μ¬μ©νλ κ²μ λ¬΄μ² μ€μν μΌμ΄λ€. κ·Έλ λ€λ©΄, React.memo()
λ propsλ₯Ό ν΅ν κ°μ²΄λ λ°°μ΄ λλ ν¨μλ₯Ό κ°μ Έμ€λ μ»΄ν¬λνΈμλ μ¬μ©ν μ μλ κ±ΈκΉ? λ€ννλ ν΄κ²° λ°©λ²μ μ‘΄μ¬νλ€.React.memo()
λ‘ propsλ‘ μ λ¬νλ κ°μ²΄λ λ°°μ΄ νΉμ ν¨μμλ μλνκ²λ λ§λ€ μ μλ€. κ°μ²΄λ₯Ό μμ±νκ³ μ μ₯νλ λ°©μμ μ‘°κΈ λ³κ²½ν΄μ€λ€λ©΄ λ§μ΄λ€. κ·Έλ¦¬κ³ μ΄ μμ
μ React μμ μ 곡νλ hook μ ν΅ν΄μ κ°λ₯νλ€. λ°λ‘ useCallback()
μ΄λΌλ hook μ΄λ€.useCallback
μ¬μ©νκΈ°useCallback
μ κΈ°λ³Έμ μΌλ‘ μ»΄ν¬λνΈ μ€ν μ λ°μ κ±Έμ³ ν¨μλ₯Ό μ μ₯ν μ μλλ‘ νλ hook μΌλ‘μ¨ useCallback
λ₯Ό ν΅ν΄μ κ°μΌ ν¨μλ₯Ό μ μ₯νμ¬ μ΄ ν¨μκ° μ΄ν리μΌμ΄μ
μ΄ λ§€λ² μ€νλ λλ§λ€ μ¬μμ±ν νμκ° μλ€λ κ²μ Reactμ μ리λ μν μ νλ€. useCallback
μ μ¬μ©νμ¬ νΉμ ν¨μλ₯Ό κ°μΌλ€λ©΄, μ΄ ν¨μ κ°μ²΄κ° λ©λͺ¨λ¦¬μ λμΌν μμΉμ μ μ₯λλ―λ‘ μ΄λ₯Ό ν΅ν΄ λΉκ΅ μμ
μ ν μ μκ² λλ€. ꡬ체μ μΌλ‘ μλ₯Ό λ€μ΄λ³΄μ.let obj1 = {};
let obj2 = {};
let obj1 = {};
let obj2 = {};
obj1 === obj2;
// false
obj1
κ³Ό obj2
κ° κ°μ λ©λͺ¨λ¦¬ μμ κ°μ μμΉλ₯Ό κ°λ¦¬ν€κ³ μλ€λ©΄ μ΄λ¨κΉ?let obj1 = {};
let obj2 = {};
obj1 = obj2;
obj1
μ obj2
λ₯Ό ν λΉν΄λ³΄μ.let obj1 = {};
let obj2 = {};
obj1 = obj2;
obj1 === obj2;
// true
obj1
μ obj2
λ₯Ό κ°μ κ°μ²΄λ‘ κ°μ£Όνκ² λλ€. μ΄λ useCallback
μ΄ νλ μΌκ³Ό μ ννκ² λμΌν μν μ νλ€.const toggleParagraphHandler = () => {
setShowParagraph((prevParagraph) => !prevParagraph);
};
useCallback
μ μ¬μ©λ²λ λ§€μ° κ°λ¨νλ€.const toggleParagraphHandler = useCallback(() => {
setShowParagraph((prevParagraph) => !prevParagraph);
});
useCallback
μΌλ‘ μ μ₯νλ €λ ν¨μλ₯Ό λννκΈ°λ§ νλ©΄ λλ€. useCallback
μ ν΅ν΄μ μ΄λ€ ν¨μλ₯Ό 첫 λ²μ§Έ μΈμλ‘ μ λ¬νλ©΄, useCallback
λ μ΄ μ μ₯λ ν¨μλ₯Ό λ°ννλ€. μ΄λ° μλ κ³Όμ μ ν΅ν΄μ App
μ»΄ν¬λνΈ ν¨μκ° μ¬μ€νλ λλ§λ€ useCallback
μ΄ React μ λ΄λΆ λ©λͺ¨λ¦¬μ μ μ₯λ ν¨μλ₯Ό μ°Ύμμ μ¬μ¬μ©νλ κ²μ΄λ€. λ°λΌμ, μ΄λ€ ν¨μκ° μ λ λ³κ²½λμ΄μλ μλλ€λ©΄, μ΄ useCallback
hook μ μ¬μ©ν΄μ κ·Έ ν¨μλ₯Ό React λ΄λΆμ λ©λͺ¨λ¦¬μ μ μ₯νλ©΄ λλ€.const toggleParagraphHandler = useCallback(() => {
setShowParagraph((prevParagraph) => !prevParagraph);
}, []);
useCallback
μ λκ°μ μΈμκ° νμνλ° μ²« λ²μ§Έ μΈμλ μμ κ±°λ‘ ν ν¨μμ΄κ³ , λ λ²μ§Έ μΈμλ μμ‘΄μ± λ°°μ΄μ΄λ€. μμ‘΄μ± λ°°μ΄μ useEffect
hook μμ λ§νλ μμ‘΄μ± λ°°μ΄κ³Ό κ°μ μλ―Έλ‘ μ°μΈλ€.useCallback
νΈμΆμ λν μμ‘΄μ± λ°°μ΄μ 첫 λ²μ§Έ μΈμμΈ ν¨μλ₯Ό κ°μΌ μ»΄ν¬λνΈλ‘λΆν° μ λ¬λ°λ λͺ¨λ κ²μ μ¬μ©ν μ μλ€. (useEffect
μ²λΌ) μ¦, μν(state)λ props, 컨ν
μ€νΈ κ°μ κ² λ§μ΄λ€.const toggleParagraphHandler = useCallback(() => {
setShowParagraph((prevParagraph) => !prevParagraph);
}, []);
toggleParagraphHandler
ν¨μμμλ μ
λ°μ΄νΈ ν¨μ setShowParagraph
λ₯Ό λͺ
μνλ©΄ λλ€. λ¬Όλ‘ setShowParagraph
μ μμ‘΄μ± λ°°μ΄ μμ μΆκ°ν μλ μμ§λ§ Reactκ° useCallback
μ ν΅ν΄ ν΄λΉ ν¨μλ μ λ λ³νμ§ μμΌλ©°, μ΄μ κ³Ό λμΌν ν¨μ κ°μ²΄μμ 보μ₯νκ³ μκΈ° λλ¬Έμ κ΅³μ΄ μΆκ°ν νμκ° μμ΄μ μλ΅νμλ€. λ€λ§ μ΄λ° μ½λλ setShowParagraph
μ μ λ¬λ ν¨μλΌλ κ±Έ κΈ°μ΅λ§ νλ©΄ λ κ²μ΄λ€. κΈ°μ΅νλ€λ κ²μ μ¦, μ΄ λͺ¨λκ° μ½λ°± ν¨μμ ν¬ν¨λμ΄ μλ€λ λ»μ΄λ€.toggleParagraphHandler
ν¨μλ₯Ό κ°μΌ useCallback
μ μμ‘΄μ± λ°°μ΄μ Reactμ toggleParagraphHandler
ν¨μλ₯Ό μ μ₯νλ €κ³ νλ μ΄ μ½λ°± ν¨μλ μ λ λ³κ²½λμ§ μμ κ²μ΄λΌκ³ Reactμ μλ €μ£Όλ μν μ νλ€. λ°λΌμ App
μ»΄ν¬λνΈκ° λ€μ 리λ λλ§ λμ΄λ νμ κ°μ ν¨μ κ°μ²΄κ° μ¬μ©λκ²λ νλ κ²μ΄λ€.useCallback
μ ν΅ν΄ μΌλ° λΉκ΅ μ°μ°μλ₯Ό ν΅ν΄ λΉκ΅κ° κ°λ₯νλλ‘ μ λ¬νκΈ° λλ¬Έμ React.memo()
μ΄ μν μ μ λλ‘ μνν μ μλλ‘ νκΈ° λλ¬Έμ΄λ€. μ¦, useCallback
λλΆμ toggleParagraphHandler
κ°μ²΄κ° Reactμ λ©λͺ¨λ¦¬ μμμ νμ κ°μ κ°μ²΄μμ 보μ₯νκ³ μλ κ²μ΄λ€.useCallback
μ μ΄μ©νλ©΄ ν¨μλ₯Ό μ μ₯νκ³ μ΄λ₯Ό μ¬μ¬μ©ν μ μκ² λλ€.const toggleParagraphHandler = useCallback(() => {
setShowParagraph((prevParagraph) => !prevParagraph);
}, []);
useCallback
μΌλ‘ μ μ₯ν ν¨μμ μμ‘΄μ± λ°°μ΄μ μ§μ ν΄μΌ νλλ°, μ΄ μμ‘΄μ± λ°°μ΄μ΄ μ νμνμ§μ λν΄μ μμν μκ° μλ€. μ§κΈμ μ΄ν리μΌμ΄μ
λ΄μ ν¨μλ λͺ¨λ μ¬λ λλ§ μ£ΌκΈ°λ§λ€ νμ λκ°μ λ‘μ§μ μ°λλ°, μ΄ μμ‘΄μ± λ°°μ΄μ μ νμν κ²μΌκΉ? <DemoOutput show={showParagraph} />
<Button>Allow Toggling</Button>
<Button onClick={toggleParagraphHandler}>Toggle Paragraph!</Button>
App
μ»΄ν¬λνΈκ° λ λνλ Button
μ»΄ν¬λνΈ μμ "Allow Toggling" μ΄λΌλ ν
μ€νΈλ₯Ό λ£μ Button
μ»΄ν¬λνΈ νλλ₯Ό λ μΆκ°νλ€. μ΄ λ²νΌμ Toggle κΈ°λ₯μ νμ±νν΄μ μλμ λ²νΌμ΄ μλνκ²λ νλ λ²νΌμΌλ‘ λ§λ€ κ²μ΄λ€.const [allowToggle, setAllowToggle] = useState(false);
allowToggle
μν(state)λ₯Ό μΆκ°ν΄μ£Όμ. μ΄κΈ°κ°μ false λ‘ μ€μ ν΄μ€λ€. κ·Έλ¦¬κ³ ν΄λΉ Toggle κΈ°λ₯μ μ μ©ν λ²νΌμ onClick
μ΄λ²€νΈλ‘ ν΄λΉ νΈλ¦¬κ±° ν¨μλ₯Ό ν λΉνλ€.const allowToggleHandler = () => {
setAllowToggle(true);
};
...
<Button onClick={allowToggleHandler}>Allow Toggling</Button>;
allowToggleHandler
λ μμ±νλ€. ν΄λΉ ν¨μκ° νΈλ¦¬κ±° λ λλ§λ€ setAllowToggle
μν μ
λ°μ΄νΈ ν¨μλ‘ true κ°μΌλ‘ μ
λ°μ΄νΈν κ²μ΄λ€. (μ΄ ν¨μλ Toggle μ체μ μν(state)κ° μλλΌ Toggleμ μμ§μ΄λ λ²νΌ μ체μ λν Toggleμ νμ±νν λΏμ΄λ€.)allowToggleHandler
λ₯Ό λ°μΈλ©νλ κ² μΈμλ μ¬κΈ°μ λ€λ₯Έ ν¨μ(toggleParagraphHandler
)μμ allowToggle
μν(state) μ€λ
μ·μ μ΄μ©ν΄μ setShowParagraph
λ₯Ό μ¬μ©ν μ μλμ§ νμΈν κ²μ΄κΈ° λλ¬Έμ΄λ€.const toggleParagraphHandler = useCallback(() => {
if (allowToggle) {
setShowParagraph((prevParagraph) => !prevParagraph);
}
}, []);
toggleParagraphHandler
λ‘ λμκ° allowToggle
μν(state) μ€λ
μ·μ λ°λΌ μλμ λ²νΌμ μν(state)κ° μ
λ°μ΄νΈ λλλ‘ μμ±ν΄μ€λ€. if λ¬Έμ μ¬μ©ν΄μ λ§μ½ allowToggle
(Toggle λ²νΌμ μ€νν μ μλμ§λ₯Ό 체ν¬νλ μν κ°)μ΄ true μΌ λλ§ setShowParagraph
μν(state) μ
λ°μ΄νΈ ν¨μκ° μ€νλ μ μλλ‘ μμ±ν΄μ€λ€. μ΄λ κ² λλ©΄, showParagraph
μν(state)λ Toggle μ΄ νμ©λλ κ²½μ°(allowToggle
κ° true μΌ λ)λ§ μ
λ°μ΄νΈνκ² λλ€.useCallback
μ μ λλ‘ μ¬μ©νμ§ μμκΈ° λλ¬Έμ΄λ€. μμ μ΄λ―Έμ§λ₯Ό 보면 μμ‘΄μ± λ°°μ΄ []
λΆλΆμ νΈμ§κΈ°μμ μ½λ μμ±μ λ¬Έμ κ° μμμ νμν΄μ£Όκ³ μλ€.useCallback
μμ λ°ννλ ν¨μκ° μ μλλ©΄(App
μ»΄ν¬λνΈ ν¨μ λ΄λΆμ μλ λͺ¨λ μ½λλ€) μ΄ ν¨μ(useCallback
μμ λ°ννλ ν¨μ)κ° μ μλ λ μλ°μ€ν¬λ¦½νΈλ μ΄ ν¨μ μμμ μ¬μ©λλ λͺ¨λ λ³μλ₯Ό μ κ·Έκ² λλ€. λ¬Όλ‘ ν¨μ μΈλΆμμ μ¬μ©νλ λͺ¨λ λ³μλΌκ³ ν΄μΌ μ‘°κΈ λ μ νν μ€λͺ
μΌ κ²μ΄λ€.const toggleParagraphHandler = useCallback(() => {
if (allowToggle) {
setShowParagraph((prevParagraph) => !prevParagraph);
}
}, []);
allowToggle
μ΄ μμ μ€λͺ
ν κ²½μ°μ ν΄λΉνλλ° allowToggle
λ App
μ»΄ν¬λνΈ ν¨μ μΈλΆμ μλ λ³μλ μμμ΄κ³ ,const [allowToggle, setAllowToggle] = useState(false);
useCallback
μμ λ°ννλ ν¨μ μμμ μ¬μ©νκ³ μλ€.useCallback(() => {
if (allowToggle) {
setShowParagraph((prevParagraph) => !prevParagraph);
}
}, [allowToggle]);
λ°λΌμ μλ°μ€ν¬λ¦½νΈλ μ΄ allowToggle
μ ν΄λ‘μ λ₯Ό λ§λ€κ³ , ν΄λΉ ν¨μλ₯Ό μ μν λ μ¬μ©νκΈ° μν΄ λ³μ(allowToggle
)λ₯Ό μ μ₯νλ€.
κ·Έλ¦¬κ³ μ΄λ κ² λλ©΄, λ€μμ toggleParagraphHandler
ν¨μκ° μ€νλλ©΄ μ΄ μ μ₯λ λ³μ(allowToggle
)λ₯Ό κ·Έλλ‘ μ¬μ©νκ² λλ€. λ°λΌμ μ΄ λ³μμ κ°μ λ³μκ° μ μ₯λ μμ (allowToggle
μ ν΄λ‘μ λ₯Ό λ§λ€ λ)μ κ°μ μ¬μ©νκ² λκ³ , ν¨μ λ°μ λ³μλ₯Ό ν¨μ μμμ μ¬μ©ν μ μμΌλ©° μ°λ¦¬κ° μνλ μμ μ ν¨μλ₯Ό νΈμΆν μ μκ² λλ€.
allowToggle
μ κ°μ allowToggle
κ° μ μ₯λ μμ μ κ°μ μ¬μ©νλ€. μ΄λ μΈλ» 보기μ μλ²½ν κΈ°λ₯μ²λΌ 보μΈλ€. μ΄λ° κΈ°λ₯μ μ¬μ©νλ©΄ useCallback
μμ λ°ννλ ν¨μ λ°μ λ³μλ₯Ό ν΄λΉ ν¨μ μμμ μ¬μ©ν μ μμΌλ©° μ°λ¦¬κ° μνλ μμ μ ν¨μλ₯Ό νΈμΆν μ μκΈ° λλ¬Έμ΄λ€.<Button onClick={toggleParagraphHandler}>Toggle Paragraph!</Button>
toggleParagraphHandler
ν¨μμ²λΌ λ§μ΄λ€.useCallback
μ μ¬μ©νμ¬ λ¦¬μ‘νΈμκ² ν΄λΉ ν¨μλ₯Ό μ μ₯νλΌκ³ μ§μν μ μλ€. μ΄λ¬λ©΄ μ΄ ν¨μλ λ©λͺ¨λ¦¬ μ΄λκ°μ μ μ₯λλ€. App
ν¨μκ° ν κΈ μνκ° λ³κ²½λμ΄ μ¬νκ°, μ¬μ€νλλ©΄ 리μ‘νΈλ μ΄ ν¨μλ₯Ό μ¬μμ± νμ§ μμ κ²μ΄λ€. μ κ·Έλ΄κΉ? μλνλ©΄ μ°λ¦¬κ° useCallback
μ ν΅ν΄ 리μ‘νΈμκ² μ΄λ€ νκ²½μμλ ν¨μ μ¬μμ±μ νμ§ μλλ‘ μλμ μΌλ‘ λ§μκΈ° λλ¬Έμ΄λ€.useCallback(() => {
if (allowToggle) {
setShowParagraph((prevParagraph) => !prevParagraph);
}
}, []);
allowToggle
μ κ°μ μ΅μ μ€λ
μ·μ κ°μ΄ μλλΌ, App
μ»΄ν¬λνΈκ° μ²μ μ€νλ μμ μ κ°μ μ μ₯νκ³ μμ λΏμ΄λ€. μ΄μ μ κ±°λ‘ νλ―μ΄ μλ°μ€ν¬λ¦½νΈλ ν¨μ μμ± μμ μ allowToggle
μμμ κ°μ μ μ₯νκ³ μκΈ° λλ¬Έμ΄λ€. κ·Έλ¦¬κ³ λΉμ°ν μ΄λ° μ λλ¬Έμ μ€λ₯λ λ°μνλ€. μ°λ¦¬κ° μλμ μΌλ‘ useCallback
μ μ¬μ©ν΄μ 리μ‘νΈμ ν¨μλ₯Ό μ μ₯νλΌκ³ μ§μνκ³ , App
μ»΄ν¬λνΈκ° λ³κ²½λμ΄ μ¬νκ°, μ¬μ€νλλ λμ΄μ ν΄λΉ ν¨μκ° μ¬μμ±νμ§ μλλ‘ νκΈ° λλ¬Έμ΄λ€. νμ§λ§ λλλ‘ μ°λ¦¬λ ν΄λΉ ν¨μμ μ¬μμ±μ΄ νμλ‘ ν μ§λ λͺ¨λ₯Έλ€. κ·Έλ¬λκΉ ν΄λΉ ν¨μμμ μ¬μ©νλ μ¦ ν¨μ μΈλΆμμ μ€λ κ°(allowToggle
)μ΄ μ
λ°μ΄νΈ λ μ§λ λͺ¨λ₯΄λ κ°λ₯μ±μ΄ μλ€λ μ΄μΌκΈ°λ€. μ§κΈμ μ¬λ‘μ²λΌ λ§μ΄λ€.const toggleParagraphHandler = useCallback(() => {
if (allowToggle) {
setShowParagraph((prevParagraph) => !prevParagraph);
}
}, []);
allowToggle
μ useCallback
μ μ’
μμ±μ μΆκ°νλ €κ³ νλ€. μ΄λ κ² λλ©΄, useCallback
μ ν΅ν΄ 리μ‘νΈμ ν¨μλ₯Ό μ μ₯νλΌκ³ μ§μνμ΄λ, μ’
μ ννλ‘ μΆκ°λ allowToggle
μ κ°μ΄ μ
λ°μ΄νΈ λκ±°λ μλ‘μ΄ κ°μ΄ λ€μ΄μμ λ ν΄λΉ ν¨μλ₯Ό μ¬μμ± νκ³ , μ΄ μ¬μμ±λ ν¨μλ‘ μ μ₯ν μ μκ² λλ€.const toggleParagraphHandler = useCallback(() => {
if (allowToggle) {
setShowParagraph((prevParagraph) => !prevParagraph);
}
}, [allowToggle]);
allowToggle
μ μ΅μ κ°λ§μ μ¬μ©ν μ μλ€. λν allowToggle
μ΄ λ³κ²½λμ§λ§ μλλ€λ©΄ ν¨μλ₯Ό μ¬μμ±νμ§ μκ² λμλ€. μ¦, useCallback
μ ν΅ν λΆνμν μ¬μμ±μ λ°©μ§νλ μ₯μ κ³Ό, ν΄λΉ ν¨μμμ μ¬μ©νλ λ³μμ κ°μ μ΅μ κ°μΌλ‘ μ¬μ©ν μ μλ μ₯μ μ λͺ¨λ μ±κΈΈ μ μκ² λμλ€.React.memo
κ° λ λ²μ§Έ λ²νΌμμλ μλνμ§ μλλ€. μλνλ©΄ "Allow Toggling" λ²νΌμ μ°κ²°λ ν¨μμΈ allowToggleHandler
λ useCallback
μ μ¬μ©νμ§ μμκΈ° λλ¬Έμ΄λ€. "Toggle Paragraph!" λ²νΌμ΄ λ€μ λ λλ§ λλ€λ©΄ λ λ² νμλκ² μ§λ§, useCallback
μ΄ ν΄λΉ ν¨μκ° λ§€ λ² λ€μ λΉλλλ κ²μ μλμ μΌλ‘ λ§μκΈ° λλ¬Έμ λ€λ§ μμ‘΄μ±μΌλ‘ μ£Όμ
λ allowToggle
μνκ° λ³κ²½λ λλ§ ν΄λΉ 문ꡬλ₯Ό λ³Ό μ μλ€.π¨ ν΄λΉ ν¬μ€ν μ Udemyμ βReact μλ²½ κ°μ΄λβ κ°μλ₯Ό λ² μ΄μ€λ‘ ν κΈ°λ‘μ λλ€.
βπ» κ°μ git repo λ°λ‘κ°κΈ°