๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ React์ Context API๋ฅผ useContext๋ก ์ต์ ํํ์ฌ ์ฑ๋ฅ ๋ฐ ํ์ฅ์ฑ์ ํฅ์์ํค๋ ํฌ๊ด์ ์ธ ๊ฐ์ด๋์ ๋๋ค.
React useContext: ์ฑ๋ฅ ํฅ์์ ์ํ Context API ์๋น ์ต์ ํ
์ฃผ๋ก useContext ํ
์ ํตํด ์ ๊ทผํ๋ React์ Context API๋ ๋ชจ๋ ๋ ๋ฒจ์ ํตํด ์๋์ผ๋ก props๋ฅผ ์ ๋ฌํ ํ์ ์์ด ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ ์ฒด์์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์๋นํ ํธ์์ฑ์ ์ ๊ณตํ์ง๋ง, ๋ถ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ฉด ํนํ ๋๊ท๋ชจ์ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ด๋ํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋๋ useContext๋ฅผ ์ฌ์ฉํ์ฌ Context API ์๋น๋ฅผ ์ต์ ํํ๋ ํจ๊ณผ์ ์ธ ์ ๋ต์ ์์ธํ ์ค๋ช
ํ๋ฉฐ, React ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ ์ฌ์ ์ธ ์ฑ๋ฅ ํจ์ ์ดํดํ๊ธฐ
ํต์ฌ ๋ฌธ์ ๋ useContext๊ฐ ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐฉ์์ ์์ต๋๋ค. ์ปดํฌ๋ํธ๊ฐ useContext๋ฅผ ์ฌ์ฉํ๋ฉด, ์ง์ ๋ ์ปจํ
์คํธ ๋ด์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌ๋
ํฉ๋๋ค. ํด๋น ํน์ ์ปดํฌ๋ํธ๊ฐ ์ค์ ๋ก ์
๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด, ์ปจํ
์คํธ ๊ฐ์ ๋ํ ๋ชจ๋ ์
๋ฐ์ดํธ๋ ํด๋น ์ปดํฌ๋ํธ์ ๊ทธ ๋ชจ๋ ์์์ ๋ฆฌ๋ ๋๋งํ๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ผ๋ก ์ด์ด์ ธ ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ ์ ์์ผ๋ฉฐ, ํนํ ์์ฃผ ์
๋ฐ์ดํธ๋๋ ์ปจํ
์คํธ๋ ํฐ ์ปดํฌ๋ํธ ํธ๋ฆฌ์์ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
์คํ์ผ๋ง์ ์ฌ์ฉ๋๋ ์ ์ญ ํ ๋ง ์ปจํ ์คํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ํด๋น ํ ๋ง ์ปจํ ์คํธ ๋ด์์ ์ฌ์ํ๊ณ ๊ด๋ จ ์๋ ๋ฐ์ดํฐ ์กฐ๊ฐ์ด๋ผ๋ ๋ณ๊ฒฝ๋๋ฉด, ๋ฒํผ๋ถํฐ ์ ์ฒด ๋ ์ด์์์ ์ด๋ฅด๊ธฐ๊น์ง ํด๋น ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. ์ด๋ ๋นํจ์จ์ ์ด๋ฉฐ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
useContext๋ฅผ ์ํ ์ต์ ํ ์ ๋ต
useContext์ ์ฑ๋ฅ ์ํฅ์ ์ํํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ ๋ต๋ค์ ํ๊ตฌํ๊ณ , ์ค์ฉ์ ์ธ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ๊ณตํ ๊ฒ์
๋๋ค.
1. ์ธ๋ถํ๋ ์ปจํ ์คํธ ์์ฑ
์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋จ์ผ์ ๊ฑฐ๋ํ ์ปจํ ์คํธ๋ฅผ ๋ง๋๋ ๋์ , ๋ฐ์ดํฐ๋ฅผ ๋ ์๊ณ ๊ตฌ์ฒด์ ์ธ ์ปจํ ์คํธ๋ก ๋ถ๋ฆฌํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๋ฆฌ๋ ๋๋ง์ ๋ฒ์๋ฅผ ์ต์ํํ ์ ์์ต๋๋ค. ํน์ ์ปจํ ์คํธ ๋ด์์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ์ ์ง์ ์ ์ผ๋ก ์์กดํ๋ ์ปดํฌ๋ํธ๋ง ์ํฅ์ ๋ฐ์ต๋๋ค.
์์:
์ฌ์ฉ์ ๋ฐ์ดํฐ, ํ
๋ง ์ค์ ๋ฐ ๊ธฐํ ์ ์ญ ์ํ๋ฅผ ๋ชจ๋ ๋ด๋ ๋จ์ผ AppContext ๋์ , ๋ณ๋์ ์ปจํ
์คํธ๋ฅผ ์์ฑํ์ธ์:
UserContext: ์ฌ์ฉ์ ๊ด๋ จ ์ ๋ณด(์ธ์ฆ ์ํ, ์ฌ์ฉ์ ํ๋กํ ๋ฑ)์ฉ.ThemeContext: ํ ๋ง ๊ด๋ จ ์ค์ (์์, ๊ธ๊ผด ๋ฑ)์ฉ.SettingsContext: ์ ํ๋ฆฌ์ผ์ด์ ์ค์ (์ธ์ด, ์๊ฐ๋ ๋ฑ)์ฉ.
์ด ์ ๊ทผ ๋ฐฉ์์ ํ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ๊ด๋ จ ์๋ ์ปจํ ์คํธ์ ์์กดํ๋ ์ปดํฌ๋ํธ์์ ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
2. ๋ฉ๋ชจ์ด์ ์ด์
๊ธฐ๋ฒ: React.memo ๋ฐ useMemo
React.memo: props๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ปจํ
์คํธ๋ฅผ ์๋นํ๋ ์ปดํฌ๋ํธ๋ฅผ React.memo๋ก ๊ฐ์ธ์ธ์. ์ด๋ ์ปดํฌ๋ํธ์ ์ ๋ฌ๋ props์ ์์ ๋น๊ต๋ฅผ ์ํํฉ๋๋ค.
์์:
import React, { useContext } from 'react';
const ThemeContext = React.createContext({});
function MyComponent(props) {
const theme = useContext(ThemeContext);
return <div style={{ color: theme.textColor }}>{props.children}</div>;
}
export default React.memo(MyComponent);
์ด ์์์์ MyComponent๋ theme.textColor๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. ๊ทธ๋ฌ๋ React.memo๋ ์์ ๋น๊ต๋ฅผ ์ํํ๋ฏ๋ก, ์ปจํ
์คํธ ๊ฐ์ด ์์ฃผ ๋ณ๊ฒฝ๋๋ ๋ณต์กํ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ์๋ ์ถฉ๋ถํ์ง ์์ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์๋ useMemo ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์.
useMemo: ์ปจํ
์คํธ์์ ํ์๋ ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์
ํ๊ธฐ ์ํด useMemo๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๋ ๋ถํ์ํ ๊ณ์ฐ์ ๋ฐฉ์งํ๊ณ ์ปดํฌ๋ํธ๊ฐ ์์กดํ๋ ํน์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ๋ฆฌ๋ ๋๋ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์:
import React, { useContext, useMemo } from 'react';
const MyContext = React.createContext({});
function MyComponent() {
const contextValue = useContext(MyContext);
// Memoize the derived value
const importantValue = useMemo(() => {
return contextValue.item1 + contextValue.item2;
}, [contextValue.item1, contextValue.item2]);
return <div>{importantValue}</div>;
}
export default MyComponent;
์ฌ๊ธฐ์ importantValue๋ contextValue.item1 ๋๋ contextValue.item2๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๋ค์ ๊ณ์ฐ๋ฉ๋๋ค. `contextValue`์ ๋ค๋ฅธ ์์ฑ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ `MyComponent`๋ ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง๋์ง ์์ต๋๋ค.
3. ์ ๋ ํฐ ํจ์
์ปจํ ์คํธ์์ ํ์ํ ๋ฐ์ดํฐ๋ง ์ถ์ถํ๋ ์ ๋ ํฐ ํจ์๋ฅผ ์์ฑํ์ธ์. ์ด๋ฅผ ํตํด ์ปดํฌ๋ํธ๋ ์ ์ฒด ์ปจํ ์คํธ ๊ฐ์ฒด๊ฐ ์๋, ํ์ํ ํน์ ๋ฐ์ดํฐ ์กฐ๊ฐ์๋ง ๊ตฌ๋ ํ ์ ์์ต๋๋ค. ์ด ์ ๋ต์ ์ธ๋ถํ๋ ์ปจํ ์คํธ ์์ฑ ๋ฐ ๋ฉ๋ชจ์ด์ ์ด์ ์ ๋ณด์ํฉ๋๋ค.
์์:
import React, { useContext } from 'react';
const UserContext = React.createContext({});
// Selector function to extract the username
const selectUsername = (userContext) => userContext.username;
function UsernameDisplay() {
const username = selectUsername(useContext(UserContext));
return <p>Username: {username}</p>;
}
export default UsernameDisplay;
์ด ์์์์ UsernameDisplay๋ UserContext์ username ์์ฑ์ด ๋ณ๊ฒฝ๋ ๋๋ง ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ปดํฌ๋ํธ๋ฅผ `UserContext`์ ์ ์ฅ๋ ๋ค๋ฅธ ์์ฑ๋ค๊ณผ ๋ถ๋ฆฌํฉ๋๋ค.
4. ์ปจํ ์คํธ ์๋น๋ฅผ ์ํ ์ฌ์ฉ์ ์ ์ ํ
์ปจํ ์คํธ ์๋น ๋ก์ง์ ์ฌ์ฉ์ ์ ์ ํ ๋ด์ ์บก์ํํ์ธ์. ์ด๋ ์ปจํ ์คํธ ๊ฐ์ ์ ๊ทผํ๊ณ ๋ฉ๋ชจ์ด์ ์ด์ ๋๋ ์ ๋ ํฐ ํจ์๋ฅผ ์ ์ฉํ๋ ๋ ๊น๋ํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ํ ๋ ์ฌ์ด ํ ์คํธ ๋ฐ ์ ์ง๋ณด์๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์์:
import React, { useContext, useMemo } from 'react';
const ThemeContext = React.createContext({});
// Custom hook for accessing the theme color
function useThemeColor() {
const theme = useContext(ThemeContext);
// Memoize the theme color
const themeColor = useMemo(() => theme.color, [theme.color]);
return themeColor;
}
function MyComponent() {
const themeColor = useThemeColor();
return <div style={{ color: themeColor }}>Hello, World!</div>;
}
export default MyComponent;
useThemeColor ํ
์ theme.color์ ์ ๊ทผํ๊ณ ์ด๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํ๋ ๋ก์ง์ ์บก์ํํฉ๋๋ค. ์ด๋ ์ด ๋ก์ง์ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๋ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ํ๋ฉฐ, ์ปดํฌ๋ํธ๊ฐ theme.color๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๋ฆฌ๋ ๋๋ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
5. ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์
๋ณต์กํ ์ํ ๊ด๋ฆฌ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ, Redux, Zustand ๋๋ Jotai์ ๊ฐ์ ์ ์ฉ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค์ ์ง์ค์ ์ํ ๊ด๋ฆฌ, ์์ธก ๊ฐ๋ฅํ ์ํ ์ ๋ฐ์ดํธ ๋ฐ ์ต์ ํ๋ ๋ฆฌ๋ ๋๋ง ๋ฉ์ปค๋์ฆ๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- Redux: JavaScript ์ฑ์ ์ํ ์์ธก ๊ฐ๋ฅํ ์ํ ์ปจํ ์ด๋๋ฅผ ์ ๊ณตํ๋ ์ฑ์ํ๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋ ๋ง์ ์์ฉ๊ตฌ ์ฝ๋(boilerplate code)๋ฅผ ์๊ตฌํ์ง๋ง, ํ๋ฅญํ ๋๋ฒ๊น ๋๊ตฌ์ ํฐ ์ปค๋ฎค๋ํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Zustand: ๋จ์ํ๋ Flux ์์น์ ์ฌ์ฉํ๋ ์๊ณ ๋น ๋ฅด๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ๋ฒ ์ด๋ณธ(bearbones) ์ํ ๊ด๋ฆฌ ์๋ฃจ์ ์ ๋๋ค. ์ฌ์ฉ ํธ์์ฑ๊ณผ ์ต์ํ์ ์์ฉ๊ตฌ๋ก ์ ์๋ ค์ ธ ์์ต๋๋ค.
- Jotai: React๋ฅผ ์ํ ์์์ ์ด๊ณ ์ ์ฐํ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ต์ํ์ ์์ฉ๊ตฌ๋ก ์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํนํ ๋น๋ฒํ ์ ๋ฐ์ดํธ์ ๋ณต์กํ ๋ฐ์ดํฐ ์ข ์์ฑ์ ์ฒ๋ฆฌํ ๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ๋ ๋์ ์ ํ์ด ๋ ์ ์์ต๋๋ค. Context API๋ props drilling ํํผ์ ๋ฐ์ด๋์ง๋ง, ์ ์ฉ ์ํ ๊ด๋ฆฌ๋ ์ ์ญ ์ํ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ ์ ํด๊ฒฐํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
6. ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ
๋ณต์กํ ๊ฐ์ฒด๋ฅผ ์ปจํ ์คํธ ๊ฐ์ผ๋ก ์ฌ์ฉํ ๋, ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ธ์. ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๊ฐ์ฒด์ ๋ํ ๋ณ๊ฒฝ์ด ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ๋์ ์๋ก์ด ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ฅผ ํตํด React๋ ํจ์จ์ ์ธ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์ํํ๊ณ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
Immer ๋ฐ Immutable.js์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋ ์ฝ๊ฒ ์์ ํ ์ ์๋๋ก ๋์์ค๋๋ค.
Immer ์ฌ์ฉ ์์:
import React, { createContext, useState, useContext, useCallback } from 'react';
import { useImmer } from 'use-immer';
const MyContext = createContext();
function MyProvider({ children }) {
const [state, updateState] = useImmer({
item1: 'value1',
item2: 'value2',
});
const updateItem1 = useCallback((newValue) => {
updateState((draft) => {
draft.item1 = newValue;
});
}, [updateState]);
return (
<MyContext.Provider value={{ state, updateItem1 }}>
{children}
</MyContext.Provider>
);
}
function MyComponent() {
const { state, updateItem1 } = useContext(MyContext);
return (
<div>
<p>Item 1: {state.item1}</p>
<button onClick={() => updateItem1('new value')}>Update Item 1</button>
</div>
);
}
export { MyContext, MyProvider, MyComponent };
์ด ์์์์ useImmer๋ ์ํ ์
๋ฐ์ดํธ๊ฐ ์ ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ก ๋ณด์ฅํ์ฌ ํ์ํ ๋๋ง ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
7. ์ํ ์ ๋ฐ์ดํธ ๋ฐฐ์น ์ฒ๋ฆฌ
React๋ ์ฌ๋ฌ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋จ์ผ ๋ฆฌ๋ ๋๋ง ์ฌ์ดํด๋ก ์๋์ผ๋ก ๋ฐฐ์น ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ํน์ ์ํฉ์์๋ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ๋ฐฐ์น ์ฒ๋ฆฌํด์ผ ํ ์๋ ์์ต๋๋ค. ์ด๋ ๋น๋๊ธฐ ์์ ์ด๋ ์งง์ ๊ธฐ๊ฐ ๋ด์ ์ฌ๋ฌ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ํนํ ์ ์ฉํฉ๋๋ค.
์๋์ผ๋ก ์
๋ฐ์ดํธ๋ฅผ ๋ฐฐ์น ์ฒ๋ฆฌํ๋ ค๋ฉด ReactDOM.unstable_batchedUpdates (React 18 ์ดํ ๋ฒ์ ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, React 18+์ ์๋ ๋ฐฐ์น ์ฒ๋ฆฌ๋ก ์ธํด ์ผ๋ฐ์ ์ผ๋ก ๋ถํ์ํจ)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
8. ๋ถํ์ํ ์ปจํ ์คํธ ์ ๋ฐ์ดํธ ๋ฐฉ์ง
๋ฐ์ดํฐ์ ์ค์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๋๋ง ์ปจํ ์คํธ ๊ฐ์ ์ ๋ฐ์ดํธํ๋๋ก ํ์ธ์. ๋์ผํ ๊ฐ์ผ๋ก ์ปจํ ์คํธ๋ฅผ ๋ถํ์ํ๊ฒ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ํผํ์ญ์์ค. ์ด๋ ๊ฒ ํด๋ ๋ฆฌ๋ ๋๋ง์ด ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
์ปจํ ์คํธ๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ์ ๊ฐ๊ณผ ์ด์ ๊ฐ์ ๋น๊ตํ์ฌ ์ฐจ์ด๊ฐ ์๋์ง ํ์ธํ์ธ์.
๋ค์ํ ๊ตญ๊ฐ์ ์ค์ ์ฌ๋ก
์ด๋ฌํ ์ต์ ํ ๊ธฐ์ ์ด ๋ค์ํ ๊ตญ๊ฐ์ ์๋๋ฆฌ์ค์ ์ด๋ป๊ฒ ์ ์ฉ๋ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ์ ์์๊ฑฐ๋ ํ๋ซํผ (๊ธ๋ก๋ฒ): ์ ์์๊ฑฐ๋ ํ๋ซํผ์
CartContext๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ์ฅ๋ฐ๊ตฌ๋๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ต์ ํ ์์ด๋ ์ฅ๋ฐ๊ตฌ๋์ ํญ๋ชฉ์ด ์ถ๊ฐ๋ ๋ ํ์ด์ง์ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ์ ์์ต๋๋ค. ์ ๋ ํฐ ํจ์์React.memo๋ฅผ ์ฌ์ฉํ๋ฉด ์ฅ๋ฐ๊ตฌ๋ ์์ฝ ๋ฐ ๊ด๋ จ ์ปดํฌ๋ํธ๋ง ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. Zustand์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฅ๋ฐ๊ตฌ๋ ๊ด๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ค์ ์ง์คํํ ์ ์์ต๋๋ค. ์ด๋ ์ง์ญ์ ๊ด๊ณ์์ด ์ ์ธ๊ณ์ ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค. - ๊ธ์ต ๋์๋ณด๋ (๋ฏธ๊ตญ, ์๊ตญ, ๋
์ผ): ๊ธ์ต ๋์๋ณด๋๋ ์ค์๊ฐ ์ฃผ๊ฐ ๋ฐ ํฌํธํด๋ฆฌ์ค ์ ๋ณด๋ฅผ ํ์ํฉ๋๋ค.
StockDataContext๋ ์ต์ ์ฃผ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ณผ๋ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํดuseMemo๋ฅผ ์ฌ์ฉํ์ฌ ์ด ํฌํธํด๋ฆฌ์ค ๊ฐ์น์ ๊ฐ์ ํ์๋ ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์ ํฉ๋๋ค. ์ถ๊ฐ ์ต์ ํ๋ ๊ฐ ์ฐจํธ์ ๋ํ ํน์ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์ถ์ถํ๊ธฐ ์ํด ์ ๋ ํฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํฌํจํ ์ ์์ต๋๋ค. Recoil๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ์ฉํ ์ ์์ต๋๋ค. - ์์
๋ฏธ๋์ด ์ ํ๋ฆฌ์ผ์ด์
(์ธ๋, ๋ธ๋ผ์ง, ์ธ๋๋ค์์): ์์
๋ฏธ๋์ด ์ ํ๋ฆฌ์ผ์ด์
์
UserContext๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ํ๋กํ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ฌ์ฉ์ ํ๋กํ ์ปจํ ์คํธ๋ฅผ ์ธ์ฆ ์ปจํ ์คํธ์ ๋ถ๋ฆฌํ๊ธฐ ์ํด ์ธ๋ถํ๋ ์ปจํ ์คํธ ์์ฑ์ด ์ฌ์ฉ๋ฉ๋๋ค. ํจ์จ์ ์ธ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. Immer์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋จ์ํํ ์ ์์ต๋๋ค. - ์ฌํ ์์ฝ ์น์ฌ์ดํธ (์ผ๋ณธ, ๋ํ๋ฏผ๊ตญ, ์ค๊ตญ): ์ฌํ ์์ฝ ์น์ฌ์ดํธ๋
SearchContext๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ ๊ธฐ์ค ๋ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ์ ์ ๊ทผํ๊ณ ์ด๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ ๋ก์ง์ ์บก์ํํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ ์ ํ ์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ๋ฌ ํํฐ๊ฐ ๋์์ ์ ์ฉ๋ ๋ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ํ ์ ๋ฐ์ดํธ ๋ฐฐ์น๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
- ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํ์ผ๋ง: React DevTools๋ฅผ ์ฌ์ฉํ์ฌ ์์ฃผ ๋ฆฌ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ๋ฅผ ์๋ณํฉ๋๋ค.
- ์ธ๋ถํ๋ ์ปจํ ์คํธ๋ก ์์: ์ ์ญ ์ํ๋ฅผ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ปจํ ์คํธ๋ก ๋ถํดํฉ๋๋ค.
- ๋ฉ๋ชจ์ด์ ์ด์
์ ๋ต์ ์ผ๋ก ์ ์ฉ:
React.memo๋ฐuseMemo๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํฉ๋๋ค. - ์ ๋ ํฐ ํจ์ ํ์ฉ: ์ปจํ ์คํธ์์ ํ์ํ ๋ฐ์ดํฐ๋ง ์ถ์ถํฉ๋๋ค.
- ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ณ ๋ ค: ๋ณต์กํ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด Redux, Zustand ๋๋ Jotai์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ํฉ๋๋ค.
- ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฑํ: Immer์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ณ ๋ฐ์ดํฐ ์์ ์ ๋จ์ํํฉ๋๋ค.
- ๋ชจ๋ํฐ๋ง ๋ฐ ์ต์ ํ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ํ์์ ๋ฐ๋ผ ์ปจํ ์คํธ ์ฌ์ฉ์ ์ต์ ํํฉ๋๋ค.
๊ฒฐ๋ก
React์ Context API๋ ์ ์คํ๊ฒ ์ฌ์ฉํ๊ณ ๋ ผ์๋ ๊ธฐ์ ๋ก ์ต์ ํํ ๋, ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๊ฐ๋ ฅํ๊ณ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ ์ฌ์ ์ธ ์ฑ๋ฅ ํจ์ ์ ์ดํดํ๊ณ ์ ์ ํ ์ต์ ํ ์ ๋ต์ ๊ตฌํํจ์ผ๋ก์จ, ํฌ๊ธฐ๋ ๋ณต์ก์ฑ์ ๊ด๊ณ์์ด React ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฑ๋ฅ, ํ์ฅ์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ์ ์ ์งํ๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.
ํญ์ ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋กํ์ผ๋งํ๊ณ ์ต์ ํ๊ฐ ํ์ํ ์์ญ์ ์๋ณํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ํน์ ์๊ตฌ ์ฌํญ๊ณผ ์ปจํ
์คํธ์ ๊ฐ์ฅ ์ ํฉํ ์ ๋ต์ ์ ํํ์ญ์์ค. ์ด ์ง์นจ์ ๋ฐ๋ฅด๋ฉด useContext์ ํ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ณ ํ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ณ ์ฑ๋ฅ React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.