[React] useEffect와 useCallback 차이 간단 정리!

SHORTCUT

    반응형

    useCallback()

    • useCallback(함수, [검사값]) 검사값이 변경되었을 때에만 함수를 생성하는 Hook이다.
    • 함수를 memoize → 재사용하기 위해서 사용(랜더링 성능 최적화)
    • 검사값에 따른 랜더링 비교
      • [] : 검사값이 비어있으므로, 최초 랜더링시에만 함수를 선언하고 이후 계속 재사용한다
      • [number] : number 값이 변경되었을 때에만, 함수를 다시 선언
    • 사용 이유
      • 자식 컴포넌트에게 props로 함수를 전달할 때 사용 → 자식 컴포넌트의 불필요한 랜더링을 방지
      • 함수 변경이 없거나, 연산이 큰 함수를 최초에만 선언하기 위해서 사용

    useEffect()

    • 사이드 이펙트를 방지하기 위해서 사용함
    • 상세 사례
      • API Fetching : 컴포넌트 내에 axios를 선언해놓았는데, 해당 컴포넌트가 부모에 의해 계속 재랜더링된다면? 불필요한 api 요청이 계속 반복됨(side effect 발생)
        const [data, setData] = useState([]);
        
        // 컴포넌트 최초 마운트시에만 실행 -> 
        useEffect(() => {
          const fetchData = async () => {
            const result = await axios(
              'https://23log.tistory.com/api/v2/getPost'
            );
            setData(result.data);
          };
        	// fetch 후 setDate()로 state 등록
          fetchData();
        }, []);
      • 이벤트 리스너 추가/제거 : 컴포넌트 마운트 될 때, 이벤트 추가하고. 해제될 때 이벤트 제거를 위해서
        useEffect(() => {
          function handleResize() {
            // 등록하고자 하는 이벤트 등록
          }
        
        	// 검사값배열이 [] : 최초 랜더링 시 실행
          window.addEventListener('resize', handleResize);
        	// 클린업 함수 : 
          return () => {
            window.removeEventListener('resize', handleResize);
          };
        }, []);
      • DOM 업데이트 시 처리 등

    🤷 그래서, 차이점은?

    둘다 두번째 인자로 검사값(종속성 배열)을 받고 있어 비슷한 형태인데, 어떤 차이점이 있을까? 바로 위 설명처럼, 사용 목적에 그 차이점이 존재한다.

    • useCallback
      • 콜백함수를 자식에게 전달해줄 때 사용
      • 자주 렌더링 위험이 있는 요소를 성능 최적화를 위해 사용
      • const onChange = useCallback(e => {...}); 이렇게 지정하고 자식에게 던진다!
    • useEffect
      • 사이드 이펙트 방지를 위해 사용
      • API 통신(data fetch), 이벤트 리스너 추가, DOM 업데이트 등
      • useEffect(()=>{...}); 함수 호출을 통해, 실행한다!

    반응형

    댓글

    Designed by JB FACTORY