프로그래밍/ReactJS

React Context API: 전역 상태 관리, 이제 더 이상 고민하지 마세요! 🚀

shimdh 2025. 9. 25. 09:50
728x90

안녕하세요, 리액트 개발자 여러분! 복잡한 컴포넌트 트리 사이에서 props를 일일이 전달하느라 지치셨나요? 아니면 테마, 사용자 인증 같은 전역 상태를 어떻게 효율적으로 관리해야 할지 막막하셨나요? 오늘 이 글을 통해 여러분의 고민을 한 방에 해결해 줄 React Context API의 모든 것을 알려드리겠습니다!


React Context API란 무엇인가요? 🤔

React Context API는 컴포넌트 트리의 모든 레벨을 통해 props를 전달할 필요 없이 애플리케이션 전체에서 전역 상태를 관리할 수 있게 해주는 강력한 기능입니다. 즉, "prop drilling" 이라고 불리는 번거로운 과정을 거치지 않고도, 여러 컴포넌트가 동일한 데이터에 쉽게 접근하고 업데이트할 수 있도록 돕는 도구입니다.

이는 특히 테마 변경, 사용자 로그인 정보 관리, 언어 설정 등 다양한 컴포넌트에서 공통적으로 사용해야 하는 데이터가 있을 때 빛을 발합니다. Context API를 사용하면 코드의 가독성유지보수성이 크게 향상되어, 개발 프로세스를 더욱 효율적으로 만들 수 있습니다.


728x90

Context의 기본 이해: Provider와 Consumer

Context를 효과적으로 사용하고 업데이트하는 방법을 알기 전에, Context가 어떻게 작동하는지 기본적인 개념을 이해하는 것이 중요합니다.

1. Context 생성: React.createContext()

React.createContext() 함수를 사용하여 Context를 생성합니다. 이 함수는 두 가지 핵심 컴포넌트를 반환합니다:

  • Provider 컴포넌트: Context의 변경 사항을 구독할 수 있도록 해주는 역할을 합니다. Provider는 value prop을 통해 자신의 자식 컴포넌트들에게 Context 값을 제공합니다.
  • Consumer 컴포넌트 (또는 Hooks): 현재 Context 값을 읽을 수 있도록 해줍니다. 최신 React에서는 useContext 훅을 사용하여 Context 값을 소비하는 것이 일반적이며, 훨씬 간결하고 편리합니다.

2. 값 전파: Prop Drilling 없이 자유롭게

Provider가 제공하는 값은 문자열, 숫자, 객체 등 모든 JavaScript 타입이 될 수 있습니다. 가장 중요한 점은, Provider에 의해 제공된 이 값은 해당 Provider의 자식 컴포넌트라면 그 어떤 컴포넌트라도 명시적인 prop drilling 없이 직접 이 값에 접근할 수 있다는 것입니다. 이는 마치 애플리케이션 내부에 공용 우체통 📮을 두는 것과 같아서, 필요한 컴포넌트는 언제든 우체통을 열어 필요한 정보를 가져갈 수 있습니다.


React Context를 효율적으로 업데이트하는 4단계 📝

이제 Context가 무엇인지 이해했다면, 애플리케이션 내에서 Context를 효과적으로 업데이트하는 구체적인 단계를 살펴보겠습니다.

1. Context 생성

가장 먼저 해야 할 일은 애플리케이션의 전역 상태를 관리할 새로운 Context를 만드는 것입니다.

// MyContext.js
import React from 'react';

const MyContext = React.createContext();

export default MyContext;

위와 같이 React.createContext() 함수를 사용하여 Context를 생성하고 내보냅니다. 이 Context는 Provider와 Consumer 두 가지 컴포넌트를 내부에 포함하고 있습니다.

2. 상태 관리 설정

다음으로, 이 Context를 제공할 상위 컴포넌트에서 상태 관리를 설정해야 합니다. 이는 일반적으로 React의 useState 훅을 사용하여 동적인 데이터를 저장하고 업데이트하는 방식으로 이루어집니다.

예를 들어, 테마를 관리하는 경우 'light' 또는 'dark'와 같은 테마 상태를 정의하고, 이 테마를 전환하는 함수를 만듭니다.

// ThemeProvider.js
import React, { useState } from 'react';
import MyContext from './MyContext'; // 위에서 생성한 Context

function ThemeProvider({ children }) {
  const [theme, setTheme] = useState('light'); // 테마 상태 정의

  const toggleTheme = () => {
    setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light'));
  };

  return (
    <MyContext.Provider value={{ theme, toggleTheme }}>
      {children}
    </MyContext.Provider>
  );
}

export default ThemeProvider;

여기서 ThemeProvider 컴포넌트는 Context 값을 제공하는 역할을 할 것입니다.

3. Provider를 통한 상태 제공

Provider 컴포넌트는 자식 컴포넌트들이 Context 값에 접근할 수 있도록 감싸주는 역할을 합니다. value prop을 통해 현재 상태와 상태를 업데이트하는 함수를 함께 전달하여, 하위 컴포넌트들이 단순히 값을 읽는 것뿐만 아니라 필요에 따라 상태를 변경할 수 있도록 합니다. 이렇게 하면 Context의 동적인 특성을 최대한 활용할 수 있습니다.

일반적으로 애플리케이션의 최상위 컴포넌트(App.js 등)에서 Provider로 전체 애플리케이션을 감싸줍니다.

// App.js
import React from 'react';
import ThemeProvider from './ThemeProvider';
import MyComponent from './MyComponent';

function App() {
  return (
    <ThemeProvider>
      <MyComponent />
    </ThemeProvider>
  );
}

export default App;

4. 자식 컴포넌트에서 상태 소비 및 업데이트

마지막으로, 자식 컴포넌트에서는 useContext 훅을 사용하여 상위 컴포넌트에서 제공한 Context 값에 접근합니다. 이 훅은 Context에 저장된 현재 상태와 상태 업데이트 함수를 반환하므로, 자식 컴포넌트는 Context 값을 기반으로 UI를 렌더링하거나, 필요에 따라 상태 업데이트 함수를 호출하여 전역 상태를 변경할 수 있습니다.

예를 들어, 테마를 변경하는 버튼은 Context에서 가져온 toggleTheme 함수를 호출하여 전체 애플리케이션의 테마를 변경할 수 있습니다.

// MyComponent.js
import React, { useContext } from 'react';
import MyContext from './MyContext';

function MyComponent() {
  const { theme, toggleTheme } = useContext(MyContext);

  return (
    <div style={{ background: theme === 'light' ? '#fff' : '#333', color: theme === 'light' ? '#333' : '#fff' }}>
      <h1>현재 테마: {theme}</h1>
      <button onClick={toggleTheme}>테마 변경</button>
    </div>
  );
}

export default MyComponent;

결론

이러한 단계들을 통해 우리는 React Context API를 사용하여 전역 상태를 효율적으로 관리하고, 컴포넌트 간의 데이터 흐름을 간소화할 수 있습니다. 이 방법을 사용하면 복잡한 prop drilling 없이도 다양한 컴포넌트에서 테마와 같은 중요한 데이터를 쉽게 접근하고 업데이트할 수 있어, 애플리케이션의 구조를 개선하고 가독성확장성을 높일 수 있습니다.

이제 여러분도 React Context API를 사용하여 더욱 강력하고 유지보수하기 쉬운 애플리케이션을 만들어 보세요! ✨

728x90