๐ŸŽจ 11. Context API์˜ ํ•œ๊ณ„์™€ ๋ Œ๋” ์›Œํ„ฐํด ํŒŒ๊ดด

๐Ÿ“‹ ๊ฐœ์š”

Context API๋ฅผ ์ƒํƒœ ๊ด€๋ฆฌ ํˆด๋กœ ์˜คํ•ดํ•  ๋•Œ ํ„ฐ์ง€๋Š” ๋ถˆํ•„์š”ํ•œ ์ „์—ญ ๋ Œ๋”๋ง ์ฐธ์‚ฌ๋ฅผ ๋ง‰๊ณ  ์šฐํšŒํ•˜๋Š” ํ˜„์—… ๋ถ„๋ฆฌ ๊ธฐ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๐ŸŽฏ ์ด ์„น์…˜์„ ์ฝ๊ณ  ๋‚˜๋ฉด:

  • Context API๋ฅผ ๋ฆฌ๋•์Šค(Redux)์ฒ˜๋Ÿผ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์—†๋Š” ๊ทผ๋ณธ์ ์ธ ์—”์ง„ ํ•œ๊ณ„๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Context ์•ˆ์˜ ๊ฐ’์ด ํ•˜๋‚˜ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ํ•˜์œ„ ํŠธ๋ฆฌ๊ฐ€ ์ „๋ถ€ ๋ชจ์กฐ๋ฆฌ ๋ Œ๋”๋ง๋˜๋Š” ํญํฌ์ˆ˜(Waterfall) ์ฐธ์‚ฌ๋ฅผ ๋ชฉ๊ฒฉํ•œ๋‹ค.
  • ๊ฐ’(Value)๊ณผ ํ–‰๋™(Action)์„ ์ž˜๊ฒŒ ์ชผ๊ฐœ๋Š” Context ์ชผ๊ฐœ๊ธฐ(Splitting) ๋ฐฉ์–ด์ˆ ์„ ๋‹ค๋ฃฌ๋‹ค.

๐Ÿ“‹ ๋ชฉ์ฐจ


๐Ÿ“Œ ์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์ „์—

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 10๋ถ„ / ํ•ต์‹ฌ ํŒŒํŠธ: 6๋ถ„

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

  • ์˜์ฒ (์‹ ์ž…): "Props ๋„˜๊ธฐ๋Š” ๊ฑฐ ๋„ˆ๋ฌด ๊ท€์ฐฎ์•„์š”! ์šฐ๋ฆฌ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ํ…Œ๋งˆ(๋‹คํฌ๋ชจ๋“œ), ๋กœ๊ทธ์ธํ•œ ์œ ์ € ์ •๋ณด, ์‹ฌ์ง€์–ด ์ž…๋ ฅ์ฐฝ ์ž๋™์™„์„ฑ ํ‚ค์›Œ๋“œ๊นŒ์ง€ ์‹น ๋‹ค ๊ฑฐ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ๋šฑ๋šฑํ•œ Context์— ์šฑ์—ฌ๋„ฃ๊ณ  ์ „์—ญ์—์„œ ๋ฝ‘์•„ ์“ธ๊ฒŒ์š”!"
  • ์˜ํ˜ธ(๋ฆฌ๋“œ): "์˜์ฒ  ๋‹˜... Context๋Š” ์ณ๋‹ค๋งŒ ๋ด๋„ ์ฃ„์•…์ธ '๋ Œ๋”๋ง ๋ฐฉ์‚ฌ๋Šฅ'์„ ๋‚ด๋ฟœ๋Š” ํญํƒ„ ๋ฐ”๊ตฌ๋‹ˆ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฑธ ํ•˜๋‚˜๋กœ ๋ญ‰์ณ๋†“๋‹ค๋‡จ."

๐Ÿค” ์™œ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€: Context๋Š” ๋ฌด์ฃ„๋‹ค, ๋‹น์‹ ์ด ๋‚จ์šฉํ–ˆ์„ ๋ฟ

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Zustand, Recoil, Redux ๊ฐ™์€ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๊ธฐ ์‹ซ์–ด์„œ, ๋ฆฌ์•กํŠธ ์•ˆ์— ๋‚ด์žฅ๋œ Context API๋ฅผ '์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ'๋ผ๊ณ  ๋งน์‹ ํ•˜๋Š” ์—„์ฒญ๋‚œ ์ฐฉ๊ฐ์„ ํ•ฉ๋‹ˆ๋‹ค.

Context ์ž์ฒด๋Š” ์ƒํƒœ(State)๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๊ด€๋ฆฌ(Manage)ํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค! ๊ทธ์ € ๋ถ€๋ชจ์˜ ์ƒํƒœ๋ฅผ ์ € ๋ฐ‘๋ฐ”๋‹ฅ ์‹ฌํ•ด๋กœ **ํฌํƒˆ์„ ์—ด์–ด ์ˆœ๊ฐ„์ด๋™(Dependency Injection, ์˜์กด์„ฑ ์ฃผ์ž…)**์‹œ์ผœ ์ค„ ๋ฟ์ธ ํŒŒ์ดํ”„๋ผ์ธ์— ๋ถˆ๊ณผํ•˜์ฃ .

๐Ÿค” ์ž ๊น, ๋จผ์ € ์ƒ๊ฐํ•ด๋ด
๊ฑฐ๋Œ€ํ•œ ๋ฐ”๊ตฌ๋‹ˆ(Context) ํ•˜๋‚˜์— ์œ ์ € ์ •๋ณด(name)์™€ ๋‹คํฌ๋ชจ๋“œ(isDark)๋ฅผ ๋‹ค ๋„ฃ์—ˆ์–ด. ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ฐคํ•˜๋Š˜์ฒ˜๋Ÿผ ์˜ˆ์œ ๋‹คํฌ๋ชจ๋“œ๋ฅผ ์ผฐ์ง€. ๊ทผ๋ฐ ์™œ ์œ ์ € ์ •๋ณด๋งŒ ์กฐ์šฉํžˆ ๋„์›Œ์ฃผ๋˜ ์˜† ๋™๋„ค ์•„๋ฐ”ํƒ€ ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ๋ฉ๋‹ฌ์•„ ๋ชธ์‚ด(๋ฆฌ๋ Œ๋”๋ง)์„ ์•“์„๊นŒ?

// โŒ ์˜์ฒ ์ด์˜ ํญํƒ„ ๋ฐ”๊ตฌ๋‹ˆ (Context ์˜ค๋‚จ์šฉ)
const AppContext = createContext();
 
function AppProvider({ children }) {
  const [theme, setTheme] = useState("light");
  const [user, setUser] = useState({ name: "์˜์ฒ " });
 
  // ๐Ÿ’ฃ ๋šฑ๋šฑํ•œ ๊ฐ์ฒด(๋ฐ”๊ตฌ๋‹ˆ) ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ํ†ต์งธ๋กœ ํˆฌํ•˜!
  const value = { theme, setTheme, user, setUser };
 
  return <AppContext.Provider value={value}>{children}</AppContext.Provider>;
}
 
// ------------------------------
// ์•„์ฃผ ์กฐ๊ทธ๋งŒ ์ปดํฌ๋„ŒํŠธ A
function Avatar() {
  // ๋‚˜๋Š” 'user'๋งŒ ํ•„์š”ํ•œ๋ฐ ์–ด์ฉ” ์ˆ˜ ์—†์ด ๊ฑฐ๋Œ€ ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ๋’ค์ ธ ๊บผ๋‚ธ๋‹ค
  const { user } = useContext(AppContext);
  console.log("์•„๋ฐ”ํƒ€ ๋ฆฌ๋ Œ๋”๋ง๋จ!"); // ๐Ÿšจ ํ…Œ๋งˆ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ๋‚˜๋„ ๋น„๋ช… ์ง€๋ฆ„!
  return <div>{user.name}</div>;
}

๊ฒฐ๊ณผ: ์œ ์ €๊ฐ€ setTheme("dark")๋ฅผ ๋ˆŒ๋Ÿฌ ๋‹คํฌ๋ชจ๋“œ๋ฅผ ์ „ํ™˜ํ•˜๋ฉด, ์ € ๋ฉ€๋ฆฌ ๊ตฌ์„์— ์ฒ˜๋ฐ•ํ˜€์„œ ๋กœ๊ทธ์ธ ์ด๋ฆ„๋งˆํฌ ๋„์šฐ๊ณ  ๊ฐ€๋งŒํžˆ ์žˆ๋˜ Avatar ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ•์ œ๋กœ ๋ฆฌ๋ Œ๋”๋ง๋˜๋ฉฐ ํ”ผ๊ฒฉ ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…์Šต๋‹ˆ๋‹ค.


๐Ÿ—๏ธ ๋น„์œ ๋กœ ๋จผ์ € ์ดํ•ดํ•˜๊ธฐ

๐Ÿง’ 5์‚ด์—๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค๋ฉด?

  1. Context๋Š” ๊ฑฐ๋Œ€ํ•œ ์Šคํ”ผ์ปค๊ฐ€ ๋‹ฌ๋ฆฐ ๋งˆ์„ํšŒ๊ด€ ๋™๋„ค ๋ฐฉ์†ก๊ตญ์ด์•ผ.
  2. ๋™๋„ค ๋ฐฉ์†ก ์ฃผํŒŒ์ˆ˜(useContext)๋ฅผ ๊ฝ‚๊ณ  ๋ผ๋””์˜ค๋ฅผ ๋“ฃ๋Š” ์ง‘๋“ค์ด 100๊ฐ€๊ตฌ๊ฐ€ ์žˆ์–ด. (์•„๋ฐ”ํƒ€ ์ง‘, ํ”„๋กœํ•„ ์ง‘, ํ…Œ๋งˆ ์„ธํŒ… ์ง‘ ๋“ฑ...)
  3. ์˜์ฒ (์ด์žฅ๋‹˜)์ด ๋งˆ์ดํฌ(Context Value)๋ฅผ ๋“ค๊ณ  ๋ฐฉ์†ก์„ ์ผฐ์–ด. "์•„์•„! ์˜ค๋Š˜๋ถ€ํ„ฐ ๋‹คํฌ๋ชจ๋“œ ์‹ค์‹œ!"
  4. ์•„๋ฐ”ํƒ€ ์ปดํฌ๋„ŒํŠธ๋Š” ์‚ฌ์‹ค ๋‹คํฌ๋ชจ๋“œ ๋”ฐ์œ„ 1๋„ ๊ด€์‹ฌ ์—†์–ด. ์œ ์ € ์•„์ด๋””๋งŒ ๋“ค์œผ๋ ค๊ณ  ๋ผ๋””์˜ค๋ฅผ ์ผ  ๋†ˆ์ด๊ฑฐ๋“ . (๋‚œ user ์ •๋ณด๋งŒ ๋บ์Œ)
  5. ํ•˜์ง€๋งŒ ๋ฆฌ์•กํŠธ๋Š” ์ž๋น„๊ฐ€ ์—†์ง€. ๋ฐฉ์†ก๊ตญ ๋งˆ์ดํฌ์—์„œ ์–ด์จŒ๋“  ์–ด๋–ค ์†Œ๋ฆฌ๋“  ๋‹จ ํ•˜๋‚˜๋ผ๋„ ์†ก์ถœ(Context Value ๊ฐ์ฒด์˜ ๊ป๋ฐ๊ธฐ ๋ณ€๋™)๋˜๋ฉด, ์ฃผํŒŒ์ˆ˜๋ฅผ ๊ตฌ๋… ์ค‘์ธ 100๊ฐ€๊ตฌ๋ฅผ ๋ชจ์กฐ๋ฆฌ ๋‹ค ๋ง์น˜๋กœ ๋‘๋“ค๊ฒจ ๊นจ์šฐ๊ณ  ๊ฐ•์ œ๋กœ ์žฌ์กฐ๋ฆฝ(๋ฆฌ๋ Œ๋”๋ง) ์‹œ์ผœ๋ฒ„๋ ค. "๋ฐฉ์†ก ๋‚˜์™”์œผ๋‹ˆ ๋‹ค ๋‹ค์‹œ ์„ธํŒ…ํ•ด!" ์ด๊ฒŒ ์ด๋ฅธ๋ฐ” ๋ Œ๋”๋ง ๋ฐฉ์‚ฌ๋Šฅ ์›Œํ„ฐํด์ด์•ผ.

โœ… ํ•ต์‹ฌ ์›๋ฆฌ:
09. ์ตœ์ ํ™”์˜ ๊ฑฐ์ง“๋ง์—์„œ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ๋ฆฌ์•กํŠธ๊ฐ€ ๋ฐœ์ž‘ํ•œ๋‹ค๊ณ  ๋ฐฐ์› ์ฃ ? AppProvider์—์„œ ๋ Œ๋”๋ง์ด ๋Œ๋ฉด, ์ €๊ธฐ ๊ตฌ๋ฉ(value)์— ๊ฝ‚ํžŒ { theme, user... } ๋ฌถ์Œ ๋ฐ”๊ตฌ๋‹ˆ ์ „์ฒด์˜ ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์ฒด ์ฃผ์†Œ์ง€๊ฐ€ ์ƒˆ๊ฑธ๋กœ ๊ฐˆ์•„ ์น˜์›Œ์ง‘๋‹ˆ๋‹ค.
useContext๋ฅผ ์„ ์–ธํ•œ ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์ด ๊บผ๋‚ด ์“ด ๊ฐ’์ด ๋ญ๋“ ์ง€ ๊ฐ„์—, "์•„! ์ € ๊ณต์žฅ์˜ ํฌ์žฅ์ง€(value ์ฃผ์†Œ๊ฐ’)๊ฐ€ ์ƒˆ๋กœ ๋ฐ”๋€Œ์—ˆ๊ตฐ! ๋‚ด๋ถ€๋Š” ์•ˆ ๋ด๋„ ์ƒˆ๋กœ ๋ Œ๋”๋งํ•ด์•ผ์ง€!" ๋ผ๋ฉฐ ๋ฌด์กฐ๊ฑด ๋ Œ๋”๋ง ์Šค๋ƒ…์ƒท์„ ๋Œ๋ ค๋ฒ„๋ฆฌ๋Š” ๋ฉ์ฒญํ•œ ์น˜๋ช…์  ๋‹จ์ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. (์ด๊ฒŒ Redux ๊ฐ™์€ ์™ธ๋ถ€ ์ƒํƒœ ํˆด์ด ๊ฐœ๋ณ„ ์ตœ์ ํ™”๋ฅผ ๊ตฌ์‚ฌํ•˜๋Š” ๊ฒƒ๊ณผ Context์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ž…๋‹ˆ๋‹ค.)


๐Ÿงฉ ๋ฐฉ์‚ฌ๋Šฅ ๋ถ„๋ฆฌ ํƒ€๊ฒฉ์ˆ : ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํฌํƒˆ๋กœ ์ชผ๊ฐœ๊ธฐ (Splitting)

์šฐ๋ฆฌ๊ฐ€ ์ด ๋ฐฉ์‚ฌ๋Šฅ ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•˜๋Š” ๊ฐ€์žฅ ๊ณ ์ƒํ•œ ์‹œ๋‹ˆ์–ด์˜ ๋ฐฉ๋ฒ•์€ ๋ฐฉ์‚ฌ๋Šฅ ํฌํƒˆ ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ '๊ธฐ๋Šฅ ๋‹จ์œ„', ๋˜๋Š” '์ƒํƒœ vs ์•ก์…˜ ๋‹จ์œ„'๋กœ ์•„์ฃผ ์ž˜๊ฒŒ ์ฐข์–ด ๋†“๋Š” ๊ฑฐ์•ผ.

โœ… ์˜ํ˜ธ์˜ ๋ฆฌํŒฉํ† ๋ง: ๋ฐ”๊ตฌ๋‹ˆ ๊ฐ•์ œ ๋ถ„ํ•  (Splitting Context)

์œ ์ € ๋ฐ”๊ตฌ๋‹ˆ๋ž‘ ํ…Œ๋งˆ ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ์ฐข๋Š” ๊ฑด ๋‹น์—ฐํ•œ ๊ฑฐ๊ณ , ๋‚˜์•„๊ฐ€์„œ 5๋…„ ์ฐจ๋“ค์€ ์„ฑ๋Šฅ์„ ํ•œ๊ณ„๊นŒ์ง€ ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด "๋ช…์‚ฌ(๊ฐ’)" ๊ณผ "๋™์‚ฌ(๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜)" ๋ฐ”๊ตฌ๋‹ˆ์กฐ์ฐจ ๊ฒฉ๋ฆฌ์‹œ์ผœ ๋ถ„๋‹จํ•ด ๋ฒ„๋ฆฌ์ง€.

// โœ… ์šฐ์•„ํ•œ ๊ณ ์„ฑ๋Šฅ ์•„ํ‚คํ…์ฒ˜ (Pro Approach)
// 1. ๊ฐ’(Value) ์ „์šฉ ํฌํƒˆ
const ThemeStateContext = createContext();
// 2. ํ–‰๋™(Action/Dispatch) ์ „์šฉ ํฌํƒˆ
const ThemeDispatchContext = createContext();
 
function ThemeProvider({ children }) {
  const [theme, setTheme] = useState("light");
 
  // ์ด ๋ณ€๊ฒฝ ๋ฒ„ํŠผ ํ•จ์ˆ˜๋“ค์€ ์•„๋ฌด๋ฆฌ ๋ Œ๋”๋งํ•ด๋„ ์˜์›ํžˆ ๋˜‘๊ฐ™์€ ์ฃผ์†Œ(ํฌ์žฅ์ง€)์—ฌ์•ผ ํ•จ!
  const dispatch = useMemo(() => ({
    toggleToDark: () => setTheme("dark"),
    toggleToLight: () => setTheme("light")
  }), []);
 
  return (
    <ThemeStateContext.Provider value={theme}>
      {/* ๐ŸŽฏ ํ–‰๋™ ํฌํƒˆ ์•„๋ž˜์— ๊ฐ’ ํฌํƒˆ์„ ์ค‘์ฒฉ ์„ค๊ณ„ */}
      <ThemeDispatchContext.Provider value={dispatch}>
        {children}
      </ThemeDispatchContext.Provider>
    </ThemeStateContext.Provider>
  );
}
 
// ------------------------------
// ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ B (๋‹คํฌ๋ชจ๋“œ ๋ณ€๊ฒฝ ๋ฒ„ํŠผ)
function DarkModeToggleButton() {
  // ๐ŸŽฏ ์ด ์ปดํฌ๋„ŒํŠธ๋Š” ์˜ค์ง '๋ˆ„๋ฅด๋Š” ๋™์ž‘'๋งŒ ํ•„์š”ํ•˜๋‹ค. 
  // '์ƒํƒœ(ํ…Œ๋งˆ ๊ฐ’)'๋ฅผ ๋ณด์ง€ ์•Š์œผ๋ฏ€๋กœ StateContext๋ฅผ ์ˆ˜์‹ (useContext)ํ•˜์ง€ ์•Š์Œ!
  const { toggleToDark } = useContext(ThemeDispatchContext);
 
  // ๐Ÿ˜ญ ์†Œ๋ฆ„๋‹๋Š” ๋งˆ๋ฒ•: ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํ…Œ๋งˆ๊ฐ€ ์Љ์Љ ๋ฐ”๊ปด๋„,
  // ์ด ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ ์ž์‹ ์€ ์ ˆ๋Œ€ ๋ฆฌ๋ Œ๋”๋ง ๋ฐ๋ฏธ์ง€๋ฅผ ๋งž์ง€ ์•Š๊ณ  ํ‰์˜จํ•˜๋‹ค!
  // ์ƒํƒœ ํฌํƒˆ ๊ตฌ๋…์„ ํฌ๊ธฐํ•˜๊ณ  ์•ก์…˜ ํฌํƒˆ๋งŒ ๊บผ๋‚ด ์ผ๊ธฐ ๋•Œ๋ฌธ.
  return <button onClick={toggleToDark}>์–ด๋‘ ์ด์—ฌ ๋‚ด๊ฒŒ ์˜ค๋ผ</button>;
}

์ด ์••๋„์  ์„ค๊ณ„(Context Splitting)๋ฅผ ๋ณด์‹ญ์‹œ์˜ค.
ํ…Œ๋งˆ ๊ฐ’์„ ๊ตฌ๋…(์ˆ˜์‹ )ํ•˜๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๋‹น์—ฐํžˆ ์ƒ‰์ด ๋ฐ”๋€Œ๋ฉด ์žฌ๊ฐœ์กฐ๋˜์–ด์•ผ ํ•˜๋‹ˆ๊นŒ ๋ฆฌ๋ Œ๋”๋ง ๋ฐ๋ฏธ์ง€๋ฅผ ์˜จ๋ชธ์œผ๋กœ ๋งž์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ! ๋‹จ์ˆœํžˆ ํ…Œ๋งˆ๋ฅผ ๋ฐ”๊พธ๋Š” '์Šค์œ„์น˜' ์—ญํ• ๋งŒ ํ•˜๋˜, ๊ตณ์ด ์ž๊ธฐ๊ฐ€ ์žฌ๋ Œ๋”๋ง๋˜๋ฉฐ ๊นœ๋นก๊ฑฐ๋ฆด ํ•„์š”๊ฐ€ ์—†๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์™„์ „ํžˆ ๊ฒฉ๋ฆฌ๋œ DispatchContext๋งŒ ์กฐ์šฉํžˆ ๊บผ๋‚ด ์”๋‹ˆ๋‹ค. ์ƒํƒœ ๋ณ€ํ™” ๋ฐฉ์‚ฌ๋Šฅ ํŒŒ๋™์„ ์™„๋ฒฝํ•˜๊ฒŒ ํ”ผํ•ด ๊ฐ€๋Š” ์ตœ๊ณ ์˜ ์ปดํฌ๋„ŒํŠธ ์ƒ์กด๊ธฐ๋ฒ•์ด์ฃ .


๐Ÿ’ฅ ์—๋Ÿฌ ํ•ด๊ฒฐ ์นดํƒˆ๋กœ๊ทธ

โŒ ๋งค๋ฒˆ value์— ์Œฉ ๊ฐ์ฒด๋ฅผ ์‘ค์…” ๋„ฃ๋Š” ์ตœ์•…์˜ ํ–‰์œ„

์ƒํ™ฉ:

const DataContext = createContext(null);
 
function Layout() {
  const [info, setInfo] = useState('data');
  const size = useWindowSize(); // ํ›…(์ฐฝ ํฌ๊ธฐ ๊ฐ์ง€)
  
  // ๐Ÿ’ฅ Layout์ด ๋ Œ๋”๋ง(์ฐฝ ํฌ๊ธฐ ์ถ•์†Œ ๋“ฑ) ๋Œ ๋•Œ๋งˆ๋‹ค ์ด { ์•ˆ์˜ } ๊ดด๋ฌผ ๊ฐ™์€ ๊ฐ์ฒด ํฌ์žฅ์ง€๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์–ด ์‚ดํฌ๋œ๋‹ค.
  return (
    <DataContext.Provider value={{ info, setInfo }}>
      <PageArea />
    </DataContext.Provider>
  )
}

์›์ธ: useWindowSize ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์ด 1px๋ผ๋„ ์ข์•„์ง€๊ฑฐ๋‚˜ ์กฐ์ž‘ ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค Layout ๊ป๋ฐ๊ธฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์„ ๋•๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ๋งˆ๋‹ค ์ € value={{ info, setInfo }} ๊ตฌ๋ฌธ์ด ๋“ค์ด๋ฐ•ํžˆ๋ฉด์„œ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๋”๋ฏธ ๋ถ•์–ด๋นต ๊ป์งˆ ๊ฐ์ฒด 100๋งŒ ๊ฐœ๊ฐ€ ๋ณต์‚ฌ ๋ฐœ์‚ฌ๋ฉ๋‹ˆ๋‹ค. info๋Š” ํ„ธ๋ํ•˜๋‚˜ ๋ฐ”๋€Œ์ง€ ์•Š์•˜์Œ์—๋„, DataContext๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ํŠธ๋ฆฌ ๋ฐฑ๋งŒ ๋Œ€๊ตฐ์ด ์“ธ๋ฐ์—†์ด ํ•™์‚ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…:
Context๋ฅผ ํ•˜๋‚˜๋กœ ๊ธฐ์›Œ ์“ฐ์ง€ ๋ง๊ณ , ์ฐข์–ด๋‚ด๋Š” ์œ„ ๋ฐฉ๋ฒ•์ด ์ตœ์„ ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ตณ์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋ฌถ์–ด์•ผ๊ฒ ๋‹ค๋ฉด ์ตœํ›„์˜ ๋ณด๋ฃจ์ธ ๋ฐฉ์–ด๊ธฐ์žฌ(useMemo)๋ฅผ ๋ฐ”๋ฅด์‹ญ์‹œ์˜ค.
<DataContext.Provider value={useMemo(() => ({info, setInfo}), [info])}> ๋กœ ํฌ์žฅ์ง€๋ฅผ ๊ฐ•์ œ ๋™๊ฒฐ์‹œํ‚ค๋ฉด ๊ทธ๋‚˜๋งˆ ์•„๋น„๊ทœํ™˜์€ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ ์ด๋ฒˆ์— ๋ฐฐ์šด ๋‚ด์šฉ ์ด์ •๋ฆฌ

์ƒํ™ฉโŒ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ)์˜ ์ž‘๋™โœ… ์ˆœ์ˆ˜ Context API์˜ ์ž‘๋™(ํ•œ๊ณ„์ )
๊ฑฐ๋Œ€ ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์กฐ๊ทธ๋งŒ ๊ฐ’ A๋งŒ ์ˆ˜์‹ ๊ฐ’ A๊ฐ€ ์•ˆ ๋ฐ”๋€Œ์—ˆ์œผ๋ฉด Selector๋กœ ์ปท! ๋‚˜๋Š” ๋ Œ๋”๋ง ๋ฌดํšจ๊ฐ’ B๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค๊ณ ? ํฌ์žฅ์ง€๊ฐ€ ๊ฐˆ๋ ธ์œผ๋‹ˆ ์ปดํฌ๋„ŒํŠธ A ๋„ˆ๋„ ๊ฐ•์ œ ํญํŒŒ! (์ž๋น„ ์—†์Œ)
๊ทน๋ณต ์•„ํ‚คํ…์ฒ˜๋‹จ์ผ ๊ฑฐ๋Œ€ ์Šคํ† ์–ด ์ œ์ž‘ ๊ฐ€๋Šฅ๋ฐ˜๋“œ์‹œ ๊ด€์‹ฌ์‚ฌ๋ณ„๋กœ(User / Theme / Locale) ์ˆ˜์‹ญ ๊ฐœ์˜ Context๋ฅผ ๋ถ„ํ•  ์กฐ๋ฆฝ

๐Ÿ’ก ํ•œ ์ค„๋กœ ๊ธฐ์–ตํ•˜๊ธฐ
Context๋Š” ์šฐ๋ฒ„์ด์ธ , ๋ฐฐ๋ฏผ ๋ฐฐ๋‹ฌํ†ต๊ณผ ๊ฐ™๋‹ค. ์•ˆ์— ์น˜ํ‚จ(์œ ์ € ์ •๋ณด)๊ณผ ํ”ผ์ž(๋‹คํฌ๋ชจ๋“œ)๋ฅผ ๋‹ค ์šฐ๊ฒจ๋„ฃ๊ณ  ํฌ์žฅํ•ด์„œ ๋ฐฐ๋‹ฌํ•˜๋ฉด, ํ”ผ์ž์— ๊ด€์‹ฌ ์—†๋Š” ์น˜ํ‚จ๋Ÿฌ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ํฌ์žฅ์ง€(๋ฉ”๋ชจ๋ฆฌ ๊ป๋ฐ๊ธฐ ์ฃผ์†Œ) ๊ฐœ๋ด‰์— ํœฉ์“ธ๋ ค ๋ฌด์กฐ๊ฑด ๋ฆฌ๋ Œ๋”๋ง ๋…ธ๋™์„ ๋›ฐ๊ฒŒ ๋œ๋‹ค.๊ทธ๋Ÿฌ๋ฏ€๋กœ Context๋Š” ์ƒํƒœ์˜ ๋‹จ์œ„, ๋‚˜์•„๊ฐ€ ์ฝ๊ธฐ(State)์™€ ์“ฐ๊ธฐ(Dispatch) ๋‹จ์œ„๋กœ ์ž˜๊ฒŒ ๋„๋ ค๋‚ด ํŒŒ์ดํ”„ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋‚ด๋ ค๊ฝ‚๋Š” ๊ฒƒ์ด ์‹œ๋‹ˆ์–ด์˜ ๊ธฐ์ดˆ ์†Œ์–‘์ด๋‹ค.


๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

Redux ๊น”๊ธฐ ๊ท€์ฐฎ์•„์„œ ๊ทธ๋ƒฅ useContext ์•ˆ์— ๋ชจ๋“  ์ •๋ณด ๋‹ค ๋•Œ๋ ค๋„ฃ๊ณ  ํŽธํ•˜๊ฒŒ ์‚ด๋ ค ํ–ˆ๋Š”๋ฐ, ๊ทธ๊ฒƒ ๋•Œ๋ฌธ์— ์ƒ๊ด€๋„ ์—†๋Š” ์ปดํฌ๋„ŒํŠธ 100๊ฐœ๊ฐ€ ๋‹ค ๋ Œ๋”๋ง ๋…ธ๋™์„ ๋›ฐ๊ณ  ์žˆ์—ˆ๋‹ค๋‹ˆ ๋“ฑ์— ๋•€์ด ์ญ‰ ๋‚ฌ๋‹ค.

๐Ÿ’ก "๋ช…์‚ฌ(๊ฐ’)์™€ ๋™์‚ฌ(ํ•จ์ˆ˜) ๋ฐ”๊ตฌ๋‹ˆ์กฐ์ฐจ ์ฐข์–ด ๋ฒ„๋ ค๋ผ! ๊ป๋ฐ๊ธฐ๋งŒ ๋ฐ”๋€Œ์–ด๋„ ํ•˜์œ„ ํŠธ๋ฆฌ ์ „์ฒด๊ฐ€ ์žฟ๋”๋ฏธ๊ฐ€ ๋˜๋Š” Context ๋ฐฉ์‚ฌ๋Šฅ์„ ๋ง‰๋Š” ์ตœ๊ณ ์˜ ์ „์ˆ ์ด๋‹ค."

๋‹คํฌ๋ชจ๋“œ ์Šค์œ„์น˜ ๋ฒ„ํŠผ ํ•˜๋‚˜ ๋•Œ๋ฌธ์— ๋ฒ„ํŠผ ์ž์‹ ๊นŒ์ง€ ๊นœ๋นก๊ฑฐ๋ฆฌ์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  Dispatch ์ „์šฉ ํฌํƒˆ์„ ๋šซ๋Š” ๊ธฐ๋ฒ•์€ ์™„์ „ ์˜ˆ์ˆ ์ด์—ˆ๋‹ค. ๋ฌด์ž‘์ • ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ๋ผ๊ณ  Context ํ•˜๋‚˜๋กœ ๊ธฐ์›Œ ๋ฒ„๋ ธ๋˜ ์ง€๋‚œ๋‚ ์˜ ๋ฉ์ฒญํ•œ ์ฝ”๋“œ๋“ค์„ ํ•œ ๋•€ ํ•œ ๋•€ ๋„๋ ค๋‚ด๊ณ  ์‹ถ์–ด์กŒ๋‹ค. ์ง‘์— ๊ฐ€์„œ ๋งฅ์ฃผ ํ•œ ์บ” ํ•˜๋ฉด์„œ ๋‚ด ์ฝ”๋“œ ์ƒํƒœ ์ง€์˜ฅ๋„๋‚˜ ํ•œ ๋ฒˆ ํŒŒํ—ค์ณ๋ด์•ผ๊ฒ ๋‹ค.


๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ

Q1. useContext์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๋น—๋Œ„ ๊ฐ€์žฅ ์ •ํ™•ํ•œ ๋ช…์ œ๋ฅผ ๊ณ ๋ฅด์„ธ์š”.

  • A) "Context๋Š” ๊ตฌ๋… ์ค‘์ธ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ ๋ฐ”๊ตฌ๋‹ˆ ๋‚ด๋ถ€ ์†์„ฑ(Property) ์ค‘ ๋‚ด๊ฐ€ ์“ฐ๋Š” ๊ฐ’์ด ๋ณ€ํ–ˆ์„ ๋•Œ๋งŒ ์Šค๋งˆํŠธํ•˜๊ฒŒ ์Šคํ‚ตํ•ด ์ฃผ๋Š” ๋‚ด์žฅ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ’ˆ๊ณ  ์žˆ๋‹ค."
  • B) "Context Provider์˜ value๋กœ ๋˜์ ธ์ง€๋Š” ๊ฐ์ฒด(๊ป๋ฐ๊ธฐ)์˜ ์ฐธ์กฐ ์ฃผ์†Œ(Object.is)๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ˆœ๊ฐ„, ๊ทธ๊ฒƒ์„ ๋“ฃ๊ณ  ์žˆ๋Š” ํ•˜์œ„์˜ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์ž๋น„ ์—†์ด ๋ชจ์กฐ๋ฆฌ ๋ฆฌ๋ Œ๋”๋ง ํƒ€๊ฒฉ์„ ๋งž๋Š”๋‹ค."
  • C) "Context ์•ˆ์— ์ƒํƒœ(State)๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžˆ๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฌด๊ฑฐ์›Œ์ง€๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ•์ œ๋กœ Redux ์ €์žฅ์†Œ ์„œ๋ฒ„๋กœ ์˜ฎ๊ธด๋‹ค."
  • D) "Context API๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ํ—ˆ๋ฌผ์–ด๋ถ€์ˆ˜๋Š” ์–‘๋ฐฉํ–ฅ ์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ ์ „์šฉ ๋„๊ตฌ๋‹ค."

โœ… ์ •๋‹ต: B

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค: ๋ฆฌ์•กํŠธ Context ํญํฌ์ˆ˜(Waterfall) ์›๋ฆฌ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ๋ฆฌ๋•์Šค(Redux)๋‚˜ ์ฅฌ์Šคํƒ ๋“œ(Zustand)์˜ ์…€๋ ‰ํ„ฐ(selector) ๊ธฐ๋ฒ•๊ณผ ๋‹ค๋ฅด๊ฒŒ, ๋‚ด์žฅ Context๋Š” ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ์†์„ฑ์ด ๋ฌด์—‡์ธ์ง€ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ํŒŒ์•…ํ•  ์ง€๋Šฅ๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ์ € ๋งˆ์ดํฌ ์ œ๊ณต์ž(Provider)์˜ value๋ผ๋Š” ์ปค๋‹ค๋ž€ ํ†ต(๊ฐ์ฒด ์ฃผ์†Œ) ์ž์ฒด๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ทธ๋ƒฅ ํ•˜์œ„์— ์žˆ๋Š” ์ถ”์ข…์ž ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฌด์ง€์„ฑ์œผ๋กœ ์ „์› ๋ฉฑ์‚ด ๋Œ๊ณ  ๋ Œ๋”๋ง ๋ง์œผ๋กœ ๋Œ๊ณ  ๋‚˜์˜ค๋Š” ๋ฌด์‹ํ•˜์ง€๋งŒ ๋‹จ์ˆœ ๋ฌด์‹ํ•œ ์˜์กด์„ฑ ์ฃผ์ž…๊ด€์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๋ž˜์„œ ํ•จ๋ถ€๋กœ ๋‚จ์šฉํ•˜๋ฉด ์ตœํ•˜์œ„์— ํ—ฌ๊ฒŒ์ดํŠธ๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค.)

Q2. ์„ฑ๋Šฅ ์ตœ์ƒ์˜ Context ํŒจํ„ด์ธ "์ƒํƒœ/์•ก์…˜ ๋ถ„๋ฆฌ๋ฒ•(Splitting)"์„ ์ ์šฉํ–ˆ์„ ๋•Œ, ๋‹คํฌ๋ชจ๋“œ๋ฅผ ์ „ํ™˜ํ•˜๋Š” ์Šค์œ„์น˜ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ์ ์šฉ๋œ ๋†€๋ผ์šด ์ตœ์ ํ™” ์ด๋“์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • A) ํ† ๊ธ€ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ ์ž์ฒด๊ฐ€ ์ „์—ญ ์ƒํƒœ ์บ์‹œ์— ๋“ค์–ด๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด๋„ ์˜๊ตฌ ์ €์žฅ๋˜๋Š” ๋งˆ๋ฒ•.
  • B) ํ† ๊ธ€ ๋ฒ„ํŠผ์„ 10๋ฒˆ ๊ด‘์ ์œผ๋กœ ํด๋ฆญํ•ด์„œ ์ „์—ญ ํ…Œ๋งˆ State๊ฐ€ ์š”๋™์ณ๋„, ์ด ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ ์ž๊ธฐ ์ž์‹ ์€ ์–ด์ฐจํ”ผ State ํฌํƒˆ์„ ํŒŒ๋‚ด์ง€ ์•Š์•˜๊ณ  ํ†ต์ œ๊ถŒ(Dispatch ์•ก์…˜ ํฌํƒˆ) ๊ณต๊ฐ„๋งŒ ์žก๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๋ณธ์ธ ์Šค์Šค๋กœ์˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฒˆ์ฉ์ž„(๊นœ๋ฐ•์ž„ ์—ฐ์‚ฐ)์„ 100% ๋ชจ๋ฉดํ•˜๊ณ  ๋ฌด์  ์ƒํƒœ๊ฐ€ ๋œ๋‹ค๋Š” ๊ธฐ์ .
  • C) ์•ก์…˜ ํ•จ์ˆ˜ ์ž์ฒด๊ฐ€ ์›น ์›Œ์ปค(Web Worker) ๋‚ด๋ถ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋ฐ€๋ ค๊ฐ€ ๋ฒ„ํŠผ์˜ ๋ ˆ์ดํ„ด์‹œ(์†๋„)๊ฐ€ ํ˜„์ €ํ•˜๊ฒŒ ๋‹จ์ถ•๋˜๋Š” ์ .

โœ… ์ •๋‹ต: B

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค: ํฌํƒˆ๋กœ ์ฐข๊ณ  ์˜ค๋กœ์ง€ ์•ก์…˜ ์ฃผ์‚ฌ๊ธฐ(Dispatch)๋งŒ ๊ฝ‚์•„์„œ ์“ฐ๋ฉด, ์ € ๋ฐ‘์— ์ƒํƒœ๊ฐ€ ์–ด๋–ป๊ฒŒ ํƒ€์˜ค๋ฅด๋“  ๋ง๋“  ์ด ๋ฒ„ํŠผ ๋†ˆ์€ ๊ทธ ๋ฐฉ์‚ฌ๋Šฅ์„ ๋งž์ง€ ์•Š๋Š” ๊น”๋”ํ•œ ๊ฒฉ๋ฆฌ๋ง‰์ด ํ˜•์„ฑ๋ฉ๋‹ˆ๋‹ค.

Q3. ์˜์ฒ ์ด๋Š” "Props Drilling์ด ๋„ˆ๋ฌด ์ง€๊ฒน๊ณ  ์ปดํฌ๋„ŒํŠธ ๋ช‡ ๊นŠ์ด ์ด์ƒ ํƒ€๋Š” ๊ฑฐ ๊ผด๋„ ๋ณด๊ธฐ ์‹ซ์–ด์š”. ์•ž์œผ๋ก  ๋กœ๊ทธ์ธ ๋ฐ์ดํ„ฐ๋“ , ๊ฒ€์ƒ‰์ฐฝ ๊ฒ€์ƒ‰์–ด๋“  ์ปดํฌ๋„ŒํŠธ ๋„˜๊ธฐ๋Š” ๊ฑด ์‹น ๋‹ค ๋ฌด์กฐ๊ฑด Context API๋ฅผ ์“ธ๋ž˜์š”." ๋ผ๊ณ  ๋‹น๋Œํ•˜๊ฒŒ ์™ธ์นฉ๋‹ˆ๋‹ค. ์˜ํ˜ธ๊ฐ€ Context์˜ ๋ฌด๋ถ„๋ณ„ ๋‚จ์šฉ ์‹œ ์ดˆ๋ž˜๋˜๋Š” '์ปดํฌ๋„ŒํŠธ์˜ ์„ค๊ณ„ ๋ฏธํ•™์  ๋ถ•๊ดด ์ธก๋ฉด(์žฌ์‚ฌ์šฉ์„ฑ ๋ฐ•์‚ด)'์„ ๋“ค์–ด ์กฐ์šฉํžˆ ๋ฐ˜๋ฐ•ํ•˜๋Š” ๋ง์„ ์ฃผ๊ด€์‹์œผ๋กœ ์ ์œผ์‹œ์˜ค. (๋‹จ์ˆœ ์„ฑ๋Šฅ ์ €ํ•˜ ์ด์Šˆ๊ฐ€ ์•„๋‹˜!)

โœ… ์ •๋‹ต ๋ฐ ์ฃผ๊ด€์‹ ํ•ด์„ค:

"์˜์ฒ  ๋‹˜, ํ”„๋กญ์Šค ๊ตฌ๋ฉ ๋šซ๊ธฐ๊ฐ€ ์‹ซ๋‹ค๊ณ  ๋ชจ๋“  ๊ฑธ Context ํŒŒ์ดํ”„๋ผ์ธ์— ์—ฐ๊ฒฐํ•˜๋ฉด ์ƒ๊ธฐ๋Š” ๊ฐ€์žฅ ์น˜๋ช…์  ๋…์†Œ๋Š” ๋ฐ”๋กœ '์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ(Coupling ์ง€์˜ฅ)' ์— ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์ปดํฌ๋„ŒํŠธ(<Button>, <UserCard>)๋ฅผ ์ด์˜๊ฒŒ ํฌ์žฅํ•ด์„œ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฑด ๋‚˜์ค‘์— ์ €์ชฝ B ์‚ฌ์ด๋“œ๋ฐ” ๋ฉ”๋‰ด๋‚˜ ์˜† ๋™๋„ค ํ”„๋กœ์ ํŠธ์—์„œ ์™ ๋–ผ๋‹ค๊ฐ€ ๊ทธ๋Œ€๋กœ ์žฌ์กฐ๋ฆฝ(์žฌ์‚ฌ์šฉ)์„ ํ•˜๋ ค๋Š” ๋ชฉ์ ์ด์ฃ . ๋งŒ์•ฝ ๊ทธ <UserCard> ์•ˆ์— ๊ฐ•์ œ๋กœ ์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ๋‹จ ์˜ฅ์ƒ์— ์žˆ๋Š” ๋šฑ๋šฑํ•œ ํŠน์ • UserContext๋ฅผ ๋œฏ์–ด๋จน๋„๋ก ํŒŒ์ดํ”„๋ผ์ธ(useContext ๋กœ์ง)์„ ์‹ฌ์–ด๋†” ๋ฒ„๋ ธ๋‹ค๋ฉด?
๊ทธ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฌด์กฐ๊ฑด ์˜์ฒ ๋‹˜์ด ์„ธํŒ…ํ•œ ํŠน์ • Context.Provider ์šฐ์‚ฐ ์ด๋ถˆ ๋ฐ‘์—์„œ๋งŒ ์‚ด์•„๋‚จ๋Š” ๋…ธ์˜ˆ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋–ผ์–ด๋‹ค ๋”ด ๊ณณ์— ๋†”๋‘๋ฉด ํŒŒ์ดํ”„๊ฐ€ ๋Š๊ฒจ ์ฆ‰์‚ฌ(Error)ํ•ด๋ฒ„๋ฆฌ๊ณ  ์ข…์†์„ฑ ์ŠคํŒŒ๊ฒŒํ‹ฐ๊ฐ€ ํŒŒํƒ„๋‚˜๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
๊ทธ์ € ๋ถ€๋ชจ์—์„œ ์ž์‹์œผ๋กœ ์–•์€ ์ˆ˜์ค€์ธ 2~3๋‹จ๊ณ„ ๋ ˆ๋ฒจ์˜ ํ”„๋กญ์Šค ์—ฐํŒ์ด๋ผ๋ฉด, ๋” ๋”๋Ÿฌ์›Œ ๋ณด์—ฌ๋„ ์†”์งํ•˜๊ฒŒ ๊ตฌ๋ฉ์„ ๋šซ๊ณ  ์ง(Props)์„ ์ฅ์—ฌ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ปดํฌ๋„ŒํŠธ์˜ ํƒˆ๋ถ€์ฐฉ(ํ•ฉ์„ฑ/์žฌ์‚ฌ์šฉ)์„ ์•„๋ฆ„๋‹ต๊ณ  ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋†”๋‘๋Š” ์ •์„์ž…๋‹ˆ๋‹ค."