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