React.memo와 성능 개선

2025. 8. 25. 01:02·문제 해결

1. 렌더링과 성능

  • 렌더링이란?
    • 화면을 그리는 함수가 실행되어, 화면을 그리기 위한 계산이 수행되는 과정
  • 렌더링 성능 최적화란?
    • 함수 내부 로직 실행 시간 최소화
    • 함수 호출 횟수 최소화 (👈🏻 React.memo 의 역할) = 불필요한 리렌더링 최소화
      • [ 리렌더링 발생 조건 ]
        • 부모 컴포넌트가 리렌더링 될 때
        • 부모 컴포넌트에서 전달받는 Props가 변경될 때 (부모 컴포넌트의 리렌더링을 전제로 함)
        • 자신의 State가 변경될 때
        • Provider로 감싼 컴포넌트의 경우, Context 값이 변경될 때
        • 등등

 

2. React.memo란?

: 리액트의 렌더링 성능 최적화 도구

부모 컴포넌트가 리렌더링 되었지만 Prop에 변경이 없는 경우, 자식 컴포넌트는 리렌더링 되지 않도록 한다.

= 변경 사항이 없는, 화면의 일부 또는 전체를 불필요하게 다시 그리지 않는다.

  • Prop에 변경이 없다: 함수의 input이 동일하다.
  • React의 철학: 함수의 input이 동일하면, 함수의 output이 동일하다. (purity 개념)

 

3. 서비스 내 활용 사례

채팅방 내 불필요한 리렌더링 방지 > 성능 개선

  • 문제 상황:
    • 1) 채팅 메시지를 빠르게 많이 연속적으로 타이핑 할 수록,
    • 2) 기존 채팅 메시지의 양이 많은 채팅방일 수록 앱의 성능이 악화됨
  • 문제 원인:
    1. 채팅 메시지 입력값이 바뀔 때 마다, 해당 컴포넌트의 자식 컴포넌트인 채팅 리스트 컴포넌트가 리렌더링 됨
    2. 채팅 리스트 컴포넌트는 리렌더링 될 때마다, 최대 21 ViewPort에 해당하는 데이터를 리렌더링하는 무거운 연산을 수행함 🧨
  • 개선 방안: React.memo를 채팅 리스트 컴포넌트에 적용하여 Prop이 바뀌지 않는다면, 부모 컴포넌트가 리렌더링되어도(e.g. 메시지 입력값에 의한 리렌더링) 채팅 리스트 컴포넌트는 리렌더링 되지 않도록 함

 

4. 다른 성능 최적화 도구와의 차이점

React.memo vs useMemo

  • React.memo
    • 재사용 대상: 렌더링 된 화면 또는 화면의 일부
    • 재사용 기준: 컴포넌트의 Prop이 이전 렌더링 시와 동일하다 판단되는 경우
    • ‘동일하다’의 판단 기준: 이전 렌더링 시의 Prop 값과 현재 Prop 값에 대해 얕은 비교를 수행
  • useMemo
    • 재사용 대상: 함수의 계산 결과
    • 재사용 기준: useMemo의 의존성 배열 값이 이전 렌더링 시와 동일하다 판단되는 경우
    • ‘동일하다’의 판단 기준: 이전 렌더링 시의 의존성 배열 값과 현재 의존성 배열의 값에 대해 얕은 비교를 수행 
      • 얕은 비교: 실제 내용이 같은지 확인하지 않고, 참조만 같으면 같다고 판단
      • 얕은 비교에 의해 문제가 될 수 있는 상황: 객체, 배열, 함수 등의 참조형을 의존성 배열의 값으로 가지는 경우, 참조는 동일한데 내용이 바뀌었을 때, 이전의 계산 결과를 재사용하는 것이 문제가 될 수 있음 (바뀐 내용에 의해 계산 결과가 달라져서)

'문제 해결' 카테고리의 다른 글

티스토리 다크모드 + 복붙 시 스타일 적용 안되는 문제 해결하기  (0) 2025.02.24
'문제 해결' 카테고리의 다른 글
  • 티스토리 다크모드 + 복붙 시 스타일 적용 안되는 문제 해결하기
c_jm
c_jm
  • c_jm
    c_jm
    c_jm

    🎋 어제보다 발전한 오늘

  • 전체
    오늘
    어제
    • 분류 전체보기 (36)
      • 프로젝트 (6)
      • 백준 문제풀이 (19)
      • 프로그래머스 문제풀이 (4)
      • 공부 (1)
      • 문제 해결 (2)
      • 기타 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    reverse proxy
    티스토리 다크모드
    홈서버
    리버스 프록시
    다크모드
    docker-compose
    docker-compose.yml
    인라인 css
    코드블럭
    nginx
    백준 #1152 #c++
    도커
    복붙
    docker
    도커컴포즈
    글자색
    html
    jquery
    리버스 프록시 서버
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
c_jm
React.memo와 성능 개선
상단으로

티스토리툴바