Provider Pattern
React ๊ธฐ์ค์ผ๋ก ์ค๋ช ํฉ๋๋ค.
์ฉ์ด
Prop drilliing: React์์ ํ์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์์ props๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผ ํ๋ ํ์ ์ปดํฌ๋ํธ๊ฐ ๋ง๊ฑฐ๋, ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ์์ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์์ ๋ ์ฝ๋๊ฐ ์ฅํฉํด์ง๊ณ ๋ถํธํด์ง ์ ์๋ค. ๋ณดํต ์ด๋ฌํ ์ํฉ์ ์๋ฏธํ๋ค.
์๋ฏธ
Prop drilliing์ ๋ฐฉ์งํ๊ธฐ ์ํด, props๋ฅผ ์ ๋ฌํ์ง ์๊ณ ํ์ ํธ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ด๋ค. (Context | React ๊ณต์ ๋ฌธ์)
๊ตฌํ ์์
Context Provider๋ก ๋คํฌ ๋ชจ๋ ๊ตฌํ
// ThemeContext.tsx
import { createContext } from "react";
const ThemeContext = createContext("light");
// context๋ฅผ ๋ฐ๋ก exportํด์ ์ฌ์ฉํ๊ธฐ๋ณด๋จ, hook์ผ๋ก ๋ํํด์ ์ฐ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
export const useThemeContext = () => {
const theme = useContext(ThemeContext);
if (!theme) {
throw new Error("useThemeContext๋ ThemeProvider ์์์ ์ฌ์ฉ๋์ด์ผ ํด์.");
}
return theme;
};
// ๊ฐ์ธ์ ์ผ๋ก Provider๋ ๋ํํ๋ ๊ฒ์ ์ ํธํ๋ค.
export const ThemeProvider = ({ theme, children }) => {
return (
<ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>
);
};
์ฅ์
๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ Provider์ ์๋นํ๋ Consumer(์์ ์ฝ๋์์๋
useThemeContext
๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ)๊ฐ ๊ฐ์์ ์ญํ ์ ์ง์คํ ์ ์๋ค.Prop drilling์ ๋ฐฉ์งํ ์ ์๋ค.
React์ ๋ด์ฅ๋์ด ์๋ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น๊ฐ ํ์ํ์ง ์๋ค.
๋จ์
๋ฐ์ดํฐ ํ๋ฆ์ด ๋ช ํํ๊ฒ ๋ณด์ด์ง ์๋๋ค.
React์์ Context๋ฅผ ์ฐธ์กฐํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ Context ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋๋ง๋ค ๋ฆฌ๋ ๋๋ง๋๋ฏ๋ก, Provider๋ฅผ ์ ์ ํ ๋ถ๋ฆฌํ์ง ์์ผ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
React ๊ณต์ ๋ฌธ์์์๋ Context๋ฅผ ๋์ฒดํ ์ ์๋ ๋ ๊ฐ์ง ๋ฐฉ์์ ์ ์ํ๋ฉฐ, ๋ฌด๋ถ๋ณํ Context ์ฌ์ฉ์ ์ง์ํ๋ผ๊ณ ๊ฒฝ๊ณ ํ๋ค.
Props๋ฅผ ํตํด ์ ๋ฌํ๋ ๋ฐฉ์๋ถํฐ ์์ํ๋ผ.
์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํด
children
์ผ๋ก ์ ๋ฌํ๋ผ. (ex.<Layout posts={posts} />
โ<Layout><Posts posts={posts} /></Layout>
.)
์ฐธ๊ณ ์๋ฃ
Last updated