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

2026๋…„ 4์›” 30์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

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

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

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

๐Ÿ“‹ ๋ชฉ์ฐจ


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

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

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

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

๐Ÿค” ์™œ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€: 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: "์˜์ฒ " });
 
  // theme๋งŒ ๋ฐ”๋€Œ์–ด๋„ value ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.
  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 ์ปดํฌ๋„ŒํŠธ๋„ ๊ฐ™์€ Context๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ๊ป˜ ๋ฆฌ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.


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

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

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

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


๐Ÿงฉ ๋ Œ๋”๋ง ์˜ค์—ผ ์ค„์ด๊ธฐ: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํฌํƒˆ๋กœ ๋‚˜๋ˆ„๊ธฐ (Splitting)

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

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

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

// โœ… ์šฐ์•„ํ•œ ๊ณ ์„ฑ๋Šฅ ์•„ํ‚คํ…์ฒ˜ (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 ํ•˜๋‚˜๋กœ ๊ธฐ์›Œ ๋ฒ„๋ ธ๋˜ ์ง€๋‚œ๋‚ ์˜ ๋น„ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋“ค์„ ํ•œ ๋•€ ํ•œ ๋•€ ๋„๋ ค๋‚ด๊ณ  ์‹ถ์–ด์กŒ๋‹ค. ์ง‘์— ๊ฐ€์„œ ๋งฅ์ฃผ ํ•œ ์บ” ํ•˜๋ฉด์„œ ๋‚ด ์ฝ”๋“œ ์ƒํƒœ ๋ฌธ์ œ ์ƒํ™ฉ๋‚˜ ํ•œ ๋ฒˆ ํŒŒํ—ค์ณ๋ด์•ผ๊ฒ ๋‹ค.