์ ์ ๊ฐ ์ข์์ํ ์ํ์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ํฌ๊ฒ ๋๊ฐ์ง ๋ฐฉ์์ด ์๋ค.
1. ์๋ฒ API๋ก ๊ด๋ฆฌํ๊ธฐ
์๋ฒ์ธก์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ๋๋ฌธ์, ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ, ๋ณด์, ๋ฐ์ดํฐ๊ฐ ๋ง์๋ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌ ํ ์์๋ค.
2. ํ๋ก ํธ์๋ ์ ์ญ ์ํ๋ก ๊ด๋ฆฌํ๊ธฐ
์๋ฒ์ ๋คํธ์ํฌ ์์ฒญ์์ด ์งํํ๊ธฐ ๋๋ฌธ์ UI๊ฐ ๋น ๋ฅด๊ฒ ๋ฐ์ํ ์ ์์ง๋ง, ์ผ๊ด์ฑ, ์บ์๋ฅผ ์ง์ฐ๊ฑฐ๋ ๋ค๋ฅธ ๊ธฐ๊ธฐ๋ฅผ ์ฌ์ฉํ ๋ ์ข์์ ์ํ ์ ๋ณด๋ฅผ ์์ด๋ฒ๋ฆด์ ์๋ ๋ฌธ์ ์ ์ด ๋ฐ์ํ ์์๋ ๋จ์ ์ด ์กด์ฌํ๋ค.
โจ ์ผ๋ฐ์ ์ผ๋ก ์์ ์ ์ธ ์น์ฑ์์ ์๋ฒ API๋ฅผ ํตํ ๊ด๋ฆฌ ๋ฐฉ์์ ์ ํธํ๋ค!
์ฌ์ฉ์๊ฐ ์ข์์ ๋ฒํผ์ ํ ๊ธํ์ฌ , ์ข์์ ๋๋ฅธ ์ํ๋ค์ productId๋ฅผ zustand๋ก ์ ์ญ๊ด๋ฆฌํ์ฌ,
๋ง์ดํ์ด์ง์์ ์ข์์ํ ์ํ๋ค์ productId์ ๊ฐ์ง๊ณ apiํธ์ถ์ ํตํด ๊ฐ์ ธ์์ ๋์ฐ๋ ๋ฐฉ์์ ์ฑํํ์๋ค.
๐ Zustand persist : ์๋ก๊ณ ์นจ ์ ์ ์ญ์ํ ์ด๊ธฐํ ๋ฐฉ์ง
โ๏ธํ์ด์ง๊ฐ ์๋ก๊ณ ์นจ๋๊ฑฐ๋, ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์์๋๋ฉด Javascript ํ๊ฒฝ์ด ์ด๊ธฐํ๋์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ๋ด ์ํ Zustand์ Store๊น์ง ์ด๊ธฐํ๋์ด ์ ์ญ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ๊ฐ ๋ ๋ผ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๐กํด๊ฒฐ๋ฐฉ์
๋ธ๋ผ์ฐ์ ์ Storage์ ์ ์ฅํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
localStorage๋ฅผ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ์๋ค๊ฐ ๋ค์ ์ด์ด๋ ์ ์ฅ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋์ง๋ง, ๊ฐ์ ๋ธ๋ผ์ฐ์ ๋ก ๋ก๊ทธ์์ํ๊ณ ๋ค๋ฅธ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ์ ํ๋ค๋ฉด ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์ ์ ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์ข์์ํ ์ํ์ ๊ด๋ฆฌํ ์๊ฐ ์๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์ํ ๋ ์คํ ๋ฆฌ์ง๋ฅผ clearํ๋ ๋ก์ง์ ๊ตฌํํด์ ์ ์ ๊ฐ ๋ฐ์ดํฐ ๊ณต์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
ํ๋ก ํธ ์ธก์์ ๊ด๋ฆฌ๋ฅผ ํ๋ฉด, ๊ธฐ๊ธฐ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณ๊ฒฝ๋์์๋, ์ ์ ์ ์ข์์ํ ์ํ์ ๋ฐ์ํ ์ ์๋ ํ๊ณ๋ ์กด์ฌํ๋ค๐ฅฒ
import { create } from "zustand";
import { persist } from "zustand/middleware";
interface LikeProductsState {
likedProducts: number[];
isLiked: (productId: number) => boolean;
toggleLikedProduct: (productId: number) => void;
}
export const useLikedProductsStore = create(
persist<LikeProductsState>(
(set, get) => ({
likedProducts: [],
isLiked: (productId) => get().likedProducts.includes(productId),
toggleLikedProduct: (productId) =>
set((state) => {
const isAlreadyLiked = state.likedProducts.includes(productId);
if (isAlreadyLiked) {
return {
likedProducts: state.likedProducts.filter(
(id) => id !== productId
),
};
} else {
return {
likedProducts: [...state.likedProducts, productId],
};
}
}),
}),
{
name: "liked-products",
}
)
);
๐๐ป Zustand์ persist๋ฅผ ์ฌ์ฉํด ๋ก์ปฌ ์คํ ๋ฆฌ์ง ์ ์ฅ๊ณต๊ฐ์ ์ ์ฅํ๊ณ , ์ ์ ๊ฐ ๋ฐ์ดํฐ ๊ณต์ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ก๊ทธ์์์ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ์ข์์ํ ์ํ์ ๋ณด๋ฅผ ์ ๊ฑฐํด์ค๋ค.
ํ๊ณ
๐ฅฒ ์ข์์ ๊ธฐ๋ฅ์ ์ผํ์ฑ์ผ๋ก ์ฌ์ฉํ๋ ๋จ์ ์ด ์กด์ฌํ์ง๋ง, ์ผํ์ฑ์ด ์๋ ์ฅ๊ธฐ์ ์ผ๋ก ๋ณด๊ดํ๊ณ ์ถ๋ค๋ฉด ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ธฐ๋๋ฌธ์, ์ฌ์ฉํด๋ณด์ง ์์ persist์ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํด๋ณด๋๋ฐ ์๋ฏธ๋ฅผ ๋๊ธฐ๋ก ํ๋ค.
https://docs.pmnd.rs/zustand/integrations/persisting-store-data
'ํ๋ก์ ํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CSS] footer ํ๋จ ๋ฐฐ์นํ๊ธฐ (flex-grow ์ฌ์ฉ) (0) | 2024.04.24 |
---|---|
[keyDown, keyUp Event] ํ๊ตญ์ด ์ ๋ ฅ ๋ฌธ์ ํด๊ฒฐ : e.nativeEvent.isComposing (0) | 2024.04.24 |
[Fullstack] ๊ณ ๊ฐ์ผํฐ ์ฑํ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (0) | 2024.04.23 |
[react-query] useQueries๋ก ๊ฐ id์ ๋ํด ๋ณ๋ ฌ ์ฟผ๋ฆฌํ๊ธฐ (0) | 2024.04.23 |
[react-query] useQuery์ ์กฐ๊ฑด๋ฌธ ์ฟผ๋ฆฌ (0) | 2024.04.23 |