728x90
๐ useCallback
- callback ํจ์๋ฅผ memoize (๋ฉ๋ชจ์ด์ฆ)
- ํจ์ ์์ฒด (function object )๋ฅผ ์บ์ฑํ๋ ํ .
- ํจ์๋ฅผ ๋ค์ ๋ง๋ค์ง ์๋ ๋ค๋ ๊ฒ ํต์ฌ.!!
- ํจ์์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๋ ๊ฒ์ --> useMemo Hook
- ์ฌ์ฉ ๋ฐฉ๋ฒ
- useCallback(callback, dependencies)
- callback :: ํจ์๋ฅผ ๊ธฐ๋ก.
- dependencies :: ์ด dependencies ์์ ์๋ ๊ฐ์ด ๋ณ๋์ด ๋๋ฉด ๊ทธ๋ --> callback ํจ์๋ฅผ ์คํ.
- ๋ง์ฝ dependencies ๊ฐ ๋น์ด์์ผ๋ฉด --> ํ๋ฒ ๋ง๋ค๊ณ ๋ฐ๊พธ์ง ์์๊บผ๋ผ๋ ๊ฒ.
-
๋๋ณด๊ธฐuseEffect(() => {
console.log("same handleClick reference?", prevRef.current === handleClick);
prevRef.current = handleClick;
});
/*
useEffect :: ๋ ๋๋ง์ด ๋๋ ํ ์คํ๋๋ ์ฝ๋
๊ธฐ๋ณธ์ ์ผ๋ก : - ์ฒซ ๋ ๋๋ง ํ 1๋ฒ ์คํ.
- ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ ๋ ๋ง๋ค ๋ค์ ์คํ.
์์กด์ฑ ๋ฐฐ์ด์ด ์์ผ๋๊น --> ๋งค ๋ ๋๋ง ํ ์คํํจ.
useRef :: prevRef.current ๋ ๋ ๋๋ง์ด ๋ฐ๋์ด๋ ์ ์ง๋๋ ๊ฐ.
๊ฐ์ด ๋ฐ๋์ด๋ ๋ฆฌ๋ ๋๋ง์ ๋ฐ์์ํค์ง ์์.
์ฌ๊ธฐ์๋ --> ์ด์ ๋ ๋๋ง์ handleClick ํจ์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ ์ฉ๋.
*/ -
๋๋ณด๊ธฐ
import { useState, useCallback, useRef, useEffect } from "react"; import { createRoot } from "react-dom/client"; function Counter() { const [count, setCount] = useState(0); const handleClick = useCallback( () => { setCount(perv => perv +1); // ์ง์ ๊ฐ์ ์ธ์๋ก ๊ฐ์ ธ์์ --> ๊ทธ๊ฑธ 1์ ์ฆ๊ฐ ์ํด. // setCount(count + 1 ) // ์ด๊ฑด count state ๊ฐ์ 1์ ์ฆ๊ฐ ์ํค๋ ๊ฒ์. }); // ์์กด์ฑ ๋ฐฐ์ด์ด ๋น ๋ฐฐ์ด์ด๋ฉด // --> handleClick ์ ์ฒ์ ๋ ๋๋ง ๋ ๋, ํ๋ฒ๋ง ์์ฑํ๊ณ ๊ธฐ์ตํ๊ณ ์์ ๊บผ์. const prevRef = useRef(handleClick); useEffect(() => { console.log("same handleClick reference?", prevRef.current === handleClick); prevRef.current = handleClick; }); /* useEffect :: ๋ ๋๋ง์ด ๋๋ ํ ์คํ๋๋ ์ฝ๋ ๊ธฐ๋ณธ์ ์ผ๋ก : - ์ฒซ ๋ ๋๋ง ํ 1๋ฒ ์คํ. - ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ ๋ ๋ง๋ค ๋ค์ ์คํ. ์์กด์ฑ ๋ฐฐ์ด์ด ์์ผ๋๊น --> ๋งค ๋ ๋๋ง ํ ์คํํจ. useRef :: prevRef.current ๋ ๋ ๋๋ง์ด ๋ฐ๋์ด๋ ์ ์ง๋๋ ๊ฐ. ๊ฐ์ด ๋ฐ๋์ด๋ ๋ฆฌ๋ ๋๋ง์ ๋ฐ์์ํค์ง ์์. ์ฌ๊ธฐ์๋ --> ์ด์ ๋ ๋๋ง์ handleClick ํจ์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ ์ฉ๋. */ console.log("component rendering") return ( <div> <h1>Count : {count}</h1> <button onClick={handleClick}>์ฆ๊ฐ</button> </div> ); } createRoot(document.getElementById('react4')).render(<Counter />);
๐ useMemo
- Memoized value ๋ฅผ ๋ฆฌํด,.
- Memoization ์ ๊ฐ์ ์บ์ฑํ๋ ๊ฒ.
- --> ์ฌ๊ณ์ฐ์ด ํ์์๊ฒ ํจ.
- ๋ํ๋์๊ฐ ์
๋ฐ์ดํธ ๋ ๋๋ง useMemo Hook์ด ์คํ ๋จ.
- --> ์ฑ๋ฅ์ด ํฅ์๋ ์ ์์.
| useMemo | useCallback | |
| ๋ฐํํ๋ ๊ฒ์ ์ฐจ์ด์ . | Memoized ๊ฐ ๋ฐํ | Memoization ํจ์ ๋ฐํ |
- --------------------------------------------------------------------------------------
- useMemo ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํ๋ฉด ํ๋ํ๋ํ ๋๋ง๋ค ๋ก๋ฉ ์์ฒญ ๊ฑธ๋ ธ์...
- ๋๋ฆฐ ์ด์ ๋ const calculation = expensiveCalculation(count); ๋๋ฌธ์ ๋๋ฆฐ๊ฑฐ์.
- counter ํธ์ถํ ๋๋ expensiveCalculation(count); ๊ฐ ๋ถ๋ฌ์ ธ์ผํ๋ ๊ฒ ๋ง์ง๋ง,
- todo ํธ์ถํ ๋๋ ์๋ฅผ ๋ถ๋ฅผ ํ์๊ฐ ์์.
-
๋๋ณด๊ธฐ

import { useState, useCallback } from "react"; import {createRoot} from "react-dom/client"; const expensiveCalculation = (num) => { console.log("๊ณ์ฐ์ค..."); for( let i = 0; i < 3000000000; i++ ){ num += 1; } return num; } function App() { const [count, setCount] = useState(0); const [todos, setTodos] = useState([]); const calculation = expensiveCalculation(count); const increment = () => { setCount( c => c+1 ); // ์ฌ๊ธฐ์ c ๋ ์ง์ ๊ฐ์ ์ ์ฅํ๋ ๊ทธ๋ฅ ๋ณ์์. }; const addTodo = () => { setTodos( (t) => { return [...t, "์๋ก์ด ํ ์ผ"] }); }; return ( <div> <div> <h2>๋์ ํ ์ผ๋ค without useMemo</h2> {todos.map( (todo, idx) => { return <p key={idx}>{todo}</p> })} <button onClick={addTodo}>ํ ์ผ ์ถ๊ฐ</button> </div> <hr /> <div> Count : {count} <button onClick={increment}> + </button> </div> </div> ); } createRoot(document.getElementById('react4')).render(<App />);
- ---------------------------------------------------------------------------------------
- useMemo ๋ฅผ ์ฌ์ฉํด์ ํด๋ด.
- ์๋์ ํ์ ์์ธ์ธ expensiveCalculation ๋ถ๋ถ์ count ๊ฐ์ด ๋ณํ ๋๋ง ์คํํ ์ ์๊ฒ useMemo๋ฅผ ์ฌ์ฉํจ.
- const calculation = useMemo( () => expensiveCalculation(count), [count] );
// count ๊ฐ์ด ๋ณํ ๋๋ง?? --> expensiveCalculation ๋ฅผ ์คํํ์.
[count] ๋ถ๋ถ์ด --> dependencies ์.!! -
๋๋ณด๊ธฐ

import { useState, useCallback, useMemo } from "react"; import {createRoot} from "react-dom/client"; const expensiveCalculation = (num) => { console.log(num + " -- ๊ณ์ฐ์ค..."); for( let i = 0; i < 3000000000; i++ ){ num += 1; } return num; } function App() { const [count, setCount] = useState(0); const [todos, setTodos] = useState([]); const calculation = useMemo( () => expensiveCalculation(count), [count] ); // count ๊ฐ์ด ๋ณํ ๋๋ง?? --> expensiveCalculation ๋ฅผ ์คํํ์. const increment = () => { setCount( c => c+1 ); // ์ฌ๊ธฐ์ c ๋ ์ง์ ๊ฐ์ ์ ์ฅํ๋ ๊ทธ๋ฅ ๋ณ์์. }; const addTodo = () => { setTodos( (t) => { return [...t, "์๋ก์ด ํ ์ผ"] }); }; return ( <div> <div> <h2>๋์ ํ ์ผ๋ค with useMemo</h2> {todos.map( (todo, idx) => { return <p key={idx}>{todo}</p> })} <button onClick={addTodo}>ํ ์ผ ์ถ๊ฐ</button> </div> <hr /> <div> Count : {count} <button onClick={increment}> + </button> </div> </div> ); } createRoot(document.getElementById('react4')).render(<App />);
- --------------------------------------------------------------------------------------
๐ ?
- ใ ใ
์ถ์ฒ :
https://www.youtube.com/watch?v=bSqXAP7KLyc&list=PLTb3qGCzYjS2AliTIbz9eAGjZSdEQa3m1&index=43
๊ฐ๋ฐ ๊ณต๋ถ๋ฅผ ์ํ ๋ธ๋ก๊ทธ ์ ๋๋ค.
์ค๋ฅ๊ฐ ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
๊ฐ์ฌํฉ๋๋ค.

728x90
'front > react' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [react] React Router v6.4 ( createBrowerRouter, RouterProvi๏ปฟder) (0) | 2026.01.07 |
|---|---|
| [react] React Hook 5 (Custom Hook) (0) | 2026.01.07 |
| [react] React Hook 3 (useReducer) (0) | 2026.01.07 |
| [react] React Hook 2 (useContext, useRef) (0) | 2026.01.06 |
| [react] React Hooks 1 (useState, useEffect) (0) | 2026.01.04 |