코드 최적화 확인 방법
1. 코드를 보고 파악하기 (정적 분석)
2. 프로그램을 활용하여 파악하기 (동적 분석)

날짜 변경 버튼을 누르면 setState(상태변화함수)가 실행되고, state가 변경되어 Home 컴퍼넌트가 리랜더링됨
React.memo
const ControlMenu = React.memo(({ value, onChange, optionList }) => {
return (
<select
className="ControlMenu"
value={value}
onChange={(e) => onChange(e.target.value)}
>
{optionList.map((it, idx) => (
<option key={idx} value={it.value}>
{it.name}
</option>
))}
</select>
);
});
...
return (
<div className="DiaryList">
<div className="menu_wrapper">
<div className="left_col">
<ControlMenu
value={sortType}
onChange={setSortType}
optionList={sortOptionList}
/>
<ControlMenu
value={filter}
onChange={setFilter}
optionList={filterOptionList}
/>
</div>
<div className="right_col">
<MyButton
type={"positive"}
text={"새 일기쓰기"}
onClick={() => navigate("/new")}
></MyButton>
</div>
</div>
...
)
필터값이 변경되면 DiaryList의 state가 변경되기 때문에, 자식 컴퍼넌트인 DiaryItem 컴퍼넌트로 리랜더링됨
// DiaryList.js
const DiaryList = ({ diaryList }) => {
const navigate = useNavigate();
const [sortType, setSortType] = useState("lastest");
const [filter, setFilter] = useState("all");
...
import { useNavigate } from "react-router-dom";
import React, { useContext } from "react";
import { DiaryDispatchContext } from "./../App.js";
import MyButton from "./MyButton";
...
export default React.memo(DiaryItem);
일기 내용 변경 시, DiaryEditor.js의 content state가 변경됨 -> 자식 컴퍼넌트인 EmotionItem도 리랜더링됨
// EmotionItem.js
import React from "react";
...
export default React.memo(emotionItem);
위와같이 React.memo로 묶어주었음에도 계속 리랜더링됨.
// DiaryEditor.js
import { useState, useRef, useContext, useEffect, useCallback } from "react";
// 감정상태 변화 함수 따로 빼기
const handleClickEmote = useCallback((slctEmotionId) => {
setslctEmotionId(slctEmotionId);
}, []);
return (
<section>
<h4>오늘의 감정</h4>
<div className="input_box emotion_list_wrapper">
{emotionList.map((it) => (
<EmotionItem
key={it.emotion_id}
{...it}
// callBack안에서 또 useCallback을 사용할 수 없어서 함수를 따로 생성해서 빼내기
onClickFunc={handleClickEmote}
isSelected={it.emotion_id === slctEmotionId}
/>
))}
</div>
</section>
)