State를 이동하여 리렌더링 최적화

발행: (2025년 12월 30일 오후 11:58 GMT+9)
3 분 소요
원문: Dev.to

Source: Dev.to

소개

성능을 향상하고 불필요한 재렌더링을 줄이는 한 가지 방법은 상태를 낮은 수준으로 옮기는 것입니다. 특히 해당 상태가 컴포넌트 트리의 특정 부분에만 영향을 미치는 경우에 유용합니다.

예를 들어, count 상태를 변경하는 버튼을 가진 부모 컴포넌트를 생각해 보세요. 이 상태 변경을 별도의 컴포넌트로 이동하면 전체 부모가 재렌더링되는 것을 방지할 수 있습니다.

문제 발생 전 (성능 이슈가 있는 경우)

import { useState } from 'react';
import { data } from '../../../../data';
import List from './List';

const App = () => {
  const [people, setPeople] = useState(data);
  const [count, setCount] = useState(0);

  return (
    
       setCount(count + 1)}
        style={{ marginBottom: '1rem' }}
      >
        count {count}
      
      
    
  );
};
export default App;

이 구성에서는 count 상태가 변경될 때마다 전체 App 컴포넌트(그리고 List 컴포넌트 포함)가 재렌더링되어 비효율적입니다.

Profiler Highlight

해결책: 카운터 버튼을 별도 Counter 컴포넌트로 이동

import { useState } from 'react';
import { data } from '../../../../data';
import List from './List';
import Counter from './Counter';

const App = () => {
  const [people, setPeople] = useState(data);

  return (
    
      
      
    
  );
};
export default App;

카운터 버튼을 자체 Counter 컴포넌트로 추출하면, 카운트가 변할 때 해당 컴포넌트만 재렌더링되고 나머지 UI는 영향을 받지 않습니다.

업데이트된 Counter 컴포넌트

import { useState } from 'react';

const Counter = () => {
  const [count, setCount] = useState(0);

  return (
     setCount(count + 1)}
      style={{ marginBottom: '1rem' }}
    >
      count {count}
    
  );
};

export default Counter;

React Profiler

React Profiler에서는 버튼을 클릭했을 때 Counter 컴포넌트만 재렌더링되고, List 컴포넌트나 그 자식 컴포넌트(예: Person)는 재렌더링되지 않는 것을 확인할 수 있습니다.

Profiler 스크린샷

Profiler Settings 1

Profiler Settings 2

Profiler Settings 3

Profiler Settings 4

Profiler Settings 5

요약

특정 UI 요소(예: 카운터 버튼)에만 영향을 주는 상태를 별도 컴포넌트로 분리하면 불필요한 재렌더링을 줄이고 성능을 향상시킬 수 있습니다.

Back to Blog

관련 글

더 보기 »

ReactJS 디자인 패턴 ~State 동시 배치~

Collocating State는 상태를 사용되는 위치에 최대한 가깝게 배치하는 것입니다. 이 패턴은 복잡성을 줄이고 컴포넌트를 더 쉽게 이해할 수 있게 합니다. Before...