
์ต๊ทผ์ ๋ฉด์ ์ ๋ช ๊ตฐ๋ฐ ๋ดค๋๋ฐ, ์ง๋ฌธ์ ๋ฐ์์ง๋ง ์ ๋๋ก ๋ต๋ณํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๊ผญ ์ง๊ณ ๋์ด๊ฐ์ผ๊ฒ ๋ค๊ณ ์๊ฐํ ๊ฒ ์ค ํ๋๊ฐ "Redux์ Recoil์ ์ฐจ์ด"์ด๋ค. ์ค๋์ ์ด ๋ถ๋ถ์ ๋ํด ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค.
๋จผ์ Redux์ Recoil ๋ชจ๋ ๋ฆฌ์กํธ์์ ์ํ ๊ด๋ฆฌ ๋ฅผ ์ํด ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ๐ค ๊ทธ๋ผ ์ํ ๊ด๋ฆฌ๋ ์ ํ์ํ ๊ฒ์ผ๊น?
๋ฆฌ์กํธ๋ ๋จ๋ฐฉํฅ์ผ๋ก ๋ฐ์ธ๋ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ๋จ๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ด๋ผ ํจ์, ์ปดํฌ๋ํธ ์ฌ์ด์์ state๋ฅผ ์ ๋ฌํ ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ ๋ฐฉํฅ์ผ๋ก๋ง state๋ฅผ props๋ก ์ ๋ฌํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ด์ ๋ฐ๋๋ก ์์ ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ state๋ฅผ ๋ฐ๊พธ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
- ์์ ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก state๋ฅผ ์์ ํ ์ ์๋ ํธ๋ค๋ฌ ํจ์๋ฅผ props๋ก ๋๊ฒจ์ค๋ค.
- ๋ฆฌ์กํธ์์ ์ ๊ณตํ๊ณ ์๋ Context API๋ฅผ ์ฌ์ฉํ๋ค.
- Redux, Recoil๊ณผ ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
๊ฐ๋จํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ฉด 1๋ฒ ๋ฐฉ์์ ์ด์ฉํด์ ์ํ๋ ์ปดํฌ๋ํธ์์ state๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ก ๊ตฌํํ ์ ์๋ค. ํ์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ์กฐ๊ธ๋ง ๋ณต์กํด์ ธ๋(์ ํ๋ฆฌ์ผ์ด์ ๋ด depth๊ฐ ์ปค์ง์๋ก) 1๋ฒ ๋ฐฉ์์ ์ฌ์ฉํด ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋ฌด์ฒ ์ด๋ ค์์ง๋ค. ๋ฐ๋ผ์ 3๋ฒ๊ณผ ๊ฐ์ด ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ฃผ๋ฅผ ์ด๋ฃจ๊ฒ ๋์๋ค.

Redux๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋๋ ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ํ ์ปดํฌ๋ํธ์์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ๊ฐ๊ธฐ๊น์ง ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์ props๋ฅผ ์ ๋ฌํด์ผ ํ๋ค๋ ํน์ง์ด ์์ง๋ง, Redux๋ฅผ ์ฌ์ฉํ๋ฉด Store๋ผ๋ ์ค์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํด ์ํ๋ฅผ ์ฝ๊ฒ ์ ์ฅํ๊ณ ๊บผ๋ด์ฌ ์ ์๋ค.
์ด์ฒ๋ผ Redux๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ์ ์ฌ์ฉ๋๋ state๋ค์ ๋ถ๋ฆฌ, ํตํฉํด ๊ด๋ฆฌํ ์ ์๊ฒ ํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ฑ์ ๋์ผ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.

Redux๊ฐ ๋ฑ์ฅํ๊ธฐ ์ , ํ๋ก ํธ์๋ ํ๊ฒฝ์์ ๋ฐ์ดํฐ์ ํ๋ฆ์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ MVC ํจํด ์ด์๋ค.
- Model - ๋ฐ์ดํฐ์ ํ์์ด๋ ๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํ๋ค. ๋ชจ๋ธ์ ๋ง์ง ์๋ ๋ฐ์ดํฐ๋ ํ๋ฆ์ ์ ์ด ๋ฐ์ ์ ์๋ค.
- View - ์ฝ๋๊ฐ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ ๋ถ๋ถ์ ๋ด๋นํ๋ค. ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ ๋ชจ์ต๊ณผ ํํ๋ฅผ ๊ด๋ฆฌํ๋ค.
- Controller - ๋ณํํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ค. View์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ก ๋ณ๊ฒฝ๋๋ ๋ฐ์ดํฐ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ Model๊ณผ View์ ์ ๋ฐ์ดํธํ๋ค.
MVC ํจํด ์ ์๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ฐ์ง๊ณ ์๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋ธ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ทฐ๋ ๋ณ๊ฒฝ๋๊ณ , ์ฌ์ฉ์์ ์ํด ๋ทฐ์์ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ค๋ฉด ๋ชจ๋ธ ๋ํ ๋ณ๊ฒฝ๋๋ค. ์ด๋ฌํ ์๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ์ค๊ณํ๊ธฐ๋ ๊ฐ๋จํ๊ณ , ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ๋ ์ฝ๋ค๋ ์ฅ์ ์ด ์๋ค.
ํ์ง๋ง ์ ํ๋ฆฌ์ผ์ด์
์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ค๋ฉด, ํ ๊ฐ์ ๋ชจ๋ธ์ด ์ฌ๋ฌ ๊ฐ์ ๋ทฐ๋ฅผ ์กฐ์ํ๊ณ , ํ ๊ฐ์ ๋ทฐ๊ฐ ์ฌ๋ฌ ๊ฐ์ ๋ชจ๋ธ์ ์กฐ์ํ ์ ์๊ฒ ๋๋ฉด์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
2014๋
ํ์ด์ค๋ถ์์ MVC ํจํด์ ๋์์ผ๋ก Flux ๋ผ๋ ์๋ก์ด ์ํคํ
์ฒ ํจํด์ ๊ฐ๋ฐํ๋ค.

Flux ํจํด ์ MVC ํจํด์์ ๊ฒช์ ๋ณต์กํ ์ํฉ์ ๊ฐ์ ํ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ๊ฐ๋ฐ๋์๊ณ , ๊ทธ ๋ฐฉ๋ฒ์ผ๋ก "๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ"์ ์ ์ฉํ์๋ค.
- View์์ ์ด๋ฒคํธ ๋ฐ์ ์, ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ณ๊ฒฝ์ํค์ง ์๊ณ Action์ ๋๊ฒจ์ฃผ๊ณ
- Action์ ๋ฐ๋์ Dispatcher๋ฅผ ์ง๋๊ฒ ๋๋ฉฐ
- Dispatcher๋ฅผ ํตํด ์ง์ ์ ์ธ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋ Store์ ๋ณ๊ฒฝ์ฌํญ์ด ์ ์ฉ๋๋ฉด
- View๋ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ Store๋ฅผ ํตํด ์ ๋ฌ ๋ฐ๋๋ค.
์ด๋ฌํ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ธฐ์กด MVC ํจํด์ ์๋ '์ํ์ ์ ์ด' ํ์(๋ทฐ์ ๋ชจ๋ธ ์ฌ์ด์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์ฐ๊ฒฐ๋ ๋ชจ๋ ๊ณณ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ ํ์)์ ์์ ์ฃผ๊ณ , '์์ธก ๊ฐ๋ฅํ๋ค'๋ ํน์ง์ ๊ฐ์ง๋ค. ๋ํ state๊ฐ ํ์ํ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ ์ ์ฅ์์ธ Store๋ฅผ ๋ฐ๋ก ์ฐ๊ฒฐํด์ ๋ฐ์ดํฐ๊ฐ ๋จ๋ฐฉํฅ์ผ๋ก ํ๋ฅด๋ฏ๋ก ์ฑ๋ฅ์ด ํจ์จ์ ์ด๋ค.
๊ทธ๋ฆฌ๊ณ 2015๋
์ Dan Abramov์ ์ํด React + Flux ๊ตฌ์กฐ์ Reducer๋ฅผ ๊ฒฐํฉํ Redux๊ฐ ๋ฑ์ฅํ๋ค.
1๏ธโฃ ์ง์ค์ ํ๋์ ์์ค๋ก๋ถํฐ
์ ํ๋ฆฌ์ผ์ด์
์ ๋ชจ๋ ์ํ๋ ํ๋์ Store ์์ ํ๋์ ๊ฐ์ฒด ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ ์ฅ๋๋ค.
๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ Reducer๋ฅผ ํตํด ์ผ์ด๋๋ฉฐ, ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ Store์ ์ ์ฅ๋๋ค. ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ Store์ ๊ธฐ๋ก๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ํ๋ฆ์ ์์ฒ์ ํญ์ Store์ฌ์ผ ํ๋ค.
์ํฉ๊ณผ ํ์์ ๋ฐ๋ผ Store๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค ์ ์์ง๋ง, ๋๋ฌด ๋ง์ ๊ฒฝ์ฐ ๊ธฐ์กด MVC ํจํด์ ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ์๊ฐํด๋ณผ ํ์๊ฐ ์๋ค. Store๋ ๋ณดํต 1๊ฐ๋ฅผ ์ฌ์ฉํ๋ค.
2๏ธโฃ State๋ ์ฝ๊ธฐ ์ ์ฉ์ด๋ค
์ํ๋ฅผ ๋ณํ์ํค๋ ์ ์ผํ ๋ฐฉ๋ฒ์ Action ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ ๋ฟ์ด๋ค.
View์์ ์ผ์ด๋๋ ์ด๋ฒคํธ๋ ์ง์ ์ํ๋ฅผ ๋ณ๊ฒฝํด์๋ ์๋๋ฉฐ, ์ด๋ฒคํธ๋ ๋จ์ง Action ๊ฐ์ฒด๋ฅผ Reducer๋ก ์ ๋ฌํ๋ ์ญํ ๋ง ํ๋ค. ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ Reducer๋ง ํ ์ ์๋ค. Reducer ์ด์ธ์ ๊ณต๊ฐ์์ ์ํ๋ ์ฝ๊ธฐ ๋ชจ๋์ด๋ค.
3๏ธโฃ ๋ณํ๋ ์์ ํจ์๋ก ์์ฑ๋์ด์ผ ํ๋ค
Action ๊ฐ์ฒด์ ์ํด ์ํ ํธ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ๋ณํํ๋์ง๋ฅผ ์ง์ ํ๊ธฐ ์ํด ํ๋ก๊ทธ๋๋จธ๋ ์์ ๋ฆฌ๋์ ํจ์๋ฅผ ์์ฑํด์ผ ํ๋ค.
์์ Reducer ํจ์๋ ํจ์๊ฐ ์คํ๋๋ ๊ณณ์์ ์ธ๋ถ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ๋์ผํ ์ ๋ ฅ๊ฐ์๋ ๋์ผํ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํด์ผ ํ๋ค๋ ์์ ํจ์์ ๊ธฐ๋ณธ ํน์ง์ ๊ฐ์ง๊ณ ์์ผ๋ฉด์๋, ๋ค์ ๋ ๊ฐ์ง ํน์ง์ ์ถ๊ฐ๋ก ๊ฐ๋๋ค.
Action์ ๋ณดํต type๊ณผ payload ์์ฑ์ ๊ฐ์ง๋ฉฐ, '๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง'๋ฅผ ์ค๋ช ํ๋ ๊ฐ์ฒด์ด๋ค.
{
type: 'cart/addItem',
payload: { id: 1, name: 'T-Shirt' }
}
Redux Toolkit์์๋ createSlice ํจ์๊ฐ action creator๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ๊ธฐ ๋๋ฌธ์, ์ง์ Action ๊ฐ์ฒด๋ฅผ ์ ์ํ ํ์๊ฐ ์๋ค.
๋จผ์ Reducer๋ Store์ Action ๊ฐ์ฒด๋ฅผ ์ ๋ ฅ๋ฐ์ ์๋ก์ด ์ํ ๊ฐ์ ์ถ๋ ฅํ๋ ์์ ํจ์๋ค. Reducer๋ ๋ฐ๋์ ์์ ํจ์์ฌ์ผ ํ๋ฉฐ, ์ธ๋ถ ์ํ๋ฅผ ์ง์ ์์ ํ๋ฉด ์๋๋ค. Action ๊ฐ์ฒด๋ ๋ฐ๋์ type ์์ฑ ๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ค.
2025๋
๊ธฐ์ค Redux Toolkit์์๋ createSlice ๋ก Reducer๋ฅผ ์ ์ํ๋ค. Redux Toolkit์ ๋ด๋ถ์ ์ผ๋ก Immer๋ฅผ ์ฌ์ฉํด ๋ถ๋ณ์ฑ์ ์๋์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์, state.push() ์ฒ๋ผ ์ง์ state๋ฅผ ๋ณ๊ฒฝํ๋ ์ฝ๋๋ ์์ ํ๊ฒ ์๋ํ๋ค.
// stor/cartSlice.js
import { createSlice } from "@reduxjs/toolkit";
const cartSlice = createSlice(
name: 'cart',
initialState: [],
reducers: {
addItem: (state, action) => {
state.push(action.payload);
},
deleteItem: (state, action) => {
return state.filter(item => item.id !== action.payload.id);
},
},
);
export const { addItem, deleteItem } = cartSlice.actions;
export default cartSlice.reducer;
Store๋ ๋ชจ๋ state๋ค์ ๋ด๊ณ ์๋ ์ค์ ์ ์ฅ์์ด๋ค. ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์ ์ํ๋ฅผ ๊ณต๊ธํ๊ธฐ ์ํด Provider ๋ก ๊ฐ์ผ๋ค.
// store/index.js
import { configureStore } from '@reduxjs/toolkit';
import cartReducer from './cartSlice';
const store = configureStore({
reducer: {
cart: cartReducer,
},
});
export default store;
// index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import App from './App';
import store from './store';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<Provider store={store}>
<App />
</Provider>
);
useDispatch ํจ์๋ ์ปดํฌ๋ํธ์์ Store์ Action์ ์ ๋ฌํ๊ธฐ ์ํ ํ
์ด๋ค. Redux Store ์ ์ฒด ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ค.
import { useDispatch } from 'react-redux';
import { addItem } from '../store/cartSlice';
function Product({ product }) {
const dispatch = useDispatch();
const handleAdd = () => {
dispatch(addItem(product));
};
return <button onClick={handleAdd}>์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ</button>;
}
useSelector ๋ Store์ ์ํ ์ค ํ์ํ ๋ถ๋ถ๋ง ์ ํํด์ ๊ฐ์ ธ์ค๋ ํ
์ด๋ค.
import { useSelector } from 'react-redux';
function CartList() {
const items = useSelector((state) => state.cart);
return (
<ul>
{items.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
}
useSelector ๋ฅผ ์ฌ์ฉํ ์ปดํฌ๋ํธ๋ ๋ณ๊ฒฝ๋ ๊ฐ์ผ๋ก ์๋ ๋ฆฌ๋ ๋๋ง๋๋ค.์ฆ, ๋ฐ์ดํฐ์ ํ๋ฆ์ "๋จ๋ฐฉํฅ"์ด๋ฉฐ, ์์ธก ๊ฐ๋ฅํ๋ค.
Component->Action->Reducer->Store->Component

Recoil์ React์ context API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋ ํจ์ํ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ, ํ์ด์ค๋ถ์์ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๋ฆฌ์กํธ์ ํธํ์ฑ์ด๋ ๋จ์ํจ์ ์๊ฐํ๋ค๋ฉด ๋ฆฌ์กํธ์ ๋ด์ฅ๋ hooks๋ context API๋ฅผ ์ฌ์ฉํด ์ํ ๊ด๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ๋ฐ๋์งํ์ง๋ง, ์ด ๊ฒฝ์ฐ๋ ์ฌ๋ฌ ๊ฐ์ง ํ๊ณ๊ฐ ์กด์ฌํ๋ค.
๐ hooks๋ context API๋ฅผ ์ฌ์ฉํ์ ๋์ ๋ฌธ์ ์
- ์ปดํฌ๋ํธ ์ํ๋ฅผ ์์ ์ปดํฌ๋ํธ๊น์ง ๋์ด์ฌ๋ฆด ์ ์์ง๋ง, ์ด ๊ณผ์ ์์ ๊ฑฐ๋ํ ํธ๋ฆฌ์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ ์ ์๋ค.
- Context๋ ๋จ์ผ ๊ฐ๋ง ์ ์ฅ ๊ฐ๋ฅํ๊ณ , ์์ฒด Consumer๋ฅผ ๊ฐ์ง๋ ์ฌ๋ฌ ๊ฐ๋ค์ ์งํฉ์ ๋ด๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
Recoil์ ๋ด๋ถ์ ์ผ๋ก ๋ฐฉํฅ ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ, React ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ํจ๊ป ์๋ํ๋ค. ์ด ๊ทธ๋ํ์ ๋ฟ๋ฆฌ ์ญํ ์ ํ๋ ๊ฒ์ด atom, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์๋ ๊ฐ์ ๊ณ์ฐํ๋ ์์ ํจ์๊ฐ selector ์ด๋ค. ์ํ์ ํ๋ฆ์ atom -> selector -> component ์ ๊ฐ์ด ํ๋ฅธ๋ค.
atom ์ Recoil์์ ๊ด๋ฆฌํ๋ ์ต์ ๋จ์์ ์ํ๋ก, ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๋์์ ๊ตฌ๋
ํ๊ณ ์์ ํ ์ ์๋ค. atom ์ด ์
๋ฐ์ดํธ๋๋ฉด, ๊ฐ๊ฐ์ ๊ตฌ๋
๋ ์ปดํฌ๋ํธ๋ ์๋ก์ด ๊ฐ์ ๋ฐ์ํด ๋ฆฌ๋ ๋๋งํ๋ค. ์ด๋ฅผ ํตํด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
atom ์ atom() ํจ์๋ฅผ ์ฌ์ฉํด ์์ฑํ๋ค. atom ์ ํค ๊ฐ์ ์ ์ญ์ ์ผ๋ก ๊ณ ์ ํด์ผ ํ๋ค.
const fontSizeState = atom({
key: 'fontSizeState', // ๊ณ ์ ํ ํค ๊ฐ
default: 14,
});
๋์ผํ atom ์ด ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ปดํฌ๋ํธ๋ ์ํ๋ฅผ ๊ณต์ ํ๋ฉฐ, ์ปดํฌ๋ํธ์์ atom ์ ์ฝ๊ณ ์ธ ๋๋ useRecoilState(keyValue) ๋ผ๋ ํ
์ ์ฌ์ฉํด์ผ ํ๋ค.
selector ๋ ํ๋ ์ด์์ atom์ด๋ selector๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ ์๋ก์ด ๊ฐ์ ๊ณ์ฐํ๋ ์์ ํจ์์ด๋ค. ์ฝ๊ฒ ๋งํด, atom ์ ์ ์ฅ๋ ์๋ณธ ์ํ๋ก๋ถํฐ ํ์๋ ์ํ๋ฅผ ๋ง๋๋ ์ญํ ์ ํ๋ค. selector ๋ ์
๋ ฅ์ผ๋ก ๋ฐ์ atom์ด๋ selector๊ฐ ์
๋ฐ์ดํธ๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ์ฌ์คํ๋๋ค.
selector ๋ฅผ ์ ์ํ ๋ get ์์ฑ์ ๊ณ์ฐ ๋ก์ง์ ๋ด์ ํจ์์ด๋ค. ์ด ํจ์์ ์ธ์๋ก ์ ๋ฌ๋๋ get() ์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ atom์ด๋ selector์ ๊ฐ์ ์ฝ์ ์ ์๋ค. ์ด๋ ๊ฒ ์ ๊ทผํ๋ฉด ์๋์ผ๋ก ์์กด ๊ด๊ณ๊ฐ ๋ฑ๋ก๋ผ, ์ฐธ์กฐ ์ค์ธ ์ํ๊ฐ ๋ฐ๋ ๋๋ง๋ค selector ๊ฐ ์ฌ์คํ๋๋ค.
const userNameSelector = selector({
key: 'userNameSelector',
get: ({ get }) => {
const user = get(userState);
return `${user.firstName} ${user.lastName}`;
},
});
๊ธฐ๋ณธ์ ์ผ๋ก selector๋ ์ฝ๊ธฐ ์ ์ฉ์ด๋ฉฐ, useRecoilValue(selectorName) ํ
์ผ๋ก ๊ฐ์ ์กฐํํ ์ ์๋ค. ํ์ง๋ง set ์์ฑ์ ํจ๊ป ์ ์ํ๋ฉด ์ฐ๊ธฐ ๊ฐ๋ฅํ selector ๋ ๋ง๋ค ์ ์๋ค. useRecoilState(selectorName) ํ
์ผ๋ก get/set ๋ชจ๋ ๊ฐ๋ฅํด์ง๋ค.
boilerplate-free API ๋ฅผ ์ ๊ณตํ๋ค. // example
const [user, setUser] = useRecoilState(userState);
๋์์ฑ ๋ชจ๋(Concurrent Mode)
ํ๋ฆ์ด ์ฌ๋ฌ ๊ฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ด๋ฉฐ, ๋ฆฌ์กํธ์์ ๋ ๋๋ง์ ๋์ ์ฐ์ ์์๋ฅผ ์ ํด ์ ์ ํ ๋์ ๋ ๋๋งํด์ค๋ค.
atom, selector)๋ ํ์ํ ๋๋ง๋ค ์ ์ํ๊ณ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, ๊ฐ ๊ธฐ๋ฅ๋ณ๋ก ๋
๋ฆฝ์ ์ธ ์ํ ๋ชจ๋์ ๊ด๋ฆฌํ ์ ์์ด ์ ์ง๋ณด์์ ์ฉ์ดํ๋ค.atom ์ ๋ค๋ฅธ atom ์ผ๋ก ๊ต์ฒดํ๋๋ผ๋, ์ด๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ ๋์ผํ ์ธํฐํ์ด์ค๋ก ์ํ๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ์ ๋ก์ง์ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค.Recoil์ ๋น๋ ํ ES5 ๋ฌธ๋ฒ์ผ๋ก ๋ณํ๋์ง ์๊ธฐ ๋๋ฌธ์, Recoil์ ES5์ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒ์ ์ง์ํ์ง ์๋๋ค. ๋ฐ๋์ ES6์ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋ค.
Redux Essentials, Part 1: Redux Overview and Concepts
๋ฆฌ๋์ค(Redux)๋ ์ ์ฐ๋ ๊ฑด๋ฐโ
Recoil ๊ณต์ ๋ฌธ์ - ์๊ฐ - ๋๊ธฐ