2022.07.07(Thurs)
[TIL] Day52
[SEB FE] Day51
โ๏ธย Redux ์ข ํฉํด์ฆ๋ฅผ ํ๊ณ ๊ธฐ์ตํด์ผ ํ ๊ฐ๋ ์ ์ ๋ฆฌํฉ๋๋ค.
โ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข
๋ฅ: React Context
, Redux
, MobX
, recoil
, zustand
โฆ
โ Reducer
๋ ์ด์ ์ํ์ ๋์์ ๋ฐ์ ์ ์ํ๋ฅผ ๋ฆฌํดํ๋ ์์ ํจ์
โ Action
๊ฐ์ฒด์ ๊ฐ์ ํ์ธํ ํ, ํด๋น๋๋ ๊ฒฝ์ฐ๊ฐ ์์ ๋ ๊ธฐ์กด ์ํ๋ฅผ ๊ทธ๋๋ก ๋ฆฌํดํ๋ ๊ฒ์ด Good ๐โโ๏ธ
โ Redux
์ Store
์ค์ ๋ฐฉ๋ฒ
//index.js
import { createStore } from 'redux';
import { Provider } from 'react-redux';
import { reducer } from './reducer.js';
const store = createStore(reducer);
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
โ ๋ง์ฝ ์ฌ๋ฌ ๊ฐ์ Reducer
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, Redux
์ combineReducers
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ํ๋์ Reducer
๋ก ํฉ์ฒด ๊ฐ๋ฅ
// Case: App.js์์ reduce1์์ ์์ฑ๋ ๋ฐ์ดํฐ ์ฌ์ฉ
//reducer.js
import { combineReducers } from 'redux';
const reducer1 = (initialState = [1, 2, 3], action) => {
...
};
const reducer2 = (initialState = {}, action) => {
...
};
// combineReducers()๋ก reducer1, reducer2๋ฅผ ํ๋์ reducer๋ก ํฉ์ฒด
export const rootReducer = combineReducers({ reducer1, reducer2 });
// -------------------------------------------------------------
//index.js
import { createStore } from 'redux';
import { Provider } from 'react-redux';
import { rootReducer } from './reducer.js';
const store = createStore(rootReducer);
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
// -------------------------------------------------------------
//App.js
import React from 'react';
import styled from 'styled-components';
import { useSelector } from 'react-redux';
...
export default function App() {
// reducer2 ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ถ๋ค๋ฉด reducer1 -> reducer2๋ก ๋ณ๊ฒฝํ๋ฉด ๋จ!
const data = useSelector((state) => state.reducer1);
console.log(data); // [1, 2, 3]
return (
...
);
}
โ Reducer
๊ฐ ์ฒ์ ํธ์ถ๋ ๋, state
๊ฐ์ undefined
๐ย ๋ฐ๋ผ์ state
์ ์ด๊น๊ฐ์ ์ง์ ํด์ Action
๋ฐ์ ์ ์ ์ฒ๋ฆฌํด์ค์ผ ํจ
If not ์ด๊ธฐ๊ฐ ์ค์ โ ์ค๋ฅ ๋ฐ์
//reducer.js
// 1)
export const reducer = (initialState, action) => {
if (typeof initialState === undefined) {
initialState = 1;
}
...
};
// 2)
export const reducer = (initialState = 1, action) => {
...
};
์ ์ ๊ตฌํํ CRUD-diary-toy_project๋ฅผ ๊ณ์ refactoringํ๋ฉด์ ๊ณ์ update ํด๋๊ฐ๊ณ ์ถ์ด์ ๊ฐ๊ฐ์ client, server repository๋ฅผ ํ๋์ repository๋ก ํฉ์น๊ณ ์ถ์ด์ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด๊ณ ์ ์ฉํด๋ดค๋ค!
1. ํฉ์ณ์ ์๋กญ๊ฒ ๊ด๋ฆฌํ repository๋ฅผ ์๋ก ์์ฑํ ํ, Local์์ clone ๋ฐ๊ธฐ
git clone https://github.com/Beanxx/React-Express-CRUD-Project.git
2. ์๋ก ์์ฑํ ํด๋์์ subtree๋ฅผ ์ด์ฉํด ์๋ก์ด repository์ ์ถ๊ฐํ ๊ธฐ์กด repository๋ฅผ ๋ํด์ค
git subtree add --prefix=[์ repositry์ ์ถ๊ฐํ ํด๋๋ช
] [์ถ๊ฐํ ๊ธฐ์กด git repository ์ฃผ์] [๊ธฐ์กด repository branch name]
3. ์๋ก์ด repository์ push
git push
์ค๋์ ์ด์ Redux ๊ณผ์ ๊ฐ ์๊ฐ๋ณด๋ค ์ผ์ฐ ๋๋ ๋์ ์ฌ์ ๋กญ๊ฒ ๊ณต๋ถํ ์ ์๋ ๋ ูฉ( แ )ู
์ด์ ๋๋ฌด ํผ๊ณคํด์ ์๋ ์๋ ์๊ฐ๋ณด๋ค ์ผ์ฐ ์ค๋๋ฐ๋ ์ค์ ์ ๋ ํผ๊ณคํ๋ค..
์ค๋์ ์ ๋ ์ฝ์๋ ์์ผ๋๊น ์ง์ง์ง์ง ๊ณ์ ๋ฏธ๋ฃจ์ง ๋ง๊ณ ๊ณํํ๋ ๊ฐ์๋ ๋ค ๋ฃ์ ์ ญ์ ๐
โ๏ธ Todo List
โ๏ธย TIL ์์ฑ
โ๏ธย ํ๋ก๊ทธ๋๋จธ์ค Lv.1_์ ์ ์ ๊ณฑ๊ทผ ํ๋ณ ๋ฌธ์ ํ๊ธฐ
โ๏ธย ์ธํ๋ฐ ๋ฆฌ์กํธ ๊ฐ์(Node.js, React.js ๊ธฐ์ด ํํธ)๋ฃ๊ธฐ
โ๏ธย Udemy React Section3 ๊ฐ์ ๋ฃ๊ธฐ
โ๏ธย Udemy ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ ๋ฃ๊ธฐ
โ๏ธย DeepDive ์ฑ 1~3์ฅ ์ฝ๊ธฐ(~p.33)