이미 계산 해본 연산 결과를 기억 해 두었다가 동일한 계산을 시키면, 다시 연산하지 않고 기억해 두었던 데이터를 반환 시키게 하는 방법
연산 과정을 최적화한다.
일기의 감정점수의 통계치를 구하는 함수를 통해 Memoiation기법을 사용할 것이다.
const getDiaryAnalysis = () => {
console.log("일기 분석 시작");
const goodCount = data.filter((it) => it.emotion >= 3).length;
const badCount = data.length - goodCount;
const goodRatio = (goodCount / data.length) * 100;
return { goodCount, badCount, goodRatio }
}
getDiaryAnalysis()
함수는 각 계산한 값을 객체 형태로 리턴을 한다.
const { goodCount, badCount, goodRatio } = getDiaryAnalysis();
호출을 하면서 리턴한 값을 비구조 할당을 통해 변수에 담는다.
return (
<div className="App">
<Lifecycle />
<DiaryEditor onCreate={onCreate} />
<div>전체 일기 : {data.length}</div>
<div>기분 좋은 일기 개수 : {goodCount}</div>
<div>기분 나쁜 일기 개수 : {badCount}</div>
<div>기분 좋은 일기 비율 : {goodRatio}</div>
<DiaryList onRemove={onRemove} diaryList={data} onEdit={onEdit} />
</div>
);
브라우저 화면에 나타나게 된다.
useMemo(콜백함수, []);
import { useMemo, useEffect, useRef, useState } from 'react';
const getDiaryAnalysis = useMemo(
() => {
console.log("일기 분석 시작");
const goodCount = data.filter((it) => it.emotion >= 3).length;
const badCount = data.length - goodCount;
const goodRatio = (goodCount / data.length) * 100;
return { goodCount, badCount, goodRatio }
}, [data.length]
);
useMemo()
를 사용하면 Memoization기법을 사용 할 수 있다.useMemo()
는 콜백 함수의 retrun값을 반환한다.useMemo()
의 두번째 매개변수인 []배열
의 값이 변화하게 되면 콜백함수를 호출을 한다.[]
안에 있는 값이 변화를 하게 된다는 순간에만 getDiaryAnalysis
의 값을 변경하고, 그 이외의 상황에서는 반환한 값을 기억해, App.js가 리렌더링 되어도, 리렌더링을 하지 않는다.const { goodCount, badCount, goodRatio } = getDiaryAnalysis;
useMemo()
을 이용하게 되면 useMemo()
의 콜백함수의 return값
을 변수에 할당
하는 형태가 된다.객체 값을 가진 변수
로서 할당을 해줘야 제대로 작동을 한다.data.length
가 변화하지 않는 상황에서 App.js가 리렌더링 될때에는data.length
가 변화할때만, getDiaryAnalysis의 useMemo의 콜백함수가 호출된다.