Reactμ experimental_useContextSelector ν μ λν μ¬μΈ΅ λΆμμΌλ‘, 볡μ‘ν μ ν리μΌμ΄μ μμ μ±λ₯ μ΅μ ν λ° ν¨μ¨μ μΈ μν κ΄λ¦¬μ λν μ΄μ μ νꡬν©λλ€. μ»΄ν¬λνΈκ° 컨ν μ€νΈμμ νμν λ°μ΄ν°λ§ μ ννμ¬ λΆνμν μ¬ λ λλ§μ λ°©μ§νλ λ°©λ²μ μμ보μΈμ.
React experimental_useContextSelector: μΈλΆνλ 컨ν μ€νΈ μλΉ
Reactμ Context APIλ λͺ μμ μΈ prop λλ¦΄λ§ μμ΄ μ ν리μΌμ΄μ μ 체μμ μνμ propsλ₯Ό 곡μ ν μ μλ κ°λ ₯ν λ©μ»€λμ¦μ μ 곡ν©λλ€. κ·Έλ¬λ κΈ°λ³Έ Context API ꡬνμ νΉν 컨ν μ€νΈ κ°μ΄ μμ£Ό λ³κ²½λλ λκ·λͺ¨μ 볡μ‘ν μ ν리μΌμ΄μ μμ λλλ‘ μ±λ₯ λ¬Έμ λ₯Ό μΌμΌν¬ μ μμ΅λλ€. μ»΄ν¬λνΈκ° 컨ν μ€νΈμ μμ λΆλΆμλ§ μμ‘΄νλλΌλ 컨ν μ€νΈ κ°μ λ³κ²½μ ν΄λΉ 컨ν μ€νΈλ₯Ό μλΉνλ λͺ¨λ μ»΄ν¬λνΈκ° μ¬ λ λλ§λκ² νμ¬ λΆνμν μ¬ λ λλ§κ³Ό μ±λ₯ λ³λͺ© νμμ μ΄λν μ μμ΅λλ€.
μ΄λ¬ν μ νμ ν΄κ²°νκΈ° μν΄ Reactλ experimental_useContextSelector
ν
(μ΄λ¦μμ μ μ μλ―μ΄ νμ¬ μ€νμ μ)μ λμ
νμ΅λλ€. μ΄ ν
μ μ»΄ν¬λνΈκ° νμν 컨ν
μ€νΈμ νΉμ λΆλΆλ§ ꡬλ
νλλ‘ νμ¬ μ»¨ν
μ€νΈμ λ€λ₯Έ λΆλΆμ΄ λ³κ²½λ λ μ¬ λ λλ§μ λ°©μ§ν©λλ€. μ΄ μ κ·Ό λ°©μμ λΆνμν μ»΄ν¬λνΈ μ
λ°μ΄νΈ μλ₯Ό μ€μ¬ μ±λ₯μ ν¬κ² μ΅μ νν©λλ€.
μ΄ν΄ν΄μΌ ν λ¬Έμ : ν΄λμ 컨ν μ€νΈ API λ° μ¬ λ λλ§
experimental_useContextSelector
λ₯Ό μ΄ν΄λ³΄κΈ° μ μ νμ€ Context APIμ μ μ¬μ μΈ μ±λ₯ λ¬Έμ λ₯Ό μ€λͺ
ν΄ λ³΄κ² μ΅λλ€. μ¬μ©μ μ 보, κΈ°λ³Έ μ€μ λ° μΈμ¦ μνλ₯Ό μ μ₯νλ μ μ μ¬μ©μ 컨ν
μ€νΈλ₯Ό κ³ λ €νμμμ€.
const UserContext = React.createContext({
userInfo: {
name: 'John Doe',
email: 'john.doe@example.com',
country: 'USA'
},
preferences: {
theme: 'light',
language: 'en-US',
notificationsEnabled: true
},
isAuthenticated: false
});
function App() {
const [user, setUser] = React.useState({
userInfo: {
name: 'John Doe',
email: 'john.doe@example.com',
country: 'USA'
},
preferences: {
theme: 'light',
language: 'en-US',
notificationsEnabled: true
},
isAuthenticated: false
});
const updateUser = (newUser) => {
setUser(newUser);
};
return (
);
}
function Profile() {
const { userInfo } = React.useContext(UserContext);
return (
{userInfo.name}
Email: {userInfo.email}
Country: {userInfo.country}
);
}
function Settings() {
const { preferences, updateUser } = React.useContext(UserContext);
const toggleTheme = () => {
updateUser({
...user,
preferences: { ...preferences, theme: preferences.theme === 'light' ? 'dark' : 'light' },
});
};
return (
Theme: {preferences.theme}
);
}
μ΄ μλ리μ€μμ Profile
μ»΄ν¬λνΈλ userInfo
μμ±λ§ μ¬μ©νλ λ°λ©΄, Settings
μ»΄ν¬λνΈλ preferences
λ° updateUser
μμ±μ μ¬μ©ν©λλ€. Settings
μ»΄ν¬λνΈκ° ν
λ§λ₯Ό μ
λ°μ΄νΈνμ¬ preferences
κ°μ²΄μ λ³κ²½μ μΌμΌν€λ©΄ Profile
μ»΄ν¬λνΈλ preferences
μ μ ν μμ‘΄νμ§ μλλΌλ μ¬ λ λλ§λ©λλ€. μ΄λ React.useContext
κ° μ»΄ν¬λνΈλ₯Ό μ 체 컨ν
μ€νΈ κ°μ ꡬλ
μν€κΈ° λλ¬Έμ
λλ€. μ΄ λΆνμν μ¬ λ λλ§μ 컨ν
μ€νΈ μλΉμκ° λ§μ λ 볡μ‘ν μ ν리μΌμ΄μ
μμ μ¬κ°ν μ±λ₯ λ³λͺ© νμμ΄ λ μ μμ΅λλ€.
experimental_useContextSelector μκ°: μ νμ 컨ν μ€νΈ μλΉ
experimental_useContextSelector
ν
μ μ»΄ν¬λνΈκ° νμν 컨ν
μ€νΈμ νΉμ λΆλΆλ§ μ νν μ μλλ‘ νμ¬ μ΄ λ¬Έμ μ λν ν΄κ²°μ±
μ μ 곡ν©λλ€. μ΄ ν
μ λ κ°μ μΈμλ₯Ό μ¬μ©ν©λλ€.
- 컨ν
μ€νΈ κ°μ²΄(
React.createContext
λ‘ μμ±). - μ 체 컨ν μ€νΈ κ°μ μΈμλ‘ λ°μ μ»΄ν¬λνΈμ νμν νΉμ κ°μ λ°ννλ μ νκΈ° ν¨μ.
μ»΄ν¬λνΈλ μ νλ κ°μ΄ λ³κ²½λ λλ§ μ¬ λ λλ§λ©λλ€(μ격ν λλ±μ±, ===
μ¬μ©). μ΄λ₯Ό ν΅ν΄ μ΄μ μμ λ₯Ό μ΅μ ννκ³ Profile
μ»΄ν¬λνΈμ λΆνμν μ¬ λ λλ§μ λ°©μ§ν μ μμ΅λλ€.
experimental_useContextSelectorλ‘ μμ 리ν©ν λ§
λ€μμ experimental_useContextSelector
λ₯Ό μ¬μ©νμ¬ μ΄μ μμ λ₯Ό 리ν©ν λ§νλ λ°©λ²μ
λλ€.
import { unstable_useContextSelector as useContextSelector } from 'use-context-selector';
const UserContext = React.createContext({
userInfo: {
name: 'John Doe',
email: 'john.doe@example.com',
country: 'USA'
},
preferences: {
theme: 'light',
language: 'en-US',
notificationsEnabled: true
},
isAuthenticated: false
});
function App() {
const [user, setUser] = React.useState({
userInfo: {
name: 'John Doe',
email: 'john.doe@example.com',
country: 'USA'
},
preferences: {
theme: 'light',
language: 'en-US',
notificationsEnabled: true
},
isAuthenticated: false
});
const updateUser = (newUser) => {
setUser(newUser);
};
return (
);
}
function Profile() {
const userInfo = useContextSelector(UserContext, (context) => context.userInfo);
return (
{userInfo.name}
Email: {userInfo.email}
Country: {userInfo.country}
);
}
function Settings() {
const preferences = useContextSelector(UserContext, (context) => context.preferences);
const updateUser = useContextSelector(UserContext, (context) => context.updateUser);
const toggleTheme = () => {
updateUser({
...user,
preferences: { ...preferences, theme: preferences.theme === 'light' ? 'dark' : 'light' },
});
};
return (
Theme: {preferences.theme}
);
}
μ΄ λ¦¬ν©ν°λ§λ μμ μμ Profile
μ»΄ν¬λνΈλ μ΄μ useContextSelector
λ₯Ό μ¬μ©νμ¬ μ»¨ν
μ€νΈμμ userInfo
μμ±λ§ μ νν©λλ€. λ°λΌμ Settings
μ»΄ν¬λνΈκ° ν
λ§λ₯Ό μ
λ°μ΄νΈνλ©΄ userInfo
μμ±μ΄ λ³κ²½λμ§ μμΌλ―λ‘ Profile
μ»΄ν¬λνΈλ λ μ΄μ μ¬ λ λλ§λμ§ μμ΅λλ€. λ§μ°¬κ°μ§λ‘ `Settings` μ»΄ν¬λνΈλ νμν `preferences` λ° `updateUser` μμ±λ§ μ ννμ¬ μ±λ₯μ λμ± μ΅μ νν©λλ€.
μ€μ μ°Έκ³ μ¬ν: unstable_useContextSelector
λ₯Ό use-context-selector
ν¨ν€μ§μμ κ°μ Έμ€λ κ²μ μμ§ λ§μμμ€. μ΄λ¦μμ μ μ μλ―μ΄ μ΄ ν
μ μ¬μ ν μ€ν μ€μ΄λ©° ν₯ν React 릴리μ€μμ λ³κ²½λ μ μμ΅λλ€. `use-context-selector` ν¨ν€μ§λ μμνκΈ°μ μ’μ μ΅μ
μ΄μ§λ§ κΈ°λ₯μ΄ μμ νλλ©΄ React νμ μ μ¬μ μΈ ν₯ν API λ³κ²½ μ¬νμ μ μνμμμ€.
experimental_useContextSelector μ¬μ©μ μ΄μ
- ν₯μλ μ±λ₯: μ νν 컨ν μ€νΈ κ°μ΄ λ³κ²½λ λλ§ μ»΄ν¬λνΈλ₯Ό μ λ°μ΄νΈνμ¬ λΆνμν μ¬ λ λλ§μ μ€μ λλ€. μ΄λ 컨ν μ€νΈ λ°μ΄ν°κ° μμ£Ό λ³κ²½λλ 볡μ‘ν μ ν리μΌμ΄μ μ νΉν μ μ©ν©λλ€.
- μΈλΆνλ μ μ΄: μ»΄ν¬λνΈκ° ꡬλ νλ 컨ν μ€νΈμ λΆλΆμ μ ννκ² μ μ΄ν μ μμ΅λλ€.
- κ°μνλ μ»΄ν¬λνΈ λ‘μ§: μ»΄ν¬λνΈ μ λ°μ΄νΈμ λν΄ λ μ½κ² μΆλ‘ ν μ μμ΅λλ€. μ»΄ν¬λνΈλ νΉμ μ’ μμ±μ΄ λ³κ²½λ λλ§ μ¬ λ λλ§λ©λλ€.
κ³ λ € μ¬ν λ° λͺ¨λ² μ¬λ‘
- μ νκΈ° ν¨μ μ±λ₯: μ νκΈ° ν¨μκ° μ±λ₯μ΄ λ°μ΄λκ³ λ³΅μ‘ν κ³μ°μ΄λ λΉμ©μ΄ λ§μ΄ λλ μμ μ νΌνμμμ€. μ νκΈ° ν¨μλ 컨ν μ€νΈκ° λ³κ²½λ λλ§λ€ νΈμΆλλ―λ‘ μ±λ₯μ μ΅μ ννλ κ²μ΄ μ€μν©λλ€.
- λ©λͺ¨μ΄μ μ΄μ
: μ νκΈ° ν¨μκ° κΈ°λ³Έ λ°μ΄ν°κ° λ³κ²½λμ§ μμλλΌλ λ§€λ² νΈμΆλ λλ§λ€ μ κ°μ²΄ λλ λ°°μ΄μ λ°ννλ κ²½μ° μ»΄ν¬λνΈλ μ¬μ ν μ¬ λ λλ§λ©λλ€. λ©λͺ¨μ΄μ μ΄μ
κΈ°μ (μ:
React.useMemo
λλ Reselectμ κ°μ λΌμ΄λΈλ¬λ¦¬)μ μ¬μ©νμ¬ μ νκΈ° ν¨μκ° κ΄λ ¨ λ°μ΄ν°κ° μ€μ λ‘ λ³κ²½λ κ²½μ°μλ§ μ κ°μ λ°ννλλ‘ νλ κ²μ κ³ λ €νμμμ€. - 컨ν μ€νΈ κ° κ΅¬μ‘°: κ΄λ ¨ μλ λ°μ΄ν°κ° ν¨κ» λ³κ²½λ κ°λ₯μ±μ μ΅μννλ λ°©μμΌλ‘ 컨ν μ€νΈ κ°μ ꡬμ±νλ κ²μ κ³ λ €νμμμ€. μλ₯Ό λ€μ΄ μ ν리μΌμ΄μ μνμ μ¬λ¬ μΈ‘λ©΄μ λ³λμ 컨ν μ€νΈλ‘ λΆλ¦¬ν μ μμ΅λλ€.
- λμ: μ ν리μΌμ΄μ μ 볡μ‘μ±μ΄ μ΄λ₯Ό μ λΉννλ κ²½μ° Redux, Zustand λλ Jotaiμ κ°μ λ체 μν κ΄λ¦¬ μ루μ μ νμνμμμ€. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ μ μ μνλ₯Ό κ΄λ¦¬νκ³ μ±λ₯μ μ΅μ ννλ λ° λ κ³ κΈ κΈ°λ₯μ μ 곡ν©λλ€.
- μ€νμ μν:
experimental_useContextSelector
λ μ¬μ ν μ€ν μ€μ λλ€. APIλ ν₯ν React 릴리μ€μμ λ³κ²½λ μ μμ΅λλ€. `use-context-selector` ν¨ν€μ§λ μμ μ μ΄κ³ μμ μ μΈ κ΅¬νμ μ 곡νμ§λ§ ν΅μ¬ APIμ μ μ¬μ μΈ λ³κ²½ μ¬νμ λν React μ λ°μ΄νΈλ₯Ό νμ λͺ¨λν°λ§νμμμ€.
μ€μ μμ λ° μ¬μ© μ¬λ‘
λ€μμ experimental_useContextSelector
κ° νΉν μ μ©ν μ μλ μ€μ μμ μ
λλ€.
- ν
λ§ κ΄λ¦¬: μ¬μ©μ μ μ κ°λ₯ν ν
λ§κ° μλ μ ν리μΌμ΄μ
μμ
experimental_useContextSelector
λ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈκ° νμ¬ ν λ§ μ€μ λ§ κ΅¬λ νλλ‘ νμ¬ λ€λ₯Έ μ ν리μΌμ΄μ μ€μ μ΄ λ³κ²½λ λ μ¬ λ λλ§μ λ°©μ§ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ μ¬μ©μμκ² λ€μν μμ ν λ§λ₯Ό μ μμ μΌλ‘ μ 곡νλ μ μ μκ±°λ μ¬μ΄νΈλ₯Ό κ³ λ €νμμμ€. μμ(λ¨μΆ, λ°°κ²½ λ±)λ§ νμνλ μ»΄ν¬λνΈλ 컨ν μ€νΈ λ΄μμ `theme` μμ±λ§ ꡬλ νμ¬ μλ₯Ό λ€μ΄ μ¬μ©μμ ν΅ν κΈ°λ³Έ μ€μ μ΄ λ³κ²½λ λ λΆνμν μ¬ λ λλ§μ λ°©μ§ν©λλ€. - κ΅μ ν(i18n): λ€κ΅μ΄ μ ν리μΌμ΄μ
μμ λ²μμ κ΄λ¦¬ν λ
experimental_useContextSelector
λ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈκ° νμ¬ λ‘μΊ λλ νΉμ λ²μλ§ κ΅¬λ νλλ‘ ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ κΈλ‘λ² μμ λ―Έλμ΄ νλ«νΌμ μμν΄λ³΄μμμ€. νΉμ κ²μλ¬Όμ λ²μλ§ λ³κ²½λ κ²½μ°(μ: μμ΄μμ μ€νμΈμ΄λ‘) μ 체 λ΄μ€ νΌλμ μ¬ λ λλ§μ νΈλ¦¬κ±°ν΄μλ μ λ©λλ€.useContextSelector
λ κ΄λ ¨ μ»΄ν¬λνΈλ§ μ λ°μ΄νΈλλλ‘ ν©λλ€. - μ¬μ©μ μΈμ¦: μ¬μ©μ μΈμ¦μ΄ νμν μ ν리μΌμ΄μ
μμ
experimental_useContextSelector
λ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈκ° μ¬μ©μμ μΈμ¦ μνλ§ κ΅¬λ νλλ‘ νμ¬ λ€λ₯Έ μ¬μ©μ νλ‘ν μ λ³΄κ° λ³κ²½λ λ μ¬ λ λλ§μ λ°©μ§ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ μ¨λΌμΈ λ± νΉ νλ«νΌμ κ³μ μμ½ μ»΄ν¬λνΈλ 컨ν μ€νΈμ `userId`μλ§ μμ‘΄ν μ μμ΅λλ€. μ¬μ©μκ° νλ‘ν μ€μ μμ μ£Όμλ₯Ό μ λ°μ΄νΈνλ©΄ κ³μ μμ½ μ»΄ν¬λνΈλ₯Ό μ¬ λ λλ§ν νμκ° μμ΄ μ¬μ©μ κ²½νμ΄ λ μνν΄μ§λλ€. - μμ κ΄λ¦¬: μ¬λ¬ νλκ° μλ 볡μ‘ν μμμ μ²λ¦¬ν λ
experimental_useContextSelector
λ₯Ό μ¬μ©νμ¬ κ°λ³ μμ νλκ° νΉμ κ°λ§ ꡬλ νλλ‘ νμ¬ λ€λ₯Έ νλκ° λ³κ²½λ λ μ¬ λ λλ§μ λ°©μ§ν μ μμ΅λλ€. λΉμ λ°κΈμ μν λ€λ¨κ³ μ μ² μμμ μμν΄λ³΄μμμ€. κ° λ¨κ³(μ΄λ¦, μ£Όμ, μ¬κΆ μΈλΆ μ 보)λ₯Ό 격리νκ³ κ° νλ μ λ°μ΄νΈ ν μ 체 μμμ μ¬ λ λλ§νλ λμ ν΄λΉ νΉμ λ¨κ³ λ΄μ λ°μ΄ν°κ° λ³κ²½λ λλ§ μ¬ λ λλ§ν μ μμ΅λλ€.
κ²°λ‘
experimental_useContextSelector
λ Context APIλ₯Ό μ¬μ©νλ React μ ν리μΌμ΄μ
μ μ±λ₯μ μ΅μ ννλ λ° μ μ©ν λꡬμ
λλ€. μ»΄ν¬λνΈκ° νμν 컨ν
μ€νΈμ νΉμ λΆλΆλ§ μ νν μ μλλ‘ ν¨μΌλ‘μ¨ λΆνμν μ¬ λ λλ§μ λ°©μ§νκ³ μ λ°μ μΈ μ ν리μΌμ΄μ
μλ΅μ±μ ν₯μμν΅λλ€. μ¬μ ν μ€ν μ€μ΄μ§λ§ React μνκ³μ λν μ λ§ν μΆκ° κΈ°λ₯μ΄λ©° μ±λ₯μ΄ μ€μν μ ν리μΌμ΄μ
μμ νμν κ°μΉκ° μμ΅λλ€. νμ μ² μ ν ν
μ€νΈνκ³ ν
μ΄ λ°μ ν¨μ λ°λΌ μ μ¬μ μΈ API λ³κ²½ μ¬νμ μ μνμμμ€. 볡μ‘ν μν κ΄λ¦¬ λ° λΉλ²ν 컨ν
μ€νΈ μ
λ°μ΄νΈλ‘ μΈν μ±λ₯ λ³λͺ© νμμ μ²λ¦¬ν λ React λꡬ μμμ κ°λ ₯ν μΆκ° κΈ°λ₯μΌλ‘ κ°μ£Όνμμμ€. μ ν리μΌμ΄μ
μ 컨ν
μ€νΈ μ¬μ©λμ μ μ€νκ² λΆμνκ³ experimental_useContextSelector
λ₯Ό μ λ΅μ μΌλ‘ μ μ©νλ©΄ μ¬μ©μ κ²½νμ ν¬κ² ν₯μμν€κ³ λ ν¨μ¨μ μ΄κ³ νμ₯ κ°λ₯ν React μ ν리μΌμ΄μ
μ ꡬμΆν μ μμ΅λλ€.