๐ฌ ๋ค์ด๊ฐ๋ฉฐ
์ด์ ์ ๊ฐ๋ ์ ์ ๋ฆฌํ๋ Redux, MVC๋ฑ์ ๊ธ์ ํ๋ฒ ๋ณด๊ณ ๊ฐ๋ฉด ์ข์ ๋ฏ ํ๋ค.
์ค๋ ๊ณต๋ถํ ๋ถ๋ถ์ recoil ์ด์ง๋ง ํ๋ฒ๋ ๊ฐ๋จํ๊ฒ Redux์ ๋ํด ์ด์ผ๊ธฐํด๋ณด๋ฉด, Redux๋ ์ ์ญ ์ํ๊ด๋ฆฌ๋ฅผ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ค๋๋ Recoil์ ๋นํด ์๋ฑํ ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ๋ค.
์ต๊ทผ Recoil๋ ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ๋ ์ถ์ธ์ด์ง๋ง ์์ง ๋น๊ต๊ฐ ์๋ ๋งํผ ์ ์ ์๋ฅผ ๋ณด์ด๊ณ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ต๊ทผ Recoil ์ด์ฉ์๊ฐ ๋ง์์ง๋ ์ด์ ๊ฐ ๋ญ๊น??
๊ทธ๊ฒ์ ๋ฐ๋ก Redux ์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๊ฐ ๊ต์ฅํ ๋ณต์กํ๊ธฐ ๋๋ฌธ์ด๋ค.
Redux์ ๋ณด์ผ๋ฌํ๋ ์ดํธ๋?
Redux ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๊ธฐ์ ๋ก์ง์ ์์ฑํด์ผํ๋ ์ด๊ธฐ ์ค์ , ๊ตฌ์กฐ, ํจํด ๋ฑ์ ์๋ฏธํ๋ค. ์ผ๋ฐ์ ์ผ๋ก Redux๋ฅผ ์ฌ์ฉํ๋ ๊ณผ์ ์์ ๋ฐ๋ณต์ ์ธ ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ๋ง์ด ๊ฐ๊ฒ๋๋ค.
Redux์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ ๊ณตํ์ฌ ๋ ์ฝ๊ฒ Redux๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค์ด ์ฃผ๋ Redux ํดํท ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ง๋ง ์ด๋ฒ ๊ธ์์๋ Recoil์ ๋ํด ์์๋ณธ๋ค.
Recoil
Facebook์์ ๊ฐ๋ฐํ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. React๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ค๋ฅธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊ณผ๋ ๋ฌ๋ฆฌ, Recoil์ React์ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๋ค.
Recoil์ ์ปดํฌ๋ํธ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ ์ญ ์ํ ๊ด๋ฆฌ ๋ฐฉ์์ ์ทจํ๊ณ ์๋ค.
๋ฐ๋ผ์, ์ปดํฌ๋ํธ ๊ฐ ๋ฐ์ดํฐ ์ ๋ฌ์ ๋ณด๋ค ์ฝ๊ณ ์ง๊ด์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค. ๋ํ Recoil์ ๋ค์ํ ์ํ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ์ํ ๊ด๋ฆฌ๋ฅผ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ค๋ค.
Recoil ์ฃผ์ ๊ธฐ๋ฅ
- Atom: ์ ์ญ ์ํ๋ฅผ ์ ์ํ๊ณ , ์ด๋ฅผ ์ฝ๊ณ ์ฐ๊ธฐ ์ํ ๋ฉ์๋๋ฅผ ์ ๊ณต
- Selector: ์ ์ญ ์ํ๋ฅผ ์กฐํฉํ์ฌ ํ์๋ ์ํ๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ์ฝ๊ธฐ ์ํ ๋ฉ์๋๋ฅผ ์ ๊ณต
- Asynchronous Effects: ๋น๋๊ธฐ ์์ ์ ์ํํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณต
- Persistence: ์ํ๋ฅผ ๋ก์ปฌ ์คํ ๋ฆฌ์ง ๋ฑ์ ์ ์ฅํ๊ณ , ์ด๋ฅผ ๋ค์ ๋ถ๋ฌ์ค๋ ๊ธฐ๋ฅ์ ์ ๊ณต
https://recoiljs.org/ko/docs/introduction/core-concepts/
Recoil ์ฌ์ฉ๋ฐฉ๋ฒ
import "./index.css";
import App from "./App";
import React from "react";
import ReactDOM from "react-dom/client";
import { RecoilRoot } from "recoil";
import { BrowserRouter } from "react-router-dom";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<>
<RecoilRoot>
<BrowserRouter>
<App />
</BrowserRouter>
</RecoilRoot>
</>
);
App์ RecoilRoot๋ก ๊ฐ์ธ Recoil์ App ์ ์ฒด์์ ์ ์ญ์ผ๋ก ์ํ๊ด๋ฆฌ ํ ์ ์๋๋ก ํด์ค๋ค.
Redux์์ <Providde>๋ฅผ ํตํด์ App์ store๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค. Recoil์ atom์ ์ค์ ํ๊ณ RecoilRoot์์์ ์์ ๋กญ๊ฒ ํต์ ํ ์ ์๋๋ก ์ค์ ํด์ฃผ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
Atoms
Atom ์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ RecoilRoot ๋ด๋ถ์์ ์์ ๋กญ๊ฒ ๋ถ๋ฌ๋ค๊ฐ ์ฌ์ฉํ ์ ์๋ ์ํ๋จ์ ์ด๋ค.
์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์์ ๋กญ๊ฒ ์ฌ์ฉ๊ฐ๋ฅ ํ๋ฉฐ ์๋ก์ด ๊ฐ์ ๋ฐ์ ๋๋๋งํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. ๊ทธ๋ ๊ฒ ๋๋ค๋ฉด ์ฐ๊ฒฐ๋์ด ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ์ ๊ฐ์ด ์๋กญ๊ฒ ๋ฐ์๋๋ค.
const fontSizeState = atom({
key: 'fontSizeState',
default: 14,
});
Atom์ ์์ ๊ฐ์ด ๊ณ ์ ํ ํค ๊ฐ, default ๊ฐ์ผ๋ก ์ ์ธํ์ฌ ์ฌ์ฉํ๋ค.
Atom์๋ ๊ณ ์ ํ ํค๊ฐ ํ์ํ๋ค. ๋๊ฐ ์ด์์ Atom์์ ๊ฐ์ ํค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ค๋ฅ์ด๊ธฐ ๋๋ฌธ์ ํค ๊ฐ์ ์ ์ญ์ ์ผ๋ก ๊ณ ์ ํ๋๋ก ํด์ผํ๋ค.
ํด๋น Atom์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด useRecoilState๋ผ๋ ํ ์ ์ด์ฉํด์ผ ํ๋ค. React์ useState์ ๋น์ทํ์ง๋ง ์ํ๊ฐ ์ปดํฌ๋ํธ๊ฐ์ ๊ณต์ ๋ ์ ์๋ค.
useRecoilState
import { userData } from "atom/atom";
import { useRecoilState } from "recoil";
const MyBoard = ({ setActive, userId }) => {
const [content, setContent] = useRecoilState(userData);
...
}
์ฌ์ฉํ๊ณ ์ ํ๋ ์ปดํฌ๋ํธ์์ ๋ค์๊ณผ๊ฐ์ด ์ ์ธ๋ atom์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ณ , useRecoilState๋ฅผ ์ด์ฉํ์ฌ ์ํ๋ ๊ฐ์ฒด์ ๋ด์ ์ค ์ ์๋ค.
์ด์ ๊ฐ์ฒด content์๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ atom์ ๋ด๊ฒจ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋๊ฒ์ด๋ค.
์ฌ๊ธฐ์ setContent์ ํด๋น๋์ด์๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด atom์ ์๋ , ๊ทธ๋ฆฌ๊ณ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ํจ๊ป ๋ณํํ๋ค.
Selectors
Atom๋ฐ Selector์์ ํ์๋ ๊ฐ์ ๊ณ์ฐํ๊ณ ๋ณํํ๋ ์์ ํจ์์ด๋ค.
Selector๋ ์ปดํฌ๋ํธ์ ๋ ๋๋ง๊ณผ๋ ๊ด๊ณ์์ด ํธ์ถ๋๊ณ , ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ํ๋ฅผ ์์ ํ์ง ์๊ณ ๋ณํํ๋ฉฐ ์ํํ๋ค.
Selector๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ญ ์ํ์ ๊ฐ์ ๊ณ์ฐํ๊ฑฐ๋ ๋ณํํ ์ ์๋ค. ์ํ๋ฅผ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ ๊ณ์ฐ๋ ๊ฐ์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ํ ์ ์๋ค.
ํจ์จ์ ์ธ ๋ ๋๋ง์ ์ํด ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ ๋๋ค.
import { selector } from 'recoil';
import { todoListState } from './atoms';
export const todoListFilterState = selector({
key: 'todoListFilterState',
get: ({ get }) => {
const todoList = get(todoListState);
const itemsLeft = todoList.filter((item) => !item.isComplete).length;
return { itemsLeft, todoList };
},
});
todoListFilterState์ Selector ํจ์๋ todoListState Atom ๊ฐ์ ์ธ์๋ก ๋ฐ์๋ค์ธ๋ค.
์ด Selector ํจ์๋ todoListState์ ๊ฐ์ ๋ถ์ํ๊ณ ํํฐ๋ง๋ ํ ์ผ ๋ชฉ๋ก๊ณผ ์๋ฃ๋์ง ์์ ํ ์ผ ํญ๋ชฉ ์๋ฅผ ๋ฐํํ๋ค.
์ด ๊ฐ์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ณ , todoListState๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๋ค์ ๊ณ์ฐ๋์ด ๋ ๋๋ง์ด ์งํ๋๋ ํ์์ด๋ค.
Recoil๊ณผ Redux ์ฅ๋จ์
์ธก๋ฉด | Recoil | Redux |
๊ฐ๋ | React ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ์ค์ ์ง์คํ๋ ์ํ ์ ์ฅ์ ๋ฐ ๋ถ๋ณ ์ํ ์ ๋ฐ์ดํธ |
ํต์ฌ ์์ด๋์ด | "Atoms"๋ผ ๋ถ๋ฆฌ๋ ์์์ ์ธ ์ํ ์กฐ๊ฐ๋ค์ ์กฐํฉ | ๋จ์ผ ์คํ ์ด์ ์ก์ ์ ํตํ ์ํ ๋ณํ ๊ด๋ฆฌ |
๋น๋๊ธฐ ์ฒ๋ฆฌ | ์ง์ ์ ์ผ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ์ง ์์ | ๋ฏธ๋ค์จ์ด(thunk, saga ๋ฑ)๋ฅผ ํตํ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ |
์ฑ๋ฅ ์ต์ ํ | "Selector"๋ฅผ ํตํด Memoization๊ณผ ์ง์ฐ ๋ก๋ฉ ์ง์ | Reselect๋ Memoization์ ํตํ ์ฑ๋ฅ ์ต์ ํ ๊ฐ๋ฅ |
์ํ ์ ๋ฐ์ดํธ | Immutableํ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฌ์ฉ | ๋ถ๋ณ์ฑ ์ ์ง๋ฅผ ์ํด ๋ถ๋ณ ์ ๋ฐ์ดํธ ํจํด ์ฌ์ฉ |
ํธ๋ฆฌ์ฑ ๋ฐ ๋ณต์ก์ฑ | ์ปดํฌ๋ํธ ๋ด์์ ๋น๊ต์ ์ง๊ด์ ์ธ ์ํ ๊ด๋ฆฌ | ์ด๊ธฐ ์ค์ ๋ฐ ๋ฏธ๋ค์จ์ด ์ค์ ์ผ๋ก ์ธํ ์ค์ ๋ณต์ก์ฑ |
์ปค๋ฎค๋ํฐ ๋ฐ ์ํ๊ณ | ์์ง ์๋์ ์ผ๋ก ์์ ์ปค๋ฎค๋ํฐ์ ์ํ๊ณ | ํฐ ์ปค๋ฎค๋ํฐ์ ๋ค์ํ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ฌ๊ทธ์ธ |
๊ณต์ ๋ฌธ์ ๋ฐ ์๋ฃ | ์๋์ ์ผ๋ก ํ์ ๋ ๋ฌธ์ ๋ฐ ์๋ฃ | ๋ค์ํ ์๋ฃ์ ์์ ๊ฐ ํ๋ถํ ๊ณต์ ๋ฌธ์ |
ํ๋ก์ ํธ ์ ํ ๋ฐ ๊ท๋ชจ | ์ค๊ฐ ํฌ๊ธฐ์ ํ๋ก์ ํธ๋ ์๋ก์ด ํ๋ก์ ํธ์ ์ ํฉ | ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ๋ณต์กํ ์ํ ๊ด๋ฆฌ์ ์ ํฉ |
(Recoil ) ์ง์ฐ๋ก๋ฉ ์ด๋?
์ง์ฐ๋ก๋ฉ (lazy loading)์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ํ ๋ฆฌ์์ค๋ฅผ ์ฒ์์ ๋ชจ๋ ๋ถ๋ฌ์ค์ง ์๊ณ , ํ์ํ ์์ ์ ํ์ํ ๋ฆฌ์์ค๋ง ๋ก๋ฉํ๋ ๊ธฐ๋ฒ์ ๋งํจ
- "Selectors" ๋ผ๊ณ ๋ถ๋ฆฌ๋ ํจ์๋ฅผ ํตํด ์ํ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์กฐ์ํ ์ ์๋๋ฐ, ์ด๋ฅผ ์ด์ฉํ์ฌ ์ง์ฐ๋ก๋ฉ์ ๊ตฌํํ ์ ์์
(Recoil) Immutable ์ด๋?
Immutable์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋ฏธํ๋ ๊ฐ๋ ์ด๋ค. ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํจ์ผ๋ก ์จ ์์ธก๊ฐ๋ฅํ์ฌ ์์์น ๋ชปํ ๋ถ์์ฉ์ ์ค์ผ ์ ์๋ค.
Recoil ๊ณผ Redux ์ฐจ์ด์ ์์ฝ
๋์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์ํ๊ด๋ฆฌ์ ์ ๊ทผ ๋ฐฉ์์ด๋ค.
Recoil์ React ์ปดํฌ๋ํธ ๋ด์์ ์ง์ ์ ์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ๊ณต์ ํ๋๋ฐ ์ด์ ์ ๋ ๋ฐ๋ฉด,
Redux๋ ์ค์์ง์คํ๋(Reducer) ์ํ ์ ์ฅ์์ ์ก์ ์ ํตํ ์ํ ๋ณํ ๊ด๋ฆฌ ์ค์ ์ ๋์๋ค.
Recoil์ ์ปดํฌ๋ํธ๊ฐ ์ํ๊ณต์ ๋ฅผ ๊ฐํธํ๊ฒ ๋ง๋ค๊ณ , Redux๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๊ด๋ฆฌ์ ๋ฏธ๋ค์จ์ด ๊ธฐ๋ฅ์ ๊ฐ์กฐํ๋ค.
๐ ์ฐธ๊ณ
https://tech.osci.kr/2022/06/16/recoil-state-management-of-react/
https://recoiljs.org/ko/docs/introduction/core-concepts/
'Front-End > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
useMemo์ useCallback, React.memo ์ ์ฐจ์ด์ (0) | 2023.05.05 |
---|---|
(pagination)React์์ ์ฌ์ฉํ ๊ฒ์๊ธ pagination (0) | 2023.03.30 |
[firebase] onSanpshot์ ์ด์ฉํ ์ค์๊ฐ ์ ๋ฐ์ดํธ (0) | 2023.03.21 |
textarea ์ค๋ฐ๊ฟ ํ์ํ๋ ๋ฐฉ๋ฒ (0) | 2023.03.20 |
sort๋ฅผ ์ด์ฉํ ๊ฒ์๊ธ ์ธ๊ธฐ์ ์ ๋ ฌ (๋ชฉ๋ก๊น์ง ์ ๋ ฌ๋๋ ์ค๋ฅ ์์ ) (0) | 2023.03.20 |