createContext

createContext๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
const SomeContext = createContext(defaultValue)

์ฐธ์กฐ

createContext(defaultValue)

์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ createContext๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.
import { createContext } from 'react'; const ThemeContext = createContext('light');

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

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

๋ฐ˜ํ™˜๊ฐ’

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

SomeContext.Provider

์ปดํฌ๋„ŒํŠธ๋ฅผ ์ปจํ…์ŠคํŠธ provider๋กœ ๊ฐ์‹ธ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์ด ์ปจํ…์ŠคํŠธ์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”:
function App() { const [theme, setTheme] = useState('light'); // ... return ( <ThemeContext.Provider value={theme}> <Page /> </ThemeContext.Provider> ); }

Props

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

SomeContext.Consumer

useContext ์ด์ „์—๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ๋Š” ์˜ค๋ž˜๋œ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค:
function Button() { // ๐ŸŸก Legacy way (not recommended) return ( <ThemeContext.Consumer> {theme => ( <button className={theme} /> )} </ThemeContext.Consumer> ); }
์ด ์˜ค๋ž˜๋œ ๋ฐฉ๋ฒ•์€ ์—ฌ์ „ํžˆ ๋™์ž‘ํ•˜์ง€๋งŒ ์ƒˆ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” ๋Œ€์‹  useContext()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
function Button() { // โœ… Recommended way const theme = useContext(ThemeContext); return <button className={theme} />; }

Props

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

์‚ฌ์šฉ๋ฒ•

context ์ƒ์„ฑํ•˜๊ธฐ

์ปจํ…์ŠคํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ ๋„ ์ •๋ณด๋ฅผ ๊นŠ์ˆ™์ด ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ 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.Provider value={theme}> <AuthContext.Provider value={currentUser}> <Page /> </AuthContext.Provider> </ThemeContext.Provider> ); }
์ด์ œ Page ์ปดํฌ๋„ŒํŠธ์™€ ๊ทธ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” ์•„๋ฌด๋ฆฌ ๊นŠ์ˆ™์ด ๋“ค์–ด๊ฐ€๋”๋ผ๋„ ์ „๋‹ฌ๋œ ์ปจํ…์ŠคํŠธ ๊ฐ’์„ โ€œ๋ฐ”๋ผ๋ณด๊ฒŒโ€ ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ „๋‹ฌ๋œ ์ปจํ…์ŠคํŠธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด, React๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ๋Š” ์ปดํฌ๋„ŒํŠธ๋„ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ์—์„œ ์ปจํ…์ŠคํŠธ import ๋ฐ exportํ•˜๊ธฐ

์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ผํ•œ ์ปจํ…์ŠคํŠธ์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ปจํ…์ŠคํŠธ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ์— ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ 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.Provider value={theme}> <AuthContext.Provider value={currentUser}> <Page /> </AuthContext.Provider> </ThemeContext.Provider> ); }
์ด๋Š” ์ปดํฌ๋„ŒํŠธ import ๋ฐ export์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ

์ปจํ…์ŠคํŠธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ ์ปจํ…์ŠคํŠธ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค:
const ThemeContext = createContext('light');
์ด ๊ฐ’์€ ์ ˆ๋Œ€ ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. React๋Š” ์œ„์—์„œ ์ผ์น˜ํ•˜๋Š” provider๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด ๊ฐ’์„ ๋Œ€์ฒดํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋„๋ก ํ•˜๋ ค๋ฉด ์ปจํ…์ŠคํŠธ provider์— state๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ์„ธ์š”.