<aside> 💡 **세부 목표

현재 일기 데이터를 분석하는 함수를 제작하고 해당 함수가 일기 데이터의 길이가 변화하지 않을 때 값을 다시 계산하지 않도록 하기

</aside>

Untitled

사용될 hook

userMemo

해당 함수는 App.js 에 일부를 가져온 것인데 이 함수가 한 번만 실행되는 게 아니라 App.js가 rerender 되는 순간에도 계속 실행되기에 불필요한 실행이 반복된다.

또한, 일기를 수정할 때는 감정을 변화 시킬 수도 없는데도 해당 함수가 실행된다.

이를 해결하기 위해선 useMemo를 사용한다!

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 };
  };

  const { goodCount, badCount, goodRatio } = getDiaryAnalysis();

Untitled

💡 useMemo 사용하기

최적화 위한 함수에 useMemo를 이용해 해당 함수를 감싸주고 감싸준 함수 뒤 dependency array에 어떤 값이 변화할 때만 이 연산을 다시 수행 할 지를 명시하여 연산 최적화를 할 수 있다.

→ 아래에서는 data.length가 변화할 때만 해당 함수 수행함

주의할 사항은 useMemo를 사용할 시 해당 함수는 더 이상 함수가 아니라 값이 된다. 그러므로 어디선가 호출할 때 함수처럼 호출하면 X

또한, 함수 그 자체를 prop으로 줘야하는 경우도 사용하면 안됨 값으로 반환되기 때문에

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]);

  const { goodCount, badCount, goodRatio } = getDiaryAnalysis;