REACT

[Redux] Redux-toolkit์œผ๋กœ ์ƒํƒœ๊ด€๋ฆฌ ํ•˜๊ธฐ

์˜ˆ๊ธ€ 2024. 3. 6. 15:39

๐Ÿš€ Redux-toolkit

  • ๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ๋ผ๋Š” ๊ฒƒ์„ ํ•ด์•ผํ•œ๋‹ค. ํ•œ๋‘ ๋ฒˆ๋งŒ props๋กœ ๋„˜๊ธฐ๋ฉด ๊ดœ์ฐฎ์ง€๋งŒ ์•ˆ ๊ทธ๋Ÿด ๋•Œ๋„ ๋งŽ์œผ๋‹ˆ,,
  • ๋ณดํ†ต ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ Redux, MobX, ContextAPI, recoil, zustand์ธ๋ฐ ๋‚˜๋Š” Redux๋กœ ํ•ด๋ณด๊ธฐ๋กœ ๊ฒฐ์ •!
  • ๊ฐ€์žฅ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ๊ธฐ๋„ ํ•˜๊ณ  ๊ทธ๋Ÿผ ์ •๋ณด๋„ ๋” ๋งŽ์„๊ฑฐ๋‹ˆ๊นŒ ใ…Žใ…Ž

๐Ÿ“š Redux์™€ Redux-toolkit์˜ ์ฐจ์ด

  • Redux๋ฅผ ๋งŒ๋“  ๊ณณ์—์„œ ๊ณต์‹์ ์œผ๋กœ ํšจ์œจ์ ์ธ Redux ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํˆดํ‚ท
  • Redux-Toolkit์„ ์‚ฌ์šฉํ•˜๋ฉด Redux์˜ ๋ฌธ์ œ์  ํ•ด๊ฒฐ
    •  Redux ์Šคํ† ์–ด ๊ตฌ์„ฑ์ด ๋„ˆ๋ฌด ๋ณต์žกํ•˜๋‹ค.
    •  Redux์—์„œ ์œ ์šฉํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋งŽ์€ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.
    •  Redux์—๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๐Ÿ“” Redux-Toolkit์ด ์ œ๊ณตํ•˜๋Š” ๊ฒƒ

  • configureStore : ๊ฐ„๋‹จํ•˜๊ฒŒ Store๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
  • createReducer : switch๋ฌธ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ ๋Œ€์‹  ๊ฐ„๋‹จํ•˜๊ฒŒ Reducer๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
  • createAction : Reducer์— ์ž‘์„ฑํ•œ ๊ฒƒ๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ Action๋“ค์„ ๋งŒ๋“ค์–ด ์คŒ
  • createSlice : reducer์˜ ์ด๋ฆ„, ์ดˆ๊ธฐ์ƒํƒœ, reducers ๋“ฑ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์คŒ
  • createAsyncThunk : createAction์„ ๋น„๋™๊ธฐ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์คŒ
  • createSelector : Store์—์„œ ์ƒํƒœ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๋„๋ก ๋„์›€

1๏ธโƒฃ appํด๋”์— redux ํด๋” ๋งŒ๋“ค๊ณ  store.js ๋งŒ๋“ค๊ธฐ

import React from 'react';
import { configureStore } from '@reduxjs/toolkit';

export default configureStore({
  reducer: {},
})
  • configureStore์—์„œ ๋ชจ๋“  state๋ฅผ ๊ด€๋ฆฌ
  • reducer์— ์ƒํƒœ๊ด€๋ฆฌํ•  ๊ฒƒ๋“ค ์ €์žฅ

2๏ธโƒฃ index.js์— Provider๋กœ ๊ฐ์‹ธ๊ธฐ

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import reportWebVitals from './reportWebVitals';
import store from './redux/store';
import { Provider } from 'react-redux';

ReactDOM.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById('root')
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

 

3๏ธโƒฃ ๋ฆฌ๋“€์„œ ๋งŒ๋“ค๊ธฐ

- redux/user.js

import { createSlice } from '@reduxjs/toolkit';

export const userSlice = createSlice({
    name: "user",
    initialState: { value: {name: "", age: 0, email: ""}},
    reducers: {
        login: (state, action) => {
            state.value = action.payload
        },
    },
});

export default userSlice.reducer;
  • createReducer์™€ createAction์ด ํ•˜๋˜ ์ผ์„ ๊ฐ™์ด ํ•จ
  • ์‚ฌ์šฉํ•  ๋ฆฌ๋“€์„œ์˜ ์ด๋ฆ„ ์ •ํ•˜๊ณ  createSlice๋กœ ์ง€์ •
  • name: ๋ฆฌ๋“€์„œ ์ด๋ฆ„ ๋ญ˜๋กœ ํ• ์ง€ ์ •ํ•จ
  • initialState: ๋“ค์–ด๊ฐˆ ๋ฐ์ดํ„ฐ์˜ ์ดˆ๊นƒ๊ฐ’ ์žก์•„์คŒ
  • reducers: ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋ ์ง€ ์ •ํ•จ
  • state: ์ง€์ •ํ•ด๋†“์€ ์ดˆ๊ธฐ๊ฐ’์˜ value๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• 
  • actions: payload๋ž‘ type์ด ์žˆ์Œ --> ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ๊ณณ์—๋‹ค๊ฐ€ ๋„˜๊ฒจ์คŒ

 

- app/redux/store.js ---> ์Šคํ† ์–ด์— ์ €์žฅ 

import { configureStore } from '@reduxjs/toolkit'
import userReducer from './user'

export default configureStore({
    reducer:{
        user: userReducer
    }
})
  • ์Šคํ† ์–ด์— ์ €์žฅํ•ด์•ผ ์ž‘๋™ํ•จ

4๏ธโƒฃ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธ

import { useSelector } from 'react-redux'

const user = useSelector((state) => state.user.value)
  • useSelector๋ฅผ ์ด์šฉํ•ด์„œ ๋งŒ๋“  ๋ฆฌ๋“€์„œ์— ์ ‘๊ทผ
  • user๋ผ๊ณ  ์ด๋ฆ„ ์ง€์–ด์ค€ ๋ฆฌ๋“€์„œ์— ์žˆ๋Š” state์— ์ ‘๊ทผ
  • user ๋ฆฌ๋“€์„œ์—์„œ ์ดˆ๊นƒ๊ฐ’์„ value๋กœ ์ง€์ • -> user์— ์žˆ๋Š” value๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ
  • --> state.๋ฆฌ๋“€์„œ ์ด๋ฆ„.์ดˆ๊นƒ๊ฐ’