ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React.js, 성능최적화] UseEffect Memory resource Leak
    에러와 마주할 때 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해주는 클린업 함수가 필요한 것입니다! 이렇게 되면, 리액트는 더 이상 불만을 표출하지 않을 것 입니다!

     

    굉장히 당연하고 많이 있을만한 에러였지만, 누구나 할 수 있는 실수인 것 같습니다! 모두 성능향상을 위해 힘써보도록 합시다!!

    댓글

sangjun's blog