๋ฆฌ์กํธ๋ก ์น์ฌ์ดํธ๋ฅผ ๋ง๋ค๋ค ๋ณด๋ฉด, ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ผ๋ฆฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํด์ผ ํ ๋๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ์ด๋ฆ์ ํค๋์์๋ ๋ณด์ฌ์ฃผ๊ณ , ๋ง์ดํ์ด์ง์์๋ ์จ์ผ ํ ๊ฒฝ์ฐ์ด๋ค.
์ด๋ด ๋ ์ํ๊ด๋ฆฌ๋ผ๋ ๊ฒ ํ์ํ๋ค.
๊ทธ๋ฐ๋ฐโฆ
Redux๋ ๋๋ฌด ๋ณต์กํ๊ณ
Recoil์ ๋ญ๊ฐ ์ด๋ ต๊ณ
Context API๋ ์ํ๊ฐ ๋ง์์ง๋ฉด ๋ณต์กํด์ง๊ณ โฆ
๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ Jotai์ด๋ค!
Jotai๋ ์์(atom) ๋จ์๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๋ React ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ด๋ฆ ๋ป ๊ทธ๋๋ก, ์ํ๋ฅผ ๊ฐ์ฅ ์์ ์กฐ๊ฐ์ผ๋ก ๋๋ ์ ํ์ํ ๋๋ง ๊ฐ์ ธ๋ค ์ฐ๋ ๋ฐฉ์์ด๋ค.
npm install jotai
atom์ Jotai์์ ์ํ(state)๋ฅผ ์์ ์กฐ๊ฐ์ผ๋ก ๋๋๋, ์ด๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฅ ์์ ๋จ์์ด๋ค.
import { useAtom } from 'jotai';
function Counter() {
const [count, setCount] = useAtom(countAtom); // ์ฐ๊ฒฐ ์๋ฃ!
return (
<>
<h1>{count}</h1> {/* countAtom์์ ๊ฐ์ ธ์จ ๊ฐ */}
<button onClick={() => setCount(count + 1)}>+1</button> {/* countAtom์ ์์ */}
</>
);
}
import { useAtom } from 'jotai';
๐ Jotai์์ ์ํ๋ฅผ ์ฌ์ฉํ ๋ ๊ผญ ํ์ํ ์ฝ๋์ด๋ค.
๐ useAtom()์ useState()์ฒ๋ผ ์๋ํ์ง๋ง, ์ํ๋ฅผ atom๊ณผ ์ฐ๊ฒฐํด์ ์ฌ์ฉํ๋ค.
const [count, setCount] = useAtom(countAtom);
๐ countAtom์ ์๊น ๋ง๋ Jotai์ ์ํ ์กฐ๊ฐ(์: const countAtom = atom(0))์ด๋ค.
๐ useAtom(countAtom)์ ์ฌ์ฉํ๋ฉด:
count: ํ์ฌ ์ํ๊ฐ์ ์ฝ์ ์ ์๋ค. (์ด๊ธฐ๊ฐ์ 0)
setCount: ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ํจ์์ด๋ค.
const [count, setCount] = useState(0);
const [count, setCount] = useAtom(countAtom);
useState๋ ํด๋น ์ปดํฌ๋ํธ์์๋ง ์ฐ์ง๋ง,
useAtom์ ์ ์ญ์ฒ๋ผ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๊ณต์ ํ ์ ์๋ค.
ํ๋์ atom์ ๊ธฐ์ค์ผ๋ก ์๋ก์ด atom์ ๋ง๋ค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
๊ณ์ฐ๋ ๊ฐ์ด๋ ๊ฐ๊ณต๋ ๊ฐ์ ์ ์ฅํ ์ ์๋ค.
get()์ ํตํด ๋ค๋ฅธ atom์ ๊ฐ์ ๋ถ๋ฌ์จ๋ค.
const countAtom = atom(1); // ๊ธฐ๋ณธ ์ซ์ ์ํ
const doubleAtom = atom((get) => get(countAtom) * 2); //
๐ doubleAtom์ countAtom์ ๊ฐ์ ๊ฐ์ํ๋ค.
๐ ๋ง์ฝ countAtom์ด 3์ด ๋๋ฉด, doubleAtom์ ์๋์ผ๋ก 6์ด ๋๋ค.
๐ doubleAtom์ ์ฝ๊ธฐ ์ ์ฉ์ด๊ธฐ ๋๋ฌธ์, ์ํ๋ฅผ ์ง์ ์์ ํ ์๋ ์๋ค.
doubleAtom์ ์ฝ๊ธฐ ์ ์ฉ์ด์ง๋ง, ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ฅผ ๋ชจ๋ ์ง์ํ๊ณ ์ถ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
const countAtom = atom(0);
const countControlAtom = atom(
(get) => get(countAtom), // ์ฝ๊ธฐ
(get, set, newValue) => set(countAtom, newValue) // ์ฐ๊ธฐ
);
get: ํ์ฌ ์ํ๋ฅผ ์ฝ์ ๋ ์ฌ์ฉ
set: ๋ค๋ฅธ atom์ ๊ฐ์ ์์ ํ ๋ ์ฌ์ฉ -> ์ฐ๊ธฐ ์ ์ฉ ๊ตฌํ ๊ฐ๋ฅ!
newValue: ์ธ๋ถ์์ ์ด atom์ ์ ๋ฌํ ์ ๊ฐ
๐ ์ด๋ก์จ, atom ๊ฐ์ ์ธ๋ถ์์ ์ง์ ์์ ํ ์ ์๋ค.
atom(async () => {...}) ํํ๋ก ๋น๋๊ธฐ ์์
์ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ฑฐ๋, ์๋ฒ ์์ฒญ์ ๋ณด๋ผ ๋ ์ ์ฉํ๋ค. ์ฆ, useEffect ์์ด๋ ๋น๋๊ธฐ ์ํ๋ฅผ ์์ฃผ ๊ฐ๋จํ๊ฒ ๋ค๋ฃฐ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
const userAtom = atom(async () => {
const res = await fetch('https://jsonplaceholder.typicode.com/users/1');
return await res.json();
});
const [user] = useAtom(userAtom);
return <div>{user.name}</div>;
userAtom์ API ์๋ต์ ์๋์ผ๋ก ๋ฐ์์ค๊ธฐ ๋๋ฌธ์,
useAtom(userAtom)์ผ๋ก ํธ์ถ๋ง ํด๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ฌ ์ ์๋ค.
๋ก๋ฉ, ์๋ฌ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ถ์ผ๋ฉด Suspense๋ฅผ ์ฌ์ฉํ์ฌ, ํ์์ ๋ฐ๋ผ ๋ณ๋๋ก ๊ด๋ฆฌํ ์ ์๋ค.
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| ๋จ์ํ ๋ฌธ๋ฒ | useState์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ |
| ์ ์ญ ์ํ ๊ณต์ | ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ atom ๊ณต์ |
| ๊ณ์ฐ๋ ์ํ | ํ์ atom์ผ๋ก ๊ฐ ์๋ ๊ณ์ฐ |
| ๋น๋๊ธฐ ์์ ์ง์ | API ์์ฒญ๋ atom์ผ๋ก ์ฒ๋ฆฌ |
| ์ต์ ๋ ๋๋ง ๋จ์ | ํ์ํ ์ปดํฌ๋ํธ๋ง ๋ฆฌ๋ ๋๋ง๋จ |
โ๏ธ ๋ฐฐ์ด์
ํ๋ก์ ํธ ๋ฏธ์ ์ ํตํด Jotai๋ผ๋ ์๋ก์ด ์ํ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์ ํ๊ฒ ๋์๋ค. ์ฒ์์ "useState(useState๋ฅผ ๋ชจ๋ฅธ๋ค๋ฉด?: https://velog.io/@krsjkim/React-์ผํ์ -Hook-useState-useEffect-useNavigate ์ฐธ๊ณ ) ๋ ๋ญ๊ฐ ๋ค๋ฅด์ง?"๋ผ๋ ์๋ฌธ์ด ๋ค์์ง๋ง, ์ค์ ๋ก ์ฌ์ฉํด๋ณด๋ฉด์ Jotai์ ์ ์ญ ์ํ ๊ณต์ ์ ๊ฐํธํจ, ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ atom ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ ๋ถํ์ํ ๋ ๋๋ง์ ์ค์ฌ์ฃผ๋ ์ค๊ณ ๋ฐฉ์์ ๊ตฌํํ ์ ์๋ค๋ ์ ์ ๋ฐฐ์ ๊ณ , ์ด ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์ด ์ด๋ฒ ์ํด๋ฆฌ ๋ธ๋ก๊ทธ ์ฃผ์ ๋ก ์์ฑํด๋ณด์๋ค.
๐ฆ ์ํ๊ด๋ฆฌ ๋๊ตฌ๋ค ๊ฐ๋จ ๋น๊ต
Redux ๐ ํ์ฌ์ฉ, ๋ณต์กํจ
Recoil ๐ ์คํ์ , ์ด๋ ต์ง๋ง ์ ์ฐํจ
Zustand ๐ ํธํ์ง๋ง ๊ตฌ์กฐ ์ก๊ธฐ ํ์
Jotai ๐ ์ฌํํ๊ณ ๊ฐ๋ณ๋ค!
Jotai๋ฅผ ๊ณต๋ถํ๋ค ๋ณด๋ ์์ฐ์ค๋ฝ๊ฒ ๋ค๋ฅธ ์ํ๊ด๋ฆฌ ๋๊ตฌ๋ค๋ ๊ถ๊ธํด์ก๋ค. ์์ง์ ์์ ๊ท๋ชจ์ ํ๋ก์ ํธ๋ง ๊ฒฝํํ๋๋ผ Jotai๋ง ์ฌ์ฉํด๋ณด์์ง๋ง, ์์ผ๋ก Redux, Recoil, Zustand ๊ฐ์ ๋๊ตฌ๋ค๋ ์ง์ ์ฌ์ฉํด๋ณด๋ฉฐ ์ํฉ์ ๋ง๋ ์ํ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ์ ํํ ์ ์๋ ๊ฐ๋ฐ์๊ฐ ๋๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
jotai๋ ๊ฐ๊ฒฐํด์ ๋๋ฌด ํธํ ๊ฒ ๊ฐ์์. ๋ฌผ๋ก zustand๋ ์ข์ต๋๋ค!
๋์ ์ฒ ์ ๋ค ์ด ๋ด ......
์ด๋ฐ ๊ฒ๋ ์๊ตฐ์ ๊ฐ์ด ํ์ ํธ๋ ํ ๊ฒ ๋ง์๊น์? ์ด์ฐ๋๋ ์ข์ ๊ธ ๊ฐ์ฌํฉ๋๋ค .......
Jotai๋ผ๋๊ฑธ ์ฒ์ ์๊ฒ๋์ด์. useState๋ง ์ฌ์ฉํด ๋ดค๋๋ฐ ๋น์ทํ๋ฉด์๋ ๋ ๊ฐํธํ๊ตฐ์. ๋์ค์ ํ๋ฒ ์จ๋ด์ผ๊ฒ ์ด์
๋น์ทํ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ๋๋ฐ ์ด๋ฒ์๋ useState๋ง๊ณ jotai๋ฅผ ์ฌ์ฉํด๋ด๋ ์ข์ ๊ฒ ๊ฐ์์!
์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์์ ๊ฐ์ฅ ํธํ๊ฒ ์ด์ฉํ ์ ์๋๊ฒ jotai์ด๋ค ๋ณด๋ ๋จผ์ ๊ฐ์ ธ์ค๊ฒ ๋์์ด์ ๋ฌผ๋ก ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๋ ์ฅ๋จ์ ์ด ์๊ธดํ๊ฒ ์ง๋ง ์ง๊ธ์ ์ฐ์ '์ ์ญ ์ํ์ ๊ด๋ฆฌ๊ฐ ์ ํ์ํ์ง'์ ๋ํด์ ์ด์ ๋ง์ถฐ์ ์ดํด๋ฅผ ํ๊ณ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์จ๋ณด๋๊ฒ ์ข์๊ฑฐ ๊ฐ์์ฉ