νλ‘λ°μ΄λ ν¨ν΄μ νμ©ν ν¨μ¨μ μΈ React Context μ¬μ©λ²μ μμ보μΈμ. React μ ν리μΌμ΄μ μ μ±λ₯, 리λ λλ§ λ° μ μ μν κ΄λ¦¬μ λν λͺ¨λ² μ¬λ‘λ₯Ό λ°°μλλ€.
React Context μ΅μ ν: νλ‘λ°μ΄λ ν¨ν΄ ν¨μ¨μ±
React Contextλ μ μ μνλ₯Ό κ΄λ¦¬νκ³ μ ν리μΌμ΄μ μ 체μ λ°μ΄ν°λ₯Ό 곡μ νκΈ° μν κ°λ ₯ν λꡬμ λλ€. νμ§λ§ μ μ€νκ² κ³ λ €νμ§ μμΌλ©΄ λΆνμν 리λ λλ§κ³Ό κ°μ μ±λ₯ λ¬Έμ λ₯Ό μΌμΌν¬ μ μμ΅λλ€. μ΄ λΈλ‘κ·Έ ν¬μ€νΈμμλ ν₯μλ ν¨μ¨μ±κ³Ό λͺ¨λ² μ¬λ‘λ₯Ό μν΄ νλ‘λ°μ΄λ ν¨ν΄μ μ΄μ μ λ§μΆ° React Context μ¬μ©μ μ΅μ ννλ λ°©λ²μ μμΈν μμλ΄ λλ€.
React Context μ΄ν΄νκΈ°
κΈ°λ³Έμ μΌλ‘ React Contextλ λͺ¨λ λ 벨μμ μλμΌλ‘ propsλ₯Ό μ λ¬ν νμ μμ΄ μ»΄ν¬λνΈ νΈλ¦¬λ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό μ λ¬νλ λ°©λ²μ μ 곡ν©λλ€. μ΄λ μ¬μ©μ μΈμ¦ μν, ν λ§ μ€μ λλ μ ν리μΌμ΄μ ꡬμ±κ³Ό κ°μ΄ λ§μ μ»΄ν¬λνΈμμ μ κ·Όν΄μΌ νλ λ°μ΄ν°μ νΉν μ μ©ν©λλ€.
React Contextμ κΈ°λ³Έ ꡬ쑰λ μΈ κ°μ§ ν΅μ¬ μμλ‘ κ΅¬μ±λ©λλ€:
- Context κ°μ²΄:
React.createContext()
λ₯Ό μ¬μ©νμ¬ μμ±λ©λλ€. μ΄ κ°μ²΄λ `Provider`μ `Consumer` μ»΄ν¬λνΈλ₯Ό ν¬ν¨ν©λλ€. - Provider: μμ μ»΄ν¬λνΈμκ² μ»¨ν μ€νΈ κ°μ μ 곡νλ μ»΄ν¬λνΈμ λλ€. 컨ν μ€νΈ λ°μ΄ν°μ μ κ·Όν΄μΌ νλ μ»΄ν¬λνΈλ€μ κ°μλλ€.
- Consumer (λλ useContext ν ): Providerκ° μ 곡ν 컨ν μ€νΈ κ°μ μ¬μ©νλ μ»΄ν¬λνΈμ λλ€.
κ°λ μ μ€λͺ νκΈ° μν κ°λ¨ν μμλ λ€μκ³Ό κ°μ΅λλ€:
// Create a context
const ThemeContext = React.createContext('light');
function App() {
return (
<ThemeContext.Provider value='dark'>
<Toolbar />
</ThemeContext.Provider>
);
}
function Toolbar() {
return (
<div>
<ThemedButton />
</div>
);
}
function ThemedButton() {
const theme = React.useContext(ThemeContext);
return (
<button style={{ backgroundColor: theme === 'dark' ? 'black' : 'white', color: theme === 'dark' ? 'white' : 'black' }}>
Button
</button>
);
}
λ¬Έμ μ : λΆνμν 리λ λλ§
React Contextμ μ£Όλ μ±λ₯ λ¬Έμ λ Providerκ° μ 곡νλ κ°μ΄ λ³κ²½λ λ λ°μν©λλ€. κ°μ΄ μ λ°μ΄νΈλλ©΄, λ³κ²½λ κ°μ μ§μ μ¬μ©νμ§ μλλΌλ ν΄λΉ 컨ν μ€νΈλ₯Ό μ¬μ©νλ λͺ¨λ μ»΄ν¬λνΈκ° 리λ λλ§λ©λλ€. μ΄λ ν¬κ³ 볡μ‘ν μ ν리μΌμ΄μ μμ μ¬κ°ν λ³λͺ© νμμ μ λ°νμ¬ μ±λ₯ μ νμ λμ μ¬μ©μ κ²½νμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
컨ν μ€νΈκ° μ¬λ¬ μμ±μ κ°μ§ ν° κ°μ²΄λ₯Ό κ°μ§κ³ μλ μλ리μ€λ₯Ό μκ°ν΄ 보μΈμ. μ΄ κ°μ²΄μ μμ± μ€ νλλ§ λ³κ²½λλλΌλ, λ³κ²½λμ§ μμ λ€λ₯Έ μμ±μλ§ μμ‘΄νλ μ»΄ν¬λνΈλ₯Ό ν¬ν¨νμ¬ μ»¨ν μ€νΈλ₯Ό μ¬μ©νλ λͺ¨λ μ»΄ν¬λνΈκ° 리λ λλ§λ©λλ€. μ΄λ λ§€μ° λΉν¨μ¨μ μΌ μ μμ΅λλ€.
ν΄κ²°μ± : νλ‘λ°μ΄λ ν¨ν΄κ³Ό μ΅μ ν κΈ°λ²
νλ‘λ°μ΄λ ν¨ν΄μ 컨ν μ€νΈλ₯Ό κ΄λ¦¬νκ³ μ±λ₯μ μ΅μ ννλ ꡬ쑰νλ λ°©λ²μ μ 곡ν©λλ€. μ¬κΈ°μλ λͺ κ°μ§ ν΅μ¬ μ λ΅μ΄ ν¬ν¨λ©λλ€:
1. λ λλ§ λ‘μ§μμ 컨ν μ€νΈ κ° λΆλ¦¬νκΈ°
Providerλ₯Ό λ λλ§νλ μ»΄ν¬λνΈ λ΄μμ μ§μ 컨ν μ€νΈ κ°μ μμ±νλ κ²μ νΌνμΈμ. μ΄λ μ»΄ν¬λνΈμ μνκ° λ³κ²½λμμ§λ§ 컨ν μ€νΈ κ° μ체μλ μν₯μ λ―ΈμΉμ§ μμ λ λΆνμν 리λ λλ§μ λ°©μ§ν©λλ€. λμ , 컨ν μ€νΈ κ°μ κ΄λ¦¬νκΈ° μν λ³λμ μ»΄ν¬λνΈλ ν¨μλ₯Ό λ§λ€κ³ μ΄λ₯Ό Providerμ μ λ¬νμΈμ.
μμ: μ΅μ ν μ (λΉν¨μ¨μ )
function App() {
const [theme, setTheme] = React.useState('light');
return (
<ThemeContext.Provider value={{ theme, toggleTheme: () => setTheme(theme === 'light' ? 'dark' : 'light') }}>
<Toolbar />
</ThemeContext.Provider>
);
}
μ΄ μμμμλ App
μ»΄ν¬λνΈκ° 리λ λλ§λ λλ§λ€(μ: ν
λ§μ κ΄λ ¨ μλ μν λ³κ²½μΌλ‘ μΈν΄) μλ‘μ΄ { theme, toggleTheme: ... }
κ°μ²΄κ° μμ±λμ΄ λͺ¨λ 컨μλ¨Έκ° λ¦¬λ λλ§λ©λλ€. μ΄λ λΉν¨μ¨μ μ
λλ€.
μμ: μ΅μ ν ν (ν¨μ¨μ )
function ThemeProvider({ children }) {
const [theme, setTheme] = React.useState('light');
const value = React.useMemo(
() => ({
theme,
toggleTheme: () => setTheme(theme === 'light' ? 'dark' : 'light')
}),
[theme]
);
return (
<ThemeContext.Provider value={value}>
{children}
</ThemeContext.Provider>
);
}
function App() {
return (
<ThemeProvider>
<Toolbar />
</ThemeProvider>
);
}
μ΄ μ΅μ νλ μμμμλ value
κ°μ²΄κ° React.useMemo
λ₯Ό μ¬μ©νμ¬ λ©λͺ¨μ΄μ μ΄μ
λ©λλ€. μ΄λ theme
μνκ° λ³κ²½λ λλ§ κ°μ²΄κ° μ¬μμ±λλ€λ κ²μ μλ―Έν©λλ€. 컨ν
μ€νΈλ₯Ό μ¬μ©νλ μ»΄ν¬λνΈλ€μ ν
λ§κ° μ€μ λ‘ λ³κ²½λ λλ§ λ¦¬λ λλ§λ©λλ€.
2. useMemo
λ₯Ό μ¬μ©νμ¬ μ»¨ν
μ€νΈ κ° λ©λͺ¨μ΄μ μ΄μ
νκΈ°
useMemo
ν
μ λΆνμν 리λ λλ§μ λ°©μ§νλ λ° λ§€μ° μ€μν©λλ€. μ΄λ₯Ό ν΅ν΄ 컨ν
μ€νΈ κ°μ λ©λͺ¨μ΄μ μ΄μ
νμ¬ μμ‘΄μ±μ΄ λ³κ²½λ λλ§ μ
λ°μ΄νΈλλλ‘ ν μ μμ΅λλ€. μ΄λ μ ν리μΌμ΄μ
μ 리λ λλ§ νμλ₯Ό ν¬κ² μ€μ¬μ€λλ€.
μμ: useMemo
μ¬μ©νκΈ°
const AuthContext = React.createContext();
function AuthProvider({ children }) {
const [user, setUser] = React.useState(null);
const contextValue = React.useMemo(() => ({
user,
login: (userData) => {
setUser(userData);
},
logout: () => {
setUser(null);
}
}), [user]); // Dependency on 'user' state
return (
<AuthContext.Provider value={contextValue}>
{children}
</AuthContext.Provider>
);
}
μ΄ μμμμ contextValue
λ λ©λͺ¨μ΄μ μ΄μ
λ©λλ€. μ΄ κ°μ user
μνκ° λ³κ²½λ λλ§ μ
λ°μ΄νΈλ©λλ€. μ΄λ μΈμ¦ 컨ν
μ€νΈλ₯Ό μ¬μ©νλ μ»΄ν¬λνΈμ λΆνμν 리λ λλ§μ λ°©μ§ν©λλ€.
3. μν λ³κ²½ λΆλ¦¬νκΈ°
컨ν
μ€νΈ λ΄μμ μ¬λ¬ μνλ₯Ό μ
λ°μ΄νΈν΄μΌ νλ κ²½μ°, κ°λ₯νλ€λ©΄ λ³λμ 컨ν
μ€νΈ Providerλ‘ λΆλ¦¬νλ κ²μ κ³ λ €ν΄ λ³΄μΈμ. μ΄λ 리λ λλ§μ λ²μλ₯Ό μ νν©λλ€. λλ Provider λ΄μμ useReducer
ν
μ μ¬μ©νμ¬ κ΄λ ¨ μνλ₯Ό λ³΄λ€ ν΅μ λ λ°©μμΌλ‘ κ΄λ¦¬ν μ μμ΅λλ€.
μμ: 볡μ‘ν μν κ΄λ¦¬λ₯Ό μν useReducer
μ¬μ©
const AppContext = React.createContext();
function appReducer(state, action) {
switch (action.type) {
case 'SET_USER':
return { ...state, user: action.payload };
case 'SET_LANGUAGE':
return { ...state, language: action.payload };
default:
return state;
}
}
function AppProvider({ children }) {
const [state, dispatch] = React.useReducer(appReducer, {
user: null,
language: 'en',
});
const contextValue = React.useMemo(() => ({
state,
dispatch,
}), [state]);
return (
<AppContext.Provider value={contextValue}>
{children}
</AppContext.Provider>
);
}
μ΄ μ κ·Ό λ°©μμ λͺ¨λ κ΄λ ¨ μν λ³κ²½μ λ¨μΌ 컨ν
μ€νΈ λ΄μ μ μ§νλ©΄μλ useReducer
λ₯Ό μ¬μ©νμ¬ λ³΅μ‘ν μν λ‘μ§μ κ΄λ¦¬ν μ μκ² ν΄μ€λλ€.
4. React.memo
λλ React.useCallback
μΌλ‘ 컨μλ¨Έ μ΅μ ννκΈ°
Providerλ₯Ό μ΅μ ννλ κ²μ΄ μ€μνμ§λ§, κ°λ³ 컨μλ¨Έ μ»΄ν¬λνΈλ μ΅μ νν μ μμ΅λλ€. ν¨μν μ»΄ν¬λνΈμ propsκ° λ³κ²½λμ§ μμλ€λ©΄ React.memo
λ₯Ό μ¬μ©νμ¬ λ¦¬λ λλ§μ λ°©μ§νμΈμ. μμ μ»΄ν¬λνΈμ propsλ‘ μ λ¬λλ μ΄λ²€νΈ νΈλ€λ¬ ν¨μλ₯Ό λ©λͺ¨μ΄μ μ΄μ
νλ €λ©΄ React.useCallback
μ μ¬μ©νμ¬ λΆνμν 리λ λλ§μ μ λ°νμ§ μλλ‘ νμΈμ.
μμ: React.memo
μ¬μ©νκΈ°
const ThemedButton = React.memo(function ThemedButton() {
const theme = React.useContext(ThemeContext);
return (
<button style={{ backgroundColor: theme === 'dark' ? 'black' : 'white', color: theme === 'dark' ? 'white' : 'black' }}>
Button
</button>
);
});
ThemedButton
μ React.memo
λ‘ κ°μΈλ©΄, propsκ° λ³κ²½λ κ²½μ°μλ§ λ¦¬λ λλ§λ©λλ€ (μ΄ κ²½μ° λͺ
μμ μΌλ‘ μ λ¬λλ propsλ μμΌλ―λ‘ ThemeContextκ° λ³κ²½λ λλ§ λ¦¬λ λλ§λ©λλ€).
μμ: React.useCallback
μ¬μ©νκΈ°
function MyComponent() {
const [count, setCount] = React.useState(0);
const increment = React.useCallback(() => {
setCount(prevCount => prevCount + 1);
}, []); // No dependencies, function always memoized.
return <CounterButton onClick={increment} />;
}
const CounterButton = React.memo(({ onClick }) => {
console.log('CounterButton re-rendered');
return <button onClick={onClick}>Increment</button>;
});
μ΄ μμμμ increment
ν¨μλ React.useCallback
μ μ¬μ©νμ¬ λ©λͺ¨μ΄μ μ΄μ
λμμΌλ―λ‘, CounterButton
μ onClick
propμ΄ λ³κ²½λ λλ§ λ¦¬λ λλ§λ©λλ€. λ§μ½ ν¨μκ° λ©λͺ¨μ΄μ μ΄μ
λμ§ μκ³ MyComponent
λ΄μ μ μλμλ€λ©΄, λ§€ λ λλ§λ§λ€ μλ‘μ΄ ν¨μ μΈμ€ν΄μ€κ° μμ±λμ΄ CounterButton
μ 리λ λλ§μ κ°μ ν κ²μ
λλ€.
5. λκ·λͺ¨ μ ν리μΌμ΄μ μ μν 컨ν μ€νΈ λΆν
λ§€μ° ν¬κ³ 볡μ‘ν μ ν리μΌμ΄μ μ κ²½μ°, 컨ν μ€νΈλ₯Ό λ μκ³ μ§μ€λ 컨ν μ€νΈλ€λ‘ λΆν νλ κ²μ κ³ λ €ν΄ λ³΄μΈμ. λͺ¨λ μ μ μνλ₯Ό ν¬ν¨νλ νλμ κ±°λν 컨ν μ€νΈ λμ , μΈμ¦, μ¬μ©μ νκ²½ μ€μ , μ ν리μΌμ΄μ μ€μ λ±κ³Ό κ°μ΄ μλ‘ λ€λ₯Έ κ΄μ¬μ¬μ λν΄ λ³λμ 컨ν μ€νΈλ₯Ό λ§λμΈμ. μ΄λ 리λ λλ§μ λΆλ¦¬νκ³ μ λ°μ μΈ μ±λ₯μ ν₯μμν€λ λ° λμμ΄ λ©λλ€. μ΄λ λ§μ΄ν¬λ‘μλΉμ€μ μ μ¬νμ§λ§ React Context APIμ λν κ²μ λλ€.
μμ: ν° μ»¨ν μ€νΈ λΆν νκΈ°
// Instead of a single context for everything...
const AppContext = React.createContext();
// ...create separate contexts for different concerns:
const AuthContext = React.createContext();
const ThemeContext = React.createContext();
const SettingsContext = React.createContext();
컨ν μ€νΈλ₯Ό λΆν ν¨μΌλ‘μ¨, μ ν리μΌμ΄μ μ ν μμμμμ λ³κ²½μ΄ κ΄λ ¨ μλ μμμμ 리λ λλ§μ μ λ°ν κ°λ₯μ±μ΄ μ€μ΄λλλ€.
μ€μ μ¬λ‘μ κΈλ‘λ² κ³ λ €μ¬ν
κΈλ‘λ² μ¬μ©μμ λ€μν μ¬μ© μ¬λ‘λ₯Ό κ³ λ €νμ¬ μ€μ μλ리μ€μμ μ΄λ¬ν μ΅μ ν κΈ°μ μ μ μ©νλ λ°©λ²μ λν λͺ κ°μ§ μ€μ©μ μΈ μμλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
μμ 1: κ΅μ ν(i18n) 컨ν μ€νΈ
λ§μ κΈλ‘λ² μ ν리μΌμ΄μ μ μ¬λ¬ μΈμ΄μ λ¬Ένμ μ€μ μ μ§μν΄μΌ ν©λλ€. React Contextλ₯Ό μ¬μ©νμ¬ νμ¬ μΈμ΄μ νμ§ν λ°μ΄ν°λ₯Ό κ΄λ¦¬ν μ μμ΅λλ€. μ νλ μΈμ΄μ λ³κ²½μ΄ μ 체 μ ν리μΌμ΄μ μ΄ μλ μ§μνλ ν μ€νΈλ₯Ό νμνλ μ»΄ν¬λνΈλ§ 리λ λλ§νλλ‘ νλ κ²μ΄ μ΄μμ μ΄λ―λ‘ μ΅μ νκ° λ§€μ° μ€μν©λλ€.
ꡬν:
- νμ¬ μΈμ΄(μ: 'en', 'fr', 'es', 'ja')λ₯Ό μ μ₯νκΈ° μν΄
LanguageContext
λ₯Ό μμ±ν©λλ€. - νμ¬ μΈμ΄μ μ κ·Όνκ³ λ³κ²½ν μ μλ ν¨μλ₯Ό μ 곡νλ
useLanguage
ν μ μ 곡ν©λλ€. - νμ¬ μΈμ΄λ₯Ό κΈ°λ°μΌλ‘ νμ§νλ λ¬Έμμ΄μ λ©λͺ¨μ΄μ μ΄μ
νκΈ° μν΄
React.useMemo
λ₯Ό μ¬μ©ν©λλ€. μ΄λ κ΄λ ¨ μλ μν λ³κ²½μ΄ λ°μν λ λΆνμν 리λ λλ§μ λ°©μ§ν©λλ€.
μμ:
const LanguageContext = React.createContext();
function LanguageProvider({ children }) {
const [language, setLanguage] = React.useState('en');
const translations = React.useMemo(() => {
// Load translations based on the current language from an external source
switch (language) {
case 'fr':
return { hello: 'Bonjour', goodbye: 'Au revoir' };
case 'es':
return { hello: 'Hola', goodbye: 'AdiΓ³s' };
default:
return { hello: 'Hello', goodbye: 'Goodbye' };
}
}, [language]);
const value = React.useMemo(() => ({
language,
setLanguage,
t: (key) => translations[key] || key, // Simple translation function
}), [language, translations]);
return (
<LanguageContext.Provider value={value}>
{children}
</LanguageContext.Provider>
);
}
function useLanguage() {
return React.useContext(LanguageContext);
}
μ΄μ λ²μλ ν
μ€νΈκ° νμν μ»΄ν¬λνΈλ useLanguage
ν
μ μ¬μ©νμ¬ t
(λ²μ) ν¨μμ μ κ·Όν μ μμΌλ©° μΈμ΄κ° λ³κ²½λ λλ§ λ¦¬λ λλ§λ©λλ€. λ€λ₯Έ μ»΄ν¬λνΈλ μν₯μ λ°μ§ μμ΅λλ€.
μμ 2: ν λ§ μ ν 컨ν μ€νΈ
ν
λ§ μ νκΈ°λ₯Ό μ 곡νλ κ²μ μΉ μ ν리μΌμ΄μ
μ μΌλ°μ μΈ μꡬ μ¬νμ
λλ€. ThemeContext
μ κ΄λ ¨ νλ‘λ°μ΄λλ₯Ό ꡬννμΈμ. useMemo
λ₯Ό μ¬μ©νμ¬ theme
κ°μ²΄κ° μ ν리μΌμ΄μ
μ λ€λ₯Έ λΆλΆμ μνκ° μμ λ λκ° μλλΌ ν
λ§κ° λ³κ²½λ λλ§ μ
λ°μ΄νΈλλλ‘ ν©λλ€.
μμ 보μ¬λλ¦° μ΄ μμλ μ΅μ νλ₯Ό μν useMemo
μ React.memo
κΈ°μ μ 보μ¬μ€λλ€.
μμ 3: μΈμ¦ 컨ν μ€νΈ
μ¬μ©μ μΈμ¦ κ΄λ¦¬λ λΉλ²ν μμ
μ
λλ€. μ¬μ©μμ μΈμ¦ μν(μ: λ‘κ·ΈμΈ λλ λ‘κ·Έμμ)λ₯Ό κ΄λ¦¬νκΈ° μν΄ AuthContext
λ₯Ό μμ±νμΈμ. μΈμ¦ μν λ° ν¨μ(λ‘κ·ΈμΈ, λ‘κ·Έμμ)μ λν΄ React.useMemo
λ₯Ό μ¬μ©νμ¬ μ΅μ νλ νλ‘λ°μ΄λλ₯Ό ꡬννμ¬ μ»¨μλ¨Έ μ»΄ν¬λνΈμ λΆνμν 리λ λλ§μ λ°©μ§νμΈμ.
ꡬν μ κ³ λ €μ¬ν:
- μ μ μ¬μ©μ μΈν°νμ΄μ€: μ ν리μΌμ΄μ μ 체μ ν€λλ λ΄λΉκ²μ΄μ λ°μ μ¬μ©μλ³ μ 보λ₯Ό νμν©λλ€.
- μμ ν λ°μ΄ν° κ°μ Έμ€κΈ°: λͺ¨λ μλ² μΈ‘ μμ²μ 보νΈνκ³ , μΈμ¦ ν ν°κ³Ό νμ¬ μ¬μ©μμ μΌμΉνλ κΆνμ κ²μ¦ν©λλ€.
- κ΅μ μ μ§μ: μ€λ₯ λ©μμ§ λ° μΈμ¦ νλ¦μ΄ νμ§ κ·μ μ μ€μνκ³ μ§μνλ μΈμ΄λ₯Ό μ§μνλλ‘ ν©λλ€.
μ±λ₯ ν μ€νΈ λ° λͺ¨λν°λ§
μ΅μ ν κΈ°μ μ μ μ©ν νμλ μ ν리μΌμ΄μ μ μ±λ₯μ ν μ€νΈνκ³ λͺ¨λν°λ§νλ κ²μ΄ νμμ μ λλ€. λͺ κ°μ§ μ λ΅μ λ€μκ³Ό κ°μ΅λλ€:
- React κ°λ°μ λꡬ νλ‘νμΌλ¬: React κ°λ°μ λꡬ νλ‘νμΌλ¬λ₯Ό μ¬μ©νμ¬ λΆνμνκ² λ¦¬λ λλ§λλ μ»΄ν¬λνΈλ₯Ό μλ³νμΈμ. μ΄ λꡬλ μ»΄ν¬λνΈμ λ λλ§ μ±λ₯μ λν μμΈν μ 보λ₯Ό μ 곡ν©λλ€. "Highlight Updates" μ΅μ μ μ¬μ©νλ©΄ λ³κ²½ μ€μ 리λ λλ§λλ λͺ¨λ μ»΄ν¬λνΈλ₯Ό λ³Ό μ μμ΅λλ€.
- μ±λ₯ λ©νΈλ¦: μ΅μ νκ° μ¬μ©μ κ²½νμ λ―ΈμΉλ μν₯μ νκ°νκΈ° μν΄ FCP(First Contentful Paint) λ° TTI(Time to Interactive)μ κ°μ μ£Όμ μ±λ₯ λ©νΈλ¦μ λͺ¨λν°λ§νμΈμ. Lighthouse(Chrome κ°λ°μ λꡬμ ν΅ν©λ¨)μ κ°μ λꡬλ κ·μ€ν ν΅μ°°λ ₯μ μ 곡ν μ μμ΅λλ€.
- νλ‘νμΌλ§ λꡬ: λΈλΌμ°μ νλ‘νμΌλ§ λꡬλ₯Ό νμ©νμ¬ μ»΄ν¬λνΈ λ λλ§ λ° μν μ λ°μ΄νΈλ₯Ό ν¬ν¨ν λ€μν μμ μ μμλλ μκ°μ μΈ‘μ νμΈμ. μ΄λ μ±λ₯ λ³λͺ© νμμ μ νν μ°Ύμλ΄λ λ° λμμ΄ λ©λλ€.
- λ²λ€ ν¬κΈ° λΆμ: μ΅μ νκ° λ²λ€ ν¬κΈ° μ¦κ°λ‘ μ΄μ΄μ§μ§ μλλ‘ νμΈμ. λ²λ€μ΄ ν΄μλ‘ λ‘λ μκ°μ λΆμ μ μΈ μν₯μ λ―ΈμΉ μ μμ΅λλ€. webpack-bundle-analyzerμ κ°μ λꡬλ λ²λ€ ν¬κΈ°λ₯Ό λΆμνλ λ° λμμ΄ λ μ μμ΅λλ€.
- A/B ν μ€νΈ: νΉμ μ ν리μΌμ΄μ μ κ°μ₯ ν° μ±λ₯ ν₯μμ μ 곡νλ κΈ°μ μ κ²°μ νκΈ° μν΄ λ€μν μ΅μ ν μ κ·Ό λ°©μμ λν A/B ν μ€νΈλ₯Ό κ³ λ €ν΄ λ³΄μΈμ.
λͺ¨λ² μ¬λ‘ λ° μ€ν κ°λ₯ν ν΅μ°°λ ₯
μμ½νμλ©΄, React Contextλ₯Ό μ΅μ ννκ³ νλ‘μ νΈμ ꡬννκΈ° μν λͺ κ°μ§ μ£Όμ λͺ¨λ² μ¬λ‘μ μ€ν κ°λ₯ν ν΅μ°°λ ₯μ λ€μκ³Ό κ°μ΅λλ€:
- νμ νλ‘λ°μ΄λ ν¨ν΄ μ¬μ©: 컨ν μ€νΈ κ° κ΄λ¦¬λ₯Ό λ³λμ μ»΄ν¬λνΈλ‘ μΊ‘μννμΈμ.
useMemo
λ‘ μ»¨ν μ€νΈ κ° λ©λͺ¨μ΄μ μ΄μ : λΆνμν 리λ λλ§μ λ°©μ§νμΈμ. μμ‘΄μ±μ΄ λ³κ²½λ λλ§ μ»¨ν μ€νΈ κ°μ μ λ°μ΄νΈνμΈμ.- μν λ³κ²½ λΆλ¦¬: 리λ λλ§μ μ΅μννκΈ° μν΄ μ»¨ν
μ€νΈλ₯Ό λΆν νμΈμ. 볡μ‘ν μν κ΄λ¦¬λ₯Ό μν΄
useReducer
λ₯Ό κ³ λ €νμΈμ. React.memo
μReact.useCallback
μΌλ‘ 컨μλ¨Έ μ΅μ ν: 컨μλ¨Έ μ»΄ν¬λνΈ μ±λ₯μ ν₯μμν€μΈμ.- 컨ν μ€νΈ λΆν κ³ λ €: λκ·λͺ¨ μ ν리μΌμ΄μ μ κ²½μ°, λ€μν κ΄μ¬μ¬μ λ°λΌ 컨ν μ€νΈλ₯Ό λΆν νμΈμ.
- μ±λ₯ ν μ€νΈ λ° λͺ¨λν°λ§: React κ°λ°μ λꡬμ νλ‘νμΌλ§ λꡬλ₯Ό μ¬μ©νμ¬ λ³λͺ© νμμ μλ³νμΈμ.
- μ κΈ°μ μΈ κ²ν λ° λ¦¬ν©ν λ§: μ΅μ μ μ±λ₯μ μ μ§νκΈ° μν΄ μ½λλ₯Ό μ§μμ μΌλ‘ νκ°νκ³ λ¦¬ν©ν λ§νμΈμ.
- κΈλ‘λ² κ΄μ : λ€μν μκ°λ, λ‘μΌμΌ λ° κΈ°μ κ³Όμ νΈνμ±μ 보μ₯νκΈ° μν΄ μ λ΅μ μ‘°μ νμΈμ. μ¬κΈ°μλ i18next, react-intl λ±κ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν μΈμ΄ μ§μ κ³ λ €κ° ν¬ν¨λ©λλ€.
μ΄λ¬ν κ°μ΄λλΌμΈμ λ°λ₯΄λ©΄ React μ ν리μΌμ΄μ μ μ±λ₯κ³Ό μ μ§ κ΄λ¦¬μ±μ ν¬κ² ν₯μμμΌ μ μΈκ³ μ¬μ©μμκ² λ λΆλλ½κ³ λ°μμ±μ΄ λ°μ΄λ μ¬μ©μ κ²½νμ μ 곡ν μ μμ΅λλ€. μ²μλΆν° μ΅μ νλ₯Ό μ°μ μνκ³ κ°μ ν λΆλΆμ μ°ΎκΈ° μν΄ μ½λλ₯Ό μ§μμ μΌλ‘ κ²ν νμΈμ. μ΄λ μ ν리μΌμ΄μ μ΄ μ±μ₯ν¨μ λ°λΌ νμ₯μ±κ³Ό μ±λ₯μ 보μ₯ν©λλ€.
κ²°λ‘
React Contextλ React μ ν리μΌμ΄μ
μμ μ μ μνλ₯Ό κ΄λ¦¬νκΈ° μν κ°λ ₯νκ³ μ μ°ν κΈ°λ₯μ
λλ€. μ μ¬μ μΈ μ±λ₯ ν¨μ μ μ΄ν΄νκ³ μ μ ν μ΅μ ν κΈ°μ κ³Ό ν¨κ» νλ‘λ°μ΄λ ν¨ν΄μ ꡬνν¨μΌλ‘μ¨, μ°μνκ² νμ₯λλ κ²¬κ³ νκ³ ν¨μ¨μ μΈ μ ν리μΌμ΄μ
μ ꡬμΆν μ μμ΅λλ€. 컨ν
μ€νΈ μ€κ³λ₯Ό μ μ€νκ² κ³ λ €νκ³ useMemo
, React.memo
, React.useCallback
μ νμ©νλ©΄ μ°μν μ¬μ©μ κ²½νμ μ 곡ν κ²μ
λλ€. λ³λͺ© νμμ μλ³νκ³ ν΄κ²°νκΈ° μν΄ νμ μ ν리μΌμ΄μ
μ μ±λ₯μ ν
μ€νΈνκ³ λͺ¨λν°λ§νλ κ²μ μμ§ λ§μΈμ. React κΈ°μ κ³Ό μ§μμ΄ λ°μ ν¨μ λ°λΌ μ΄λ¬ν μ΅μ ν κΈ°μ μ μ μΈκ³ μ¬μ©μλ₯Ό μν κ³ μ±λ₯ λ° μ μ§ κ΄λ¦¬κ° μ©μ΄ν μ¬μ©μ μΈν°νμ΄μ€λ₯Ό ꡬμΆνλ λ° μμ΄μλ μ λ λκ΅¬κ° λ κ²μ
λλ€.