useCallback()
useCallback()
1. κ°μ
useCallback()ν
μ useMemo()μ λλΆμ΄ μ±λ₯ μ΅μ νμ μ¬μ©λλ Reactμ ν
μ΄λ€. useMemo()λ νΉμ κ²°κ³Όκ°μ μ¬μ¬μ©ν λ μ¬μ©νλ λ°λ©΄, useCallback()ν
μ νΉμ ν¨μλ₯Ό μλ‘ λ§λ€μ§ μκ³ μ¬μ¬μ©νκ³ μΆμ λ μ¬μ©νλ ν
μ΄λ€.
2. useCallback() μ¬μ©λ²
μ¬μ©λ² const fn = useCallback(function, deps)
function: Memoizationμ νλ ν¨μ
deps: μμ‘΄μ± λ°°μ΄λ‘
useEffect()μ depsμ κ°λ€.
κΈ°λ³Έ μ¬μ©λ²μ useMemo()κ³Ό κ°μ 보μΈλ€. νμ§λ§ ν¨μλ₯Ό Memoizationνλμ§ νΉμ κ°μ Memoizationμ΄ νλ κ²μ μ°¨μ΄κ° μλ€.
3. useCallback()λ₯Ό μ¬μ©νμ§ μλ μ»΄ν¬λνΈμ λλλ§
λ¨Όμ useCallback()ν
μ μ¬μ©νμ§ μμ μ½λλ₯Ό μμ±νκ³ λλλ§νλ κ³Όμ μ μ΄ν΄λ³΄μ. μ΅κ·Όμ μ μ£Όλ μ¬νμ λ€λ
μκΈ°μ μ΄μ κ΄λ ¨ν κ°λ¨ν μ½λλ₯Ό μμλ‘ μκ°νλ€.
μλμ κ°μ΄ λ κ°μ μ»΄ν¬λνΈλ₯Ό μμ±νλ€.
// Test μ»΄ν¬λνΈ
import React, { useState } from "react";
import { useForm } from "react-hook-form";
import Children from "./Children";
const Test = () => {
const { register, handleSubmit, setValue } = useForm();
const [isSunny, setIsSunny] = useState(true);
const [gift, setGift] = useState([]);
const getMyGift = () => {
return gift.join(", ");
};
return (
<div>
<div>
<span>κΈ°λ
νμ κ°μ§κ³ μ§μΌλ‘ λμκ° μ μμκΉμ?</span>
<button onClick={() => setIsSunny(!isSunny)}>λ μ¨ λ°κΎΈκΈ°</button>
<div>
{isSunny
? "λ μ¨κ° λ§€μ° μ’λ€μ! λΉνκΈ°κ° μ΄λ₯ν μ μμ΄μ π«"
: "ννμ΄ μλ€μγ
γ
λ΄μΌκΉμ§ κΈ°λ€λ €λ΄μ β"}
</div>
</div>
<form
onSubmit={handleSubmit(({ gift }) => {
setGift((prev) => [...prev, gift]);
setValue("gift", "");
})}
>
<input {...register("gift")} placeholder="μ¬κ³ μΆμ κΈ°λ
ν" />
<input type="submit" value="κΈ°λ
ν κ³ λ₯΄κΈ°" />
</form>
<Children getMyGift={getMyGift} />
</div>
);
};
export default Test;
// Children μ»΄ν¬λνΈ
import React, { useState, useEffect } from "react";
const Children = ({ getMyGift }) => {
const [myGift, setMyGift] = useState();
useEffect(() => {
console.log("μλ‘μ΄ κΈ°λ
νμ΄ μΆκ°λμμ΅λλ€!");
setMyGift(getMyGift());
}, [getMyGift]);
return <div>λμ κΈ°λ
ν λͺ©λ‘: {myGift}</div>;
};
export default Children;μ½λμ λΆμλΆν° ν΄λ³΄μ.
λ¨Όμ λλ
useFormν μ μ¬μ©νκ³ μλ€. μ΄ ν μreact-hook-formλͺ¨λμ μ€μΉν ν μ¬μ©ν μ μλ€. ν΄λΉ λͺ¨λκ³Ό ν μ λν΄μλ λ€λ₯Έ μ±ν°μμ μμΈν λ€λ£¨λλ‘ νκ² λ€.isSunnyμgiftλΌλ stateλ₯Ό λ§λ€μλ€.isSunnystateλλ μ¨ λ°κΎΈκΈ°λ²νΌμ λλ¬ κ°μ λ°κΏ μ μκ³ κ°μ λ°λΌ λΉνκΈ°κ° μ΄λ₯ν μ μλμ§ μλμ§ ν μ€νΈλ‘ μλ €μ£Όκ³ μλ€.giftstateλ μ΄κΈ°κ°μ΄ λ°°μ΄μ΄κ³inputμμ λ°μ κ°μ μ°¨λ‘λλ‘Array.push()λ©μλλ₯Ό ν΅ν΄ μ μ₯νκ³ μλ€.getMyGift()λChildrenμ»΄ν¬λνΈμpropsλ‘ μ λ¬νλ ν¨μμ΄λ€. ν΄λΉ ν¨μλ λ°°μ΄μArray.join()λ©μλλ₯Ό ν΅ν΄ λ¬Έμμ΄λ‘ λ°κΎΈλ μν μ νλ€.Childrenμ»΄ν¬λνΈμμλmyGiftstateκ° μ μΈμ΄ λμ΄ μλ€. ν΄λΉ stateλpropsμΌλ‘ μ λ¬λ°μgetMyGift()κ° μ λ°μ΄νΈ λ λ λ§λ€useEffect()μ ν΅ν΄ μ λ°μ΄νΈ λκ³ μλ€.
μ½λ λΆμμ΄ λλ¬μΌλ stateκ°λ€μ λ³κ²½νμ¬ νλ©΄μ΄ λλλ§νλ κ³Όμ μ μμ보μ. μΌλ¨ μ μ£Όλμ κ°μΌλ κΈ°λ
νμ μ¬μΌνλ€. μ¬κ³ μΆμ κΈ°λ
νμ μ
λ ₯νκ³ κΈ°λ
ν κ³ λ₯΄κΈ° λ²νΌμ λλ¬ λμ κΈ°λ
ν λͺ©λ‘μ μΆκ°νμ.

μ΄μ½λ¦Ώ, λ¨Έκ·Έμ, μ 주리μΌνλ₯΄νΈ, ν₯μλ₯Ό κΈ°λ
ν νλͺ©μ μΆκ°νμλ€. μΆκ°κ° λ λ λ§λ€ getMyGift()κ° μλ‘μ΄ ν¨μ κ°μ²΄λ₯Ό ν λΉνκ³ μκΈ° λλ¬Έμ Childrenμ»΄ν¬λνΈμ useEffect()κ° μ€νλλ€.
κ·Έλ λ€λ©΄ getMyGift()μ μ ν μκ΄μλ isSunnyμ κ°μ λ°κΎΈκ² λλ©΄ μ΄λ»κ² λ κΉ? λ μ¨ λ°κΎΈκΈ°λ²νΌμ ν΄λ¦νμ¬ λΉνκΈ°λ₯Ό λ€μλ μ λμ΄λ³΄μ.

λ μ¨κ° λ°λμ΄ ννμ΄ μ€κ³ μλ€. isSunnyκ°μ μ±κ³΅μ μΌλ‘ λ°λμκ³ giftμ κ°μ λ°λμ§ μμλ€. νμ§λ§ getMyGift()κ° μλ‘μ΄ ν¨μ κ°μ²΄λ₯Ό ν λΉνκ³ μμ΄ Childrenμ»΄ν¬λνΈμ useEffect()κ° μ€νμ΄ λμλ€. κ·Έλμ μ°λ¦¬λ "μλ‘μ΄ κΈ°λ
νμ΄ μΆκ°λμμ΅λλ€!"λΌλ ν
μ€νΈκ° μ½μμ νλ λ μΆκ°λ λͺ¨μ΅μ λ³Ό μ μλ€.
μ¦ λ¦¬λλλ§μ΄ νμνμ§ μλ μ»΄ν¬λνΈμμ λΆνμν 리λλλ§μ΄ μΌμ΄λ κ²μ΄λ€.
μ΄λ¬ν μ΄μ λ useMemo()μ±ν°μμ μ€λͺ
νμ§λ§ λ€μ 볡μ΅νμλ©΄, 리μ‘νΈμμμ μ»΄ν¬λνΈλ νλμ ν¨μμ΄λ€. μ¦ ν¨μκ° λ¦¬λλλ§ λλ€λ κ²μ λ³μκ° μ΄κΈ°νκ° λλ€λ κ²μ΄λ€. κ°μ μν μ νκ³ μλ ν¨μμ§λ§ λ³μκ° μ°Έμ‘°νκ³ μλ ν¨μ κ°μ²΄μ μ£Όμλ λ€λ₯΄κΈ° λλ¬Έμ΄λ€.
4. useCallback()λ₯Ό μ¬μ©ν μ»΄ν¬λνΈμ λλλ§
μ΄μ useCallback()ν
μ μ¬μ©νμ¬ μμ λ¬Έμ λ₯Ό ν΄κ²°νμ.
getMyGift()μ ν¨μλ₯Ό μλμ κ°μ΄ μμ νμ.
κ·Έλ¦¬κ³ λμ λ€μ κΈ°λ ν λͺ©λ‘μ μΆκ°ν΄λ³΄μ.

μ΄λ²μλ κΈ°λ
ν μΆκ° λ λλ§ Childrenμ»΄ν¬λνΈκ° 리λλλ§μ΄ λλ κ²μ νμΈν μ μλ€. κ·Έλ¬λ©΄ λ μ¨ λ°κΎΈκΈ°λ²νΌμ ν΄λ¦νμ¬ Childrenμ»΄ν¬λνΈμ κ΄λ ¨μλ isSunnyμ κ°μ λ°κΎΈμ΄ 보μ.

isSunnyμ κ°μ΄ λ°λμ΄ λ μ¨κ° ννμΌλ‘ μ
λ°μ΄νΈ λμ΄λ Childrenμ»΄ν¬λνΈλ 리λλλ§μ΄ λμ§ μλ κ²μ νμΈν μ μλ€.
μ΄λ useCallback()ν
μ μμ‘΄μ± λ°°μ΄μ κ°μΌλ‘ giftλ§ μΆκ°νκΈ°μ isSunnyκ° μ무리 λ°λμ΄λ getMyGift()ν¨μκ° μ°Έμ‘°νκ³ μλ ν¨μ κ°μ²΄μ μ£Όμλ λ°λμ§ μκΈ° λλ¬Έμ΄λ€.
5. Conclusion
useMemo()ν κ³ΌuseCallback()ν μ 곡λΆνλ©΄μ λκΌλ μ μ "κ³Όμ° λ΄κ° μ μ μ μμ ν΄λΉ ν μ μ μ¬μ©ν μ μμκΉ?"μλ€. μ§κΈκΉμ§ λλλ§ μ΅μ νμ λν κ³ λ―Όμ νμ§ μκ³ μ½λλ₯Ό μμ±νκΈ° λλ¬Έμ νμν κ³³μ λ΄κ° μ μ μ©μ ν μ μμμ§ κ±±μ μ΄ λλ€. κ·Έλλ μΌλ₯Έ ν°μ²μΊ 리ν©ν λ§μ μμν΄μ μ§μ νλ‘μνΈμ μ μ©μ νκ³ μΆλ€. 리ν©ν λ§μ λ€μμ£Ό μμμΌ(22.8.8) λΆν° μμ!
μ°Έκ³
[React] 리μ‘νΈ Hooks : useCallback() ν¨μ μ¬μ©λ² React Hooks: useCallback μ¬μ©λ²
λμμ΄ λ§μ΄ λμλ μ νλΈ π¬
π 2022-08-04
Last updated
