전역 상태를 위한 useContext
Context를 만들고 Provider로 하위 트리를 감싸며, useContext로 값을 사용해 prop을 여러 단계로 전달하지 않고 테마나 인증 상태를 공유합니다.
전역 상태를 위한 useContext은(는) CoddyKit의 무료 Frontend Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Frontend Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
속성을 여러 단계로 전달할 때의 문제
속성을 여러 단계로 전달한다는 것은 깊이 중첩된 자식에게 도달하기 위해 해당 속성을 사용하지 않는 여러 중간 구성 요소를 거쳐 데이터를 전달하는 것을 의미합니다. 컨텍스트를 사용하면 트리의 모든 구성 요소에서 명시적으로 전달하지 않고도 값을 사용할 수 있으므로 이 문제를 해결할 수 있습니다.
컨텍스트 만들기
createContext(defaultValue)는 컨텍스트 객체를 만듭니다. 구성 요소가 상위에 일치하는 제공자 없이 컨텍스트를 읽을 때 기본값이 사용됩니다.
import { createContext } from 'react';
interface ThemeContextType {
theme: 'light' | 'dark';
toggleTheme: () => void;
}
const ThemeContext = createContext<ThemeContextType>({
theme: 'light',
toggleTheme: () => {}
});컨텍스트 제공하기
컨텍스트가 필요한 트리의 부분을 제공자로 감싸세요. 내부의 모든 구성 요소가 컨텍스트 값을 읽을 수 있습니다.
function ThemeProvider({ children }: { children: React.ReactNode }) {
const [theme, setTheme] = useState<'light' | 'dark'>('light');
const toggleTheme = () => setTheme(t => t === 'light' ? 'dark' : 'light');
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
}
// In app root:
<ThemeProvider>
<App />
</ThemeProvider>useContext로 사용하기
Provider 내부의 모든 컴포넌트는 useContext(ThemeContext)로 컨텍스트 값에 접근할 수 있습니다. prop으로 전달할 필요가 없습니다.
function ThemeToggle() {
const { theme, toggleTheme } = useContext(ThemeContext);
return (
<button onClick={toggleTheme}>
Switch to {theme === 'light' ? 'dark' : 'light'} mode
</button>
);
}useContext를 감싸는 사용자 정의 훅
내부에서 useContext를 호출하는 사용자 정의 훅을 내보내세요. 컨텍스트를 직접 노출하는 것보다 깔끔하며 검증도 추가할 수 있습니다.
function useTheme() {
const ctx = useContext(ThemeContext);
if (!ctx) throw new Error('useTheme must be used inside ThemeProvider');
return ctx;
}
// Usage:
const { theme } = useTheme();컨텍스트 다시 렌더링
Provider의 값이 변경되면 모든 소비자가 다시 렌더링됩니다. 값이 객체라면 렌더링할 때마다 새로운 객체 참조가 생성되어 모든 소비자가 다시 렌더링됩니다. 이를 방지하려면 useMemo로 값을 메모이제이션하세요.
const value = useMemo(
() => ({ theme, toggleTheme }),
[theme] // toggleTheme is stable if created with useCallback
);
<ThemeContext.Provider value={value}>컨텍스트를 사용할 때
적합한 경우: 테마, 로캘, 인증된 사용자, 기능 플래그, 알림 시스템. 적합하지 않은 경우: 빈번한 업데이트(키를 누를 때마다 발생하는 업데이트), 크고 복잡한 상태(대신 저장소를 사용하세요).
여러 컨텍스트
서로 독립적인 여러 컨텍스트를 만들 수 있습니다. 각각의 역할에 집중하게 하세요. 인증에는 AuthContext를, 테마에는 ThemeContext를 사용합니다. 모든 것을 담는 하나의 만능 컨텍스트는 피하세요.
컨텍스트와 Redux 비교
컨텍스트는 기본 제공되며 자주 변경되지 않는 전역 데이터에 충분합니다. Redux/Zustand/Pinia는 업데이트가 많거나, 시간 여행 디버깅 또는 미들웨어가 필요한 복잡한 상태에 더 적합합니다.
인증 컨텍스트 패턴
일반적인 패턴은 현재 사용자와 인증 메서드를 보관하는 AuthContext를 만드는 것입니다. 이를 사용하는 컴포넌트는 prop을 여러 단계로 전달하지 않고도 사용자 정보에 접근할 수 있습니다.
interface AuthContext {
user: User | null;
login: (creds: Credentials) => Promise<void>;
logout: () => void;
}
const AuthCtx = createContext<AuthContext | null>(null);
export const useAuth = () => {
const ctx = useContext(AuthCtx);
if (!ctx) throw new Error('Outside AuthProvider');
return ctx;
};컨텍스트와 TypeScript
인터페이스를 사용해 컨텍스트의 타입을 지정하세요. 초기값으로 null을 사용하고, 사용자 정의 훅에서 값이 null이면 오류를 발생시키세요. 이렇게 하면 불가능한 '제공자 외부에서 소비됨' 상태가 조용히 지나가는 것을 방지할 수 있습니다.
성능: memo + 컨텍스트
React.memo로 감싼 컴포넌트는 prop이 변경되지 않는 한 다시 렌더링되지 않습니다. 컨텍스트 소비자의 출력이 컨텍스트 일부에만 의존한다면 컨텍스트를 나누거나 선택자 패턴을 사용해 불필요한 다시 렌더링을 피하세요.
빠른 확인
Provider가 위에 없는 컴포넌트 내부에서 useContext(MyContext)를 호출하면 무엇을 반환하나요?
복습: useContext
createContext는 기본값을 가진 컨텍스트를 만듭니다. 값을 제공하려면 트리를 Provider로 감싸세요. 내부 어디서든 useContext로 값을 읽을 수 있습니다. 사용자 정의 훅은 검증을 위해 useContext를 감쌉니다. 불필요한 다시 렌더링을 방지하려면 Provider의 값을 메모이제이션하세요. 테마나 인증처럼 자주 변경되지 않는 전역 데이터에 사용하세요.
자주 묻는 질문
“전역 상태를 위한 useContext” 강의는 무료인가요?
네 — “전역 상태를 위한 useContext” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Frontend Academy 강의 전체를 잠금 해제할 수 있습니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“전역 상태를 위한 useContext”에서 뭘 배우나요?
Context를 만들고 Provider로 하위 트리를 감싸며, useContext로 값을 사용해 prop을 여러 단계로 전달하지 않고 테마나 인증 상태를 공유합니다. 브라우저에서 직접 실행하는 실습 코드로 Frontend Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Frontend Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Frontend Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“전역 상태를 위한 useContext” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Frontend Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Frontend Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 전역 상태를 위한 useContext
- 복잡한 상태를 위한 useReducer
- 성능을 위한 useMemo와 useCallback
- 사용자 지정 훅: 재사용 가능한 로직 추출