[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 활용하기
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (727)
      • 스마트팜 (1)
      • 상품 추천 (223)
      • DataBase (0)
        • MongoDB (4)
        • PostgreSQL (0)
      • 하드웨어 (18)
      • 일기장 (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)
  • 인기 글

  • 태그

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

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

티스토리툴바