프론트엔드 첫걸음

성능개선 - useMemo 로 데이터 저장 본문

개발 공부/React

성능개선 - useMemo 로 데이터 저장

차정 2022. 8. 4. 16:43

App.js

import React, { useState, useCallback } from 'react';

import Button from './components/UI/Button/Button';
import DemoOutput from './components/Demo/DemoOutput';
import './App.css'

function App() {
  const [listTitle, setListTitle] = useState('My List');
  
  const changeTitleHandler = useCallback(() => {
  	setListTitle('New Title')
  }, []);

  
  return (
    <div className="app">
      <DemoList title={listTitle} items={ [5, 3, 1, 10, 9] }/>
      <Button onClick={changeTitleHandler}> Change List Title! </Button>
    </div>
  )

}

 

DemeList.js

import React , { useMemo } from 'react'
import classes from './DemoList.module.css'

const DemoList = (props) = {
  const sortedList = props.items.sort((a,b)=> a - b);
  
  return (
    <div className={classes.list}>
      <h2>{props.title}</h2>
      <ul>
        {sortedList.map((item)=>{
           <li key={item}>{item}</li>
         })
      </ul>
    <div>
  
  )
}

export default React.memo(DemoList);

 

Title이 바뀔때마다 sort 다시되는 것 고치고 싶어서 DemoList를 리액트메모로 감싸줬지만 -

DemoList에 props로 주는 배열은 객체이기때문에 부모컴포넌트 App이 재실행되면 메모리상에서 다른 위치에 새로 생성된다.
따라서 새로운 배열이 props로 전달되어 DemoList는 매번 다시 재정렬된다. 

sort는 성능집약적 작업이다. [5 ,3, 1, 10, 9] 라는 같은 배열이 전달됐는데, 같은 배열로 매번 sort 되는 것은 비효율적이다.

 

 

useMemo 사용 

 

App.js

App 에서 배열을 useMemo를 사용해 넘긴다.

  <DemoList title={listTitle} items={ useMemo(() => [5, 3, 1, 10, 9] ,[])}/>

 

함수 외부로 빼와서 useMemo로 호출한 결과를 listItems에 저장하도록 함

import React, { useState, useCallback } from 'react';

import Button from './components/UI/Button/Button';
import DemoOutput from './components/Demo/DemoOutput';
import './App.css'

function App() {
  const [listTitle, setListTitle] = useState('My List');
  
  const changeTitleHandler = useCallback(() => {
  	setListTitle('New Title')
  }, []);

  const listItems = useMemo(() => [5, 3, 1, 10, 9] ,[]);
  
  return (
    <div className="app">
      <DemoList title={listTitle} items={ listItems }/>
      <Button onClick={changeTitleHandler}> Change List Title! </Button>
    </div>
  )

}

 

DemoList.js

DemoList 내에서 useMemo를 사용해 기존의 props의 item 으로 정렬한 리스트를 저장해놓고, 사용한다. 

import React , { useMemo } from 'react'
import classes from './DemoList.module.css'

const DemoList = (props) = {
  const { item } = props; //구조분해할당
  const sortedList = useMemo (()=> {
    return items.sort((a,b)=> a - b);
  
  },[item])
  return (
    <div className={classes.list}>
      <h2>{props.title}</h2>
      <ul>
        {sortedList.map((item)=>{
           <li key={item}>{item}</li>
         })
      </ul>
    <div>
  
  )
}

export default React.memo(DemoList);