
React에서 상태를 관리하는 방법은 내부 상태와 외부 상태 두 가지가 존재
useState, Context APIRedux, Redux Toolkit, Recoil 등Context API는 컴포넌트 간에 전역 상태를 쉽게 공유할 수 있도록 도와주는 기능
createContext로 전역 상태 저장소 만들기Provider로 전역 상태를 감싸기useContext를 이용해 전역 상태 가져오기전역 상태를 관리하기 위해 별도의 context 폴더를 생성
src
├── context
│ ├── counterContext.jsx
├── components
├── pages
├── App.jsx
├── main.jsx
createContext를 사용해 상태 저장소 생성createContext를 사용하여 전역 상태 저장소를 생성
📁 context/counterContext.jsx
import { createContext, useContext, useState } from "react";
const CounterContext = createContext();
Provider 함수 컴포넌트 생성Provider 역할을 하는 CounterProvider컴포넌트 생성
📁 context/counterContext.jsx
export function CounterProvider({ children }) {
const [counter, setCounter] = useState(0);
return (
<CounterContext.Provider value={[counter, setCounter]}>
{children}
</CounterContext.Provider>
);
}
💡 Context API에서 Provider가 `children`을 받아야 하는 이유
children을props로 받아야CounterProvider내부의 컴포넌트들이 Context를 사용할 수 있음
Context API의 Provider는 children을 감싸고, 이를 Context 내부에서 접근할 수 있도록 함
export function CounterProvider({ children }) {
const [counter, setCounter] = useState(0);
return (
<CounterContext.Provider value={[counter, setCounter]}>
{children} // ✅ 반드시 children을 렌더링해야 함!
</CounterContext.Provider>
);
}
Provider를 main.jsx에서 App을 감싸도록 설정
📁 /main.jsx
import { createRoot } from 'react-dom/client';
import './index.css';
import App from './App.jsx';
import { CounterProvider } from './context/counterContext.jsx';
createRoot(document.getElementById('root')).render(
<CounterProvider>
<App />
</CounterProvider>,
);
이제 CounterProvider 내부의 모든 컴포넌트가 전역 상태를 사용할 수 있는 상태
useContext로 전역 상태 사용하기useContext를 사용해 전역 상태를 쉽게 불러올 수 있도록 useCounter라는 함수 생성
📁 context/counterContext.jsx
export function useCounter() {
return useContext(CounterContext);
}
useCounter 활용하여 전역 상태 사용하기'
📁 ./App.jsx
import "./App.css";
import { useCounter } from "./context/counterContext";
function App() {
const [counter, setCounter] = useCounter();
return (
<>
<h1>Counter: {counter}</h1>
<button onClick={() => setCounter((prev) => prev + 1)}>+</button>
<button onClick={() => setCounter((prev) => prev - 1)}>-</button>
</>
);
}
export default App;

props를 계속 전달해야 하는 경우) 문제를 해결하고 싶을 때