์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- CS
- ํ๋ก๊ทธ๋๋จธ์ค
- ํ๋ก์ธ์ค
- ๋ฉ๋ชจ๋ฆฌ
- IT๊ฐ๋ฐ์บ ํ
- ํด์
- typescript
- ๊ฐ๋ฐ์๋ถํธ์บ ํ
- ์ ๋ฐ๋ฏธ
- Algorithm
- ์๋ฐ์คํฌ๋ฆฝํธ
- ํ๋ก์ ํธ์บ ํ
- ์ธ์ฌ์ด๋์์
- javascript
- ip
- ๋ฆฌ์กํธ
- cs #๋คํธ์ํฌ
- html
- ๋คํธ์ํฌ
- ์ค๋ ๋
- ์ค๋์ดํผํฉํ ๋ฆฌ
- BFS
- react-query
- ์ ์ง์ฝํฌ๋น
- React.js
- #ํ๋ก์ ํธ์บ ํ #ํ๋ก์ ํธ์บ ํํ๊ธฐ #์ ๋ฐ๋ฏธ #์ค๋์ดํผํฉํ ๋ฆฌ #์ ์ง์ฝํฌ๋น #์ธ์ฌ์ด๋์์ #IT๊ฐ๋ฐ์บ ํ #๊ฐ๋ฐ์๋ถํธ์บ ํ #๋ฆฌ์กํธ #react #๋ถํธ์บ ํ #๋ฆฌ์กํธ์บ ํ
- App Runner
- react
- ์๊ณ ๋ฆฌ์ฆ
- ํ์ ์คํฌ๋ฆฝํธ
- Today
- Total
Bin's Blog
[์ ๋ฐ๋ฏธx์ค๋์ดํผํฉํ ๋ฆฌ] 10์ฃผ ์์ฑ ํ๋ก์ ํธ ์บ ํ 28์ผ์ฐจ - Redux ๋ณธ๋ฌธ
[์ ๋ฐ๋ฏธx์ค๋์ดํผํฉํ ๋ฆฌ] 10์ฃผ ์์ฑ ํ๋ก์ ํธ ์บ ํ 28์ผ์ฐจ - Redux
hotIce 2023. 7. 3. 22:52
๐ค Redux๋?
๐ Redux๋ ๋ฆฌ์กํธ ์ํ๊ณ์์ ๊ฐ์ฅ ์ฌ์ฉ๋ฅ ์ด ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ๋ฆฌ๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ๋ถ์ด ๋ง๋ค๊ฒ ๋ ์ปดํฌ๋ํธ๋ค์ ์ํ ๊ด๋ จ ๋ก์ง๋ค์ ๋ค๋ฅธ ํ์ผ๋ค๋ก ๋ถ๋ฆฌ์์ผ์ ๋์ฑ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ ์ํ ๊ด๋ฆฌ๋ฅผ ์์ฝ๊ฒ ํ ์ ์๋ค.
๐ Redux๋ useState์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ณํ๋ ๊ฐ๋ค์ ๊ด๋ฆฌํด์ฃผ๋ ๊ด๋ฆฌ ์์คํ ์ด๋ค. ๋ค๋ง ์ฐจ์ด๊ฐ ์๋ค๋ฉด Redux๋ ์ ์ญ์ผ๋ก ๋ฐ์ดํฐ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค.
๐ Props๋ฅผ ๊ฐ์ง๊ณ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํ์ง๋ง ๊ฐ๋จํ ์ํฉ์์๋ ์ ์๋ํ์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง๊ณ ์ปดํฌ๋ํธ์ ๊ณ์ธต์ด ๊น์ด์ง์๋ก ์ํ ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง ์ ์๋ค. ํนํ ์ฌ๋ฌ ์ปดํฌ๋ํธ๊ฐ ๋์ผํ ์ํ๋ฅผ ๊ณต์ ํ๊ฑฐ๋, ๋น๋๊ธฐ ์์ ์ผ๋ก ์ํ๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ๋์ฑ ๊ทธ๋ ๋ค.
๐ ๋ฆฌ๋์ค์ 3๊ฐ์ง ๊ท์น
1๏ธโฃ ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ํ๋์ ์คํ ์ด
2๏ธโฃ ์ํ๋ ์ฝ๊ธฐ์ ์ฉ(์๋ก์ด ์ํ๋ฅผ ์์ฑํ์ฌ ์ ๋ฐ์ดํธ๋ฅผ ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ํ๋ค. )
3๏ธโฃ ๋ณํ๋ฅผ ์ผ์ผํค๋ ํจ์, Reducer๋ ์์ํ ํจ์(์ด์ ์ํ ์ ๋ ๊ฑด๋ค์ง ์๊ณ , ๋ณํ๋ฅผ ์ผ์ผํจ ์๋ก์ด ์ํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ฐํ)
๐ ๋ฆฌ๋์ค์ ๊ธฐ๋ณธ ํ๋ฆ
1๏ธโฃ ํ๋์ ์ค์ ๋ฐ์ดํฐ store๋ฅผ ๊ฐ์ต๋๋ค. (๋ฐ์ดํฐ๋ state(์ํ)๋ฅผ ๋งํ๋ค.)
2๏ธโฃ ์ํ ๊ฐ์ ๋ณ๊ฒฝํด์ผํ ๋ ๋ฐ์ดํฐ๋ค์ state ๊ฐ์ ์์ ํด์ค reducer ํจ์๋ฅผ ๋ง๋ ๋ค.
3๏ธโฃ dispatch๋ฅผ ์ฌ์ฉํ์ฌ reducer์๊ฒ state ๊ฐ์ ์์ ํ๋ผ๊ณ action ๊ฐ๊ณผ ํจ๊ป ์์ฒญํ๋ค.
๐ ์์(์ซ์ ์ฆ๊ฐ, ๊ฐ์ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ)
1๏ธโฃ ์ค์ store ๊ธฐ๋ณธ ์ค์
import { configureStore } from "@reduxjs/toolkit"
import counterSlice from "./counterSlice"
import { logger } from "redux-logger";
// state slice๋ ์ด๋ฆ์ ๋ฐ๊ฟ๋ ๋๋ค.
const store = configureStore({
reducer: {
counter : counterSlice,
},
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(logger),
});
export default store;
๐ configureStore์ Redux ์คํ ์ด๋ฅผ ์ฝ๊ฒ ์ค์ ํ๊ณ ์์ฑํ๋ ๋๊ตฌ ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๊ด๋ฆฌ์ ์ง์คํ๋ฉด์ Redux๋ฅผ ๋ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
๐ ๋ฏธ๋ค์จ์ด๋ action์ด dispatch ๋์ด์ reducer์ ๋๋ฌํ๊ธฐ ์ ์ ์ค๊ฐ์ ์คํ๋๋ ํจ์๋ค์ ์งํฉ์ด๋ค. ์ก์ ์ ๊ฐ๋ก์ฑ์ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ฑฐ๋, ์ก์ ์ ์ทจ์ํ๊ฑฐ๋, ๋น๋๊ธฐ ์์ ์ ์ํํ๋ ๋ฑ์ ์ญํ ์ ํ ์ ์๋ค.
๐ ๊ธฐ์กด์ ๋ฏธ๋ค์จ์ด์ logger์ ์ก์ ๊ณผ ๊ทธ์ ๋ฐ๋ฅธ ์๋ก์ด ์ํ๋ฅผ ์ฝ์์ ๊ธฐ๋กํ๋ ์ญํ ์ ์ํํ๋ ๋ฏธ๋ค์จ์ด์ด๋ค.
2๏ธโฃ slice ์์ฑ
import { createSlice } from "@reduxjs/toolkit";
const initialState = {
value: 0
}
export const counterSlide = createSlice({
name : "conuter",
initialState,
reducers: {
addCounter : (state) => {
state.value += 1;
}
minusCounter : (state) => {
state.value -= 1;
}
}
});
export default counterSlice.reducer;
export const { addCounter, minusCounter} = counterSlice.actions
๐ createSlice์์ ์๋์ผ๋ก ์ก์ ์์ฑ์๋ฅผ ๋ง๋ค๊ณ reducer๋ฅผ ์กฐํฉํ๋ค.
๐ createSlice๋ฅผ ํตํด์ 3๊ฐ์ง์ ๊ท๊ฒฉ์ ๋ง๊ฒ ์์ฑํ๋ค. 1.์ด๋ฆ, 2.์ด๊ธฐ ์ํ, 3. reducers ์์ reducer ํจ์ ์ด๋ ๊ฒ 3๊ฐ์ง๋ก ๊ตฌ์ฑ๋๋ค.
๐ counterSlice.reducer์ ์ต์ข ์ ์ผ๋ก ์์ฑ๋ Reducer๋ฅผ ๊ฐ๋ฆฌํจ๋ค. slice reducer์ ์๋ฏธํ๋ค.
๐ ๊ทธ๋ฆฌ๊ณ createSlice ํจ์๋ ์ฐ๋ฆฌ๊ฐ ์์ฑํ reducer ํจ์์ ํด๋นํ๋ ์ก์ ์์ฑ์๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด ์ค๋ค. ์ก์ ์์ฑ์๋ค์ counterSlice.actions ๊ฐ์ฒด์ ์ ์ฅ๋์ด ์๋ค. ์ ๊ทธ๋ฌ๋ฉด ์๋์ฒ๋ผ ์ง์ ์์ฑํด์ผ ํ๋ค.
function addCounter() {
return {
type: 'counter/addCounter'
}
}
function minusCounter() {
return {
type: 'counter/minusCounter'
}
}
dispatch(addCounter());
dispatch(minusCounter());
3๏ธโฃ dispatch ์ฌ์ฉํ์ฌ state ๋ณ๊ฒฝ
import { useDispatch, useSelector } from "react-redux";
import { addCounter, minusCounter } from "../store/counterSlice"
const Counter = () => {
const count = useSelector((store) => store.counter.value)
const dispatch = useDispatch();
const addHandler = () => {
dispatch(addCounter())
};
const minusHandler = () => {
dispatch(minusCounter());
}
return (
<div>
<h1>counter</h1>
<p>count: {count}</p>
<div>
<button onClick={addHandler}>์ฆ๊ฐ</button>
<button onClick={minusHandler}>๊ฐ์</button>
</div>
</div>
)
}
๐ dispatch๋ฅผ ์ด์ฉํด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
๐ useSelector๋ฅผ ์ด์ฉํด์ ์ด๋ค ์ฌ๋ผ์ด์ค์ ์ํ๋ฅผ ์ด์ฉํ๊ณ ์ถ์์ง ์ ํด์ฃผ๋ฉด ๋๋ค.
๐ ์ฌ๊ธฐ ์ก์ ์์ฑ์์ ์ ๊น ์ง๊ณ ๋์ด๊ฐ๋ฉด dispatch ํจ์๋ ์ก์ ์ ๋ฐํํ๊ณ , reducer์์ ์ด ์ก์ ์ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ค.
๐ ์ก์ ์์ฑ์ ๊ธฐ๋ณธ ํํ
function addTodo(text) {
return {
type: 'ADD_TODO',
payload: text
};
}
๐ ์ด ์ก์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์คํ ์ด์ ๋ณด๋ด๋ ๋ฐ์ดํฐ ๋ฌถ์์ด๋ค. ๋ฐ๋์ type ํ๋๋ฅผ ๊ฐ์ง๊ณ ์๋๋ค. ๊ฐ์ฒด ํํ์ด๋ค.
4๏ธโฃ Redux ์คํ ์ด React ์ฑ์ ์ฐ๊ฒฐ
import { Provider } from "react-redux";
import Counter from "../src/components/Counter"
import store from "../src/store";
function App() {
return (
<Provider store={store}>
<div>
<Counter />
</div>
</Provider>
);
}
export default App;
๐ ํญ์ Provider๋ฅผ ํตํด ์คํ ์ด๋ฅผ ์ฐ๊ฒฐํ๊ณ ์ต์์ ์ปดํฌ๋ํธ ์์นํ๊ณ , store๋ผ๋ prop์ ํตํด Redux ์คํ ์ด๋ฅผ ๋ฐ๋๋ค.
๋ณธ ํ๊ธฐ๋ ์ ๋ฐ๋ฏธ-์ค๋์ดํผํฉํ ๋ฆฌ 10์ฃผ ์์ฑ ํ๋ก์ ํธ์บ ํ ํ์ต ์ผ์ง ํ๊ธฐ๋ก ์์ฑ ๋์์ต๋๋ค.