๐ redux์ recoil์ ๋ํ ์ค๋ช
๊ณผ ๋น๊ต๋ฅผ ํ๊ธฐ ์ ์ ์ด๋ฌํ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฌ์ฉํ๋์ง์ ๋ํ ์ค๋ช
์ด ๋จผ์ ํ์ํ๋ค.
react๋ก ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ์ํ๊ฐ ์๋ก ๋ค๋ฅธ ๋ ์ปดํฌ๋ํธ์์ ํ์ํ ๋๊ฐ ์๋๋ฐ ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ์ ์ธํด๋๊ณ ํ์ํ ์ปดํฌ๋ํธ๋ง๋ค ์ ๋ฌ์ ํด์ค๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ๋๋ฉด ๋จ๊ณ๊ฐ ๊ฐ๋จํ ๊ฒฝ์ฐ์ ํ๋ฒ์ผ๋ก ์ ๋ฌ์ด ๋๋ ์ ์์ง๋ง ์ํ๋ฅผ ์ ๋ฌํ๊ธฐ ๊น์ง์ ์ปดํฌ๋ํธ๊ฐ ๊น๋ค๋ฉด ์ค๊ฐ์ ์ด ์ํ๋ฅผ ํ์๋ก ํ์ง ์๋ ์ปดํฌ๋ํธ๊น์ง ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ด๋ ๊ฒ ๋๋ฉด ์ฑ์ด ์ปค์ง์๋ก ์ํ ๊ด๋ฆฌ๊ฐ ์๋ง์ด ๋๊ณ ๋ณต์กํด์ง๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์ ๋ํ ํ๋ค์ด์ง๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ์ํ๊ด๋ฆฌ ํด์ด ํ์ํ ๊ฒ์ด๋ค.
๋ฆฌ๋์ค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ state๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์คํ์์ค JavaSctipt ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
sotre๋ผ๊ณ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ฉฐ, ํ ๋ฒ ์ค์ ์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์ํ๋ฅผ ํฌํจํ๊ณ , ํ์ํ ๋ ์ ๋ฐ์ดํธ ํด์ฃผ๋ ๋ฐฉ์์ด๋ค.
๋ฆฌ๋์ค๊ฐ ๋ฑ์ฅํ๊ธฐ ์ด์ ํ๋ก ํธ์๋์์ ๋ฐ์ดํฐ์ ํ๋ฆ์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ MVC ํจํด์ด์๋ค.
ํ๋์ ์ ํ๋ฆฌ์ผ์ด์
, ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ ๋ ๊ทธ ๊ตฌ์ฑ์์๋ฅผ ์ธ๊ฐ์ง์ ์ญํ ๋ก ๊ตฌ๋ถํ ํจํด์ด๋ค.
โ๏ธ ์์ ๊ทธ๋ฆผ์ฒ๋ผ ์ฌ์ฉ์๊ฐ controller๋ฅผ ์กฐ์ํ๋ฉด controller๋ model์ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๊ทธ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์๊ฐ์ ์ธ ํํ์ ๋ด๋นํ๋ view๋ฅผ ์ ์ดํด์ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ๊ฒ ๋๋ค.
โ๏ธ ๋ง์ฝ state๊ฐ ๋ณํํ๊ฒ ๋๋ฉด, view,model,controller์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ณ ๊ฐ์ด ๋ณํํ๋ ๋ฑ, ๋ณต์กํ๊ณ ๋ฐ์ดํฐ ํ๋ฆ์ ํ์ ํ๊ธฐ ํ๋ ๊ตฌ์กฐ๋ก ๋์ด ์๋ค. ์์ธ์ '์๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ'์ด๋ผ๋ ์ ์ด๋ค.
โ๏ธ ์ด๋ฌํ ์๋ฐฉํฅ ๋ฐ์ดํฐ๋ ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก ํ๋ฆ์ ์ ์ดํ๊ธฐ๊ฐ ํ๋ค๊ณ , ์์ฆ๊ฐ์ด ์ฌ์ฉ์์์ ์ํธ์์ฉ์ด ๋ง์์ง๊ณ ์๋ ์ํฉ์์ state ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง์ ๋ฐ๋ผ ์ค์๊ฐ์ผ๋ก ๊ตฌ๋๋์ด์ผ ํ๋ ๊ธฐ๋ฅ์ด ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์์, state ์ฐจ์ด๋ก ์ธํ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ ๋ฑ ๋ค์ํ ๋ฌธ์ ์ ์ด ๋ฐ์ํ๊ฒ ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ด๋ผ๋ ํน์ง์ ๊ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐํ๊ณ ์ ํ๊ณ 2014๋
ํ์ด์ค๋ถ์์ flux๋ฅผ ๊ฐ๋ฐํ๊ฒ ๋๋ค.
React + Flux์ ๊ตฌ์กฐ์ 'Reducer'๋ฅผ ๊ฒฐํฉํ ๊ฒ 'Redux'
React+Flux(Action,Dispatch,Store,View(Subscription))+reducer = redux
'Redux = (Red)ucer+Fl(ux)`
โ๏ธ MVC ํจํด๊ณผ๋ ๋ฌ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ณ๊ฒฝ์ํค์ง ์๊ณ Action๋ง์ ๋๊ฒจ์ค ํ, View์์ ์ด๋ค์ง Action์ ๋ฐ๋์ Dispatcher๋ฅผ ๊ฑฐ์ณ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์งํํ๋ค.
โ๏ธ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์ด๋ค์ง ํ, store์ ๊ฐ์ ์ ์ฅํ๋ ๊ณผ์ ์ ํตํด์ view๋ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ store๋ฅผ ํตํด์ ์ ๋ฌ๋ฐ๊ฒ ๋๋ค.
โ๏ธ ์ด๊ฐ์ ๊ณผ์ ์ ํตํด ์ด๋ค์ง ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ทฐ์ ๋ชจ๋ธ ์ฌ์ด์ state ์ ์ด๋ฅผ ๊ฐํธํํด์ฃผ๊ณ ๊ธฐ์กด์ ํ๋ฆ์ ํ์ ํ๊ธฐ ์ด๋ ค์ ๋ ๊ด๋ฆฌ์์ ์์ธก ๊ฐ๋ฅํ๊ฒ ํด์ฃผ์ด ๋์ฑ ํธ๋ฆฌํ state ๋ณ๊ฒฝ ๋ฐฉ๋ฒ์ ์ ์ํด์ค๋ค.
โ๏ธ ์์ ๊ฐ์ ๋ฐฉ์์ ์ฑํํ์ฌ 2015๋ ์ React+Flux ๊ตฌ์กฐ์ Reducer๋ฅผ ๊ฒฐํฉํ 'Redux'๊ฐ ๋ฑ์ฅํ๊ฒ ๋๋ค.
Recoil์ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค ์ค ๊ฐ์ฅ ์ต์ ์ ํด์ด๋ค.
Recoil์ ContextAPI ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋ ํจ์ํ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ํ์ด์ค๋ถ์์ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Redux์ ๋ง์ฐฌ๊ฐ์ง๋ก React์ ๊ณต์ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋๋ค. ํ์ง๋ง Recoil๋ React ์์ฝ ์์คํ ์ ๋ฐ์ ๊ฐ์น๊ฐ ์๋ค๊ณ ์ ์ฆ๋๋ฉด์ ๋ง์ react ์ฌ์ฉ ๊ฐ๋ฐ์๋ค๋ก๋ถํฐ ๋๊ท๋ชจ ์ฑํ์ ๋ฐ์ ์ ์์๋ค.
const exampleState = atom({
key: 'exampleState',
default: null,
})
function ExampleButton() {
const [exampleSize, setExampleSize] = useRecoilState(exampleState)
return (
<button
onClick={() => setExampleSize(size => size + 1)}
style={{ exampleSize }}
>
Click to Enlarge
</button>
)
}
function Text() {
const [exampleSize, setExampleSize] = useRecoilState(exampleState)
return <p style={{ exampleSize }}>This text will increase in size too.</p>
}
const fontSizeLabelState = selector({
key: 'fontSizeLabelState',
get: ({get}) => {
const fontSize = get(fontSizeState);
const unit = 'px';
return `${fontSize}${unit}`;
},
});
function FontButton() {
const [fontSize, setFontSize] = useRecoilState(fontSizeState);
const fontSizeLabel = useRecoilValue(fontSizeLabelState);
return (
<>
<div>Current font size: ${fontSizeLabel}</div>
<button onClick={setFontSize(fontSize + 1)} style={{fontSize}}>
Click to Enlarge
</button>
</>
);
}
โ๏ธ Recoil์ React์ useState์ ๊ธ๋ก๋ฒ ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ ๋๋์ ์ค๋ค. ๊ทธ๋์ React์ค๋ฌ์ด ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ณ ๋จ์ํ๋ค. ๋ํConcurrent(๋์์ฑ) ๋ชจ๋๋ฅผ ์ง์ํ๋ ํฐ ์ด์ ์ด ์๋ค.
โ๏ธ Redux์ฒ๋ผ ์๊ฒฉํ ๋ฌ๋ ์ปค๋ธ๋ฅผ ํ์๋ก ํ์ง ์๋๋ค. ์ดํดํ๊ธฐ ์ฌ์ด Atom๊ณผ Selector๋ผ๋ ๊ฐ๋ ์ด ์๊ณ ๋ฐฐ์ธ ๊ฒ์ด ๋ง์ง ์๋ค.
โ๏ธ BoilerPlate-free API ๋ฆฌ๋์ค๋ ์ํ๋ฅผ ๋ณํ์ํค๊ณ ์
๋ฐ์ดํธ ์ํค๋ ค๋ฉด ๊ทธ๋งํผ ์ฝ๋๊ฐ ๋์ด๋๋๋ฐ recoil์ ๊ทธ๋ ๊ฒ๊น์ง ๋ง์ ์ฝ๋๋ฅผ ์์ฑํ ํ์๊ฐ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ํ ์ ์๋ ์ฆ๋ถ ๋ฐ ๋ถ์ฐ๋์ด code splitting์ด ๊ฐ๋ฅํ๋ค.
โ๏ธ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์ด ๋์์ฑ ๋ชจ๋๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์, Redux์ ๊ฐ์ด ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ ํ์๊ฐ ์๋ค.
โ๏ธ store์ ๊ฐ์ ์ธ๋ถ ์์ธ์ด ์๋ React ๋ด๋ถ์ ์ํ๋ฅผ ํ์ฉํ๊ณ context API๋ฅผ ํตํด ๊ตฌํ๋์ด์๊ธฐ ๋๋ฌธ์ ๋ ๋ฆฌ์กํธ์ ๊ฐ๊น์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ํ ์ ์๋ค.
Recoil์ ์ฝ๊ฒ ๋ฐฐ์ฐ๊ณ ํ์ฉํ ์ ์๋ ์ฅ์ ์ด ์๊ณ ์ฝ๋๋ ๋ณต์กํ์ง ์์์ ์ ์ญ์ํ๊ด๋ฆฌ๊ฐ ๋ ์ฝ๊ณ ํธ๋ฆฌํ๊ฒ ์ด๋ฃจ์ด์ง ์ ์๋ค. ๋ recoil ์์ฒด์ ์ผ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก api๋ฅผ ํธ์ถํ ํ์๊ฐ ์์ด ์ฑ๋ฅ์ ์ผ๋ก๋ ์ ๋ฆฌํ๋ค. ํ์ง๋ง Redux์์๋ DevTool์ ์ ๊ณตํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํธ๋ฆฌํ๊ฒ state๋ฅผ ์๊ฐํํ์ฌ ๊ด๋ฆฌํ ์ ์๋๋ฐ์ ๋ฐํด Recoil์ Redux์ฒ๋ผ ๋ฐ๋ก ์์ ์ ์ธ Devtool์ด ์์ง ์๋ค.
์ฐธ์กฐ ๐