React
Context: Props Drilling 해결부터 구조적 분리까지
Context란?props 없이 직접 데이터 접근 가능props의 단점 : Props Drilling<App>
<Layout>
<Header>
<UserProfile name="ttining" /> ← 여기서만 필요한 데이터
</Header>
</Layout>
</App>
name을 중간 컴포넌트가 무의미하게 전달해야 함Context의 역할| 항목 | 설명 |
|---|---|
| 사용 목적 | 중첩된 컴포넌트 트리에서 데이터 공유 |
| 해결하는 문제 | Props Drilling |
| 전달 방식 | Provider → Consumer 패턴 |
| 주요 구성 요소 | React.createContext, Provider, useContext |
// 1. Context 생성
const ThemeContext = React.createContext("light");
// 2. Provider로 값 전달
function App() {
return (
<ThemeContext.Provider value="dark">
<Page />
</ThemeContext.Provider>
);
}
// 3. Consumer에서 값 사용
function Page() {
const theme = useContext(ThemeContext);
return <div>현재 테마: {theme}</div>;
}
useContext는 반드시 Provider 하위에서 사용해야 하며,undefined가 반환됨 (기본값 설정 가능)Context를 하나의 파일로 분리하는 것이 일반적이다.src/
contexts/
ThemeContext.tsx
import { createContext, useContext, useState, ReactNode } from "react";
const ThemeContext = createContext<{
theme: string;
setTheme: (t: string) => void;
} | null>(null);
export const ThemeProvider = ({ children }: { children: ReactNode }) => {
const [theme, setTheme] = useState("light");
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
{children}
</ThemeContext.Provider>
);
};
export const useTheme = () => {
const context = useContext(ThemeContext);
if (!context) {
throw new Error("useTheme must be used within a ThemeProvider");
}
return context;
};
useContext를 직접 export하지 않고 useTheme() 같은 커스텀 훅으로 래핑하는 것이 더 안전하고 확장성 있음| 항목 | 설명 |
|---|---|
| 성능 이슈 | Context의 value가 바뀌면 하위 컴포넌트 전체 리렌더링됨 |
| 해결 방법 | useMemo로 value 메모이제이션Context를 여러 개로 쪼개서 필요할 때만 구독 |
const value = useMemo(() => ({ theme, setTheme }), [theme]);
<ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>
Context보다