createContext๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ Context๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const SomeContext = createContext(defaultValue)

๋ ˆํผ๋Ÿฐ์Šค

createContext(defaultValue)

์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ createContext๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

import { createContext } from 'react';

const ThemeContext = createContext('light');

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋งค๊ฐœ๋ณ€์ˆ˜

  • defaultValue: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ์„ ๋•Œ ์ƒ์œ„์— ์ผ์น˜ํ•˜๋Š” ์ปจํ…์ŠคํŠธ ์ œ๊ณต์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•  ๊ฐ’์ž…๋‹ˆ๋‹ค. ์˜๋ฏธ ์žˆ๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ์—†์œผ๋ฉด null์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ โ€œ์ตœํ›„์˜ ์ˆ˜๋‹จโ€์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์ •์ ์ด๋ฉฐ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

createContext๋Š” ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ ๊ฐ์ฒด ์ž์ฒด๋Š” ์–ด๋– ํ•œ ์ •๋ณด๋„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฝ๊ฑฐ๋‚˜ ์ œ๊ณตํ•˜๋Š” ์–ด๋–ค ์ปจํ…์ŠคํŠธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ปจํ…์ŠคํŠธ ๊ฐ’์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด SomeContext๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์•„๋ž˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ฝ๊ธฐ ์œ„ํ•ด useContext(SomeContext)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • SomeContext๋Š” ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์ปจํ…์ŠคํŠธ ๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • SomeContext.Consumer๋Š” ์ปจํ…์ŠคํŠธ ๊ฐ’์„ ์ฝ๋Š” ๋Œ€์•ˆ์ด๋ฉฐ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • SomeContext.Provider๋Š” React 19 ์ด์ „ ๋ฒ„์ „์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์˜ค๋ž˜๋œ ์ปจํ…์ŠคํŠธ ๊ฐ’ ์ œ๊ณต ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

SomeContext Provider

์ปดํฌ๋„ŒํŠธ๋ฅผ ์ปจํ…์ŠคํŠธ ์ œ๊ณต์žProvider๋กœ ๊ฐ์‹ธ์„œ ์ด ์ปจํ…์ŠคํŠธ์˜ ๊ฐ’์„ ๋ชจ๋“  ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ์— ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

function App() {
const [theme, setTheme] = useState('light');
// ...
return (
<ThemeContext value={theme}>
<Page />
</ThemeContext>
);
}

์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!

React 19๋ถ€ํ„ฐ๋Š” <SomeContext>๋ฅผ ์ œ๊ณต์žProvider๋กœ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ž˜๋œ React ๋ฒ„์ „์€ <SomeContext.Provider>๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Props

  • value: ์ด ์ œ๊ณต์ž ๋‚ด๋ถ€์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๋ ค๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ ๊ฐ’์€ ์–ด๋– ํ•œ ์œ ํ˜•์ด๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ณต์ž ๋‚ด๋ถ€์—์„œ useContext(SomeContext)๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๊ทธ ์œ„์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ•ด๋‹น ์ปจํ…์ŠคํŠธ ์ œ๊ณต์ž์˜ value๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

SomeContext.Consumer

useContext๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ๋Š” ์ด์ „ ๋ฐฉ์‹์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

function Button() {
// ๐ŸŸก ์ด์ „ ๋ฐฉ์‹ (๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ)
return (
<ThemeContext.Consumer>
{theme => (
<button className={theme} />
)}
</ThemeContext.Consumer>
);
}

์ด ์˜ˆ์ „ ๋ฐฉ์‹์€ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€๋งŒ, ์ƒˆ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” ๋Œ€์‹  useContext()๋กœ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

function Button() {
// โœ… ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•
const theme = useContext(ThemeContext);
return <button className={theme} />;
}

Props

  • children: ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. React๋Š” useContext()์™€ ๋™์ผํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฒฐ์ •๋œ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ด ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด React๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ณ  UI๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

์ปจํ…์ŠคํŠธ ์ƒ์„ฑ

์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ •๋ณด๋ฅผ ๊นŠ๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ createContext๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

import { createContext } from 'react';

const ThemeContext = createContext('light');
const AuthContext = createContext(null);

createContext๋Š” ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋Š” ์ด๋ฅผ useContext()์— ์ „๋‹ฌํ•˜์—ฌ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function Button() {
const theme = useContext(ThemeContext);
// ...
}

function Profile() {
const currentUser = useContext(AuthContext);
// ...
}

๊ธฐ๋ณธ์ ์œผ๋กœ, ๊ทธ๋“ค์ด ๋ฐ›๋Š” ๊ฐ’์€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ง€์ •ํ•œ ๊ธฐ๋ณธ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž์ฒด์ ์œผ๋กœ ์ด๋Š” ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ๋Š” ๋‹ค๋ฅธ ๋™์  ๊ฐ’๋“ค์„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

function App() {
const [theme, setTheme] = useState('dark');
const [currentUser, setCurrentUser] = useState({ name: 'Taylor' });

// ...

return (
<ThemeContext value={theme}>
<AuthContext value={currentUser}>
<Page />
</AuthContext>
</ThemeContext>
);
}

์ด์ œ Page ์ปดํฌ๋„ŒํŠธ์™€ ๊ทธ ์•ˆ์˜ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ, ์–ผ๋งˆ๋‚˜ ๊นŠ๋“ ์ง€ ๊ฐ„์— ์ „๋‹ฌ๋œ ์ปจํ…์ŠคํŠธ ๊ฐ’์„ โ€œ๋ณผโ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋‹ฌ๋œ ์ปจํ…์ŠคํŠธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด, React๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ๊ณ  ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๊ณ  ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.


ํŒŒ์ผ์—์„œ ์ปจํ…์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ๋‚ด๋ณด๋‚ด๊ธฐ

์ข…์ข… ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋™์ผํ•œ ์ปจํ…์ŠคํŠธ์— ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ณ„๋„์˜ ํŒŒ์ผ์—์„œ ์ปจํ…์ŠคํŠธ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ export ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

export const ThemeContext = createContext('light');
export const AuthContext = createContext(null);

๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์„ ์–ธ๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ์ด ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด import ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// Button.js
import { ThemeContext } from './Contexts.js';

function Button() {
const theme = useContext(ThemeContext);
// ...
}
// App.js
import { ThemeContext, AuthContext } from './Contexts.js';

function App() {
// ...
return (
<ThemeContext value={theme}>
<AuthContext value={currentUser}>
<Page />
</AuthContext>
</ThemeContext>
);
}

์ด๊ฒƒ์€ ์ปดํฌ๋„ŒํŠธ import ๋ฐ exportํ•˜๊ธฐ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.


๋ฌธ์ œ ํ•ด๊ฒฐ

์ปจํ…์ŠคํŠธ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์–ด์š”

์ด๋Ÿฐ ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ ์ปจํ…์ŠคํŠธ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

const ThemeContext = createContext('light');

์ด ๊ฐ’์€ ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. React๋Š” ์ƒ์œ„์— ์ผ์น˜ํ•˜๋Š” ์ œ๊ณต์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด ๊ฐ’์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ๊ฐ€ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋˜๋„๋ก ๋งŒ๋“ค๋ ค๋ฉด, State๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ปจํ…์ŠคํŠธ ์ œ๊ณต์ž๋กœ ๊ฐ์‹ธ์„ธ์š”.