Front-end/React

[React] Context: ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์€๋ฐ€ํ•œ ํ•ด๊ฒฐ์‚ฌ ๐ŸŒ

xeunnie 2024. 12. 31. 01:00
728x90
๋ฐ˜์‘ํ˜•

๐ŸŒ React์˜ Context์— ๋Œ€ํ•ด ํ†บ์•„๋ณด์ž!

React ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ โ€œ๋ถ€๋ชจ โ†’ ์ž์‹ โ†’ ์†์žโ€ ์‹์œผ๋กœ ์ค„์ค„์ด ๋‚ด๋ ค์ค˜์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์–ด์š”. ์ด๋•Œ ์šฐ๋ฆฌ๋Š” โ€œprops drillingโ€์ด๋ผ๋Š” ์žฌ๋ฏธ์—†๋Š” ๋†€์ด์— ๋น ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์ด ๋„ˆ๋ฌด ๊ท€์ฐฎ๊ณ  ๋ณต์žกํ•˜๊ฒŒ ๋А๊ปด์งˆ ๋•Œ, ๋ฐ”๋กœ React Context๊ฐ€ ๊ตฌ์„ธ์ฃผ์ฒ˜๋Ÿผ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค!

 

์˜ค๋Š˜์€ React Context์˜ ๋ชจ๋“  ๊ฒƒ์„ ํƒˆํƒˆ ํ„ธ์–ด๋ด…๋‹ˆ๋‹ค. Context๊ฐ€ ๋ญ”์ง€, ์™œ ์จ์•ผ ํ•˜๋Š”์ง€, ์–ด๋–ป๊ฒŒ ์“ฐ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ „์—์„œ ์œ ์šฉํ•œ ํŒ๊นŒ์ง€! ๐Ÿ˜Ž


๐ŸŒŸ Context๋ž€?

Context๋Š” React ์•ฑ์—์„œ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ „์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ props๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์ง€๋งŒ, ์ค‘๊ฐ„์— ์žˆ๋Š” ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์ฃ .

 

๐Ÿ’ก ๊ณต์‹ ์„ค๋ช…

Context provides a way to pass data through the component tree without having to pass props down manually at every level.

 

๐Ÿ‘‰ ๋ฒˆ์—ญ: Context๋Š” ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ „์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค props๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

 

๐Ÿค” ์™œ Context๋ฅผ ์จ์•ผ ํ• ๊นŒ?

  1. Props Drilling ๋ฐฉ์ง€
    • ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š” ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ต์ง€๋กœ props๋กœ ๋ฐ›์•„ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ์—†์•ฑ๋‹ˆ๋‹ค.
  2. ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ
    • ํ…Œ๋งˆ, ์‚ฌ์šฉ์ž ์ธ์ฆ, ์–ธ์–ด ์„ค์ • ๋“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ์—์„œ ๊ณต์œ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  3. ์ฝ”๋“œ ๊ฐ„๊ฒฐํ™”
    • props๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ์ „๋‹ฌํ•˜๋Š” ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ์ค„์ด๊ณ , ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

๐ŸŒณ Context์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

React Context๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด 3๊ฐ€์ง€ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. Context ์ƒ์„ฑ
    • React.createContext()๋กœ Context๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. Provider๋กœ ๊ฐ’ ์ „๋‹ฌ
    • Context.Provider๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  3. Consumer๋กœ ๊ฐ’ ์‚ฌ์šฉ
    • Context.Consumer๋‚˜ useContext ํ›…์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ๊ธฐ๋ณธ ์˜ˆ์ œ

import React, { createContext, useContext } from 'react';

// 1. Context ์ƒ์„ฑ
const ThemeContext = createContext();

// 2. Provider๋กœ ๊ฐ’ ์ „๋‹ฌ
function ThemeProvider({ children }) {
  const theme = 'dark';
  return (
    <ThemeContext.Provider value={theme}>
      {children}
    </ThemeContext.Provider>
  );
}

// 3. Consumer๋กœ ๊ฐ’ ์‚ฌ์šฉ
function ThemedComponent() {
  const theme = useContext(ThemeContext);
  return <div>The current theme is {theme}</div>;
}

function App() {
  return (
    <ThemeProvider>
      <ThemedComponent />
    </ThemeProvider>
  );
}

export default App;

โœจ Context ์ฃผ์š” ๊ฐœ๋…

1. Provider

Provider๋Š” Context์˜ ๊ฐ’์„ ๊ณต๊ธ‰ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. Context๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” Provider๊ฐ€ ์ œ๊ณตํ•œ ๊ฐ’์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

<ThemeContext.Provider value="light">
  <ChildComponent />
</ThemeContext.Provider>

2. Consumer

Consumer๋Š” Context ๊ฐ’์„ ์ฝ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. useContext ํ›…์œผ๋กœ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์ฃ .

<ThemeContext.Consumer>
  {(value) => <div>The theme is {value}</div>}
</ThemeContext.Consumer>

3. useContext

React์˜ useContext ํ›…์€ Context ๊ฐ’์„ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜์ฃ .

const value = useContext(MyContext);

๐ŸŒˆ ์‹ค์ „ ํ™œ์šฉ ์˜ˆ์ œ

1. ๋‹คํฌ ๋ชจ๋“œ ํ…Œ๋งˆ ๊ด€๋ฆฌ

import React, { createContext, useContext, useState } from 'react';

// Context ์ƒ์„ฑ
const ThemeContext = createContext();

function ThemeProvider({ children }) {
  const [theme, setTheme] = useState('light');

  const toggleTheme = () => {
    setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'));
  };

  return (
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      {children}
    </ThemeContext.Provider>
  );
}

function ThemeToggleButton() {
  const { theme, toggleTheme } = useContext(ThemeContext);
  return (
    <button onClick={toggleTheme}>
      Toggle to {theme === 'light' ? 'dark' : 'light'}
    </button>
  );
}

function ThemedComponent() {
  const { theme } = useContext(ThemeContext);
  return <div>The current theme is {theme}</div>;
}

function App() {
  return (
    <ThemeProvider>
      <ThemeToggleButton />
      <ThemedComponent />
    </ThemeProvider>
  );
}

export default App;

 

2. ์‚ฌ์šฉ์ž ์ธ์ฆ ๊ด€๋ฆฌ

import React, { createContext, useContext, useState } from 'react';

// Context ์ƒ์„ฑ
const AuthContext = createContext();

function AuthProvider({ children }) {
  const [user, setUser] = useState(null);

  const login = (username) => setUser({ username });
  const logout = () => setUser(null);

  return (
    <AuthContext.Provider value={{ user, login, logout }}>
      {children}
    </AuthContext.Provider>
  );
}

function UserProfile() {
  const { user } = useContext(AuthContext);
  return <div>{user ? `Logged in as ${user.username}` : 'Not logged in'}</div>;
}

function LoginButton() {
  const { login } = useContext(AuthContext);
  return <button onClick={() => login('ReactDeveloper')}>Login</button>;
}

function LogoutButton() {
  const { logout } = useContext(AuthContext);
  return <button onClick={logout}>Logout</button>;
}

function App() {
  return (
    <AuthProvider>
      <UserProfile />
      <LoginButton />
      <LogoutButton />
    </AuthProvider>
  );
}

export default App;

โš ๏ธ Context ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  1. ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง
    • Context ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด Provider ํ•˜์œ„์˜ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…: ๊ฐ’์ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ, Context ๋Œ€์‹  ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Redux, Zustand ๋“ฑ)๋ฅผ ๊ณ ๋ คํ•˜์„ธ์š”.
  2. ๋ณต์žกํ•œ ๊ตฌ์กฐ
    • Context๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…: Provider๋ฅผ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, useReducer์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์„ธ์š”.

๐ŸŽฏ ์š”์•ฝ

  1. Context๋ž€?
    • ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ „์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” React์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ
  2. ์–ธ์ œ ์“ฐ๋‚˜?
    • Props drilling์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๊ธ€๋กœ๋ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ
  3. ๊ตฌ์กฐ์™€ ํ•ต์‹ฌ ๊ฐœ๋…
    • createContext, Provider, useContext
  4. ์‹ค์ „์—์„œ ์œ ์šฉํ•œ ํŒจํ„ด
    • ํ…Œ๋งˆ ๊ด€๋ฆฌ, ์‚ฌ์šฉ์ž ์ธ์ฆ ๋“ฑ.

 

๐ŸŒท ์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น! ๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•