에러와 마주할 때
[React.js, 성능최적화] UseEffect Memory resource Leak
juntech
2022. 1. 10. 17:58
안녕하세요! 오늘은 useEffect를 사용하던 도중 만난 에러를 기록할려고 합니다. 😇
리액트에서 scroll Event를 구현하던 도중, 갑자기 콘솔에 UseEffect에 관한 에러가 뜨더라고요! 에러 내용은 다음과 같습니다.
Warning: Can't perform a React state update on an unmounted component.
This is a no-op, but it indicates a memory leak in your application.
To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
에러는 다음과 같습니다.
에러를 단순히 살펴보면 , 언마운트된 리액트 컴포넌트가 업데이트 되었고, 이 것은 메모리 누수와 관련이 있습니다. 이 것을 고치기위해서는 비동기 작업 useEffect에 클린업 함수를 사용하라고 합니다.
우선 제가 useEffect에 작성한 함수를 살펴봅시다!

useEffect(() => {
window.addEventListener('scroll', handleScroll);
setInnerHeight(window.innerHeight);
}, [innerHeight, currentScroll]);
const handleScroll = () => {
setCurrentScroll(window.scrollY);
};
문제가 무엇일까요? useEffect에 eventlistner를 사용했지만 이 것을 remove해주지 않아서 발생하는 에러였습니다. 이 행위는 컴포넌트가 랜더링 될때마다 이벤트를 발생시킬 것이고, 당연히 성능에 치명적이겠죠?
useEffect(() => {
window.addEventListener('scroll', handleScroll);
setInnerHeight(window.innerHeight);
return () => {
window.removeEventListener('scroll', handleScroll); //clean up
}
}, [innerHeight, currentScroll]);
const handleScroll = () => {
setCurrentScroll(window.scrollY);
};
따라서 다음과 같이 event listner를 remove해주는 클린업 함수가 필요한 것입니다! 이렇게 되면, 리액트는 더 이상 불만을 표출하지 않을 것 입니다!
굉장히 당연하고 많이 있을만한 에러였지만, 누구나 할 수 있는 실수인 것 같습니다! 모두 성능향상을 위해 힘써보도록 합시다!!
