3/11(ํ† ) Redux Toolkit(Feat. Flux Pattern)

Mindfulnessยท2023๋…„ 3์›” 12์ผ
0
post-thumbnail
๐Ÿšฉ [๋ชฉํ‘œ]
  1. ๊ธฐ์กด Redux ๊ตฌ์กฐ๋ฅผ ์ข€ ๋” ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” Redux Toolkit์ด ๋ฌด์—‡์ธ์ง€, ๊ธฐ์กด Redux์™€์˜ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์Šต๋“ํ•ด๋ณด์ž.
  2. Redux DevTools๋ฅผ ์ด์šฉํ•˜์—ฌ ์ข€ ๋” ์‰ฝ๊ฒŒ ์—ฌ๋Ÿฌ ์ƒํƒœ๋ฅผ ๋น„๋กฏํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ๋ฆฌ๋•์Šคํˆดํ‚ท์ด๋ž€?

  • (1) ๋ฆฌ๋•์Šคํˆดํ‚ท

    ๋ฆฌ๋•์Šค ํˆดํ‚ท์€ ์šฐ๋ฆฌ๊ฐ€ ์ด์ „์— ๋ฐฐ์šด ๋ฆฌ๋•์Šค๋ฅผ ๊ฐœ๋Ÿ‰ํ•œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

    ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ–ˆ๋˜ ducks ํŒจํ„ด์˜ ์š”์†Œ๋“ค์ด ์ „์ฒด์ ์ธ ์ฝ”๋“œ์˜ ์–‘์„ ๋Š˜๋ฆฐ๋‹ค๋Š” ๊ฐœ๋ฐœ์ž๋“ค์˜ ๋ถˆ๋งŒ์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ , ๋ฆฌ๋•์Šค ํŒ€์—์„œ๋Š” ์ด๊ฒƒ์„ ์ˆ˜์šฉํ•˜์—ฌ ์ฝ”๋“œ๋Š” ๋” ์ ๊ฒŒ, ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋•์Šค๋ฅผ ๋” ํŽธํ•˜๊ฒŒ ์“ฐ๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ํก์ˆ˜ํ•ด์„œ ๋งŒ๋“  ๊ฒƒ์ด ๋ฆฌ๋•์Šคํˆดํ‚ท. ์ค„์—ฌ์„œ RTK.
  • (2) ์ƒˆ๋กœ์šด ๊ฒƒ์ธ๊ฐ€? ์•„๋‹ˆ๋‹ค.

    ๋ฆฌ๋•์Šค ํˆดํ‚ท์€ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์› ๋˜ ๋ฆฌ๋•์Šค์™€ ๊ตฌ์กฐ๋‚˜ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ๋ชจ๋‘ ๋˜‘๊ฐ™๋‹ค.

    ์ฆ‰ ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๋ฆฌ๋•์Šค์˜ ์ „์ฒด ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด API๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋‚˜ํ•˜๋‚˜ ์†์œผ๋กœ ๋งŒ๋“ค์–ด ์ค˜์•ผ ํ–ˆ๋˜ ducks ํŒจํ„ด์˜ ์š”์†Œ๋“ค์ด ์–ด๋А์ •๋„ ์ž๋™ํ™” ๋˜์—ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์—์„œ useSelector๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋‘ ๋˜‘๊ฐ™๋‹ค.
    ๋ฐ”๋€ ๋ถ€๋ถ„์€ ๊ทธ์ € ๋ชจ๋“ˆ ํŒŒ์ผ ๋ฟ.
    ์ดํ›„ ์ผ๋ฐ˜ ๋ฆฌ๋•์Šค์™€ ํˆดํ‚ท์˜ ์š”์†Œ๋ฅผ ๋น„๊ตํ•ด์„œ ์–ด๋–ค ์‹์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

2. ์ผ๋ฐ˜ ๋ฆฌ๋•์Šค์™€ ์ฝ”๋“œ ๋น„๊ต

  • (1) ํˆดํ‚ท ์„ค์น˜ํ•˜๊ธฐ

    CRA๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธํ‹€ ์ƒ์„ฑํ•˜๊ณ  yarn์„ ํ†ตํ•ด ์•„๋ž˜ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

    yarn add react-redux @reduxjs/toolkit
  • (2) count ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ ๋น„๊ต

    ์•„๋ž˜ ๋ณด์ด๋Š” ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜ ๋ฆฌ๋•์Šค์˜ counter ํ”„๋กœ๊ทธ๋žจ ๋ชจ๋“ˆ. Action Value, Action Creator๋ฅผ ๋ณ„๋„๋กœ ์ƒ์„ฑํ•ด์ค˜์•ผ ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋“€์„œ์—์„œ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”์‹œํ‚ฌ ์ง€ ๋งŒ๋“ค์–ด์คฌ์–ด์•ผ ํ–ˆ์—ˆ๋‹ค.

    // ์ผ๋ฐ˜ ๋ฆฌ๋•์Šค ์˜ˆ์‹œ ์ฝ”๋“œ
    
    // Action Value
    const ADD_NUMBER = "ADD_NUMBER";
    const MINUS_NUMBER = "MINUS_NUMBER";
    
    // Action Creator
    export const addNumber = (payload) => {
      return {
        type: ADD_NUMBER,
        payload,
      };
    };
    
    export const minusNumber = (payload) => {
      return {
        type: MINUS_NUMBER,
        payload,
      };
    };
    
    // Initial State
    const initialState = {
      number: 0,
    };
    
    // Reducer
    const counter = (state = initialState, action) => {
      switch (action.type) {
        case ADD_NUMBER:
          return {
            number: state.number + action.payload,
          };
        // [ํ€ด์ฆˆ ๋‹ต]
        case MINUS_NUMBER:
          return {
            number: state.number - action.payload,
          };
        default:
          return state;
      }
    };
    
    // export default reducer
    export default counter;

    ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ๋ฆฌ๋•์Šค ํˆดํ‚ท์„ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“  counter ํ”„๋กœ๊ทธ๋žจ ๋ชจ๋“ˆ์ด๋‹ค. ์ผ๋ฐ˜ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ณด๋‹ค ํ™•์‹คํžˆ ์ฝ”๋“œ์˜ ์–‘์ด ์ค„์—ˆ๋‹ค.

    ํ•œ๋ฒˆ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ํฐ ์ฐจ์ด์ ์€ Action Value์™€ Action Creator๋ฅผ ์ด์ œ ์ง์ ‘ ์ƒ์„ฑํ•ด์ฃผ์ง€ ์•Š๊ณ , Action Value, Action Creator, Reducer๊ฐ€ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์กŒ๋‹ค๋Š” ์ .

    ์ด์ œ ์šฐ๋ฆฌ๋Š” Slice ๋ผ๋Š” API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ์Šฌ๋ผ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์ € 3๊ฐœ๋ฅผ ๊ฐ๊ฐ ๋งŒ๋“ค์–ด์ค„ ํ•„์š” ์—†์ด ํ•œ๋ฒˆ์— 3๊ฐœ๊ฐ€ ๋ชจ๋‘ ๋งŒ๋“ค์–ด์ง„๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

    // src/redux/modules/counterSlice.js
    
    import { createSlice } from "@reduxjs/toolkit";
    
    const initialState = {
      number: 0,
    };
    
    const counterSlice = createSlice({
      name: "counter",
      initialState,
      reducers: {
        addNumber: (state, action) => {
          state.number = state.number + action.payload;
        },
    
        minusNumber: (state, action) => {
          state.number = state.number - action.payload;
        },
      },
    });
    
    // ์•ก์…˜ํฌ๋ฆฌ์—์ดํ„ฐ๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด export ํ•˜๊ณ 
    export const { addNumber, minusNumber } = counterSlice.actions;
    // reducer ๋Š” configStore์— ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด export default ํ•œ๋‹ค.
    export default counterSlice.reducer;

    ์Šฌ๋ผ์ด์Šค๋งŒ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž. ์Šฌ๋ผ์ด์Šค๋Š” createSlice ๋ผ๋Š” API๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ธ์ž๋กœ ์„ค์ •์ •๋ณด๋ฅผ ๊ฐ์ฒด๋กœ ๋ฐ›๋Š”๋ฐ, ๊ทธ ์•ˆ์— ์šฐ๋ฆฌ๊ฐ€ ํ•„์ˆ˜๋กœ ์ž‘์„ฑํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฐ’์€ name, initialState, reducers๊ฐ€ ์žˆ๋‹ค.

    //createSlice API ๋ผˆ๋Œ€
    
    const counterSlice = createSlice({
    	name: '', // ์ด ๋ชจ๋“ˆ์˜ ์ด๋ฆ„
    	initialState : {}, // ์ด ๋ชจ๋“ˆ์˜ ์ดˆ๊ธฐ์ƒํƒœ ๊ฐ’
    	reducers : {}, // ์ด ๋ชจ๋“ˆ์˜ Reducer ๋กœ์ง
    })

    ์‹ ๊ธฐํ•œ ๊ฒƒ์€ ์œ„์˜ counterSlice ๋ฆฌ๋“€์„œ ๊ฐ์ฒด ์•ˆ์—์„œ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฆฌ๋“€์„œ์˜ ๋กœ์ง์ด ๋˜๋ฉด์„œ๋„ ๋™์‹œ์— Action Creator๊ฐ€ ๋œ๋‹ค๋Š” ์ . ๊ทธ๋ฆฌ๊ณ  Action Value ๊นŒ์ง€ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ๋”ฐ์„œ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” Reducer๋งŒ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค.

    // counterSlice.js์˜ Slice ๊ตฌ์กฐ
    
    const counterSlice = createSlice({
      name: "counter",
      initialState,
      reducers: {
        // ๋ฆฌ๋“€์„œ ์•ˆ์—์„œ ๋งŒ๋“  ํ•จ์ˆ˜ ์ž์ฒด๊ฐ€ ๋ฆฌ๋“€์„œ์˜ ๋กœ์ง์ด์ž, ์•ก์…˜ํฌ๋ฆฌ์—์ดํ„ฐ๊ฐ€ ๋œ๋‹ค.
        addNumber: (state, action) => {
          state.number = state.number + action.payload;
        },
    
        minusNumber: (state, action) => {
          state.number = state.number - action.payload;
        },
      },
    });

    ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜ ๋ฆฌ๋•์Šค์—์„œ export๋ฅผ ํ†ตํ•ด์„œ ๊ฐ๊ฐ์˜ Action Creator๋ฅผ ๋‚ด๋ณด๋‚ด์ฃผ์—ˆ๋˜ ๊ฒƒ์„ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋˜‘๊ฐ™์ด ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฆฌ๋“€์„œ์— ๋กœ์ง์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋‚ด๋ณด๋‚ด์ฃผ๋ฉด ๋œ๋‹ค.

    // ์•ก์…˜ํฌ๋ฆฌ์—์ดํ„ฐ๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด export ํ•˜๊ณ 
    export const { addNumber, minusNumber } = counterSlice.actions;
    // reducer ๋Š” configStore์— ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด export default  ํ•œ๋‹ค.
    export default counterSlice.reducer;
  • (3) configStore ๋น„๊ต

  • ์ผ๋ฐ˜ ๋ฆฌ๋•์Šค

// ์ผ๋ฐ˜ ๋ฆฌ๋•์Šค combineReducers ์˜ˆ์‹œ ์ฝ”๋“œ

import { createStore } from "redux";
import { combineReducers } from "redux";
import counter from "../modules/counter";

const rootReducer = combineReducers({
  counter,
});
const store = createStore(rootReducer);
export default store;
  • ๋ฆฌ๋•์Šค ํˆดํ‚ท configStore์—์„œ๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋˜๋ฉฐ, ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ์ ์€ ์—†๋‹ค. todos ๋ชจ๋“ˆ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์— ์žˆ๋‹ค. ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•ด์„œ ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ชจ๋“ˆ์„ store์— ๋“ฑ๋กํ•ด๋ณด์ž.
// src/redux/modules/config/configStore.js

import { configureStore } from "@reduxjs/toolkit";
/**
 * import ํ•ด์˜จ ๊ฒƒ์€ slice.reducer
 */
import counter from "../modules/counterSlice";
import todos from "../modules/todosSlice";

/**
 * ๋ชจ๋“ˆ(Slice)์ด ์—ฌ๋Ÿฌ๊ฐœ์ธ ๊ฒฝ์šฐ
 * ์ถ”๊ฐ€ํ• ๋•Œ๋งˆ๋‹ค reducer ์•ˆ์— ๊ฐ ๋ชจ๋“ˆ์˜ slice.reducer๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ๋‹ค.
 *
 * ์•„๋ž˜ ์˜ˆ์‹œ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ ์•ˆ์—์„œ counter ๊ธฐ๋Šฅ๊ณผ todos ๊ธฐ๋Šฅ์ด ๋ชจ๋‘ ์žˆ๊ณ ,
 * ์ด๊ฒƒ์„ ๊ฐ๊ฐ ๋ชจ๋“ˆ๋กœ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ์— ์•„๋ž˜ ์ฝ”๋“œ๋กœ 2๊ฐœ์˜ ๋ชจ๋“ˆ์„ ์Šคํ† ์–ด์— ์—ฐ๊ฒฐํ•ด์ค€ ๊ฒƒ.
 */
const store = configureStore({
  reducer: { counter: counter, todos: todos },
});

export default store;
  • todos ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ todosSlice.js๋ฅผ ๋งŒ๋“ค๊ณ , ์œ„ ์„ค๋ช…๊ณผ ๊ฐ™์ด configureStore ์— todosSlice๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. (์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋‹จ์ˆœํžˆ ๋น„์–ด์žˆ๋Š” todosSlice.)
// src/redux/modules/todosSlice.js

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

const initialState = {
  todos: [],
};

const todosSlice = createSlice({
  name: "todos",
  initialState,
  reducers: {},
});

export const {} = todosSlice.actions;
export default todosSlice.reducer;

๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ์ƒ์„ฑํ•œ store๋ฅผ export default ํ•ด์„œ ์ตœ์ƒ์œ„์˜ index.js Provider์— ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฒƒ์€ ์ „ํ˜€ ๋ฐ”๋€๊ฒŒ ์—†๋‹ค.

// index.js

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { Provider } from "react-redux";
import store from "./redux/config/configStore";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <Provider store={store}>
    <App />
  </Provider>
);

App.jsx์—์„œ๋Š” ํˆดํ‚ท์„ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“  ๋ชจ๋“ˆ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐฉ์‹์€ ์ผ๋ฐ˜๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์™€ ๋™์ผ. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ, ๋ฆฌ๋•์Šค ๋ชจ๋“ˆ๋“ค์ด ์ž˜ ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

// src/App.js

import React from "react";
import { useSelector } from "react-redux";

const App = () => {
  // Store์— ์žˆ๋Š” todos ๋ชจ๋“ˆ state ์กฐํšŒํ•˜๊ธฐ
  const todos = useSelector((state) => state.todos);

  // Store์— ์žˆ๋Š” counter ๋ชจ๋“ˆ state ์กฐํšŒํ•˜๊ธฐ
  const counter = useSelector((state) => state.counter);

  return <div>App</div>;
};

export default App;

์šฐ๋ฆฌ๊ฐ€ ์œ„์—์„œ ์ž‘์„ฑํ•œ ํŒŒ์ผ๋“ค์˜ ๊ตฌ์กฐ ์ด๋ฏธ์ง€๋‹ค. modules์•ˆ์— ์žˆ๋Š” ํŒŒ์ผ์˜ ์ด๋ฆ„์€ ์ž„์˜๋กœ ํ•˜๋ฉด ๋œ๋‹ค. counter.js, todos.js๋กœ, ํ˜น์€ counterSlice.js, todosSlice.js๋กœ ํ•ด๋„ ๋œ๋‹ค. ์„ ํƒ์‚ฌํ•ญ. ์•„๋ž˜ ํŒŒ์ผ ๊ตฌ์กฐ์™€ ๋™์ผํ•œ์ง€ ํ™•์ธํ•ด๋ณด์ž.

3. Redux Devtools ์‚ฌ์šฉํ•˜๊ธฐ

  • (1) devtools ์†Œ๊ฐœ

    ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋ฆฌ๋•์Šค devtools๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ๋Š” ์ฐพ์•„๋ณผ ์ˆ˜ ์—†๋Š” ๊ต‰์žฅํžˆ ๊ฐ•๋ ฅํ•œ ๊ฐœ๋ฐœํˆด. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ state ์ƒํƒœ๋ผ๋˜๊ฐ€, ์–ด๋–ค ์•ก์…˜์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ ๊ทธ ์•ก์…˜์ด ๋ฌด์—‡์ด๊ณ , ๊ทธ๊ฒƒ์œผ๋กœ ์ธํ•ด state๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๋“ฑ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•  ๋•Œ ์•„์ฃผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ด devtools ๋•Œ๋ฌธ์— ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๋„ ๊ณผ์–ธ์ด ์•„๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋„ ํ•œ๋ฒˆ ์‚ฌ์šฉํ•ด๋ณด์ž.

    ๊ตฌ๊ธ€ ์›น์Šคํ† ์–ด์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.

  • (2) ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•

    ์›น ์Šคํ† ์–ด์—์„œ devtools๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋งŒ์•ฝ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉด ์ด๋ ‡๊ฒŒ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋…น์ƒ‰์œผ๋กœ ๋ถˆ์ด ์ผœ์ง„๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž๋„๊ตฌ ํƒญ์—์„œ Redux ๋ผ๋Š” ๋ฉ”๋‰ด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Counter ํ”„๋กœ๊ทธ๋žจ์„ ๋ฆฌ๋•์Šค devools ๋ฅผ ๋„์›Œ๋†“๊ณ  ํ•œ๋ฒˆ ์ž‘๋™์‹œ์ผœ ๋ณด์ž.

    ๋”ํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด addNumber ๋ผ๋Š” ์•ก์…˜์ด dispatch ๋œ๋‹ค. ๊ทธ๊ฒƒ์„ devtools์—์„œ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๊ณ , ๊ทธ๊ฒƒ์œผ๋กœ ์ธํ•ด state ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ–ˆ๋Š”์ง€๋ฅผ ์ „๋ถ€ ๋ณด์—ฌ์ค€๋‹ค.

    ํ”„๋กœ์ ํŠธ๊ฐ€ ์ ์  ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š์€๋ฐ, ์ด ํˆด์„ ์ด์šฉํ•ด์„œ ์ •๋ง ์‰ฝ๊ฒŒ ๋””๋ฒ„๊น…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. devtools๋ฅผ ์ž˜ ํ™œ์šฉํ•ด๋ณด์ž.

    ๐Ÿ’ก **ํˆดํ‚ท์ด ์•„๋‹Œ ์ผ๋ฐ˜ ๋ฆฌ๋•์Šค์—์„œ devtools๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, ๋ณ„๋„ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค. ํˆดํ‚ท์€ devtools์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์ฝ”๋“œ ์„ค์ • ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.** ## 4. Flux ํŒจํ„ด
  • ๋งŒํ™”๋กœ ๋ณด๋Š” Flux

    Flux๋กœ์˜ ์นดํˆฐ ์•ˆ๋‚ด์„œ

  • Flux์™€ redux์˜ ๊ด€๊ณ„

    Flux์™€ Redux

profile
Junior Frontend Developer

0๊ฐœ์˜ ๋Œ“๊ธ€