[React] 성능 측정하기

2022. 10. 28. 13:06·React/기능
반응형

React 성능을 측정할 수 있는 Profiler라는 도구가 있다. 

 

사용하기 위해선 크롬에서는 React Developer Tools라는 익스텐션을 설치해야 한다. 

https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=ko 

 

React Developer Tools

Adds React debugging tools to the Chrome Developer Tools. Created from revision 336ac8ceb on 7/13/2022.

chrome.google.com

 

설치하고 React 프로젝트를 실행해서 개발자 도구를 들어가면 

다음과 같이 Profiler가 있다. 

 

Profiler를 사용해서 컴포넌트의 렌더링에 걸리는 시간을 확인할 수 있다. 

 

렌더링하면 가장 먼저 떠오르는 React.memo를 사용하는 경우와 사용하지 않는 경우의 차이를 

비교해보았다. 

 

import { useEffect, useState } from "react";
import styled from "styled-components";
import ChildComponentOne from "./ChildComponentOne";
import ChildComponentTwo from "./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 style={{ display: "flex", justifyContent: "space-between" }}>
        <ChildComponentOne photos={photos} />
        <ChildComponentTwo photos={photos} />
      </Wrapper>
    </div>
  );
};

const Wrapper = styled.div`
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;

  width: 100%;
`;

export default ParentsComponents;

먼저 최상위 부모 컴포넌트로 렌더링에 유의미한 시간을 확인하기 위해서 

fetch로 많은 데이터를 받아와서 각 컴포넌트에 넘겨준다. 

 

리렌더링을 발생시키기 위해서 input에서 State를 변경할 수 있게 만들었다. 

 

// ChildComponentOne 
import React from "react";
import styled from "styled-components";

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

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

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

  padding: 10px;
`;

export default React.memo(ChildComponentOne);

React.memo를 사용한 컴포넌트 비교군이다. 

photos는 처음 fetch를 통해서만 변경되므로 계획대로라면 React.memo를 사용해서

리렌더링이 발생하면 안된다.

 

// ChildComponentTwo 
import styled from "styled-components";

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

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

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

  padding: 10px;
`;

export default ChildComponentTwo;

React.memo를 사용하지 않은 컴포넌트이다. 

그러므로 부모 컴포넌트가 리렌더링되면 예상대로라면 자식 컴포넌트로 리렌더링이 발생해야 한다. 

 

React.memo를 사용한 컴포넌트와 사용하지 않은 컴포넌트가 확실하게 비교가 가능하다. 

memo를 사용한 컴포넌트를 리렌더링이 발생하지 않고 사용한 컴포넌트를

리렌더링이 발생하는 것을 볼 수 있다.

 

 

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

'React > 기능' 카테고리의 다른 글

[React] useCallback 그리고 React.memo  (0) 2022.10.27
[React] useRef 그리고 useState  (1) 2022.10.26
[React] Map을 State로 사용하기  (0) 2022.10.25
[React] 컴포넌트 합성  (1) 2022.10.21
[React] react-router-dom 사용하기  (1) 2022.10.05
'React/기능' 카테고리의 다른 글
  • [React] useCallback 그리고 React.memo
  • [React] useRef 그리고 useState
  • [React] Map을 State로 사용하기
  • [React] 컴포넌트 합성
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (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)
  • 태그

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

티스토리툴바