지난번에 포스팅했던 useMemo이 값의 재사용을 위한 것이라면 useCallback은 함수의 재사용을 위한 Hook 함수이다.

지난번에 사용했던 회원가입 App 컴포넌트를 가져왔다.

import React, { useState } from 'react';
 
function countUsers (users) {
  console.log("회원 수를 세는 중...");
  return users.length;
}
 
function App() {
  const [users, setUsers] = useState([]);
 
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
 
  const { username, email } = inputs;
  const onCreate = () => {
    setUsers([
      ...users,
      {
        username: username,
        email: email
      }
    ]);
  }
 
  const onChange = e => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
  }
 
  const count = countUsers(users);
 
  return (
    <div>
      <input name='username' onChange={onChange} value={username} placeholder='이름'></input>
      <input name='email' onChange={onChange} value={email} placeholder='이메일'></input>
      <button onClick={onCreate}>등록</button>
      <div>
        {
          users.map(user => <div>{user.username} ({user.email})</div>)
        }
      </div>
      <div>전체 회원 수: {count}</div>
    </div>
  )
}
export default App;

 

여기서 onCreate, onChange 함수는 컴포넌트가 리렌더링될 때마다 새로 만들어진다.

39, 40번째줄에 있는 username과 email을 입력하는 input은 키를 하나 입력할 때마다 App이 리렌더링되는데,

그 때마다 App 컴포넌트의 내부 함수인 onCreate와 onChange 함수가 계속 새로 만들어지는 것이다.

이들을 새로 만들지 않고 재사용하기 위해서 useCallback 함수를 사용할 수 있다.

사용법 역시 useMemo와 비슷하다.

 

useCallback(함수, [함수를 새로 만들지 말지 결정할 변수들])

17번째줄에 있는 onCreate 함수에 적용해보면 다음과 같다.

  const onCreate = useCallback(() => {
    setUsers([
      ...users,
      {
        username: username,
        email: email
      }
    ]);
  }, [users, username, email]);

 

onCreate 함수 내에서 사용하고 있는 '상태'들은 users, username, email이다.

만약 이 값들이 변했는데도 성능을 최적화하겠다고 두번째 파라미터에 이 상태들을 넣지 않으면 onCreate 함수가 실행될 때 현재 users가 아닌 초기값을 사용하는 등 예상치 못한 결과를 낳을 수 있다.

이런 일을 방지하기 위해 useCallback의 두번째 파라미터에는 '이 상태들이 변하면 함수를 새로 만들어주세요'하고 dependencies들을 넣어주어야 한다.

'프론트엔드 > React' 카테고리의 다른 글

useReducer  (0) 2021.09.14
React.memo  (0) 2021.09.12
useMemo  (0) 2021.09.06
useEffect  (0) 2021.09.03
useRef  (0) 2021.09.03

+ Recent posts