React Academy · 강의

다시 렌더링을 제한하도록 컨텍스트 나누기

자주 변경되는 값과 안정적인 값을 서로 다른 컨텍스트로 분리합니다.

레슨 1/413개 단계

다시 렌더링을 제한하도록 컨텍스트 나누기은(는) CoddyKit의 무료 React Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 React Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

환영합니다

이 레슨에서는 컨텍스트 값의 일부만 변경될 때 불필요한 재렌더링을 줄이도록 React 컨텍스트를 별도의 프로바이더로 나누는 방법을 배웁니다.

컨텍스트의 재렌더링 문제

useContext(MyCtx)를 호출하는 모든 컴포넌트는 컨텍스트 값의 ANY 부분이 변경될 때 재렌더링됩니다. 자신이 사용하는 부분이 변경되지 않았더라도 마찬가지입니다. 하나의 큰 컨텍스트는 불필요한 재렌더링을 많이 일으킬 수 있습니다.

업데이트 빈도에 따른 분리

자주 변경되는 값과 거의 변경되지 않는 값을 분리합니다. 각 그룹을 자체 컨텍스트에 배치합니다. 소비자는 필요한 컨텍스트에만 구독합니다.
const ThemeCtx = createContext('light');
const UserCtx = createContext(null);
// theme changes rarely; user changes on login/logout — same frequency is fine
// but notifCount changes every second — split it out!

데이터와 디스패치 컨텍스트 분리

일반적인 패턴은 상태 데이터를 위한 컨텍스트(변경될 때마다 재렌더링)와 디스패치 또는 설정 함수를 위한 컨텍스트(안정적이며 소비자를 재렌더링하지 않음)로 나누는 것입니다. 디스패치만 사용하는 소비자는 데이터가 변경되어도 재렌더링되지 않습니다.
const CountCtx = createContext(0);
const SetCountCtx = createContext(() => {});

function Provider({ children }) {
  const [count, setCount] = useState(0);
  return (
    <CountCtx.Provider value={count}>
      <SetCountCtx.Provider value={setCount}>
        {children}
      </SetCountCtx.Provider>
    </CountCtx.Provider>
  );
}

디스패치 컨텍스트 메모이제이션

useState의 설정 함수는 안정적이므로 모든 렌더링에서 동일한 참조를 유지합니다. 따라서 디스패치 컨텍스트 값은 변경되지 않습니다. 하지만 동작 객체를 계산한다면 useMemo로 감싸십시오.
const actions = useMemo(() => ({
  increment: () => setCount(c => c + 1),
  reset: () => setCount(0),
}), []); // stable — empty deps

중첩된 프로바이더

컴포넌트 트리에서 여러 프로바이더를 중첩합니다. 소비자는 필요한 특정 컨텍스트만 가져와 사용하므로 구독 범위를 좁게 유지할 수 있습니다.
function App() {
  return (
    <AuthProvider>
      <ThemeProvider>
        <NotificationsProvider>
          <Router />
        </NotificationsProvider>
      </ThemeProvider>
    </AuthProvider>
  );
}

분리 전 프로파일링

컨텍스트를 분리하기 전에 항상 React DevTools로 프로파일링하십시오. 불필요한 재렌더링은 비용이 클 때만 문제가 됩니다. 재렌더링이 빠른 컨텍스트를 과도하게 설계하지 마십시오.

컨텍스트 분리의 절충점

컨텍스트가 많아지면 컴포넌트 트리에 프로바이더도 많아집니다. 이로 인해 인지 부담이 늘어납니다. 미리 분리하지 말고, 프로파일링에서 성능 문제가 확인될 때만 분리하십시오.

React.memo와 결합

컨텍스트가 하나뿐이어도 비용이 큰 자식 컴포넌트를 React.memo로 감싸면 props가 변경될 때만 재렌더링됩니다. 컨텍스트가 변경될 때는 재렌더링되지 않습니다. 이는 분리보다 간단한 대안이 될 수 있습니다.
const ExpensiveChild = React.memo(function({ label }) {
  return <div>{label}</div>;
}); // won't re-render on context change if label hasn't changed

useReducer + Context

복잡한 상태를 관리하려면 useReducer를 컨텍스트와 함께 사용합니다. 한 컨텍스트에는 상태를 저장하고 다른 컨텍스트에는 디스패치 함수를 저장합니다. 디스패치는 안정적이며 상태는 각 동작마다 업데이트됩니다.

빠른 확인

상태와 디스패치를 별도의 컨텍스트로 나누면 성능이 향상되는 이유는 무엇입니까?

복습

업데이트 빈도에 따라 컨텍스트를 나눕니다. 자주 변경되는 상태는 한 컨텍스트에, 안정적인 디스패치 및 설정 함수는 다른 컨텍스트에 배치합니다. 먼저 프로파일링하고, 실제로 필요할 때만 분리하며, 더 간단한 대안으로 React.memo를 고려하십시오.

다음 학습

다음 레슨: **useMemo로 컨텍스트 값 메모이제이션하기** — 컨텍스트 값 객체를 useMemo로 감싸 변경되지 않은 데이터로 인해 소비자가 재렌더링되지 않게 합니다.
무료로 시작

AI 튜터와 함께 React을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
88
레슨
324

자주 묻는 질문

“다시 렌더링을 제한하도록 컨텍스트 나누기” 강의는 무료인가요?

네 — “다시 렌더링을 제한하도록 컨텍스트 나누기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 React Academy 강의 전체를 잠금 해제할 수 있습니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“다시 렌더링을 제한하도록 컨텍스트 나누기”에서 뭘 배우나요?

자주 변경되는 값과 안정적인 값을 서로 다른 컨텍스트로 분리합니다. 브라우저에서 직접 실행하는 실습 코드로 React Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

React Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 React Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“다시 렌더링을 제한하도록 컨텍스트 나누기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 React Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 React Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 다시 렌더링을 제한하도록 컨텍스트 나누기
  2. useMemo로 컨텍스트 값 메모이제이션하기
  3. 컨텍스트 선택기 패턴
  4. 컨텍스트를 사용하지 말아야 할 때
← React Academy(으)로 돌아가기