[React 최적화] 메모이제이션 완벽 가이드 - useMemo, useCallback, React.memo 실전 활용법

2024. 11. 17. 10:43·TypeScript
반응형

소개

React 애플리케이션의 성능을 최적화하는 방법 중 가장 중요한 것이 메모이제이션(Memoization)입니다. 메모이제이션은 이전에 계산한 값을 재사용하여 불필요한 렌더링과 계산을 방지하는 기술입니다. 이번 글에서는 React의 메모이제이션 도구들을 자세히 살펴보겠습니다.

React.memo

React.memo는 컴포넌트 자체를 메모이제이션하는 고차 컴포넌트(HOC)입니다.

// 기본 사용법
const MemoizedComponent = React.memo(function MyComponent(props) {
  return (
    <div>
      <h2>{props.name}</h2>
      <p>{props.description}</p>
    </div>
  );
});

// 커스텀 비교 함수 사용
const MemoizedWithCustomCompare = React.memo(MyComponent, (prevProps, nextProps) => {
  return prevProps.name === nextProps.name;
  // description이 변경되어도 리렌더링하지 않음
});

useMemo

useMemo는 계산 비용이 많이 드는 값을 메모이제이션합니다.

// 고비용 계산의 결과를 메모이제이션
const memoizedValue = useMemo(() => {
  return expensiveCalculation(count * 2);
}, [count]); // count가 변경될 때만 재계산

// 객체 메모이제이션
const memoizedObject = useMemo(() => ({
  id: props.id,
  name: props.name
}), [props.id, props.name]);

useCallback

useCallback은 함수를 메모이제이션하여 불필요한 재생성을 방지합니다.

// 이벤트 핸들러 메모이제이션
const handleClick = useCallback(() => {
  console.log('Button clicked:', count);
}, [count]); // count가 변경될 때만 함수 재생성

// 자식 컴포넌트에 전달하는 콜백 메모이제이션
const handleSearch = useCallback((searchTerm: string) => {
  setResults(items.filter(item => item.includes(searchTerm)));
}, [items]);

실제 사용 예제

실제 애플리케이션에서 메모이제이션을 활용하는 예제를 살펴보겠습니다.

function ExpensiveList({ items, onItemClick }) {
  // 아이템 필터링 결과 메모이제이션
  const filteredItems = useMemo(() => {
    return items.filter(item => item.active);
  }, [items]);

  // 클릭 핸들러 메모이제이션
  const handleClick = useCallback((id: string) => {
    onItemClick(id);
  }, [onItemClick]);

  return (
    <ul>
      {filteredItems.map(item => (
        <ListItem
          key={item.id}
          item={item}
          onClick={() => handleClick(item.id)}
        />
      ))}
    </ul>
  );
}

// 리스트 아이템 컴포넌트 메모이제이션
const ListItem = React.memo(({ item, onClick }) => (
  <li onClick={onClick}>
    {item.name}
  </li>
));

메모이제이션 사용 시 주의사항

  1. 과도한 메모이제이션 피하기
    // 불필요한 메모이제이션 (단순 값)
    const simpleValue = useMemo(() => count + 1, [count]);
    // 대신 이렇게 사용
    const simpleValue = count + 1;
  2. 의존성 배열 관리
// 잘못된 의존성 배열
const memoizedValue = useMemo(() => {
  return data.filter(item => item.id === selectedId);
}, []); // selectedId가 변경되어도 업데이트되지 않음

// 올바른 의존성 배열
const memoizedValue = useMemo(() => {
  return data.filter(item => item.id === selectedId);
}, [data, selectedId]);

 

성능 측정

메모이제이션 적용 전후의 성능을 측정하는 방법입니다.

// React DevTools Profiler 사용
function ParentComponent() {
  const [renderCount, setRenderCount] = useState(0);

  console.time('render');
  useEffect(() => {
    console.timeEnd('render');
  });

  return (
    <MemoizedComponent 
      data={complexData}
      onUpdate={() => setRenderCount(prev => prev + 1)}
    />
  );
}

결론

메모이제이션은 React 애플리케이션의 성능을 최적화하는 강력한 도구입니다. React.memo, useMemo, useCallback을 적절히 활용하면 불필요한 렌더링을 방지하고 애플리케이션의 반응성을 향상시킬 수 있습니다. 하지만 모든 것을 메모이제이션하는 것은 오히려 성능을 저하시킬 수 있으므로, 실제 성능 측정을 통해 필요한 곳에만 적용하는 것이 중요합니다.

저작자표시 비영리 변경금지 (새창열림)

'TypeScript' 카테고리의 다른 글

3D 카드 플립 효과로 배우는 실전 Tailwind 활용법  (0) 2024.11.20
[Next.js 실전] Image 컴포넌트로 웹 성능 최적화하기  (0) 2024.11.18
데이터베이스 API 구현하기 : SQLite와 타입 안전성  (7) 2024.11.17
React에서 Tailwind CSS 활용하기  (1) 2024.11.15
React 프로젝트 구조 및 VSCode 확장 프로그램 추천  (4) 2024.11.14
'TypeScript' 카테고리의 다른 글
  • 3D 카드 플립 효과로 배우는 실전 Tailwind 활용법
  • [Next.js 실전] Image 컴포넌트로 웹 성능 최적화하기
  • 데이터베이스 API 구현하기 : SQLite와 타입 안전성
  • React에서 Tailwind CSS 활용하기
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (725)
      • 스마트팜 (0)
      • 상품 추천 (223)
      • MongoDB (4)
      • 하드웨어 (17)
      • 일기장 (4)
      • 파이썬 (130)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (51)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    unity
    codingtips
    셀레니움
    programming101
    appdevelopment
    list
    스크립트 실행
    스크립트 실행 순서
    파이썬
    카페24리뷰이관
    믈레코비타멸균우유
    ipcamera
    쇼핑몰리뷰
    C#
    programmerlife
    긴유통기한우유
    learntocode
    상품 리뷰 크롤링
    codingcommunity
    리스트
    카페24리뷰
    리뷰이관
    rtsp
    cv2
    라떼우유
    리뷰관리
    devlife
    스마트스토어리뷰
    Python
    유니티
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
[React 최적화] 메모이제이션 완벽 가이드 - useMemo, useCallback, React.memo 실전 활용법
상단으로

티스토리툴바