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

2026๋…„ 3์›” 8์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

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์— ๊ฐ์ฒด๋ฅผ ๋„ฃ๋Š” ์ตœ์•…์˜ ํ–‰์œ„

์ƒํ™ฉ: "๋‚˜๋Š” size๋ฅผ Context์— ๋„ฃ์ง€๋„ ์•Š์•˜๋Š”๋ฐ ์™œ ํ•˜์œ„ ํŠธ๋ฆฌ๊ฐ€ ๋‹ค ํ„ฐ์งˆ๊นŒ?"

const DataContext = createContext(null);
 
function Layout() {
  const [info, setInfo] = useState('data');
  const size = useWindowSize(); // ๐Ÿšจ ๋ฒ”์ธ: ์ฐฝ ํฌ๊ธฐ 1px๋งŒ ๋ณ€ํ•ด๋„ Layout์„ ๋ฆฌ๋ Œ๋”๋ง์‹œํ‚ด
 
  return (
    // ๐Ÿ’ฅ ์„ฑ๋Šฅ ์žฌ์•™์˜ ์ฃผ๋ฒ”: {{ ... }} ์ค‘๊ด„ํ˜ธ ๋‘ ๊ฐœ
    <DataContext.Provider value={{ info, setInfo }}>
      <PageArea />
    </DataContext.Provider>
  )
}

๐Ÿ” ์™œ '์„ฑ๋Šฅ ์žฌ์•™'์ธ๊ฐ€? (ํ•ต์‹ฌ ์š”์•ฝ):

  1. ์ฆ‰์„ ๋ถ•์–ด๋นต ๊ตฌ์›Œ๋‚ด๊ธฐ: value={{ info, setInfo }}๋Š” ๋ฆฌ์•กํŠธ์—๊ฒŒ **"๋ Œ๋”๋ง ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ฃผ์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋ผ"**๊ณ  ๋ช…๋ นํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ์ฐธ์กฐ๊ฐ’ ๋ถˆ์ผ์น˜ ์ง€์˜ฅ: info ๊ฐ’์ด ํ„ธ๋ ํ•˜๋‚˜ ์•ˆ ๋ฐ”๋€Œ์—ˆ์–ด๋„, ๊ฐ์ฒด ์ฃผ์†Œ(0x001 -> 0x002) ๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋˜๊ณ , ๋ฆฌ์•กํŠธ Context ์—”์ง„์€ "๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ–ˆ๋‹ค"๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฌด์ฐจ๋ณ„ ํ”ผ๊ฒฉ: DataContext๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ์ € ๋ฐ‘๋ฐ”๋‹ฅ์˜ ์ˆ˜๋ฐฑ ๊ฐœ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๋ถ€๋ชจ๊ฐ€ ์ฐฝ ํฌ๊ธฐ ์กฐ์ ˆ(size)๋กœ ํ”๋“ค๋ฆด ๋•Œ๋งˆ๋‹ค ๋ฌด์ง€์„ฑ์œผ๋กœ ๊ฐ•์ œ ๋ฆฌ๋ Œ๋”๋ง ํญํ’ ์„ ๋งž์Šต๋‹ˆ๋‹ค.

โœ… ํ•ด๊ฒฐ์ฑ…: ๋ƒ‰๋™ ๋™๊ฒฐ (useMemo)

// ๐ŸงŠ [info]๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ํ•œ, ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
const memoizedValue = useMemo(() => ({ info, setInfo }), [info]);
 
return <DataContext.Provider value={memoizedValue}>{children}</DataContext.Provider>;

์ด๋ ‡๊ฒŒ ํ•ด์•ผ ๋ถ€๋ชจ๊ฐ€ ์•„๋ฌด๋ฆฌ ๋ฆฌ๋ Œ๋”๋งํ•ด๋„, ํ•˜์œ„ ํŠธ๋ฆฌ๋Š” ํ‰์˜จ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


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

๋น„๊ต ํ•ญ๋ชฉ๐Ÿ“ฆ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand, Redux)โšก ์ˆœ์ˆ˜ Context API
๋ Œ๋”๋ง ๋ฐฉ์–ด๊ฐ€๋Šฅ: ๊ฐ’์ด ์•ˆ ๋ฐ”๋€Œ์—ˆ์œผ๋ฉด Selector๋กœ ์ปท! ๋ Œ๋”๋ง ๋ฌดํšจํ™”๋ถˆ๊ฐ€๋Šฅ: ํฌ์žฅ์ง€(value ์ฃผ์†Œ)๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ•˜์œ„ ํŠธ๋ฆฌ๋Š” ๊ฐ•์ œ ๋ฆฌ๋ Œ๋”๋ง
์ด์ƒ์ ์ธ ์„ค๊ณ„ ๋ฐฉ์‹์ˆ˜๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ๋‹จ์ผ ๊ฑฐ๋Œ€ ์Šคํ† ์–ด(Store) ๋กœ ์šด์˜ ๊ฐ€๋Šฅ๋ Œ๋”๋ง ์˜ค์—ผ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๊ด€์‹ฌ์‚ฌ๋ณ„๋กœ ์ˆ˜์‹ญ ๊ฐœ์˜ Context๋กœ ์ชผ๊ฐœ์•ผ ํ•จ

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

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

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

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

โœ… ์ •๋‹ต: B

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

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

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

โœ… ์ •๋‹ต: B

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

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

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

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


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

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

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

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