๋ ์ผ์ด๋ก "์ํ"๋ฅผ ์๋ฏธํ๋ Zustand๋ React ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋จ์ํ๋ Flux ํจํด์ ์ฌ์ฉํ๋ ์๊ณ ๋น ๋ฅธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
hook์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ๋ ๊ฐํธํ API๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ต์ํ์ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์ํ ๊ด๋ฆฌ๋ฅผ ์ง๊ด์ ์ด๊ณ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ค๋ค.
์ฃผ์ ๊ธฐ๋ฅ ๋ฐ ํน์ง
1. ์ฌํํ API:
Zustand์ API๋ ๋งค์ฐ ๊ฐ๋จํ๋ค. ๋ณดํต 1~2๊ฐ์ hook๋ง ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ์ ์ํ๊ณ , ์ด๋ฅผ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๋ค. ์ฃผ๋ก `create` ํจ์์ `useStore` ํ
์ ์ฌ์ฉํ๋ค.
2. ์ด๊ฒฝ๋:
Zustand๋ ๊ฒฝ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ํฌ๊ธฐ๊ฐ ์๊ณ ๋น ๋ฅด๋ค. React Context API ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ ๋ค๋ฅธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋น๊ตํ์ ๋, ์ฑ๋ฅ ์ ํ๊ฐ ์ ๋ค.
3. ์ ์ญ ์ํ ๊ด๋ฆฌ:
Zustand๋ ์ ์ญ ์ํ๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ํด์ค๋ค. ์ํ๋ ์ ์ญ์ ์ผ๋ก ์ ์๋๋ฉฐ, ์ด๋์๋ ์ก์ธ์คํ ์ ์๋ค.
4. ๋ฏธ๋ค์จ์ด ์ง์:
Zustand๋ ์ฌ๋ฌ ๋ฏธ๋ค์จ์ด๋ฅผ ํตํด ์ํ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋ค. ๋ก๊น
, ์ํ ์ง์์ฑ, ๋ฐ ํ์ ํธ๋๋ธ ๋๋ฒ๊น
๋ฑ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค.
5. React์ ์ํ๊ณ์ ํตํฉ:
Zustand๋ React์ ์์ฐ์ค๋ฝ๊ฒ ํตํฉ๋๋ค. React ํ
์ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ์ ์ํ๊ณ , ์ด๋ฅผ React ์ปดํฌ๋ํธ ๋ด์์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
1. zustand ์ค์น
npm i zustand
2. ์คํ ์ด ์์ฑ
import { create } from 'zustand'
const useBearStore = create((set) => ({
bears: 0,
increasePopulation: () => set((state) => ({ bears: state.bears + 1 })),
removeAllBears: () => set({ bears: 0 }),
}))
3. ์ปดํฌ๋ํธ ๋ฐ์ธ๋ฉ์ ํ๋ฉด ์๋ฃ.
function BearCounter() {
const bears = useBearStore((state) => state.bears)
return <h1>{bears} around here ...</h1>
}
function Controls() {
const increasePopulation = useBearStore((state) => state.increasePopulation)
return <button onClick={increasePopulation}>one up</button>
}
๋ค์ํ ์ถ๊ฐ ๊ธฐ๋ฅ
- ๋ฏธ๋ค์จ์ด ์ถ๊ฐ:
Zustand๋ ๋ฏธ๋ค์จ์ด๋ฅผ ํตํด ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ํตํฉํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ก๊น
๋ฏธ๋ค์จ์ด๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค.
import create from 'zustand'
import { devtools } from 'zustand/middleware'
const useStore = create(devtools(set => ({
bears: 0,
increasePopulation: () => set(state => ({ bears: state.bears + 1 })),
removeAllBears: () => set({ bears: 0 })
})))
- Persist:
Zustand๋ ์ํ๋ฅผ ์คํ ๋ฆฌ์ง์ ์ ์ฅํ ์ ์๋ ๊ธฐ๋ฅ๋ ์ง์ํ๋ค.
import { create } from 'zustand'
import { persist, createJSONStorage } from 'zustand/middleware'
const useFishStore = create(
persist(
(set, get) => ({
fishes: 0,
addAFish: () => set({ fishes: get().fishes + 1 }),
}),
{
name: 'food-storage', // name of the item in the storage (must be unique)
storage: createJSONStorage(() => sessionStorage), // (optional) by default, 'localStorage' is used
},
),
)
์ด ์ธ์๋, ๋ค์ํ ๊ธฐ๋ฅ๋ค์ ์ง์ํ๋ค.
์ด๋ฒ ๊ธฐํ์ hook์ ์ด์ฉํ ์ํ๊ด๋ฆฌ ๊ณต๋ถ๋ฅผ ์ํด ์๋์ ๋์๋ฅผ ๊ตฌ๋งคํ๋ค. ๋์๋ก ๊ณต๋ถํ ๋ค, ์ฌํ๊ณผ์ ๋ ์ ๋ฆฌํด๋ณผ ์์ ์ด๋ค.
๐ธ ์ถ์ฒ ๐ธ
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ React ] React์ export์ export default ์ฐจ์ด์ ์์๋ณด๊ธฐ (0) | 2024.08.18 |
---|---|
[ React ] Chart UI ๊ตฌํ์ ์ํ React ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ฆฌ (0) | 2024.06.23 |
[ Sentry ] F.E์์ Sentry๋ฅผ ํ์ฉํ์ฌ ๋๋ฒ๊น ํ๊ธฐ. (0) | 2024.05.19 |
[ React ] Suspense๋ ๋ฌด์์ผ๊น? (0) | 2023.07.16 |
[ Next.js ] Next13์์ ์ปค์คํ Font ์ธํ ํ๊ธฐ. (App Router ๊ธฐ์ค) (0) | 2023.06.20 |