๐ ๋ฌด๋ถ๋ณํ ์ ์ญ ์ํ(Global State) ์ฌ์ฉ: ์์ธก ๋ถ๊ฐ๋ฅํ ์ํ ๋ณํ์ ์ฑ๋ฅ ๋ณ๋ชฉ, ๐ชข ๋ณต์กํ ์์กด์ฑ
Summary
๋ฌด๋ถ๋ณํ ์ ์ญ ์ํ ์ฌ์ฉ์ ์์ธก ๋ถ๊ฐ๋ฅํ ์ํ ๋ณํ, ์ฑ๋ฅ ์ ํ, ์ ์ง๋ณด์ ์ด๋ ค์, ๋๋ฒ๊น ๋ณต์ก์ฑ ์ฆ๊ฐ๋ฅผ ์ด๋ํฉ๋๋ค. ์ ์ ํ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, Context API, ์ต์ ํ ๊ธฐ๋ฒ, ๋๋ฒ๊น ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ์ ์ญ ์ํ๋ฅผ ํจ์จ์ ์ด๊ณ ํฌ๋ช ํ๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
Why Wrong?
์ ์ญ ์ํ๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ ๊ฑธ์ณ ์ํ ๋ณํ๊ฐ ์์ธก ๋ถ๊ฐ๋ฅํ๊ฒ ๋ฐ์ํ๊ณ , ํน์ ์ปดํฌ๋ํธ์์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ถํ์ํ๊ฒ ๋ง์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์ด ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํฉ๋๋ค. ์ปดํฌ๋ํธ ๊ฐ์ ์์กด์ฑ์ด ๋์์ ธ ์ฝ๋ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๊ณ , ์ํ ๋ณํ ์ถ์ ์ด ํ๋ค์ด ๋๋ฒ๊น ์ด ๋ณต์กํด์ง๋๋ค.
How to Fix?
- ๋ช
ํํ ์ํ ๊ด๋ฆฌ ๋ชฉํ ์ค์ : ์ด๋ค ์ํ๊ฐ ์ ์ญ์ ์ผ๋ก ๊ด๋ฆฌ๋์ด์ผ ํ๋์ง ๋ช
ํํ ์ ์ํ๊ณ , ๋ก์ปฌ ์ํ๋ก ๊ด๋ฆฌ ๊ฐ๋ฅํ ๋ถ๋ถ์ ๋ถ๋ฆฌํฉ๋๋ค. 2. ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํ: Redux, Zustand, Recoil ๋ฑ ์ ์ ํ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ์ฌ ์ํ ๊ด๋ฆฌ๋ฅผ ์ฒด๊ณํํฉ๋๋ค. 3. Context API ํ์ฉ: ๊ฐ๋จํ ์ ์ญ ์ํ๋ React Context API๋ฅผ ํ์ฉํ์ฌ ๊ด๋ฆฌํ๊ณ , ๋ณต์กํ ์ํ ๊ด๋ฆฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. 4. ์ํ ์
๋ฐ์ดํธ ์ต์ ํ: ์ํ ์
๋ฐ์ดํธ ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ต์ํํ๊ธฐ ์ํด
useMemo
,useCallback
ํ ์ ํ์ฉํ๊ณ , Immer ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ณ์ฑ์ ์ ์งํ๋ฉด์ ํจ์จ์ ์ธ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ํํฉ๋๋ค. 5. ์ํ ๋ณํ ๋ก๊น ๋ฐ ๋๋ฒ๊น ๋๊ตฌ ํ์ฉ: ์ํ ๋ณํ๋ฅผ ์ถ์ ํ๊ณ ๋๋ฒ๊น ํ๊ธฐ ์ํด Redux DevTools์ ๊ฐ์ ๋๊ตฌ๋ฅผ ํ์ฉํฉ๋๋ค. 6. ๊ด์ฌ์ฌ ๋ถ๋ฆฌ: ์ ์ญ ์ํ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์ ๊ทธ๋ ์ง ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํ์ฌ ์์กด์ฑ์ ๋ฎ์ถฅ๋๋ค.
์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Context API๋ฅผ ์ฌ์ฉํด ์ ์ญ ์ํ๋ก ๊ด๋ฆฌํ๋, ์ํ ์ ๋ฐ์ดํธ ๋ฒ์๋ฅผ ์ขํ๊ณ , ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๋ ์ต์ ํ ๊ธฐ๋ฒ์ ์ ์ฉํด์ผ ํฉ๋๋ค. ๋ํ, ์ํ ๋ณํ ์ถ์ ๋ฐ ๋๋ฒ๊น ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ํฌ๋ช ํ๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
Before Code (Bad)
// ์ ์ญ ๋ณ์๋ฅผ ์ด์ฉํ ์ํ ๊ด๋ฆฌ (์์, ์ค์ ๋ก๋ ๋ ๋ณต์กํ ๋ก์ง์ด ์์ ์ ์์)
let theme = 'light';
function toggleTheme() {
theme = theme === 'light' ? 'dark' : 'light';
// ๊ฐ์ ๋ก ๋ชจ๋ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง (๋งค์ฐ ๋นํจ์จ์ )
forceUpdateAllComponents();
}
function MyComponent() {
return (
<div>
Current theme: {theme}
<button onClick={toggleTheme}>Toggle Theme</button>
</div>
);
}
After Code (Good)
// React Context๋ฅผ ์ด์ฉํ ์ํ ๊ด๋ฆฌ
import React, { createContext, useState, useContext } from 'react';
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 useTheme() {
return useContext(ThemeContext);
}
function MyComponent() {
const { theme, toggleTheme } = useTheme();
return (
<div>
Current theme: {theme}
<button onClick={toggleTheme}>Toggle Theme</button>
</div>
);
}
// App.js
function App() {
return (
<ThemeProvider>
<MyComponent />
</ThemeProvider>
);
}