특정 함수를 새로 만들지 않고, 필요시에만 사용하는 함수 !
값 대신에 함수 자체를 캐싱
(컴포넌트 렌더링 성능 최적화 → useCallback으로 컴포넌트 props가 변하지 않으면 렌더가 발생하지 않음)
const memoizedCallback = useCallback(function, deps)
🔔 함수(콜백함수)를 배열형태의 함수 실행 조건값(deps)이 변경될 때까지 저장하고, 재사용
(deps 값이 바뀌지 않는 한 기존함수를 재사용함)
👍렌더 도중에 생기는 함수를 메모이제이션해서 전달해야 할 때
👍함수의 동등성에 의해
👍자식컴포넌트에 props로 함수를 전달하는 경우
👍외부에서 값을 가져오는 api를 호출하는 경우
자바스크립트에서 일반적으로 함수는 객체로 취급한다.
다시 말해서, 자바스크립트의 객체를 비교하는 경우 같은 값이 예상된다고 하더라도 연산자(===)로 비교시 'false'를 출력한다.
그 이유는? 객체가 메모이제이션되는 경우 주소값이 메모이제이션되는데 함수가 렌더될때 함수내부에 있는 모든 변수는 초기화된다.
이때, 객체의 주소값 또한 새로 배분되는데 이때 객체의 값이 변동했다고 판단하므로 다시 리렌더링 된다.
이때 useCallback으로 객체(함수)를 감싸주면 이러한 문제를 차단할 수 있음
useCallback 적재 적소에 쓰자 !
오히려 부담되는 작업을 수 있음을 반드시 염두해두자 !
예를 들어 함수내부에서 setState 혹은 dispatch를 호출하는 경우에는 쓰지 말자! 왜냐 리액트에서 이미 useState, useDispatch에 대한 성능최적화를 보장하고 있다. setState함수와 dispatch함수는 새로 생성되지 않는다 .왜냐하면 Hooks API이기 때문이다!
참고 !
https://ko.reactjs.org/docs/hooks-reference.html#usecallback
https://narup.tistory.com/273
https://dori-coding.tistory.com/entry/React-useCallback%EA%B3%BC-useMemo-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
https://m.blog.naver.com/dlaxodud2388/222641701457
https://bamtory29.tistory.com/entry/Hooks-useCallback
https://youngslog.medium.com/usecallback%EA%B3%BC-react-memo%EB%A1%9C-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%B5%9C%EC%A0%81%ED%99%94-%ED%95%98%EA%B8%B0-edff1185cebd
https://mooneedev.netlify.app/Frontend/%EC%96%B8%EC%A0%9C%EC%8D%A8%EC%95%BC%ED%95%A0%EA%B9%8C%20useCallback/
https://eunhee-programming.tistory.com/201
https://velog.io/@ashnamuh/React의-useReducer-useCallback-useMemo-제대로-알고-사용하기
https://k-developer.gitbook.io/dev/react/react-hook/usecallback
https://cocoon1787.tistory.com/798
https://velog.io/@woohm402/useCallback-알아보기
https://www.daleseo.com/react-hooks-use-callback/
https://minjung-jeon.github.io/useCallback/
https://ko.wikipedia.org/wiki/메모이제이션