์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ ์ธ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด React Context๋ฅผ ๋ง์คํฐํ์ธ์. Context ์ฌ์ฉ ์์ , ํจ๊ณผ์ ์ธ ๊ตฌํ ๋ฐฉ๋ฒ ๋ฐ ํํ ํจ์ ์ ํผํ๋ ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
React Context: ์ข ํฉ ๊ฐ์ด๋
React Context๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๋ชจ๋ ๋ ๋ฒจ์ ํตํด ๋ช ์์ ์ผ๋ก props๋ฅผ ์ ๋ฌํ์ง ์๊ณ ๋ ์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋๋ค. ํน์ ํ์ ํธ๋ฆฌ์ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ํน์ ๊ฐ์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ฐ์ด๋์์๋ React Context๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ์๊ธฐ์ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ํผํด์ผ ํ ๋ชจ๋ฒ ์ฌ๋ก์ ์ผ๋ฐ์ ์ธ ํจ์ ์ ๋ํด ์์๋ด ๋๋ค.
๋ฌธ์ ์ดํดํ๊ธฐ: Prop Drilling
๋ณต์กํ React ์ ํ๋ฆฌ์ผ์ด์ ์์๋ "prop drilling" ๋ฌธ์ ๋ฅผ ๊ฒช์ ์ ์์ต๋๋ค. ์ด๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ๊น๊ฒ ์ค์ฒฉ๋ ์์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผ ํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ฅผ ์ํด, ์ค๊ฐ ์ปดํฌ๋ํธ๋ค์ด ํด๋น ๋ฐ์ดํฐ๊ฐ ํ์ํ์ง ์๋๋ผ๋ ๋ชจ๋ ์ค๊ฐ ์ปดํฌ๋ํธ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์์ต๋๋ค:
- ์ฝ๋์ ๋ณต์ก์ฑ ์ฆ๊ฐ: ์ค๊ฐ ์ปดํฌ๋ํธ๋ค์ด ๋ถํ์ํ props๋ก ์ธํด ๋น๋ํด์ง๋๋ค.
- ์ ์ง๋ณด์์ ์ด๋ ค์: prop ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.
- ๊ฐ๋ ์ฑ ์ ํ: ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํ ๋ฐ์ดํฐ ํ๋ฆ์ ์ดํดํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋๋ค.
๋ค์์ ๊ฐ๋จํ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
function App() {
const user = { name: 'Alice', theme: 'dark' };
return (
<Layout user={user} />
);
}
function Layout({ user }) {
return (
<Header user={user} />
);
}
function Header({ user }) {
return (
<Navigation user={user} />
);
}
function Navigation({ user }) {
return (
<Profile user={user} />
);
}
function Profile({ user }) {
return (
<p>ํ์ํฉ๋๋ค, {user.name}๋!
ํ
๋ง: {user.theme}</p>
);
}
์ด ์์์์ user ๊ฐ์ฒด๋ ์ค์ ๋ก Profile ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ๋จ์๋ ๋ถ๊ตฌํ๊ณ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์ณ ์ ๋ฌ๋ฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก prop drilling์ ์ ํ์ ์ธ ์ฌ๋ก์
๋๋ค.
React Context ์๊ฐ
React Context๋ props๋ฅผ ํตํด ๋ช ์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ์ง ์๊ณ ๋ ํ์ ํธ๋ฆฌ์ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋๋ก ํ์ฌ prop drilling์ ํผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์ธ ๊ฐ์ง ์ฃผ์ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
- Context: ๊ณต์ ํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ์ปจํ
์ด๋์
๋๋ค.
React.createContext()๋ฅผ ์ฌ์ฉํ์ฌ context๋ฅผ ์์ฑํฉ๋๋ค. - Provider: ์ด ์ปดํฌ๋ํธ๋ context์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. Provider๋ก ๊ฐ์ธ์ง ๋ชจ๋ ์ปดํฌ๋ํธ๋ context ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค. Provider๋ ๊ณต์ ํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ธ
valueprop์ ๋ฐ์ต๋๋ค. - Consumer: (๋ ๊ฑฐ์, ๋ ์ผ๋ฐ์ ) ์ด ์ปดํฌ๋ํธ๋ context๋ฅผ ๊ตฌ๋ ํฉ๋๋ค. context ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค Consumer๋ ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค. Consumer๋ ๋ ๋ prop ํจ์๋ฅผ ์ฌ์ฉํ์ฌ context ๊ฐ์ ์ ๊ทผํฉ๋๋ค.
useContextHook: (ํ๋์ ์ ๊ทผ๋ฒ) ์ด hook์ ์ฌ์ฉํ๋ฉด ํจ์ํ ์ปดํฌ๋ํธ ๋ด์์ ์ง์ context ๊ฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
React Context๋ ์ธ์ ์ฌ์ฉํด์ผ ํ ๊น?
React Context๋ React ์ปดํฌ๋ํธ ํธ๋ฆฌ์์ "์ ์ญ์ "์ผ๋ก ๊ฐ์ฃผ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ ์ ์์ต๋๋ค:
- ํ ๋ง: ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ๋ง(์: ๋ผ์ดํธ ๋๋ ๋คํฌ ๋ชจ๋)๋ฅผ ๋ชจ๋ ์ปดํฌ๋ํธ์์ ๊ณต์ ํฉ๋๋ค. ์์: ๊ตญ์ ์ ์ธ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์ฌ์ฉ์๊ฐ ์ ๊ทผ์ฑ ๋ฐ ์๊ฐ์ ์ ํธ๋ ํฅ์์ ์ํด ๋ผ์ดํธ ํ ๋ง์ ๋คํฌ ํ ๋ง ๊ฐ์ ์ ํํ ์ ์๋๋ก ํ์ฉํ ์ ์์ต๋๋ค. Context๋ ํ์ฌ ํ ๋ง๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ชจ๋ ์ปดํฌ๋ํธ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ธ์ฆ: ํ์ฌ ์ฌ์ฉ์์ ์ธ์ฆ ์ํ ๋ฐ ํ๋กํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์: ๊ธ๋ก๋ฒ ๋ด์ค ์น์ฌ์ดํธ๋ Context๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ๋ฐ์ดํฐ(์ฌ์ฉ์ ์ด๋ฆ, ์ ํธ๋ ๋ฑ)๋ฅผ ๊ด๋ฆฌํ๊ณ ์ฌ์ดํธ ์ ์ฒด์์ ์ฌ์ฉํ ์ ์๊ฒ ํ์ฌ ๊ฐ์ธํ๋ ์ฝํ ์ธ ์ ๊ธฐ๋ฅ์ ํ์ฑํํ ์ ์์ต๋๋ค.
- ์ธ์ด ์ค์ : ๊ตญ์ ํ(i18n)๋ฅผ ์ํด ํ์ฌ ์ธ์ด ์ค์ ์ ๊ณต์ ํฉ๋๋ค. ์์: ๋ค๊ตญ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ Context๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ์ ํ๋ ์ธ์ด๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ปดํฌ๋ํธ๋ค์ ์ด context์ ์ ๊ทผํ์ฌ ์ฌ๋ฐ๋ฅธ ์ธ์ด๋ก ์ฝํ ์ธ ๋ฅผ ํ์ํฉ๋๋ค.
- API ํด๋ผ์ด์ธํธ: API ํธ์ถ์ด ํ์ํ ์ปดํฌ๋ํธ์ API ํด๋ผ์ด์ธํธ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์คํ ํ๋๊ทธ (๊ธฐ๋ฅ ํ ๊ธ): ํน์ ์ฌ์ฉ์๋ ๊ทธ๋ฃน์ ๋ํด ๊ธฐ๋ฅ์ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํฉ๋๋ค. ์์: ๊ตญ์ ์ ์ธ ์ํํธ์จ์ด ํ์ฌ๋ ํน์ ์ง์ญ์ ์ผ๋ถ ์ฌ์ฉ์์๊ฒ ๋จผ์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ์ํ์ฌ ์ฑ๋ฅ์ ํ ์คํธํ ์ ์์ต๋๋ค. Context๋ ์ด๋ฌํ ๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ์ ์ ํ ์ปดํฌ๋ํธ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ค์ ๊ณ ๋ ค์ฌํญ:
- ๋ชจ๋ ์ํ ๊ด๋ฆฌ๋ฅผ ๋์ฒดํ์ง๋ ์์: Context๋ Redux๋ Zustand์ ๊ฐ์ ๋ณธ๊ฒฉ์ ์ธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ฒดํ๋ ๊ฒ์ด ์๋๋๋ค. ์ง์ ์ผ๋ก ์ ์ญ์ ์ด๊ณ ๊ฑฐ์ ๋ณ๊ฒฝ๋์ง ์๋ ๋ฐ์ดํฐ์ Context๋ฅผ ์ฌ์ฉํ์ธ์. ๋ณต์กํ ์ํ ๋ก์ง๊ณผ ์์ธก ๊ฐ๋ฅํ ์ํ ์ ๋ฐ์ดํธ์๋ ์ ์ฉ ์ํ ๊ด๋ฆฌ ์๋ฃจ์ ์ด ๋ ์ ํฉํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์์: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ง์ ํญ๋ชฉ, ์๋ ๋ฐ ๊ณ์ฐ์ด ํฌํจ๋ ๋ณต์กํ ์ฅ๋ฐ๊ตฌ๋๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ, Context์๋ง ์์กดํ๊ธฐ๋ณด๋ค๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ๋์ ์ ํ์ผ ์ ์์ต๋๋ค.
- ๋ฆฌ๋ ๋๋ง: context ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํด๋น context๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค. context๊ฐ ์์ฃผ ์ ๋ฐ์ดํธ๋๊ฑฐ๋ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๊ฐ ๋ณต์กํ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ต์ํํ๋๋ก context ์ฌ์ฉ์ ์ต์ ํํ์ธ์. ์์: ์์ฃผ ์ ๋ฐ์ดํธ๋๋ ์ฃผ๊ฐ๋ฅผ ํ์ํ๋ ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์, ์ฃผ๊ฐ context๋ฅผ ๊ตฌ๋ ํ๋ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง๋๋ฉด ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๊ด๋ จ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ ๋ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
React Context ์ฌ์ฉ๋ฒ: ์ค์ฉ์ ์ธ ์์
prop drilling ์์ ๋ก ๋์๊ฐ์ React Context๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํด ๋ณด๊ฒ ์ต๋๋ค.
1. Context ์์ฑํ๊ธฐ
๋จผ์ , React.createContext()๋ฅผ ์ฌ์ฉํ์ฌ context๋ฅผ ์์ฑํฉ๋๋ค. ์ด context๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ฒ ๋ฉ๋๋ค.
// UserContext.js
import React from 'react';
const UserContext = React.createContext(null); // ๊ธฐ๋ณธ๊ฐ์ null ๋๋ ์ด๊ธฐ ์ฌ์ฉ์ ๊ฐ์ฒด๊ฐ ๋ ์ ์์ต๋๋ค
export default UserContext;
2. Provider ์์ฑํ๊ธฐ
๋ค์์ผ๋ก, ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฃจํธ(๋๋ ๊ด๋ จ ํ์ ํธ๋ฆฌ)๋ฅผ UserContext.Provider๋ก ๊ฐ์ธ์ค๋๋ค. user ๊ฐ์ฒด๋ฅผ value prop์ผ๋ก Provider์ ์ ๋ฌํฉ๋๋ค.
// App.js
import React from 'react';
import UserContext from './UserContext';
import Layout from './Layout';
function App() {
const user = { name: 'Alice', theme: 'dark' };
return (
<UserContext.Provider value={user}>
<Layout />
</UserContext.Provider>
);
}
export default App;
3. Context ์ฌ์ฉํ๊ธฐ
์ด์ Profile ์ปดํฌ๋ํธ๋ useContext hook์ ์ฌ์ฉํ์ฌ context์์ ์ง์ user ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ ์ด์ prop drilling์ด ํ์ ์์ต๋๋ค!
// Profile.js
import React, { useContext } from 'react';
import UserContext from './UserContext';
function Profile() {
const user = useContext(UserContext);
return (
<p>ํ์ํฉ๋๋ค, {user.name}๋!
ํ
๋ง: {user.theme}</p>
);
}
export default Profile;
์ค๊ฐ ์ปดํฌ๋ํธ๋ค(Layout, Header, Navigation)์ ๋ ์ด์ user prop์ ๋ฐ์ ํ์๊ฐ ์์ต๋๋ค.
// Layout.js, Header.js, Navigation.js
import React from 'react';
function Layout({ children }) {
return (
<div>
<Header />
<main>{children}</main>
</div>
);
}
function Header() {
return (<Navigation />);
}
function Navigation() {
return (<Profile />);
}
export default Layout;
๊ณ ๊ธ ์ฌ์ฉ๋ฒ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
1. Context์ useReducer ๊ฒฐํฉํ๊ธฐ
๋ ๋ณต์กํ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด React Context์ useReducer hook์ ๊ฒฐํฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ํ ์
๋ฐ์ดํธ๋ฅผ ๋ ์์ธก ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค. context๋ ์ํ๋ฅผ ์ ๊ณตํ๊ณ , reducer๋ ๋์คํจ์น๋ ์ก์
์ ๋ฐ๋ผ ์ํ ์ ํ์ ์ฒ๋ฆฌํฉ๋๋ค.
// ThemeContext.js import React, { createContext, useReducer } from 'react'; const ThemeContext = createContext(); const initialState = { theme: 'light' }; const themeReducer = (state, action) => { switch (action.type) { case 'TOGGLE_THEME': return { ...state, theme: state.theme === 'light' ? 'dark' : 'light' }; default: return state; } }; function ThemeProvider({ children }) { const [state, dispatch] = useReducer(themeReducer, initialState); return ( <ThemeContext.Provider value={{ ...state, dispatch }}> {children} </ThemeContext.Provider> ); } export { ThemeContext, ThemeProvider };// ThemeToggle.js import React, { useContext } from 'react'; import { ThemeContext } from './ThemeContext'; function ThemeToggle() { const { theme, dispatch } = useContext(ThemeContext); return ( <button onClick={() => dispatch({ type: 'TOGGLE_THEME' })}> ํ ๋ง ์ ํ (ํ์ฌ: {theme}) </button> ); } export default ThemeToggle;// App.js import React from 'react'; import { ThemeProvider } from './ThemeContext'; import ThemeToggle from './ThemeToggle'; function App() { return ( <ThemeProvider> <div> <ThemeToggle /> </div> </ThemeProvider> ); } export default App;
2. ๋ค์ค Context ์ฌ์ฉ
๊ด๋ฆฌํด์ผ ํ ์ ์ญ ๋ฐ์ดํฐ์ ์ข
๋ฅ๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ, ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ๋ฌ context๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๊ณ ์ฝ๋ ๊ตฌ์ฑ์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ์ธ์ฆ์ ์ํ UserContext์ ์ ํ๋ฆฌ์ผ์ด์
ํ
๋ง ๊ด๋ฆฌ๋ฅผ ์ํ ThemeContext๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
3. ์ฑ๋ฅ ์ต์ ํ
์์ ์ธ๊ธํ๋ฏ์ด, context ๋ณ๊ฒฝ์ ์ด๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์์ ๋ฆฌ๋ ๋๋ง์ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ฑ๋ฅ์ ์ต์ ํํ๋ ค๋ฉด ๋ค์์ ๊ณ ๋ คํ์ธ์:
- ๋ฉ๋ชจ์ด์ ์ด์
:
React.memo๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ๋ค์ ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. - ์์ ์ ์ธ Context ๊ฐ: Provider์ ์ ๋ฌ๋๋
valueprop์ด ์์ ์ ์ธ ์ฐธ์กฐ์ธ์ง ํ์ธํฉ๋๋ค. ๊ฐ์ด ๋งค ๋ ๋๋ง๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ, ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ ๋ฐํฉ๋๋ค. - ์ ํ์ ์ ๋ฐ์ดํธ: ์ค์ ๋ก ๋ณ๊ฒฝ์ด ํ์ํ ๋๋ง context ๊ฐ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
4. Context ์ ๊ทผ์ ์ํ ์ปค์คํ Hook ์ฌ์ฉ
context ๊ฐ์ ์ ๊ทผํ๊ณ ์ ๋ฐ์ดํธํ๋ ๋ก์ง์ ์บก์ํํ๊ธฐ ์ํด ์ปค์คํ hook์ ๋ง๋ญ๋๋ค. ์ด๋ ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํต๋๋ค. ์๋ฅผ ๋ค์ด:
// useTheme.js import { useContext } from 'react'; import { ThemeContext } from './ThemeContext'; function useTheme() { const context = useContext(ThemeContext); if (!context) { throw new Error('useTheme must be used within a ThemeProvider'); } return context; } export default useTheme;// MyComponent.js import React from 'react'; import useTheme from './useTheme'; function MyComponent() { const { theme, dispatch } = useTheme(); return ( <div> ํ์ฌ ํ ๋ง: {theme} <button onClick={() => dispatch({ type: 'TOGGLE_THEME' })}> ํ ๋ง ์ ํ </button> </div> ); } export default MyComponent;
ํผํด์ผ ํ ์ผ๋ฐ์ ์ธ ํจ์
- Context์ ๋จ์ฉ: ๋ชจ๋ ๊ฒ์ Context๋ฅผ ์ฌ์ฉํ์ง ๋ง์ธ์. ์ง์ ์ผ๋ก ์ ์ญ์ ์ธ ๋ฐ์ดํฐ์ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค.
- ๋ณต์กํ ์ ๋ฐ์ดํธ: context provider ๋ด์์ ์ง์ ๋ณต์กํ ๊ณ์ฐ์ด๋ ๋ถ์ ํจ๊ณผ๋ฅผ ์ํํ์ง ๋ง์ธ์. ์ด๋ฌํ ์์ ์ reducer๋ ๋ค๋ฅธ ์ํ ๊ด๋ฆฌ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ์ธ์.
- ์ฑ๋ฅ ๋ฌด์: Context๋ฅผ ์ฌ์ฉํ ๋ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ผ๋์ ๋์ธ์. ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ต์ํํ๋๋ก ์ฝ๋๋ฅผ ์ต์ ํํ์ธ์.
- ๊ธฐ๋ณธ๊ฐ ๋ฏธ์ ๊ณต: ์ ํ ์ฌํญ์ด์ง๋ง,
React.createContext()์ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ณตํ๋ฉด ์ปดํฌ๋ํธ๊ฐ Provider ์ธ๋ถ์์ context๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
React Context์ ๋์
React Context๋ ์ ์ฉํ ๋๊ตฌ์ด์ง๋ง ํญ์ ์ต์์ ํด๊ฒฐ์ฑ ์ ์๋๋๋ค. ๋ค์ ๋์๋ค์ ๊ณ ๋ คํด ๋ณด์ธ์:
- Prop Drilling (๊ฒฝ์ฐ์ ๋ฐ๋ผ): ๋ฐ์ดํฐ๊ฐ ์์์ ์ปดํฌ๋ํธ์์๋ง ํ์ํ ๊ฐ๋จํ ๊ฒฝ์ฐ์๋ prop drilling์ด Context๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋จํ๊ณ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
- ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Redux, Zustand, MobX): ๋ณต์กํ ์ํ ๋ก์ง์ ๊ฐ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ์ ์ฉ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ๋์ ์ ํ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- ์ปดํฌ๋ํธ ํฉ์ฑ: ์ปดํฌ๋ํธ ํฉ์ฑ์ ์ฌ์ฉํ์ฌ ๋ ํต์ ๋๊ณ ๋ช ์์ ์ธ ๋ฐฉ์์ผ๋ก ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.
๊ฒฐ๋ก
React Context๋ prop drilling ์์ด ์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋๋ค. ์ธ์ ์ด๋ป๊ฒ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋์ง๋ฅผ ์ดํดํ๋ ๊ฒ์ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ด ๊ฐ์ด๋์ ์ค๋ช ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๊ณ ์ผ๋ฐ์ ์ธ ํจ์ ์ ํผํจ์ผ๋ก์จ, React Context๋ฅผ ํ์ฉํ์ฌ ์ฝ๋๋ฅผ ๊ฐ์ ํ๊ณ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค. Context ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ ์ ํน์ ์๊ตฌ ์ฌํญ์ ํ๊ฐํ๊ณ ๋์์ ๊ณ ๋ คํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.