ํ๋์ state๊ฐ ์ฌ๋ฌ ํ์ด์ง์์ ํ์ํ ๋, global state
์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ํ์ํ ๋๋ง๋ค ๊ฐ์ ธ์์ ์ฌ์ฉํ ์ ์๋ค.
์ฆ global state
๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋๋ state์ด๋ค. ๊ทธ๋ฆผ์์ ์ ์ ์๋ฏ์ด store์ name์ด๋ผ๋ state๋ฅผ ์ ์ฅํ๊ณ ํ์ํ ์ปดํฌ๋ํธ์์ importํด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฒ๊ฑฐ๋กญ๊ฒ props drilling์ ํ์ง ์์๋ ๋๋ค.
global state์ ํด๋ก๋ context-Api, Redux, Recoil ๋ฑ์ด ์๋ค.
global state tool: Redux -> MobX -> SWR -> (Rest api)react-query / (graphql api)apollo-client + Recoil
apollo-client๋ก global state๋ฅผ ๋ง๋ค๋ฉด Apollo-Cache
์ ์ ์ฅ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๊ฒฝ์ฐ, Apollo-Cache์ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธํ๊ณ ์์ผ๋ฉด ๋ฐฑ์๋์ ์์ฒญ์ ๋ณด๋ด๊ณ , ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๋ฐฑ์๋์ ์์ฒญํ์ง ์๊ณ Apollo-Cache์์ ์ปดํฌ๋ํธ๋ก ๋ฐ๋ก ๋ณด๋ด์ค๋ค.
์ด๊ฒ์ Apollo-client์ fetchPolicy
(fetch ์ ์ฑ
)์ด๋ผ๊ณ ํ๋ค.
fetch policy์๋ ์ฌ๋ฌ ๊ธฐ๋ฅ์ด ์์ผ๋ฉฐ, ์ํฉ์ ๋ง๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
cache-first(default): ์บ์์ ์๋์ง ๋จผ์ ํ์ธ
network-only: ์บ์์ ์๋์ง์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ๋ฐฑ์๋์ ์์ฒญ
์ต๊ทผ์ ๋์จ ํด์ ์๋ํ๊ฐ ๋ง์ด ๋์ด์๋ค! ์์ฆ์ ์๋ฒ๋ฐ์ดํฐ ์บ์ฑ์ผ๋ก๋ react-query์ apollo-client๋ฅผ ๋ง์ด ์ฌ์ฉํ๊ณ , ๋ก์ปฌ๋ฐ์ดํฐ ์บ์ฑ ์ฉ๋๋ก๋ Recoil
์ ์ฌ์ฉํ๋ ํธ์ด๋ค.
Recoil
์ ๋ฏธ๋ Redux๋ผ๊ณ ๋ณผ ์ ์๋ค.
Redux๋ ์ด์ ์ง์ธ๋ผ ์ต๊ทผ์๋ Redux-toolkit๊ณผ, Redux-ToolKit-Query(RTK Query)๋ฅผ ๋ด๋์ผ๋ฉด์ ์ฌ์ฉ์ ํธ๋ฆฌ์ฑ์ ๋์๋ค.
์๋ฌดํผ, ์ด๋ฒ ์๊ฐ์๋ Recoil
์ ์ฌ์ฉํ๋ค. ํ๋ก ํธ์์ ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ๋ผ๊ณ ํด๋ดค์ ๋ง์ ๋ถ๋ถ์ ์ฐจ์งํ์ง ์์ ํ
๋ฐ Redux๋ฅผ ์ฌ์ฉํ๊ธฐ์๋ ๋๋ฌด ํค๋นํ๊ธฐ ๋๋ฌธ์ด๋ค.
npm install recoil
yarn add recoil
//app.tsx ํ์ผ
import {
RecoilRoot,
atom,
selector,
useRecoilState,
useRecoilValue,
} from 'recoil';
function App() {
return (
<RecoilRoot>
//RecoilRoot๋ก ๋ชจ๋ ์ปดํฌ๋ํธ ๋ฌถ์ด์ฃผ๊ธฐ
<Component />
</RecoilRoot>
);
}
Recoil์์๋ Atom
์ผ๋ก state์ ์ผ๋ถ๋ฅผ ๋ณด์ฌ์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ปดํฌ๋ํธ๋ค์ ์์ ์ด ํ์ํ Atom์ ์ฐธ์กฐํ๋ค. ๊ทธ๋์ ์์ ์ด ์ฐธ์กฐํ๊ณ ์๋ Atom
์ ๋ณํ๊ฐ ์์ผ๋ฉด ํด๋น atom์ ์ฐธ์กฐํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ์์ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๋ค.
// Atom
const textState = atom({
key: 'textState', // state์ ์ด๋ฆ
default: '', //์ด๊ธฐ๊ฐ
});
Atom์ ์ค์ ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์ useRecoilState
๊ฐ ํ์ํ๋ค.
// TextInput ์ปดํฌ๋ํธ
function TextInput() {
const [text, setText] = useRecoilState(textState);
const onChange = (event) => {
setText(event.target.value);
};
return (
<div>
<input type="text" value={text} onChange={onChange} />
<br />
Echo: {text}
</div>
);
}
์์ ๊ฐ์ด ์ ์ด์ฃผ๋ฉด, textState
๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ์์ ๋ฆฌ๋ ๋๊ฐ ์ผ์ด๋๋ค.