๐ชข ๋ถํ์ํ React Context Provider ๋ํ: ์ฑ๋ฅ ์ ํ์ ๋๋ฒ๊น ๋ณต์ก์ฑ ์ฆ๊ฐ
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;