Recoil
์์ํ๋ฉฐ
๋ํ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ recoil์ด๋ผ๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅด ์ฒ์ ์ฌ์ฉํด๋ณด์๋ค. ๊ธฐ์กด์ ๊ตฌ์ฑ์ด ๋ค ์กํ์์ด์ ์๋ก์ด ์ํ ์ถ๊ฐ, ๊ธฐ์กด์ ์๋ ์ํ ์ฌ์ฉ ๋ฑ์ ๊ฒ๋ค๋ง ํด๋ณด์๋๋ฐ ํ๋ก์ ํธ์์ recoil์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ atom, selector์ ๋ํ ๊ฐ๋ ์ ์ธ ๋ถ๋ถ์ด ๋ถ์กฑํ๋ค๊ณ ์๊ฐํ์ฌ ๊ณต์๋ฌธ์ ๋ฅผ ์ฝ์ด๋ณด์๋ค.
Recoil
Recoil์ React๋ฅผ ์ํ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
- ์๊ณ React์ค๋ฌ์ด
Recoil์ React์ฒ๋ผ ์๋ํ๊ณ ์๊ฐํฉ๋๋ค. ์ฑ์ ์ถ๊ฐํ์ฌ ๋น ๋ฅด๊ณ ์ ์ฐํ ๊ณต์ ๋๋ ์ํ๋ฅผ ์ฌ์ฉํด๋ณด์ธ์.
- ๋ฐ์ดํฐ ํ๋ฆ ๊ทธ๋ํ
ํ์ ๋ฐ์ดํฐ์ ๋น๋๊ธฐ ์ฟผ๋ฆฌ๋ ์์ ํจ์์ ํจ์จ์ ์ธ ๊ตฌ๋ ์ผ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
- ๊ต์ฐจํ๋ ์ฑ ๊ด์ฐฐ
์ฝ๋ ๋ถํ ์ ์์์ํค์ง ์๊ณ ์ฑ ์ ์ฒด์ ๋ชจ๋ ์ํ ๋ณ๊ฒฝ์ ๊ด์ฐฐํ์ฌ ์ง์์ฑ, ๋ผ์ฐํ , ์๊ฐ ์ด๋ ๋๋ฒ๊น ๋๋ ์คํ ์ทจ์๋ฅผ ๊ตฌํํฉ๋๋ค.
์ฃผ์ ๊ฐ๋
๊ฐ์
Recoil์ ์ฌ์ฉํ๋ฉด atoms(๊ณต์ ์ํ)์์ selectors(์์ ํจ์)๋ฅผ ๊ฑฐ์ณ React ์ปดํฌ๋ํธ๋ก ๋ด๋ ค๊ฐ๋ data-flow graph๋ฅผ ๋ง๋ค ์ ์๋ค. Atoms๋ ์ปดํฌ๋ํธ๊ฐ ๊ตฌ๋ ํ ์ ์๋ ์ํ์ ๋จ์๋ค. Selectors๋ atoms ์ํ๊ฐ์ ๋๊ธฐ ๋๋ ๋น๋๊ธฐ ๋ฐฉ์์ ํตํด ๋ณํํ๋ค.
Atoms
Atoms๋ ์ํ์ ๋จ์์ด๋ฉฐ, ์ ๋ฐ์ดํธ์ ๊ตฌ๋ ์ด ๊ฐ๋ฅํ๋ค. atom์ด ์ ๋ฐ์ดํธ๋๋ฉด ๊ฐ๊ฐ์ ๊ตฌ๋ ๋ ์ปดํฌ๋ํธ๋ ์๋ก์ด ๊ฐ์ ๋ฐ์ํ์ฌ ๋ค์ ๋ ๋๋ง ๋๋ค.
const fontSizeState = atom({
key: 'fontSizeState',
default: 14
});Atom๋ ๋๋ฒ๊น
, ์ง์์ฑ ๋ฐ ๋ชจ๋ atoms์ map์ ๋ณผ ์ ์๋ ํน์ ๊ณ ๊ธ API์ ์ฌ์ฉ๋๋ ๊ณ ์ ํ ํค๊ฐ ํ์ํ๋ค. ํค ๊ฐ์ ์ ์ญ์ ์ผ๋ก ๊ณ ์ ํ๋๋ก ํด์ผํ๋ค. React ์ปดํฌ๋ํธ์ ์ํ์ฒ๋ผ ๊ธฐ๋ณธ๊ฐ๋ ๊ฐ์ง๋ค.
์ปดํฌ๋ํธ์์ atom์ ์ฝ๊ณ ์ฐ๋ ค๋ฉด useRecoilState๋ผ๋ ํ
์ ์ฌ์ฉํ๋ค. useState์ ๋น์ทํ์ง๋ง ์ปดํฌ๋ํธ ๊ฐ์ ๊ณต์ ๋ ์ ์๋ค๋ ์ฐจ์ด๊ฐ ์๋ค.
const [fontSize, setFontSize] = useRecoilState(fontSizeState);์ถ๊ฐ์ค๋ช
atom()ํจ์๋ ์ฐ๊ธฐ ๊ฐ๋ฅํ RecoilState ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ์์ธํ ์ค๋ช
atom๊ณผ ์ํธ์์ฉํ๊ธฐ ์ํด ์์ฃผ ์ฌ์ฉ๋๋ Hooks
useRecoilState(): atom์ ์ฝ๊ณ ์ฐ๋ ค๊ณ ํ ๋ ์ฌ์ฉํ๋ HookuseRecoilValue(): atom์ ์ฝ๊ธฐ๋ง ํ ๋ ์ฌ์ฉํ๋ HookuseSetRecoilState(): atom์ ์ฐ๋ ค๊ณ ๋ง ํ ๋ ์ฌ์ฉํ๋ HookuseResetRecoilState(): atom์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ด๊ธฐํํ ๋ ์ฌ์ฉํ๋ Hook
Selectors
Selector๋ atoms๋ ๋ค๋ฅธ selectors๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์๋ค์ด๋ ์์ ํจ์(pure function)๋ค. ์์์ atoms, selectors๊ฐ ์
๋ฐ์ดํธ๋๋ฉด ํ์์ selector ํจ์๋ ๋ค์ ์คํ๋๋ค. ์ปดํฌ๋ํธ๋ค์ selectors๋ฅผ atoms์ฒ๋ผ ๊ตฌ๋
ํ ์ ์์ผ๋ฉฐ selectors๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ปดํฌ๋ํธ๋ค๋ ๋ค์ ๋ ๋๋ง ๋๋ค.
Selectors๋ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ฐํ๋๋ฐ์ ์ฌ์ฉ๋๋ค. ์ต์ํ์ ์ํ ์งํฉ๋ง atoms์ ์ ์ฅํ๊ณ ๋ค๋ฅธ ํ์ ๋ฐ์ดํฐ๋ selectors์ ๋ช
์๋ ํจ์๋ฅผ ํตํด ๊ณ์ฐํจ์ผ๋ก์จ ์ธ๋ชจ์๋ ์ํ์ ๋ณด์กด์ ๋ฐฉ์งํ๋ค.
const fontSizeLabelState = selector({
key: 'fontSizeLabelState',
get: ({ get }) => {
const fontSize = get(fontSizeState);
const unit = 'px';
return `${fontSize}${unit}`;
}
})get์์ฑ์ ๊ณ์ฐ๋ ํจ์๋ค. ์ ๋ฌ๋๋ get ์ธ์๋ฅผ ํตํด atoms์ ๋ค๋ฅธ selectors์ ์ ๊ทผํ ์ ์๋ค. ๋ค๋ฅธ ๊ฒ๋ค์ ์ ๊ทผํ๋ฉด ์ข
์ ๊ด๊ณ๊ฐ ์์ฑ๋๋ฏ๋ก, ๋ค๋ฅธ ๊ฒ๋ค์ด ์
๋ฐ์ดํธ๋๋ฉด ์ด ํจ์๋ ๋ค์ ์คํ๋๋ค.
Selectors๋ useRecoilValue()๋ฅผ ์ฌ์ฉํด ์ฝ์ ์ ์๋ค. useRecoilValue()๋ ํ๋์ atom์ด๋ selector๋ฅผ ์ธ์๋ก ๋ฐ์ ๋์ํ๋ ๊ฐ์ ๋ฐํํ๋ค.
Recoil ์์ํ๊ธฐ
RecoilRoot
recoil ์ํ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ ๋ถ๋ชจ ํธ๋ฆฌ ์ด๋๊ฐ์ ๋ํ๋๋ RecoilRoot๊ฐ ํ์ํ๋ค. ๋ฃจํธ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ฅ ์ข์ ์ฅ์๋ค.
๋ง์น๋ฉฐ
๊ณต์๋ฌธ์์์ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฟผ๋ฆฌ ๋ ํ ์คํ ๋ฐฉ๋ฒ์ ๋ํด์๋ ๊ฐ์ด๋ํด์ฃผ๊ณ ์๋ค. ์ค์ ํ๋ก์ ํธ์์ ์ฌ์ฉ ์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.