์ค๋์ ์ ๊ฐ Context API์์ Zustand๋ก ์ํ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์ ํํ๊ฒ ๋ ๊ณผ์ ๊ณผ 2024๋ ํ์ฌ ๋ฆฌ์กํธ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํํฉ์ ๋ํด ์ด์ผ๊ธฐํด๋ณด๋ ค ํฉ๋๋ค.
1. Context API์ ํ๊ณ์ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์์ฑ
Context API๋ก ์์ํ ์ด์
์ฒ์ ์๋ฆฌ๋ ํ๋ก์ ํธ๋ฅผ ์์ํ ๋๋ Context API๋ง์ผ๋ก ์ถฉ๋ถํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ฌ์ฉ์ ์ธ์ฆ, ํ ๋ง, ์ธ์ด ์ค์ ๋ฑ ์ ์ญ์ ์ผ๋ก ๊ณต์ ๋์ด์ผ ํ๋ ์ํ๋ค์ ๊ด๋ฆฌํ๋ ๋ฐ Context API ๋ง์ผ๋ก ์ถฉ๋ถํ์ต๋๋ค.
// ์ด๊ธฐ Context API ์ฌ์ฉ ์์
const PetContext = React.createContext<PetContextType | undefined>(undefined);
export const PetProvider: React.FC<PropsWithChildren> = ({ children }) => {
const [petData, setPetData] = useState<PetData>({
allergies: [],
symptoms: [],
foodLog: []
});
return (
<PetContext.Provider value={{ petData, setPetData }}>
{children}
</PetContext.Provider>
);
};
ํ๊ณ์ ๋ฐ๊ฒฌ
ํ์ง๋ง ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด์ ์ฌ๋ฌ ๊ฐ์ง ํ๊ณ์ ์ด ๋๋ฌ๋๊ธฐ ์์ํ์ต๋๋ค:
- ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง: Context์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํด๋น Context๋ฅผ ๊ตฌ๋ ํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์์ต๋๋ค.
- ์ฝ๋ ๋ณต์ก๋ ์ฆ๊ฐ: ์ฌ๋ฌ ๊ฐ์ Context๋ฅผ ์ค์ฒฉํด์ ์ฌ์ฉํ๋ค ๋ณด๋ Provider Hell์ด ๋ฐ์ํ์ต๋๋ค.
- ์ํ ์ ๋ฐ์ดํธ ๋ก์ง ๊ด๋ฆฌ์ ์ด๋ ค์: ๋น๋๊ธฐ ์์ ๊ณผ ๋ณต์กํ ์ํ ์ ๋ฐ์ดํธ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ๊ณ๊ฐ ์์์ต๋๋ค.
2. ์ฃผ์ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋น๊ต ๋ถ์
Redux
Redux๋ ์ค๋ซ๋์ ๋ฆฌ์กํธ ์ํ๊ณ์ ํ์ค๊ณผ ๊ฐ์ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค.
Redux์ ํต์ฌ ๊ฐ๋
- Action: ์ํ ๋ณ๊ฒฝ์ ์ํ ์ด๋ฒคํธ๋ฅผ ์ค๋ช ํ๋ ๊ฐ์ฒด
- Reducer: Action์ ๋ฐ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ํจ์
- Store: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ์ํ๋ฅผ ๋ณด๊ดํ๋ ๊ฐ์ฒด
Redux ๋ฏธ๋ค์จ์ด ์ํ๊ณ
- Redux Thunk: ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฏธ๋ค์จ์ด
- Redux Saga: ๋ณต์กํ ๋น๋๊ธฐ ํ๋ฆ์ ์ ์ดํ๊ธฐ ์ํ ๋ฏธ๋ค์จ์ด
- Generator ํจ์๋ฅผ ์ฌ์ฉํ ์ ์ธ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ
- ๋ณต์กํ ์๋๋ฆฌ์ค(API ์์ฒญ ์ทจ์, ์ฌ์๋ ๋ฑ) ์ฒ๋ฆฌ ๊ฐ๋ฅ
- Redux Toolkit: ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ด๊ธฐ ์ํ ๊ณต์ ๋๊ตฌ
๊ทธ๋ฌ๋ Redux๋ ๋ค์๊ณผ ๊ฐ์ ๋จ์ ์ด ์์ต๋๋ค:
- ๋ง์ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋
- ํ์ต ๊ณก์ ์ด ๊ฐํ๋ฆ
- ์์ ์ํ ๋ณํ์๋ ๋ง์ ์ฝ๋ ํ์
Recoil
Facebook์์ ๋ง๋ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
์ฅ์
- React์์ ๋์ ํธํ์ฑ
- ๊ฐ๋จํ API (atom, selector)
- ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์ฌ์
๋จ์
- ์ํฐ์ผ๋ก ๊ด๋ฆฌ๋๋ ์ ์ญ ์ํ๋ฅผ ์ด๋ค ์ปดํฌ๋ํธ๋ผ๋ ๋ฐ๋ก ์ํฐ์ ๊ตฌ๋ ํด์ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ๊ธฐ์, ์์กด์ฑ์ด ์ฌ๋ฌ ๋ฐฉํฅ์ผ๋ก ์ฎ์ด๋ฉด์ ์์ธกํ๊ธฐ ํ๋ค์ด์ง๋๋ค.
Zustand
๊ฐ๋ณ๊ณ ์ง๊ด์ ์ธ API๋ฅผ ์ ๊ณตํ๋ ํ๋์ ์ธ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
์ฃผ์ ํน์ง
- ์ต์ํ์ ๋ณด์ผ๋ฌํ๋ ์ดํธ
- TypeScript ์ง์์ด ํ๋ฅญํจ
- Redux DevTools ์ง์
- ๋ฏธ๋ค์จ์ด ์์คํ (persist, devtools ๋ฑ)
์์ ์ฝ๋:
import create from 'zustand'
interface PetStore {
symptoms: Symptom[]
addSymptom: (symptom: Symptom) => void
foodLogs: FoodLog[]
addFoodLog: (log: FoodLog) => void
}
const usePetStore = create<PetStore>((set) => ({
symptoms: [],
addSymptom: (symptom) => set((state) => ({
symptoms: [...state.symptoms, symptom]
})),
foodLogs: [],
addFoodLog: (log) => set((state) => ({
foodLogs: [...state.foodLogs, log]
}))
}))
3. ์ค์ ํ๋ก์ ํธ์์์ ์ ํ: Zustand
์๋ฆฌ๋ ํ๋ก์ ํธ์์์ ์๊ตฌ์ฌํญ
- ์ค์๊ฐ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ
- ๋ณต์กํ ์ํ ๊ด๋ฆฌ (์๋ ๋ฅด๊ธฐ ์ฆ์, ์์ ๊ธฐ๋ก, ๋ถ์ ๋ฐ์ดํฐ)
- ์ฑ๋ฅ ์ต์ ํ
- TypeScript ์ง์
Zustand ์ ํ ์ด์
- ๊ฐ๋จํ ์ค์ ๊ณผ ์ฌ์ฉ๋ฒ: ๋ณ๋์ Provider ์ค์ ์ด ํ์ ์๊ณ , ์ง๊ด์ ์ธ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ํ์ํ ์ํ๋ง ๊ตฌ๋ ํ์ฌ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํฉ๋๋ค.
- TypeScript ์ง์: ํ์ ์ถ๋ก ์ด ์ ๋์ํ์ฌ ๊ฐ๋ฐ ์์ฐ์ฑ์ด ํฅ์๋์์ต๋๋ค.
- ๋ฏธ๋ค์จ์ด ์ง์: persist ๋ฏธ๋ค์จ์ด๋ฅผ ํตํด ๋ก์ปฌ ์คํ ๋ฆฌ์ง ์ฐ๋์ด ์ฌ์ ์ต๋๋ค.
Context API์์ ์กฐํ
Context API์ Zustand๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ญํ ์ ๊ตฌ๋ถํ์ต๋๋ค:
- Context API: ํ ๋ง, ์ธ์ฆ ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ์ค์ ๊ณผ ๊ด๋ จ๋ ์ํ ๊ด๋ฆฌ (๋จ์ด ๊ทธ๋๋ก ํน์ ๋งฅ๋ฝ์ ์์ธ๋ ์ฌ์ฉํ์ต๋๋ค.)
- Zustand: ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ด๋ จ๋ ๋ณต์กํ ์ํ ๊ด๋ฆฌ
4. ๊ฒฐ๋ก
2024๋ ํ์ฌ, ์ ๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ์ต๋๋ค:
- ์์ ํ๋ก์ ํธ: Context API๋ง์ผ๋ก๋ ์ถฉ๋ถ
- ์ค๊ฐ ๊ท๋ชจ ํ๋ก์ ํธ: Zustand
- ๋๊ท๋ชจ ํ๋ก์ ํธ: Redux Toolkit ๋๋ Zustand
์๋ฆฌ๋์ ๊ฐ์ด ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋ณต์กํ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํ ํ๋ก์ ํธ์๋ Zustand๊ฐ ํนํ ์ ํฉํ์ต๋๋ค. ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๋ฉด์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ํนํ TypeScript์์ ํธํ์ฑ์ด ๋ฐ์ด๋ ๊ฐ๋ฐ ๊ฒฝํ์ด ๋งค์ฐ ์ข์์ต๋๋ค.
'Side Project > Allini - ๋ฐ๋ ค๊ฒฌ ์์ ๊ด๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
PostCSS์ Autoprefixer ์นํฉ ์ค์ ๋ถํฐ ๋ฌธ์ ํด๊ฒฐ๊น์ง (1) | 2024.11.01 |
---|---|
express-openapi-validator PR ์ฌ์ ๊ธฐ! HTTP ์ธ์ฆ ๋ก์ง ๊ฐ์ ํ๊ธฐ ๐ (11) | 2024.10.27 |
React ์๋ฒ ์ปดํฌ๋ํธ ์ฌ์ธต ๋ถ์! (7) | 2024.10.22 |
Virtual Scroll: ์ด๋ค ์ํฉ์์ ์จ์ผํ ๊น? (8) | 2024.10.13 |
์ค์ ๋ก ์์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ฒ์ธ์ผ ์คํฌ๋กค์ ์ด๋ป๊ฒ ๊ตฌํํ์๊น? (0) | 2024.10.13 |