๊ธฐ์ด ํ๋ก์ ํธ์์ ์ฒ์์ผ๋ก Jotai๋ฅผ ์ฌ์ฉํด๋ณด์๊ณ , ๊ทธ ๊ฒฝํ์ ๋ฐํ์ผ๋ก Jotai์ ์ฅ์ ๊ณผ ๋จ์ ์ Context์ Zutand๋ฅผ ๋น๊ตํด๋ณด๋ ค ํฉ๋๋ค.
Jotai ์ฌ์ฉ ํ Context์ Zustand์์ ๋น๊ต ๐ซ
๐ Jotai ์ฌ์ฉ ์์
import React from 'react';
import { atom, useAtom } from 'jotai';
// atom ์ ์
const countAtom = atom(0);
function Counter() {
const [count, setCount] = useAtom(countAtom);
return (
<div>
<p>์นด์ดํธ: {count}</p>
<button onClick={() => setCount(count + 1)}>์ฆ๊ฐ</button>
</div>
);
}
export default function App() {
return (
<div>
<h1>Jotai ์นด์ดํฐ</h1>
<Counter />
</div>
);
}
Jotai์ ์ฅ์
- ๋จ์ํ API: Jotai๋ ์ํ๋ฅผ atom์ผ๋ก ์ ์ํ๊ณ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์์ด, ์ฒ์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ ์ฝ๊ฒ ์ ์ํ ์ ์์์ต๋๋ค. ๋ณต์กํ ์ค์ ์ด ํ์ ์์ด์ ๋น ๋ฅด๊ฒ ํ๋ก์ ํธ์ ์ ์ฉํ ์ ์์์ต๋๋ค.
- ๋ ๋ฆฝ์ ์ธ ์ํ ๊ด๋ฆฌ: ๊ฐ atom์ด ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ๋ฏ๋ก, ์ํ ๋ณ๊ฒฝ ์ ๋ฆฌ๋ ๋๋ง์ด ํ์ํ ์ปดํฌ๋ํธ๋ง ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์ด๋ ์ฑ๋ฅ ์ต์ ํ์ ํฐ ๋์์ด ๋์๊ณ , ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ค์ผ ์ ์์์ต๋๋ค.
- React์ ์๋ช ์ฃผ๊ธฐ์ ์ ํตํฉ: Jotai๋ React์ Suspense์ ํจ๊ป ์ฌ์ฉํ ์ ์์ด ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ ๋งค์ฐ ์ ์ฉํ์ต๋๋ค. ์ด๋ฅผ ํตํด ์ปดํฌ๋ํธ์ ๋ก๋ฉ ์ํ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์์ต๋๋ค.
Jotai์ ๋จ์
- ์ํ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ: ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด์ atom์ ์๊ฐ ๋ง์์ ธ ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง ์ ์์์ต๋๋ค. ํนํ, ์ํ๋ฅผ ์ถ์ ํ๊ณ ์ ์งํ๋ ๋ฐ ํผ๋์ค๋ฌ์ด ๋ถ๋ถ์ด ์์์ต๋๋ค.
- ๊ณ ๊ธ ๊ธฐ๋ฅ ๋ถ์กฑ: Zustand์ ๋น๊ตํ์ ๋, ๋ณต์กํ ์ํ ๊ด๋ฆฌ ๋ก์ง์ด๋ ๋ฏธ๋ค์จ์ด ์ง์์ด ๋ถ์กฑํ์ต๋๋ค. ํน์ ์ํฉ์์๋ ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์์ด, ์ํฉ์ ๋ฐ๋ผ ๋ถํธํจ์ ๋๊ผ์ต๋๋ค.
๐ Context ์ฌ์ฉ ์์
import React, { createContext, useContext, useState } from 'react';
// Context ์์ฑ
const CountContext = createContext();
function CountProvider({ children }) {
const [count, setCount] = useState(0);
return (
<CountContext.Provider value={{ count, setCount }}>
{children}
</CountContext.Provider>
);
}
function Counter() {
const { count, setCount } = useContext(CountContext);
return (
<div>
<p>์นด์ดํธ: {count}</p>
<button onClick={() => setCount(count + 1)}>์ฆ๊ฐ</button>
</div>
);
}
export default function App() {
return (
<CountProvider>
<h1>Context ์นด์ดํฐ</h1>
<Counter />
</CountProvider>
);
}
Context์ ์ฅ์
- ๋ด์ฅ๋ ๊ธฐ๋ฅ: Context๋ React์ ๋ด์ฅ๋์ด ์์ด ์ถ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ์์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ๋จํ ์ํ ๊ด๋ฆฌ๋ฅผ ํ์๋ก ํ๋ ์์ ํ๋ก์ ํธ์ ์ ํฉํฉ๋๋ค.
- ๋ช ํํ ๋ฐ์ดํฐ ํ๋ฆ: ์ ๊ณตํ๋ ๊ฐ์ ๋ช ํํ ์ ์ํ ์ ์์ด ์ํ์ ํ๋ฆ์ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค. ํ์ ๊ฐ์ ํ์ ์์๋ ์ปค๋ฎค๋์ผ์ด์ ์ด ์ฉ์ดํ์ต๋๋ค.
Context์ ๋จ์
- ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง: ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํด๋น ๊ฐ์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. ์ด๋ ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง ์ ์์ด, ํฐ ํ๋ก์ ํธ์์๋ ๋จ์ ์ผ๋ก ์์ฉํ ์ ์์ต๋๋ค.
- ๋ณต์กํ ๊ตฌ์กฐ: ์ฌ๋ฌ Context๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง๋ฉฐ, ํนํ ์ค์ฒฉ๋ Context๋ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋จ์ด๋จ๋ฆด ์ ์์ต๋๋ค.
๐ Zutand ์ฌ์ฉ ์์
import create from 'zustand';
import React from 'react';
// Zustand ์คํ ์ด ์์ฑ
const useStore = create((set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 })),
}));
function Counter() {
const { count, increment } = useStore();
return (
<div>
<p>์นด์ดํธ: {count}</p>
<button onClick={increment}>์ฆ๊ฐ</button>
</div>
);
}
export default function App() {
return (
<div>
<h1>Zustand ์นด์ดํฐ</h1>
<Counter />
</div>
);
}
Zustand์ ์ฅ์
- ์ฑ๋ฅ ์ต์ ํ: Zustand๋ ์ํ๋ฅผ ์ง์ ๊ด๋ฆฌํ๋ฉฐ, ์ ํ์ ๋ฆฌ๋ ๋๋ง์ ์ง์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ค์ด๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ๋ฏธ๋ค์จ์ด ์ง์: Zustand๋ ๋ฏธ๋ค์จ์ด๋ฅผ ํตํด ์ํ ๊ด๋ฆฌ ๋ก์ง์ ์ฝ๊ฒ ํ์ฅํ ์ ์์ด, ๋ณต์กํ ์๊ตฌ์ฌํญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ๋ฆฌํ์ต๋๋ค.
Zustand์ ๋จ์
- ํ์ต ๊ณก์ : Zustand์ API๋ Jotai๋ณด๋ค ๋ณต์กํ ์ ์์ด, ์ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฝ๊ฐ์ ํ์ต์ด ํ์ํ์ต๋๋ค.
- ์ํ ๊ด๋ฆฌ์ ๋น์กฐ์ง์ฑ: ์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค ๋ณด๋ ์ํ๋ฅผ ์ ๊ตฌ์กฐํํ์ง ์์ผ๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์๋ ์ํ์ด ์์์ต๋๋ค.
โ๏ธ ์์ฝ
- Jotai: ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด atom์ ์ฌ์ฉํ๋ฉฐ, ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Context: React์ Context API๋ฅผ ํ์ฉํด ์ํ๋ฅผ ์ปดํฌ๋ํธ ๊ฐ์ ๊ณต์ ํ๋ฉฐ, Provider๊ฐ ํ์ํฉ๋๋ค.
- Zustand: ์คํ ์ด ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ์ฌ ๊ฐ๋จํ ๋ฉ์๋๋ก ์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๐ค Jotai, Context, Zustand ๋น๊ตํ๋ฉด์ ๋๋ ์
Jotai, Context, Zustand๋ฅผ ๋น๊ตํ๋ฉฐ ๋๋ ์ ์ ๊ฐ ๋๊ตฌ๊ฐ ๊ฐ์ง ํน์ฑ๊ณผ "์ฅ๋จ์ ์ด ๋ช ํํ๊ฒ ๋ค๋ฅด๋ค."๋ ๊ฒ์ ๋๋ค.
1. ์ฌ์ฉ ์ฉ์ด์ฑ์ ์ฐจ์ด
Jotai๋ ๋งค์ฐ ์ง๊ด์ ์ด๊ณ ๊ฐ๋จํ API ๋๋ถ์ ์ฒ์ ์ฌ์ฉํ๋ ๋ฐ ๋ถ๋ด์ด ์ ์์ต๋๋ค. ์ํ๋ฅผ atom์ผ๋ก ์ฝ๊ฒ ์ ์ํ๊ณ ํ์ฉํ ์ ์์ด, ๋น ๋ฅด๊ฒ ์ตํ ์ ์์์ต๋๋ค. ๋ฐ๋ฉด, Context๋ React์ ๋ด์ฅ๋ ๊ธฐ๋ฅ์ด๋ผ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์ง๋ง, ์ฌ๋ฌ Context๋ฅผ ์ค์ฒฉํ๋ฉด ๋ณต์กํด์ง ์ ์๋ค๋ ์ ์์ ์ฌ์ฉ์ด ๋ถํธํ ์ ์์์ต๋๋ค. Zustand๋ ๊ฐ๋ ฅํ ์ฑ๋ฅ์ ์ ๊ณตํ์ง๋ง, ์ฒ์ ์ฌ์ฉํ๊ธฐ์๋ ์ฝ๊ฐ์ ํ์ต์ด ํ์ํ๋ค๋ ์ ์ด ์์ฌ์ ์ต๋๋ค.
2. ์ํ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ
๊ฐ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋๋ ๋ ๋ค๋ฅธ ์ ์ ํ๋ก์ ํธ ๊ท๋ชจ์ ๋ฐ๋ผ ์ํ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๋ค๋ ๊ฒ์ ๋๋ค. Jotai๋ atom์ ์๊ฐ ๋ง์์ง๋ฉด ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง ์ ์๊ณ , Context๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ๋ฌธ์ ๋ก ์ธํด ์ฑ๋ฅ์ ๋ถ๋ด์ ์ค ์ ์์์ต๋๋ค. Zustand๋ ์ฑ๋ฅ์ด ๋ฐ์ด๋์ง๋ง, ์ํ ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
3. ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ
์ฑ๋ฅ ์ธก๋ฉด์์ Jotai์ Zustand๋ ์ ๋ฆฌํ ์ ์ด ์์์ต๋๋ค. Jotai๋ ํ์ํ ๋ถ๋ถ๋ง ๋ฆฌ๋ ๋๋ง๋๋ ์ฅ์ ์ด ์์๊ณ , Zustand๋ ๋ฏธ๋ค์จ์ด ์ง์์ผ๋ก ๋ ๋ณต์กํ ์๊ตฌ์ฌํญ์ ์ฒ๋ฆฌํ ์ ์๋ ์ ์ฐํจ์ด ์์์ต๋๋ค. Context๋ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ ๋ฐ๋ฉด, ๊ฐ๋จํ ํ๋ก์ ํธ์์๋ ์ถฉ๋ถํ ํจ๊ณผ์ ์ผ ์ ์๋ค๋ ์ ์์ ์ฉ๋์ ๋ง๋ ์ ํ์ด ์ค์ํ๋ค๋ ๊ฒ์ ๋๊ผ์ต๋๋ค.
์ด๋ฐ ๋น๊ต ๊ณผ์ ์ ํตํด ๊ฐ ๋๊ตฌ๊ฐ ์ํฉ์ ๋ฐ๋ผ ์ด๋ค ๊ฐ์ ์ ๋ฐํํ๋์ง๋ฅผ ์๊ฒ ๋์๊ณ , ์์ผ๋ก์ ํ๋ก์ ํธ์์ ๋ณด๋ค ํจ๊ณผ์ ์ธ ์ํ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ์ ํํ ์ ์๋ ๊ธฐ์ค์ด ์๊ฒผ์ต๋๋ค. ๊ฐ ๋๊ตฌ์ ํน์ฑ์ ์ดํดํ๊ณ , ํ๋ก์ ํธ์ ํ์์ ๋ง๋ ์ ํ์ ํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง ๋ค์ ํ ๋ฒ ๋๊ผ์ต๋๋ค.
'๐ฉ๐ปโ๐ป ํ๋ก๊ทธ๋๋ฐ ์ธ์ด > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React ์๊ณ ๊ฐ ๊ฐ๋ ] - state์ props์ ์ฐจ์ด๋ฅผ ์์๋ณด์ (0) | 2025.01.09 |
---|---|
[React] - React์์ ์คํ์ผ๋ง์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ (0) | 2024.08.22 |
[React] - useEffect์ ํด๋ฆฐ์ ์ด๋ ? (0) | 2024.08.12 |
[React] - React 18์ ์๋ก์ด API ('createRoot') (0) | 2024.07.30 |