살아가는 이유_EU
내가 살아가는 이유, 삶
살아가는 이유_EU
전체 방문자
오늘
어제
  • 삶 (159)
    • 이유's EATERY (16)
      • 맛집 (10)
      • 까페 (4)
      • 맛있는 Recipe (1)
    • 이유's LIFE (16)
      • 국내여행 (5)
      • 해외여행 (2)
      • 운동 (1)
      • 취업정보 (0)
      • 끄적끄적 (5)
      • 일기쟝 (3)
      • 세상 이야기 (0)
      • 결혼 준비 (0)
    • 이유's Programming (43)
      • JavaScript (6)
      • Java (7)
      • C++ (0)
      • DBMS (24)
      • Spring (3)
      • til (1)
      • HTTP (2)
    • 이유's REVIEW (13)
      • BOOK (6)
      • PROGRAM or MOVIE (5)
      • PRODUCT 제품리뷰 (2)
    • 이유's STUDY (31)
      • 수업 관련 (2)
      • IT 시사 (2)
      • IT NEWS (2)
      • IVIEW (0)
      • IOS 앱 만들기 (0)
      • 알고리즘 문제풀이 (23)
      • PM data literacy (2)
    • 이유's ENGLISH (13)
      • Writing about something! (12)
      • Feedback (1)
      • TIL (0)
    • 이유's DB 공부 (1)
      • MySQL DB (0)
      • Postgre (1)
    • Computer 공부 (17)
      • Backend question (10)
      • Clean architecture (2)
      • Operating system (2)
      • Network (3)
      • 항해 (0)

블로그 메뉴

  • 홈
  • EATERY's 맛집
  • CAFE 까페
  • Recipe 레시피
  • IT 공부
  • 방명록
  • 태그

공지사항

인기 글

태그

  • 용인까페
  • have something to do with뜻
  • 자세요정
  • 어게인마이라이프
  • 맛집
  • memoziation
  • 스쿤브레드
  • 피지오필로소피
  • 흑임자 크림
  • React.memo
  • 묵리
  • 용인맛집
  • 파스타맛집
  • have something to do with
  • 아메리카토노
  • 현명하게 리액트
  • 스테이크
  • 고메커피
  • 삼돈식탁
  • 영어공부
  • map 하는 법
  • 자바스크립트
  • 인절미 티라미수
  • Array로 접근
  • 송계옥
  • go hand in hand
  • 고메동 카페
  • 렌더링 수 줄이기
  • 용인추천
  • key 로 접근

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
살아가는 이유_EU

내가 살아가는 이유, 삶

[ React -1 ] React.memo 를 사용하여 컴포넌트 성능 최적화하기 . / React.memo 사용할 때 그리고 사용하지 않을 때 팁 정리
이유's Programming/JavaScript

[ React -1 ] React.memo 를 사용하여 컴포넌트 성능 최적화하기 . / React.memo 사용할 때 그리고 사용하지 않을 때 팁 정리

2021. 1. 26. 10:39
728x90
반응형

유저들은 아주 작은 속도에도 굉장히 민감하게 반응을 합니다. 

 

100 ~300 의 정말 작은 초 단위도 느낄만큼 유저들은 서비스의 속도에 대해서 아주 민감하네요.

 

이런 UI 를 해결하기 위해서, React 는 higher order component 중 하나인 React.memo 를 제공합니다. 

 

 

1. React.memo() 에 대한 간략한 소개

 

React는 먼저 컴퍼넌트를 렌더링(rendering) 한 뒤, 이전 렌더된 결과와 비교하여 DOM 업데이트를 결정합니다.

 

만약 렌더 결과가 이전과 다르다면, React는 DOM을 업데이트하게 됩니다. 

 

React.memo() 로 감싸져있는 내용을, 리액트는 결과를 먼저 memoizing 하게 됩니다. 다음 렌더전에, 

 

props 의 결과가 똑같다면 react 는 memoizing 을 통해 다음 렌더링을 skipping 하게 됩니다. 

 

아래와 같은 예시를 살펴보시죠! 지금 여기서는 Movie 의 컴포넌트가 React.memo 로 감싸져 있습니다 .

 

export function Movie({ title, releaseDate }) {
  return (
    <div>
      <div>Movie title: {title}</div>
      <div>Release date: {releaseDate}</div>
    </div>
  );
}

export const MemoizedMovie = React.memo(Movie);

해당 내용은 Movie 의 컴포넌트가 React.memo 로 감싸져 있으면서 새로운 meomized 된 컴포넌트인

 

MemoizedMovie 를 return 해주게 됩니다. 

 

// First render. React calls MemoizedMovie function.
<MemoizedMovie 
  title="Heat" 
  releaseDate="December 15, 1995" 
/>

// On next round React does not call MemoizedMovie function,
// preventing rendering
<MemoizedMovie
  title="Heat" 
  releaseDate="December 15, 1995" 
/>

 

2. React.memo() 를 써야하는 케이스

 

리액트 메모를 쓸때를 간략하게 말씀 드리겠습니다. 먼저 도표에 있는 내용을 나열해볼께요. 

1)  함수형 컴포넌트를 사용할 때 ( pure functional component ) 

2 ) 렌더링이 자주 일어날 때 

3) 똑같은 props 로 렌더링이 계속 될 때 

3) 컴포넌트 사이즈의 내용이 중~ 큰 사이즈 이상일 때 

 

2.1 같은 props 로 렌더링이 자주 일어나는 컴포넌트 

위의 예시 중 정말 React.memo() 를 랩핑하는 것의 최고의 케이스는 똑같은 props 로

 

계속 렌더링이 일어난 케이스입니다. 

 

부모 컴포넌트로 받은 같은 props 가 계속 렌더링을 일으키는 상황인 것이죠. 

 

아래의 예시는 MovieViewsRealTime 이라는 부모 컴포넌트를 정의했습니다.

 

위의 부모 컴포넌트에서 title, releaseDate, views 를 넘겨주게 됩니다 .

function MovieViewsRealtime({ title, releaseDate, views }) {
  return (
    <div>
      <Movie title={title} releaseDate={releaseDate} />
      Movie views: {views}
    </div>
  );
}

그렇다면 렌더링은 Movie 와 전혀 상관없는 views 의 값이 변경이 될때도 계속해서 Movie 가 렌더링 될 것입니다. 

// Initial render
<MovieViewsRealtime 
  views={0} 
  title="Forrest Gump" 
  releaseDate="June 23, 1994" 
/>

// After 1 second, views is 10
<MovieViewsRealtime 
  views={10} 
  title="Forrest Gump" 
  releaseDate="June 23, 1994" 
/>

// After 2 seconds, views is 25
<MovieViewsRealtime 
  views={25} 
  title="Forrest Gump" 
  releaseDate="June 23, 1994" 
/>

// etc

하지만 이의 경우는 아래와 같이 React.memo 를 이용하여 해결할 수 있습니다.

 

아까만든 memoized 된 컴포넌트인 MemoizedMovie 를 부모 컴포넌트에 넣어주면 렌더링을 훨씬 줄일 수 있습니다. 

function MovieViewsRealtime({ title, releaseDate, views }) {
  return (
    <div>
      <MemoizedMovie title={title} releaseDate={releaseDate} />
      Movie views: {views}
    </div>
  )
}

또한 memo 사용하기 전에 꿀팁인 profiler 을 이용해서 컴포넌트를 줄일 수 있습니다 .

 

reactjs.org/docs/optimizing-performance.html#profiling-components-with-the-chrome-performance-tab 

3. 언제 React.memo() 를 사용하지 말아야 할까

만약 위에서 언급한 상황에 일치하지 않는다면 메모이제이션을 사용하지 않는 것이 좋습니다. 

 

성능 관련 변경이 잘못 적용 된다면 성능이 오히려 악화될 수 있다. React.memo()  를 현명하게 사용하라. 

3.1 쓸모없는 props 의 비교 

컴포넌트가 다른 props 를 가지고 렌더링을한다고 생각해 본다면,

 

이 경우에는 memoization 이 오히려 이점을 얻어가기가 어렵습니다. 

 

props 가 자주 변하는 컴퍼넌트를 React.memo() 로 맵핑할지라도 React 는 두가 지 작업을 리렌더링 할 때마다

 

렌더링을 해당 작업을 수행할 것입니다. 

 

  • 이전 props와 다음 props의 동등 비교를 위해 비교 함수를 수행한다.
  • 비교 함수는 거의 항상 false를 반환할 것이기 때문에, React는 이전 렌더링 내용과 다음 렌더링 내용을 비교할 것이다.

 

해당 비교함수의 내용은 대부분 false 를반환하기에 props 비교는 불필요하게 됩니다. 

 

 

 

참고 사이트 : ui.toast.com/weekly-pick/ko_20190731#3-%EC%96%B8%EC%A0%9C-reactmemo%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80-%EB%A7%90%EC%95%84%EC%95%BC-%ED%95%A0%EA%B9%8C

 

React.memo() 현명하게 사용하기

유저들은 반응이 빠른 UI를 선호한다. 100ms 미만의 UI 응답 지연은 유저들이 즉시 느낄 수 있고, 100ms에서 300ms가 지연되면 이미 유저들은 상당한 지연으로 느낀다. UI 성능을 증가시키기 위해, React

ui.toast.com

원본 내용 : dmitripavlutin.com/use-react-memo-wisely/ 

 

Use React.memo() wisely

React.memo() increases the performance of functional components by preventing useless renderings. But such performance tweaks must be applied wisely.

dmitripavlutin.com

 

728x90
반응형
저작자표시 비영리 변경금지

'이유's Programming > JavaScript' 카테고리의 다른 글

함수형 프로그래밍에 대한 introduction / 선언형 프로그래밍/ 함수형 프로그래밍/ functional programming  (2) 2021.08.12
Redux 에서 Mobx 상태관리 도입기 - 참고  (0) 2021.03.23
[ 구글 채널 ] Scheduling Tasks - HTTP 203  (1) 2021.03.02
자바스크립트 MAP - array 는 배열로 관리하기. / array 를 key 로 접근  (0) 2021.01.23
5강 Class  (0) 2020.07.11
    '이유's Programming/JavaScript' 카테고리의 다른 글
    • Redux 에서 Mobx 상태관리 도입기 - 참고
    • [ 구글 채널 ] Scheduling Tasks - HTTP 203
    • 자바스크립트 MAP - array 는 배열로 관리하기. / array 를 key 로 접근
    • 5강 Class
    살아가는 이유_EU
    살아가는 이유_EU
    안녕하세요. 초보개발자의 일상을 담은 블로그입니다.

    티스토리툴바