TIL 51์ผ์ฐจ -  [React] Redux 2

Yoon Kyung Parkยท2023๋…„ 6์›” 22์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
51/75

์‹ค์Šต [App.js] ์ฝ”๋“œ

๐Ÿ‘‡ [App.js]

import React from 'react';
import './style.css';

{/* 
import { useDispatch, useSelector } from 'react-redux';๋ฅผ 
ํ†ตํ•ด react-redux์—์„œ useSelector๋ฅผ ๋ถˆ๋Ÿฌ์™€์ฃผ์„ธ์š”.
*/}

import {useSelector} from 'react-redux';

{/*
import { useDispatch } from 'react-redux';๋ฅผ ํ†ตํ•ด 
react-redux์—์„œ useDispatch๋ฅผ ๋ถˆ๋Ÿฌ์™€์ฃผ์„ธ์š”. 
*/}

import {useDispatch} from 'react-redux';

// ๋‘ ๊ฐœ๋ฅผ ๋™์‹œ์— ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
// import {useSelector, useDispatch} from 'react-redux';

{/* 
import { increase,decrease } from './index.js';๋ฅผ ํ†ตํ•ด 
Action Creater ํ•จ์ˆ˜ increase, decrease๋ฅผ ๋ถˆ๋Ÿฌ์™€์ฃผ์„ธ์š”. */}

import {increase, decrease} from './index.js';


export default function App() {

 {/* 
 useDispatch์˜ ์‹คํ–‰ ๊ฐ’์„ ๋ณ€์ˆ˜์— ์ €์žฅํ•ด์„œ 
 dispatch ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.(์ฝ˜์†”๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”!) 
 */}
 
  const dispatch = useDispatch()
  console.log(dispatch);

  {/* 
  useSeletor๋ฅผ ํ†ตํ•ด state๊ฐ€ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ
  ์ „์—ญ ๋ณ€์ˆ˜ ์ €์žฅ์†Œ store์— ์ €์žฅ๋œ state๋ฅผ ์‰ฝ๊ฒŒ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
  */}
  
  {/*
  useSelector์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ธ์ž์— Store์— ์ €์žฅ๋œ 
  ๋ชจ๋“  state๊ฐ€ ๋‹ด๊น๋‹ˆ๋‹ค.
  ๊ทธ๋Œ€๋กœ return์„ ํ•˜๊ฒŒ ๋˜๋ฉด Store์— ์ €์žฅ๋œ 
  ๋ชจ๋“  state๋ฅผ ๊บผ๋‚ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
  */}
  
  const state = useSelector((state) => state);
  
  {/* 
  ๋ณ€์ˆ˜ state๋ฅผ ์ฝ˜์†”์—์„œ ํ™•์ธํ•ด๋ณด์„ธ์š”. 
  Store์— ์ €์žฅ๋œ ๊ธฐ์กด state ๊ฐ’์ธ 1์ด ์ฐํžˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
  */}
 
  console.log(state);

  {/* 
  dispatch ํ•จ์ˆ˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  ๊ทธ๋ฆฌ๊ณ  dispatch ํ•จ์ˆ˜๋Š” action ๊ฐ์ฒด๋ฅผ Reducer ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค. 
  */}
  
  {/* 
  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ onClick={plusNum}๊ณผ, 
  onClick={minusNum}์•ˆ์—์„œ dispatch๋ฅผ ํ†ตํ•ด 
  action ๊ฐ์ฒด๋ฅผ Reducer ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•ด์ฃผ์„ธ์š”. 
  */}
  
  const plusNum = () => {
    dispatch(increase());
    console.log(plusNum);
  };

  const minusNum = () => {
    dispatch(decrease());
    console.log(minusNum);
  };

  return (
    <div className="container">
     {/* 
     Store์—์„œ ๊บผ๋‚ด์˜จ state๋ฅผ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด 
     ๋ณ€์ˆ˜ state๋ฅผ ํ™œ์šฉํ•ด๋ณด์„ธ์š”. 
     */}
     
     {/* 
     '+', '-' ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ 
     ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!
     */}
     
      <h1>{`Count: ${state}`}</h1>
      <div>
        <button className="plusBtn" onClick={plusNum}>
          +
        </button>
        <button className="minusBtn" onClick={minusNum}>
          -
        </button>
      </div>
    </div>
  );
}

์ถœ์ฒ˜ : codestates


์‹ค์Šต [index.js] ์ฝ”๋“œ

๐Ÿ‘‡ [index.js]

import React from 'react';
import { createRoot } from 'react-dom/client';
import App from './App';
{/*
import { Provider } from 'react-redux';
react-redux์—์„œ Provider๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
*/}

{/*
import { Provider } from 'react-redux';
redux์—์„œ createStore๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
createStore ๋‚˜ legacy_createStore๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
*/}

import { legacy_createStore as createStore } from 'redux';

const rootElement = document.getElementById('root');
const root = createRoot(rootElement);

{/*
Action์€ ์–ด๋–ป๊ฒŒ state๋ฅผ ๋ณ€๊ฒฝํ• ์ง€ ์ •์˜ํ•ด๋†“์€ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
Action ๊ฐ์ฒด๋Š” Dispatch ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด 
Reducer ํ•จ์ˆ˜ ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
*/}

{/*
Action ๊ฐ์ฒด ์•ˆ์˜ type์€ ํ•„์ˆ˜๋กœ ์ง€์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ์ง€์ •ํ•œ type์— ๋”ฐ๋ผ Reducer ํ•จ์ˆ˜์—์„œ ์ƒˆ๋กœ์šด state๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
*/}

{/*
Action Creator ํ•จ์ˆ˜ icrease, decrease๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์„ธ์š”. 
type์€ 'INCREASE', 'DECREASE'๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
payload๋Š” ํŠน์ •ํ•œ ๊ฐ’์„ ๋ฐ›์•„์„œ reducer๋กœ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ,
๊ณ ์ •๋œ ๊ฐ’์ด ์•„๋‹Œ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ ์ธ์ž๋กœ ๋ฐ›์•„ payload์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
// payload๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
const setNumber = (num) => {
  return {
    type: 'SET_NUMBER',
    payload: num
  }
}
*/}

{/*
์•ž์„œ ๋งŒ๋“  Action Creator ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํŒŒ์ผ์—๋„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด 
export๋ฅผ ๋ถ™ํ˜€์ฃผ์„ธ์š”.
*/}

export const increase = () => {
  return {
    type: 'INCREASE',
  };
};

export const decrease = () => {
  return {
    type: 'DECREASE',
  };
};


const count = 1;

{/* 
Reducer๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์—๋Š” ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์ธ์ž๋กœ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
Reducerํ•จ์ˆ˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž์—๋Š” ๊ธฐ์กด state๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
*/}

{/*
์ฒซ๋ฒˆ์งธ ์ธ์ž์—๋Š” default value๋ฅผ ๊ผญ ์„ค์ •ํ•ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค!
๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ undefined๊ฐ€ ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์— 
๊ทธ๋กœ ์ธํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
*/}

{/*
๋‘๋ฒˆ์งธ ์ธ์ž์—๋Š” action ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
action ๊ฐ์ฒด์—์„œ ์ •์˜ํ•œ type์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด state๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
*/}

const counterReducer = (state=count, action ) => {

{/*
Action ๊ฐ์ฒด์˜ type ๊ฐ’์— ๋”ฐ๋ผ ๋ถ„๊ธฐํ•˜๋Š” switch ์กฐ๊ฑด๋ฌธ์ž…๋‹ˆ๋‹ค.
*/}

  switch (action.type) {

    //action === 'INCREASE'์ผ ๊ฒฝ์šฐ
    case 'INCREASE':
			return state + 1

    // action === 'DECREASE'์ผ ๊ฒฝ์šฐ
    case 'DECREASE':
			return state - 1

    // action === 'SET_NUMBER'์ผ ๊ฒฝ์šฐ
    case 'SET_NUMBER':
			return action.payload

    // ํ•ด๋‹น ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†์„ ๋• ๊ธฐ์กด ์ƒํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ด
    default:
      return state;
	}
 // Reducer๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’์ด ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
}

{/*
๋ณ€์ˆ˜ store์— createStore ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด store๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ , createStore์— ์ธ์ž๋กœ Reducer ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
(์ง€๊ธˆ ๋‹จ๊ณ„์—์„œ๋Š” ์ž„์‹œ์˜ ํ•จ์ˆ˜ reducer๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.)
*/}

{/*
์ƒˆ๋กœ์šด state๋Š” ์ „์—ญ ๋ณ€์ˆ˜ ์ €์žฅ์†Œ Store์— ์ €์žฅ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
*/}

const store = createStore(counterReducer);


{/*
Provider๋Š” store๋ฅผ ์†์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.
ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ ๋‹ค์Œ์—, Store๋ฅผ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ์ค€ ํ›„,
Provider ์ปดํฌ๋„ŒํŠธ์˜ props๋กœ store๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
*/}

{/*
์ „์—ญ ์ƒํƒœ ์ €์žฅ์†Œ store๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” App ์ปดํฌ๋„ŒํŠธ๋ฅผ
Provider๋กœ ๊ฐ์‹ธ์ค€ ํ›„ props๋กœ ๋ณ€์ˆ˜ store๋ฅผ ์ „๋‹ฌํ•ด์ฃผ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
*/}

root.render(
  <Provider store={store}>
  <App />
 </Provider>
);

์ถœ์ฒ˜ : codestates

ํ˜„์žฌ๋Š” index.js์— ๋ชจ๋“  ๋ฆฌ๋•์Šค ์ฝ”๋“œ๋“ค์ด ์œ„์น˜ํ•˜๊ณ  ์žˆ๋‹ค.
์ง€๊ธˆ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ์—ญํ• ์„ ํ•˜๋Š” ์ฝ”๋“œ๋“ค์„ ํ•œ ๊ณณ์— ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์˜ณ์ง€ ์•Š๋‹ค.

๊ทธ ์ด์œ ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋งค์šฐ ๋‚˜๋น ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋‚˜๋น ์ง€๊ฒŒ ๋˜๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ๋””๋ฒ„๊น…ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์›Œ์ง„๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ index.js์— ๋ชจ์—ฌ์žˆ๋Š” ๋ฆฌ๋•์Šค ์ฝ”๋“œ๋ฅผ ์—ญํ•  ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • Actions
    • type์˜ ๋ฌธ์ž์—ด์„ ๋ณ€์ˆ˜ํ™”ํ•œ ์ด์œ ๋Š” ์„ธ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค.
      1. ์˜คํƒ€๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
      2. ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ฝ”๋“œ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
      3. ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค.
        (์˜ˆ์‹œ: Action Creator ํ•จ์ˆ˜, Reducer ํ•จ์ˆ˜)
  • Reducer
    • ๋งŒ์•ฝ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Reducer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ,
      Redux์˜ combineReducers ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ
      ํ•˜๋‚˜์˜ Reducer๋กœ ํ•ฉ์ณ์ค„ ์ˆ˜ ์žˆ๋‹ค.
import { combineReducers } from 'redux';

const rootReducer = combineReducers({
  counterReducer,
  anyReducer,
  ...
});

const count= 1์ธ ์ดˆ๊ธฐ ์ƒํƒœ
1

์ดˆ๊ธฐ ์ƒํƒœ์—์„œ + ๋ฒ„ํŠผ์„ 1๋ฒˆ ๋ˆŒ๋ €์„ ๋•Œ
2

count: 2์ผ ๋•Œ, - ๋ฒ„ํŠผ์„ 1๋ฒˆ ๋ˆŒ๋ €์„ ๋•Œ
3

count: 1์ผ ๋•Œ, - ๋ฒ„ํŠผ์„ 1๋ฒˆ ๋ˆŒ๋ €์„ ๋•Œ
4-1

์ถœ์ฒ˜ : codestates


๊ณผ์ œ - Cmarket Redux

์–ด์ œ ์ง„ํ–‰ํ•œ ๊ณผ์ œ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜ ํ•˜๋‚˜ ๋ถ„์„ํ•ด ๋ณธ๋‹ค.


์†Œ๊ฐ

๐Ÿ”กโžก๏ธ๐Ÿ’ปโžก๏ธ๐Ÿค“๐Ÿ‘

์˜ค๋Š˜์€ ํŽ˜์–ด ์‹œ๊ฐ„์— ์ข…ํ•ฉํ€ด์ฆˆ๋ฅผ ๊ฐ™์ด ํ’€์–ด๋ณด๊ณ ,
๊ณผ์ œ ํŒŒ์ผ๋“ค๊ณผ ์ฝ”๋“œ๋“ค์„ ํ•˜๋‚˜์”ฉ ์ดํ•ดํ•ด๋ณด์•˜๋‹ค.
์ตœ๊ทผ ํ•™์Šต ์ค‘์— ๊ฐ€์žฅ ์žฌ๋ฐŒ์—ˆ๊ณ , ์ž˜ ์ดํ•ดํ•œ ๊ฒƒ ๊ฐ™์•„
์ •๋ง ์ฒ˜์Œ์œผ๋กœ ์ˆ˜์—…์‹œ๊ฐ„์ด ๊ธฐ๋‹ค๋ ค์กŒ๋‹ค.

๋‹ค์Œ์ฃผ์—๋Š” ์›น์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๋Š”๋ฐ
๋‹ค์Œ์ฃผ์—๋„ ์žฌ๋ฐŒ๊ฒŒ ์ž˜ ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค! ๐Ÿคฉ

profile
developerpyk

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