August 10, 2025

๐Ÿชข ๋ถˆํ•„์š”ํ•œ React Context Provider ๋ž˜ํ•‘: ์„ฑ๋Šฅ ์ €ํ•˜์™€ ๋””๋ฒ„๊น… ๋ณต์žก์„ฑ ์ฆ๊ฐ€

React
์„ฑ๋Šฅ
์ƒํƒœ๊ด€๋ฆฌ
์ปดํฌ๋„ŒํŠธ
๋ Œ๋”๋ง์ „๋žต
์•„ํ‚คํ…์ฒ˜
UX

Summary

React Context Provider๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๋””๋ฒ„๊น… ๋ณต์žก์„ฑ์„ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. Context ์‚ฌ์šฉ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ , ๋นˆ๋ฒˆํ•œ ์—…๋ฐ์ดํŠธ ๊ฐ’์€ Context ๋Œ€์‹  ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ์ƒํƒœ๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Why Wrong?

React Context๋Š” ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์— ์œ ์šฉํ•˜์ง€๋งŒ, ํ•„์š” ์ด์ƒ์œผ๋กœ Provider๋ฅผ ์ค‘์ฒฉํ•˜๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋„ˆ๋ฌด ๋†’์€ ๊ณณ์— ์œ„์น˜์‹œํ‚ค๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๊ณ , Context ๊ฐ’ ๋ณ€๊ฒฝ ์ถ”์ ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์–ด ๋””๋ฒ„๊น…์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํŠนํžˆ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ฐ’์„ ์ƒ์œ„ Provider์—์„œ ์ œ๊ณตํ•˜๋ฉด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, Provider๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด ์–ด๋–ค Provider๊ฐ€ ์–ด๋–ค ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›Œ ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

How to Fix?

Context Provider๋Š” ํ•„์š”ํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ , Provider๋ฅผ ์ค‘์ฒฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ Context๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋นˆ๋ฒˆํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ฐ’์€ Context๋ฅผ ํ†ตํ•ด ์ œ๊ณตํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ตœ์ ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. React DevTools๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ค Context์— ์˜์กดํ•˜๊ณ  ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  Context ๊ฐ’ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š”์ง€ ๋ถ„์„ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ Provider ๋ž˜ํ•‘์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Before Code (Bad)

// App.jsx
import React, { useState } from 'react';
import ThemeContext from './ThemeContext';
import UserContext from './UserContext';
import Profile from './Profile';

function App() {
  const [theme, setTheme] = useState('light');
  const [user, setUser] = useState({ name: 'John Doe', age: 30 });

  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      <UserContext.Provider value={{ user, setUser }}>
        <Profile />
      </UserContext.Provider>
    </ThemeContext.Provider>
  );
}

export default App;

// Profile.jsx
import React, { useContext } from 'react';
import ThemeContext from './ThemeContext';
import UserContext from './UserContext';

function Profile() {
  const { theme } = useContext(ThemeContext);
  const { user } = useContext(UserContext);

  return (
    <div style={{ backgroundColor: theme === 'light' ? '#fff' : '#000' }}>
      <h1>{user.name}</h1>
      <p>Age: {user.age}</p>
    </div>
  );
}

export default Profile;

// ThemeContext.js
import { createContext } from 'react';

const ThemeContext = createContext(null);

export default ThemeContext;

// UserContext.js
import { createContext } from 'react';

const UserContext = createContext(null);

export default UserContext;

After Code (Good)

// App.jsx
import React, { useState } from 'react';
import ThemeContext from './ThemeContext';
import Profile from './Profile';

function App() {
  const [theme, setTheme] = useState('light');

  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      <Profile user={{ name: 'John Doe', age: 30 }} />
    </ThemeContext.Provider>
  );
}

export default App;

// Profile.jsx
import React, { useContext } from 'react';
import ThemeContext from './ThemeContext';

function Profile({ user }) {
  const { theme } = useContext(ThemeContext);

  return (
    <div style={{ backgroundColor: theme === 'light' ? '#fff' : '#000' }}>
      <h1>{user.name}</h1>
      <p>Age: {user.age}</p>
    </div>
  );
}

export default Profile;

// ThemeContext.js
import { createContext } from 'react';

const ThemeContext = createContext(null);

export default ThemeContext;