็„ก์ œ

Context API (์ฝ˜ํ…์ŠคํŠธ ์—์ดํ”ผ์•„์ด) ๋ณธ๋ฌธ

<React>

Context API (์ฝ˜ํ…์ŠคํŠธ ์—์ดํ”ผ์•„์ด)

yo-u-loo 2026. 7. 15. 10:50

 

๐ŸŸก Context API

์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ „์—ญ์œผ๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” React์˜ ๋‚ด์žฅ ๊ธฐ๋Šฅ.

 

โ—ผ๏ธ Props Drilling์˜ ๋ฌธ์ œ์ 

๊ธฐ๋ณธ์ ์œผ๋กœ React๋Š” ๋ถ€๋ชจ์—์„œ ์ž์‹์œผ๋กœ props๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์ง€๋งŒ, ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๊ฐ€ ๊นŠ์–ด์งˆ์ˆ˜๋ก ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์ณ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ props๋ฅผ ๊ณ„์† ์ „๋‹ฌํ•˜๋Š” ํ˜„์ƒ์„ Props Drilling์ด๋ผ๊ณ  ํ•œ๋‹ค.

Context API๋Š” ์ด๋Ÿฌํ•œ Props Drilling ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

<App user={user}> (๋ฐ์ดํ„ฐ ์†Œ์œ )
  ↓ Props ์ „๋‹ฌ
<Parent user={user}> (๋ฐ์ดํ„ฐ ์ „๋‹ฌ)
  ↓ Props ์ „๋‹ฌ
<Child user={user}> (๋ฐ์ดํ„ฐ ์ „๋‹ฌ)
  ↓ Props ์ „๋‹ฌ
<GrandChild user={user}> (๋ฐ์ดํ„ฐ ์‚ฌ์šฉ)
  • ์ฝ”๋“œ ๋ณต์žก์„ฑ
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ props๊ฐ€ ๊ณ„์† ์ถ”๊ฐ€๋œ๋‹ค.
  • ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€
    • props ์ด๋ฆ„์ด๋‚˜ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋„ ํ•จ๊ป˜ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ ์ €ํ•ด
    • ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•œ ๊ตฌ์กฐ๊ฐ€ ๊ณ ์ •๋˜์–ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

โ—ผ๏ธ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ

๐Ÿ”น createContext()

Context ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

import { createContext } from "react";

const ThemeContext = createContext();

 

๐Ÿ”น Provider

Context ๋ฐ์ดํ„ฐ๋ฅผ Provider ๋‚ด๋ถ€์˜ ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•œ๋‹ค.

<ThemeContext.Provider value={theme}>
  <App />
</ThemeContext.Provider>
  • value ์†์„ฑ์— ์ „๋‹ฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ”น useContext()

Provider๊ฐ€ ์ „๋‹ฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” Hook์ด๋‹ค.

import { useContext } from "react";

const theme = useContext(ThemeContext);

 

โ—ผ๏ธ ์‚ฌ์šฉ ์ˆœ์„œ

1๏ธโƒฃ Context ์ƒ์„ฑ

// src/contexts/ThemeContext.js
import React from 'react';

// ThemeContext๋ผ๋Š” Context ๊ฐ์ฒด ์ƒ์„ฑ
const ThemeContext = React.createContext('light'); // ๊ธฐ๋ณธ๊ฐ’ 'light'

export default ThemeContext;

 

2๏ธโƒฃ Provider๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

// App.js ๋˜๋Š” ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ
import React, { useState } from 'react';
import ThemeContext from './contexts/ThemeContext'; // ์ƒ์„ฑํ•œ Context ์ž„ํฌํŠธ
import MyComponent from './MyComponent';

function App() {
  const [theme, setTheme] = useState('light'); // ํ…Œ๋งˆ ์ƒํƒœ ๊ด€๋ฆฌ
  
  const toggleTheme = () => {
    setTheme(currentTheme => (currentTheme === 'light' ? 'dark' : 'light'));
  };

  return (
    // ThemeContext.Provider๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ 'theme' ๊ฐ’์„ ์ œ๊ณต
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      <button onClick={toggleTheme}>ํ…Œ๋งˆ ์ „ํ™˜</button>
      <MyComponent /> {/* ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ */}
    </ThemeContext.Provider>
  );
}

export default App;

 

3๏ธโƒฃ useContext๋กœ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ

// MyComponent.js (ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ)
import React, { useContext } from 'react';
import ThemeContext from './contexts/ThemeContext'; // Context ์ž„ํฌํŠธ

function MyComponent() {
  // useContext ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ThemeContext์˜ ๊ฐ’(theme, toggleTheme)์„ ๊ฐ€์ ธ์˜ด
  const { theme, toggleTheme } = useContext(ThemeContext);

  return (
    <div style={{ background: theme === 'dark' ? '#333' : '#eee', color: theme === 'dark' ? 'white' : 'black' }}>
      <h1>ํ˜„์žฌ ํ…Œ๋งˆ: {theme}</h1>
      <p>Context API๋ฅผ ํ†ตํ•ด ํ…Œ๋งˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.</p>
      <button onClick={toggleTheme}>ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ…Œ๋งˆ ์ „ํ™˜</button>
    </div>
  );
}

export default MyComponent;

 

โ—ผ๏ธ ํ™œ์šฉ ์‚ฌ๋ก€

  • ํ…Œ๋งˆ(Theme): ๋‹คํฌ ๋ชจ๋“œ, ๋ผ์ดํŠธ ๋ชจ๋“œ ๋“ฑ ์•ฑ ์ „์ฒด ํ…Œ๋งˆ ๊ด€๋ฆฌ.
  • ์‚ฌ์šฉ์ž(User): ๋กœ๊ทธ์ธ ์—ฌ๋ถ€, ์‚ฌ์šฉ์ž ์ •๋ณด, ํ† ํฐ ๊ด€๋ฆฌ.
  • ์–ธ์–ด(Language): ๋‹ค๊ตญ์–ด ์ง€์›์„ ์œ„ํ•œ ์–ธ์–ด ๊ด€๋ฆฌ.
  • ๊ณตํ†ต ์„ค์ •(Settings): ์•ฑ ์ „์ฒด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์„ค์ • ๊ฐ’ ๊ด€๋ฆฌ.

 

 

๐Ÿ“ POINT ๐Ÿ“

โœ”๏ธ Context API๋Š” ์ „์—ญ์œผ๋กœ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. โœ”๏ธ

โœ”๏ธ ๋ชจ๋“  ์ƒํƒœ๋ฅผ Context๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. โœ”๏ธ

โœ”๏ธ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. โœ”๏ธ

โœ”๏ธ ๋ณต์žกํ•œ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด Redux, Zustand ๋“ฑ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค. โœ”๏ธ