React에서 연산 비용이 크거나 불필요하게 반복될 수 있는 계산은 useMemo를 통해 최적화할 수 있다. 이 글에서는 useMemo를 사용한 코드와 사용하지 않은 코드를 직접 비교하면서 어떤 차이가 있는지 명확하게 설명한다.
function TodoStats({ todos }) {
const doneCount = todos.filter((todo) => todo.isDone).length;
console.log("✅ 계산됨");
return <div>완료된 항목: {doneCount}</div>;
}
이 코드는 todos 외의 다른 상태 변경이 있어도, 예를 들어 검색어 입력 등으로 렌더링이 발생하면 doneCount 계산이 매번 실행된다.
import { useMemo } from "react";
function TodoStats({ todos }) {
const doneCount = useMemo(() => {
console.log("✅ 계산됨 (useMemo)");
return todos.filter((todo) => todo.isDone).length;
}, [todos]);
return <div>완료된 항목: {doneCount}</div>;
}
이 코드는 todos가 바뀌었을 때만 doneCount를 다시 계산한다. 즉, 불필요한 상태 변화에는 계산을 생략하고 이전 값을 재사용한다.
항목useMemo 사용 XuseMemo 사용 O
계산 조건 | 매 렌더링마다 계산 | 의존성(todos) 변경 시에만 계산 |
성능 | 불필요한 연산 발생 | 연산 최소화 가능 |
코드 명확성 | 계산이 항상 실행됨 | 계산 조건을 명확히 드러냄 |
단, 모든 계산에 useMemo를 남용하면 오히려 가독성을 해칠 수 있으므로, 성능에 민감한 부분만 선택적으로 적용하는 것이 좋다.
useMemo는 React 컴포넌트에서 불필요한 연산을 방지하고 성능을 최적화할 수 있는 유용한 도구다. 리스트 필터링, 통계 계산처럼 연산량이 커질 수 있는 경우라면, 꼭 한 번 useMemo 적용을 고려해보자.
React - useContext를 사용하기 전과 후의 구조 비교 (0) | 2025.06.08 |
---|---|
React - useCallback을 활용한 함수 최적화 전략 (0) | 2025.06.07 |
React - useState를 useReducer로 대체하는 간단 예제 (0) | 2025.06.05 |
React - props 전달 방식의 차이: `{...todo}` vs `todo={todo}` (0) | 2025.06.05 |
React - useEffect를 이용한 컴포넌트 라이프사이클 제어 정리 (1) | 2025.06.05 |