[React] useCallback의 남용

2022. 10. 31. 12:52·React/실험실
반응형

시나리오 

React Memo를 사용할 때 같이 이야기가 나오는 친구가 바로 useCallback이다 

그래서 useCallback을 사용할 때와 사용하지 않은 함수를 비교한다. 

 

머리론, useCallback이 의미없이 사용되면 일반 함수보다 시간이 더 오래 걸릴 거라는 생각이 들었다. 

 

작업 

import React, { useState } from "react";
import { useCallback } from "react";
import styled from "styled-components";

const ChildComponentOne = ({ photos }) => {
  console.log("ChildComponentOne Render");

  const handleClick1 = useCallback(() => {
    console.log("클릭");
  }, []);

  const handleClick2 = useCallback(() => {
    console.log("클릭");
  }, []);

  const handleClick3 = useCallback(() => {
    console.log("클릭");
  }, []);

  const handleClick4 = useCallback(() => {
    console.log("클릭");
  }, []);

  const handleClick5 = useCallback(() => {
    console.log("클릭");
  }, []);

  return (
    <ChildWrapper>
      {photos.map((photo) => (
        <p key={photo.id} onClick={handleClick1}>
          테스트
        </p>
      ))}
    </ChildWrapper>
  );
};

const ChildWrapper = styled.div`
  width: 45%;

  padding: 10px;
`;

export default ChildComponentOne;

ChildComponentOne의 경우 useCallback을 사용해서 의미없이 함수를 만들어봤다. 

 

import styled from "styled-components";

const ChildComponentTwo = ({ photos }) => {
  console.log("ChildComponentTwo Render");

  const handleClick1 = () => {
    console.log("클릭");
  };

  const handleClick2 = () => {
    console.log("클릭");
  };

  const handleClick3 = () => {
    console.log("클릭");
  };

  const handleClick4 = () => {
    console.log("클릭");
  };

  const handleClick5 = () => {
    console.log("클릭");
  };

  return (
    <ChildWrapper>
      {photos.map((photo) => (
        <p key={photo.id} onClick={handleClick1}>
          테스트
        </p>
      ))}
    </ChildWrapper>
  );
};

const ChildWrapper = styled.div`
  width: 45%;

  padding: 10px;
`;

export default ChildComponentTwo;

ChildComponentTwo의 경우 일반적인 함수이다. 

ChildComponentOne과 ChildComponentTwo는 비교군이다. 

 

const ParentsComponents = () => {
  const [text, setText] = useState("");
  const [photos, setPhotos] = useState([]);

  useEffect(() => {
    fetch("https://jsonplaceholder.typicode.com/photos")
      .then((response) => response.json())
      .then(setPhotos);
  }, [setPhotos]);

  return (
    <div>
      <input value={text} onChange={(e) => setText(e.currentTarget.value)} />

      <Wrapper>
        <ChildComponentOne photos={photos} />
        <ChildComponentTwo photos={photos} />
      </Wrapper>
    </div>
  );
};

마지막으로 리렌더링을 발생시키기 위한 input과 각 컴포넌트를 호출시켜주는 ParentsComponent이다.

 

정리하면 

ParentsComponent에서 text라는 State를 변경시키면 

자식 컴포넌트인 ChildComponentOne과 ChildComponentTwo는 리렌더링이 발생한다. 

 

이때, useCallback이 과연 리렌더링의 성능에 영향을 주는지 확인해봤다. 

몇가지 더 예시가 있지만 결과적으로 큰 차이는 없었다. 

 

물론 더 좋은 비교 방식이 있을 수 있지만 당장 눈에 보이는 비교 방식으로는 차이를 발견하지 못했다. 

 

결과 

useCallback을 남용을 한 컴포넌트와 일반 함수를 사용한 컴포넌트를 비교했을 때,

Profiler를 사용한 렌더링 속도 차이는 비교할 수 없었다. 

 

후기 

이런 방식으로 비교하는 것이 맞는지는 모르겠다. 

하지만 지금 내가 알고있는 비교 방식으로는 차이가 없다는 결과가 나왔다. 

 

이 외에도 다양한 시도 방법이 떠오르면 다시 한번 비교를 해보겠다. 

반응형
저작자표시 비영리 변경금지 (새창열림)

'React > 실험실' 카테고리의 다른 글

[React] 제어 컴포넌트 vs 비제어 컴포넌트  (0) 2022.11.03
[React] useMemo vs useRef  (0) 2022.11.02
[React] React와 Canvas를 사용해서 움직이는 공 만들기  (1) 2022.10.20
[React] React Query - 기존 상태 관리 라이브러리의 단점  (0) 2022.10.17
[React] Redux와 TypeScript 함께 사용하기  (1) 2022.10.12
'React/실험실' 카테고리의 다른 글
  • [React] 제어 컴포넌트 vs 비제어 컴포넌트
  • [React] useMemo vs useRef
  • [React] React와 Canvas를 사용해서 움직이는 공 만들기
  • [React] React Query - 기존 상태 관리 라이브러리의 단점
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    타입스크립트
    리액트
    식물
    영어회화
    typescript
    네이버 부스트캠프
    덤프
    Node.js
    react
    ReactNative
    리얼학습일기
    CSS
    Babel
    영어독학
    next.js
    프로그래머스
    redux
    javascript
    네트워크
    다이소
    알고리즘
    타일러영어
    바질 키우기
    리얼클래스
    바질
    자바스크립트
    Docker
    ChatGPT
    CCNA
    webpack
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[React] useCallback의 남용
상단으로

티스토리툴바