[WIL] Redux (feat. tool-kit)
โ๏ธRedux ? ์ ์ฌ์ฉํ๋์ง ?
Redux๋? ์ ์ฐ๋์งโ
Redux๋ ์ํ ์ ๋ฐ์ดํธ์ ๊ด๋ จ๋ ๋ก์ง์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ์์ ๊ฐ์ ์ํ๋ฅผ ๊ณต์ ํ ๋๋ ์์ฝ๊ฒ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค. ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ์๋ก ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ์ค๊ฐ๋ฉฐ props์ state๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ณต์กํด์ง๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์ store๋ฅผ ๋๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
์ ์ญ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค Context API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ์ง๋ง, ๊ท๋ชจ๊ฐ ํฐ ๊ฒฝ์ฐ์ ๋ฆฌ๋์ค๋ก ํจ์จ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ ๋์ฌ์ฃผ๋ ๊ฒ์ด ์ข๋ค.
Redux์ 3๊ฐ์ง ์์น
- ๋จ์ผ์คํ ์ด
- ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์๋ ํ๋์ ์คํ ์ด๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํด์ผ ํ๋ค. ์ฌ๋ฌ ๊ฐ์ ์คํ ์ด๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง๋ง ์ํ ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง๊ธฐ ๋๋ฌธ์ ๊ถ์ฅ๋์ง ์๋๋ค.
- ์ฝ๊ธฐ ์ ์ฉ ์ํ
- ๋ฆฌ๋์ค๋ ์ฝ๊ธฐ ์ ์ฉ ์ํ์ด๋ค. ์ฝ๊ธฐ ์ ์ฉ ์ํ์ธ ๊ฒ์ ๋ถ๋ณ์ฑ์ ์ ์ง๋์ด์ผํ๊ธฐ ๋๋ฌธ์ธ๋ฐ ์ฑ๋ฅ ์ ์ง๋ฅผ ์ํด ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์์ ๋น๊ต๋ฅผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. *๋ถ๋ณ์ฑ : ๊ฐ์ด๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ์์ํ ํจ์ ๋ฆฌ๋์
- ๋ฆฌ๋์๋ ๋ณํ๋ฅผ ์ผ์ผ์ผ ์๋ก์ด ์ํ๋ฅผ ๋ฐํํ๋ค. state์ action๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ๊ณ ํ๋ผ๋ฏธํฐ ์ธ์ ๊ฐ์๋ ์์กดํ์ง ์๋๋ก ์กฐ๊ฑด์ ๋ง๋ ์์ํ ํจ์๋ก ์ฌ์ฉํด์ผํ๋ค.
Redux ๊ธฐ๋ณธ ์ฉ์ด
- Store
- ์คํ ์ด๋ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์ ์ฅ์ ํ๋์ ํ๋ก์ ํธ๋ ํ๋์ ์คํ ์ด๋ง ๊ฐ์ง ์ ์๋ค.
- Action
- ์คํ ์ด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด, ์ก์ ์ ์์ฑํด์ผํ๋ค. ์ก์ ์ ๊ฐ์ฒด์ด๋ฉฐ, type์ ๊ฐ์ ธ์ผ ํ๋ค. ์ก์ ๊ฐ์ฑ๋ ์ก์ ์์ฑํจ์์ ์ํด ๋ง๋ค์ด์ง๋ค.
- Reducer
- ๋ฆฌ๋์๋ ํ์ฌ ์ํ์ ์ก์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ ์๋ก์ด ์ํ๋ฅผ ๋ฆฌํดํ๋ ํจ์์ด๋ค.
- Dispatch
- ๋์คํจ์น๋ ์คํ ์ด์ ๋ด์ฅ ํจ์ ์ค ํ๋์ด๋ฉฐ, ์ก์ ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ค ์ํ๋ฅผ ์ ๋ฐ์ดํธ ์์ผ์ฃผ๋ ์ญํ ์ด๋ค.
- Subscribe
- ์คํ ์ด์ ๋ด์ฅ ํจ์ ์ค ํ๋๋ก, ๋ฆฌ๋ด์๊ฐ ํธ์ถ๋ ๋, Subscribe๋ ํจ์ ๋ฐ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๋ค.
- UI๊ฐ ์ฒ์ ๋ ๋๋ง๋ ๋, UI ์ปดํฌ๋ํธ๋ ๋ฆฌ๋์ค ์คํ ์ด์ ์ํ์ ์ ๊ทผํ์ฌ ํด๋น ์ํ๋ฅผ ๋ ๋๋งํ๋ค.
- ์ดํ UI์์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด, ์ฑ์ ๋์คํจ์น๋ฅผ ์คํํด ์ก์ ์ ์ผ์ผํจ๋ค.
- ์๋ก์ด ์ก์ ์ ๋ฐ์ ์คํ ์ด๋ ๋ฆฌ๋์๋ฅผ ์คํํ๊ณ ๋ฆฌ๋์๋ฅผ ํตํด ๋์จ ๊ฐ์ ์๋ก์ด ์ํ๋ก ์ ์ฅํ๋ค.
- ์๋ธ์คํฌ๋ผ์ด๋ธ๋ UI์ ์ํ ์ ๋ฐ์ดํธ๋ก ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์๋กญ๊ฒ ๋ ๋๋งํ๋ค.
Redux Toolkit?
๋ฆฌ๋์ค๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด ์ฌ์ฉ ์ 1๊ฐ์ ์ก์ ์ ์์ฑํด๋ ์ก์ ํ์ ์ ์ -> ์ก์ ํจ์ ์์ฑ -> ๋ฆฌ๋์ ์ ์ ์ ์์ ์ด ํ์ํ๋ค. ๋ง์์ง๋ ์ก์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํด redux-actions์, ๋ถ๋ณ์ฑ ๋ณด์กด์ ์ํ immer, store๊ฐ์ ํจ์จ์ ์ผ๋ก ํธ๋ค๋งํ์ฌ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ง๊ธฐ ์ํด reselect, ๋น๋๊ธฐ ์์ ์ ์ํ thunk ์ saga ๋ฑ ๋ฆฌ๋์ค์ ์ ํจํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด 4~5๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.ํ์ง๋ง Redux Toolkit์ ๋ด์ฅ๋ ๊ธฐ๋ฅ์ผ๋ก saga๋ฅผ ์ ์ธํ ์์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๊ทธ๋์ ! ๋ฐ๋ Redux Toolkit์์
- Simple: ์คํ ์ด ์ค์ , ๋ฆฌ๋์ ์์ฑ, ๋ถ๋ณ์ฑ ์ ๋ฐ์ดํธ ๋ก์ง ์ฌ์ฉ์ ํธ๋ฆฌํ๊ฒ ํ๋ ๊ธฐ๋ฅ ํฌํจ
- Opitionated: ์คํ ์ด ์ค์ ์ ๊ดํ ๊ธฐ๋ณธ ์ค์ ์ ๊ณต, ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ redux addon์ด ๋ด์ฅ
- Powerful : Immer์ ์๊ฐ์ ๋ฐ์ '๋ณ๊ฒฝ'๋ก์ง์ผ๋ก '๋ถ๋ณ์ฑ'๋ก์ง ์์ฑ ๊ฐ๋ฅ, state ์ ์ฒด๋ฅผ slice๋ก ์๋์ผ๋ก ๋ง๋ค ์ ์์
- Effective : ์ ์ ์ฝ๋์ ๋ง์ ์์ ์ ์ํ ๊ฐ๋ฅ
createSlice = action + reducer
createSlice๋ Ducks ํจํด์ ์ฌ์ฉํด action๊ณผ reducer๋ฅผ ์ ๋ถ ๊ฐ์ง ํจ์์ด๋ค.
import axios from 'axios';
import {createSlice, createAsyncThunk} from '@reduxjs/toolkit';
let initialState = {
poke:[],
list:[
{id:1, text:'์๋
ํ์ธ์'}
],
load:false
}
// thunk ์์ฑ
export const fetchPoke = createAsyncThunk(
'news/fetchPoke',
async () => {
const res = await axios.get('https://pokeapi.co/api/v2/pokemon/ditto');
const data = res.data.species;
return data;
}
)
const newsSlice = createSlice({
name:'news',
initialState,
reducers: {
add:(state, action)=> {
console.log(action.payload);
state.list = [...state.list, {id:action.payload.id, text:action.payload.text}]
},
load(state, action) {
state.load = !state.load
}
},
extraReducers: {
[fetchPoke.pending]:(state) => {
console.log(state.load);
state.load = !state.load;
},
[fetchPoke.fulfilled]:(state, action) => {
state.load = !state.load;
state.poke.push({name:action.payload.name, url:action.payload.url});
}
}
})
const newsActions = newsSlice.actions;
export {newsActions};
export default newsSlice.reducer;
createAsyncThunk
createAsyncThunk์์๋ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋๋ฐ ์ฒซ ๋ฒ์งธ๋ก ์ก์ ์ ํ์ , ๋ ๋ฒ์งธ๋ก ์ฝ๋ฐฑํจ์๋ฅผ ๋ฐ๋๋ค. ์ฝ๋ฐฑ ํจ์์์๋ axios๋ก APIํต์ ์ ํ๊ณ data๋ฅผ ๋ฐ์์ค๋ ๋ก์ง์ด๋ค. ๋ฐ์์จ data๋ฅผ return์ผ๋ก ๋ฐํํด์ค๋ค.
extraReducers
thunk๋ promise๋ฅผ ๋ฐํํ๋๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ์ promise์ ์ํ์๋ ๋ํ์ ์ผ๋ก๋ ์๋์ ๊ฐ์ด 3๊ฐ์ง๊ฐ ์๋ค.
pending
fulfilled
reject
unwrap ?
unwrap()์ thunk์์ ๋น๋๊ธฐ ํต์ ์ผ๋ก ์ป์ ๋ฐ์ดํฐ๋ฅผ ์ปดํฌ๋ํธ์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
const temp = async () => {
const result = await dispatch(fetchPoke()).unwrap();
console.log(result);
}
๐ฏ์ถ์ฒ
https://freestrokes.tistory.com/160
React Redux ์์๋ณด๊ธฐ
React Redux ์์๋ณด๊ธฐ React์์ ๋ง์ด ์ฌ์ฉํ๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Redux์ ๋ํด ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. 1. Redux Redux๋ ์ํ ์ ๋ฐ์ดํธ์ ๊ด๋ จ๋ ๋ก์ง์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ฌ๋ฌ
freestrokes.tistory.com
์ต๊ณ ๋ฆฌ๋์ค์ผ ๊ณ ๋ง๋ค! Redux & Redux Toolkit ์์๋ณด๊ธฐ
๋ฆฌ๋์ค๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๋ก, ํ์ฌ๊น์ง ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๊ณ ์๋ค. ์ํ ๊ด๋ฆฌ๋ UI์ UX์ ๋ง๊ฒ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ฑฐ๋, ์๋ฒ์ ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋งํ๋ค.๊ฐ๋จํ ํ๋ก์
velog.io
https://velog.io/@djaxornwkd12/Redux-Toolkit-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
Redux Toolkit ์์๋ณด๊ธฐ
์ค๋์ ๋ฆฌ๋์ค ํดํท์ ๋ํด ์์๋ณด์~! Redux Toolkit์ด๋ ์ฌ์ฉ์ด์ Redux Toolkit์ Redux๋ฅผ ๋ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด Redux์์ ๊ณต์ ์ ๊ณตํ๋ ๊ฐ๋ฐ๋๊ตฌ์ด๋ค. Redux Toolkit์ ์๋์ ๊ฐ์ Redux์ ๋ฌธ์ ์
velog.io