
useContext์ ๋ํด ์์๋ณด๊ธฐ ์ ์, ์ฐ์ React์์ Context๋ ๋ฌด์์ธ์ง๋ถํฐ ์ดํดํ ํ์๊ฐ ์๋ค. useContext๋ Context๋ฅผ ๋ ์ฝ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ Hook์ด๊ธฐ ๋๋ฌธ์ด๋ค.
React์์ Context๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค. ์ผ๋ฐ์ ์ธ React ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋ฐ์ดํฐ๊ฐ props๋ฅผ ํตํด ๋ถ๋ชจ์์ ์์์ผ๋ก ์ ๋ฌ๋์ง๋ง, Context๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช ์์ ์ผ๋ก props๋ฅผ ๊ฐ ๋ ๋ฒจ๋ง๋ค ๋๊ฒจ์ฃผ์ง ์๊ณ ๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์๋ค.
React์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก props๋ฅผ ํตํด ์ ๋ฌํ๋ค. ํ์ง๋ง ์ปดํฌ๋ํธ ํธ๋ฆฌ๊ฐ ๊น์ด์ง๋ฉด ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผ ํ๋ Props Drilling ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. Context๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ค๊ฐ ์ปดํฌ๋ํธ๋ค์๊ฒ props๋ฅผ ์ ๋ฌํ์ง ์๊ณ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์๊ฒ ํด์ค๋ค. ํนํ ํ ๋ง, ๋ก๊ทธ์ธ ์ํ, ์ธ์ด ์ค์ ๊ณผ ๊ฐ์ ์ ์ญ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ๋ ๋งค์ฐ ์ ์ฉํ๋ค.
Context API๋ React์์ Context๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋๊ตฌ๋ค์ ์งํฉ์ด๋ค. createContext, Provider, Consumer ์ธ ๊ฐ์ง ์ฃผ์ ๊ฐ๋
์ผ๋ก ๊ตฌ์ฑ๋๋ค.
Context ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ๊ธฐ๋ณธ๊ฐ์ ์ ํ์ ์ผ๋ก ์ง์ ํ ์ ์๋ค.
const ThemeContext = React.createContext('light');
Context์ ๊ฐ์ ํ์ ์ปดํฌ๋ํธ์ ์ ๊ณตํ๋ค. Provider๋ value prop์ ํตํด ๊ฐ์ ์ ๋ฌํ ์ ์๋ค.
<ThemeContext.Provider value={theme}>
{/* ํ์ ์ปดํฌ๋ํธ๋ค */}
</ThemeContext.Provider>
Context์ ๊ฐ์ ์๋น(์ฌ์ฉ) ํ๋ ์ปดํฌ๋ํธ์ด๋ค. useContext๊ฐ ๋์ ๋๊ธฐ ์ ์๋ ์ฃผ๋ก ์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
<ThemeContext.Consumer>
{theme => (
<button style={{ background: theme === 'dark' ? 'black' : 'white' }}>
{theme} ๋ชจ๋
</button>
)}
</ThemeContext.Consumer>
useContext๋ Context API์ ์ผ๋ถ๋ก, Context์ ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํ React Hook์ด๋ค. ํจ์ํ ์ปดํฌ๋ํธ์์ Context ๊ฐ์ ์ ๊ทผํ ๋ Consumer๋ณด๋ค ๋ ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
const theme = useContext(ThemeContext);
์ด ํ ์ Context ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์ ํ์ฌ Context ๊ฐ์ ๋ฐํํ๋ค. Context์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด useContext๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ ์๋์ผ๋ก ๋ฆฌ๋ ๋๋ง ๋๋ค.
// Context ์์ฑํ๊ธฐ
const ThemeContext = React.createContext('light');
// Provider๋ก ํ์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ ์ ๊ณตํ๊ธฐ
function App() {
const [theme, setTheme] = useState('light');
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
<MainContent />
</ThemeContext.Provider>
);
}
// useContext๋ก ๋ฐ์ดํฐ ์ฌ์ฉํ๊ธฐ
function ThemedButton() {
const { theme, setTheme } = useContext(ThemeContext);
return (
<button
style={{ background: theme === 'dark' ? 'black' : 'white' }}
onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
ํ
๋ง ๋ณ๊ฒฝ
</button>
);
}
Context ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํด๋น Context๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ค. ๋ฐ๋ผ์ ์์ฃผ ๋ณ๊ฒฝ๋๋ ๊ฐ๊ณผ ๊ทธ๋ ์ง ์์ ๊ฐ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค.
// ๋ถ๋ฆฌ๋ Context ์ฌ์ฉ
const ThemeContext = createContext('light');
const UserContext = createContext(null);
// App์์
<ThemeContext.Provider value={theme}>
<UserContext.Provider value={user}>
<MainContent />
</UserContext.Provider>
</ThemeContext.Provider>
props ์ ๋ฌ์ด ๊ฐ๋จํ๋ฉด Context๋ณด๋ค props๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋ช
ํํ ์ ์๋ค.
โ๐ป ์ ์ญ ์ํ ๊ด๋ฆฌ (ํ
๋ง, ์ธ์ด, ์ธ์ฆ ๋ฑ)
โ๐ป ๊น์ ์ปดํฌ๋ํธ ํธ๋ฆฌ์์ ๋ฐ์ดํฐ ๊ณต์
๐ค๐ป ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๋์ผํ ๋ฐ์ดํฐ์ ์ ๊ทผํด์ผ ํ ๋
Context ๊ฐ์ด ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ, ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
function App() {
const [theme, setTheme] = useState('light');
const [user, setUser] = useState(null);
// ๋ฉ๋ชจ์ด์ ์ด์
๋ Context ๊ฐ
const tehmeContextValue = useMemo(() => {
return { theme, setTheme };
}, [theme]);
return (
<ThemeContext.Provider value={themeContextValue}>
<MaineContent />
</ThemeContext.Provider>
);
}
useContext Hook์ React์ Context API๋ฅผ ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ์ด๋ค. Props Drilling ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ณต์ ํ ์ ์๊ฒ ํด์ค๋ค. ์ ์ ํ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ค.
ํ์ง๋ง ๋จ์ํ props ์ ๋ฌ๋ก ํด๊ฒฐํ ์ ์๋ ๊ฒฝ์ฐ๋, ๋ฆฌ๋ ๋๋ง ์ต์ ํ๊ฐ ์ค์ํ ๊ฒฝ์ฐ๋ค๋ Context ์ฌ์ฉ์ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํ๋ค. ๋๊ท๋ชจ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ Redux๋ Zustand ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.