728x90
728x90
useCallback 훅
들어가며
- 리액트(React.js)에서 사용되는
useCallback
훅에 대해 정리해본다.

useCallback 훅
개념
- 컴포넌트의 성능 최적화(Optimization)를 위해 자주 사용되는 훅
- 함수를 메모이제이션(Memoization)하여 컴포넌트가 리렌더링될 때마다 함수가 재생성되는 것을 방지한다.
사용 방법
useCallback(() => {}, [])
와 같이 사용한다.- 첫 번째 인자로 함수를 받고, 두 번째 인자로 의존성 배열(Dependencies Array)을 받는다.
const memoizedCallback = useCallback(() => { doSomething(a, b); }, [a, b]);
⇒ 리액트는 컴포넌트가 리렌더링될 때마다 해당 함수를 다시 생성하지 않고, 의존성 배열에 있는 값들이 변경될 때만 함수를 새로 생성한다.
⇒ 불필요한 함수 재생성을 막고, 자식 컴포넌트로 전달된 함수가 불필요하게 변경되어 불필요한 리렌더링이 발생하는 것을 방지한다.
import { useState, useCallback } from 'react'; import { data } from '../data'; import List from './components/List3'; const UseCallbackExample = () => { const [people, setPeople] = useState(data); const [count, setCount] = useState(0); const removePerson = useCallback( (id) => { const newPeople = people.filter((person) => person.id !== id); setPeople(newPeople); }, [people] ); return ( <div className="section"> <h1>useCallback Example</h1> <section> <button className="btn" onClick={() => setCount(count + 1)} style={{ marginBottom: '1rem' }} > count {count} </button> <List people={people} removePerson={removePerson} /> </section> </div> ); }; export default UseCallbackExample;
자식 컴포넌트(<List/>)로 전달된 함수(removePerson)가 불필요하게 변경되어 불필요한 리렌더링이 발생하는 것을 방지한다.
사용해야 할 때
- 자식 컴포넌트에 함수를
props
로 전달하는 경우 - 컴포넌트가 자주 리렌더링되거나, 큰 리스트를 처리할 때와 같이 성능 이슈가 있을 경우
useEffect
나useMemo
와 함께 사용할 때, 의존성 배열의 값들이 변경될 때만 함수를 다시 생성하고 싶을 경우
사용 시 주의할 점
useCallback
훅을 남용할 경우, 오히려 코드가 복잡해지고 성능에 도움이 되지 않는 경우가 있다.- 따라서, 최적화가 필요한 경우에만 사용하는 것이 좋다.
사용 예
- 깃허브(GitHub) API를 이용하여 유저 정보를 불러오는 코드이다.
useEffect
훅을 이용하여 데이터를 불러와도 의존성 배열([]
)이 비어 있어서, 처음에 한 번만 실행되지만, 컴포넌트가 리렌더링 될 때마다 데이터가 다시 불러와지는 현상이 발생한다.- 이 현상을 방지하기 위해서,
useCallback
훅을 이용하여 처음 컴포넌트가 생성될 때 딱 한 번만 데이터가 불러와지도록 할 수 있다.fetchData
함수가 처음 렌더링 시 한 번만 생성되고, 이후 리렌더링 시에도 함수가 재생성되지 않는다.
import { useState, useEffect, useCallback } from 'react'; const url = 'https://api.github.com/users'; const FetchData = () => { const [users, setUsers] = useState([]); const fetchData = useCallback(async () => { try { const response = await fetch(url); const users = await response.json(); setUsers(users); } catch (error) { console.log(error); } }, []); useEffect(() => { fetchData(); }, [fetchData]); //... };
참고 사이트
useCallback – React
The library for web and native user interfaces
ko.react.dev
728x90
728x90
'Programming > React' 카테고리의 다른 글
[React.js] .env 파일 만들고 사용하기 (환경 변수 관리) (0) | 2024.09.23 |
---|---|
[React.js] React Query Devtools (0) | 2024.09.22 |
[React.js] 코드 분할(Code Splitting) : useTransition 훅, Suspense 컴포넌트, lazy 함수 (0) | 2024.09.20 |
[React.js] useMemo 훅 (0) | 2024.09.20 |
[React.js] React.memo() (0) | 2024.09.18 |
[React.js] Context API를 이용하여 전역 상태 관리하기 (2) | 2024.09.11 |
[React.js] react-toastify 라이브러리 (0) | 2024.09.10 |
[React.js] uuid, nanoid 라이브러리 사용하기 (key) (0) | 2024.09.09 |