๐Ÿ”ซ React_07 useCallback

Boriยท2022๋…„ 11์›” 9์ผ
1

React

๋ชฉ๋ก ๋ณด๊ธฐ
7/8
post-thumbnail

๐ŸŽฎ useCallback

  • useMemo : ํŠน์ • ๊ฒฐ๊ณผ๊ฐ’์„ ์žฌ์‚ฌ์šฉ ํ•  ๋•Œ ์‚ฌ์šฉ
  • useCallback : ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ
  • App.js์—์„œ ๊ตฌํ˜„ํ–ˆ๋˜ onCreate, onRemove, onToggle ํ•จ์ˆ˜ ํ™•์ธ
    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜๋“ค์ด ์ƒˆ๋กœ ์ƒ์„ฑ๋จ
    • ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ ์ž์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ๋‚˜ CPU์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์ฐจ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค
    • ํ•˜์ง€๋งŒ, ํ•œ ๋ฒˆ ๋งŒ๋“  ํ•จ์ˆ˜๋ฅผ ํ•„์š”ํ•  ๋•Œ๋งŒ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ์žฌ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”

๋‚˜์ค‘์— ์ปดํฌ๋„ŒํŠธ์—์„œ props๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์œผ๋ฉด Virtual DOM์—์„œ ์ƒˆ๋กœ ๋ Œ๋”๋ง ํ•˜์ง€ ์•Š๊ณ  ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ์ตœ์ ํ™” ์ž‘์—…์„ ํ•  ์˜ˆ์ •
โ‡’ ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ตœ์ ํ™” ์ž‘์—…์„ ์œ„ํ•ด ํ•จ์ˆ˜ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜

// App.js
const onCreate = () => {
    const user = {
        id: nextId.current,
        username,
        email,
    };
    setUser(users.concat(user));
    
    setInputs({
        username: '',
        email: '',
    });
    
    nextId.current += 1;
};

const onRemove = (id) => {
    setUser(users.filter(user => user.id !== id));
};

const onToggle = (id) => {
    setUsers(
        users.map((user) => user.id ? { ...user, active: !user.active } : user)
    );
};

useCallback์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง

  • ํ•จ์ˆ˜ ์•ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ƒํƒœ๋‚˜ props๊ฐ€ ์žˆ๋‹ค๋ฉด, deps ๋ฐฐ์—ด ์•ˆ์— ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.
    • deps ๋ฐฐ์—ด ์•ˆ์— ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์„ ๋„ฃ์ง€ ์•Š์œผ๋ฉด, ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ•ด๋‹น ๊ฐ’๋“ค์„ ์ฐธ์กฐํ•  ๋•Œ ๊ฐ€์žฅ ์ตœ์‹  ๊ฐ’์„ ์ฐธ์กฐ ํ•  ๊ฒƒ์ด๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค.
    • props๋กœ ๋ฐ›์•„์˜จ ํ•จ์ˆ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋„ deps ๋ฐฐ์—ด์— ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.
// App.js
const onCreate = useCallback(() => {
    const user = {
        id: nextId.current,
        username,
        email,
    };
    setUser(users.concat(user));
    
    setInputs({
        username: '',
        email: '',
    });
    
    nextId.current += 1;
}, [users, username, email]);

const onRemove = useCallback((id) => {
    setUser(users.filter(user => user.id !== id));
}, [users]);

const onToggle = useCallback((id) => {
    setUsers(
        users.map((user) => user.id ? { ...user, active: !user.active } : user)
    );
}, [users]);

useCallback์€ useMemo๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

  • ๋‹ค๋งŒ, ํ•จ์ˆ˜๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ํ•œ ๊ฒƒ
  • ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค
const onToggle = useMemo(() => () => {
    // ...
}, [users])

โ‡’ useCallback์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”๋กœ ์ด๋ค„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ˆˆ์— ๋„๋Š” ์ตœ์ ํ™”๋Š” ์—†๋‹ค.

์ฐธ๊ณ 

0๊ฐœ์˜ ๋Œ“๊ธ€