๐Ÿ–ฅFrontEnd/Redux

๋ฆฌ๋•์Šค์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ , ๊ธฐ์กด์˜ state๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋˜๋Š” ์ด์œ !

hellohailie 2022. 7. 11. 09:09

 

๋ฆฌ๋•์Šค ์Šคํ† ์–ด๋ฅผ ๋ฆฌ์•กํŠธ ์•ฑ์— ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฃผ๋กœ index.js ํŒŒ์ผ๋กœ ๊ฐ„๋‹ค. ๊ฑฐ๊ธฐ์„œ ์ „์ฒด ์•ฑ์„ ๋ Œ๋”ํ•œ๋‹ค. (์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๊ฐ€์žฅ ์œ„์ชฝ)

๊ฑฐ๊ธฐ์„œ root ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”ํ•œ๋‹ค. 

 

 

์ปดํฌ๋„ŒํŠธ์˜ ๋Œ€๋ถ€๋ถ„์ด ์Šคํ† ์–ด์— ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๊ฐ€์žฅ ๋†’์€ ๋ ˆ๋ฒจ์—์„œ <Provider>๋ฅผ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค. 

import React from "react";
import ReactDOM from "react-dom";
import { Provider } from "react-redux";

import "./index.css";
import App from "./App";
import store from "./store/index";

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

 

๐Ÿ‘‡ App์— ์žˆ๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” store์— ํƒญ ๋  ์ˆ˜ ์žˆ๋‹ค.

โžฅ store ๋ฐ–์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. subscription์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•ก์…˜๋„ dispatch ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 


import { useSelector } from "react-redux";

{store} ๋ณด๋‹ค {useSelector}๊ฐ€ ๋” ํŽธํ•˜๋‹ค! ๊ทธ ์ด์œ ๋Š” {useSelector}๋Š” ์ž๋™์œผ๋กœ ์ƒํƒœ์˜ ์ผ๋ถ€๋ฅผ ์„ ํƒํ•˜๊ฒŒ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

 

{useSelector}๋กœ ์Šคํ† ์–ด๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. 

useSelector()๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณด๋‚ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ ํ•จ์ˆ˜๋Š” ๋ฆฌ๋•์Šค๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ๋ฅผ ๋ฐ›๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ์˜ ์ผ๋ถ€๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. (์—ฌ๊ธฐ์„œ๋Š” state.counter)

 

useSelector()๋ฅผ ์“ฐ๋ฉด ์ข‹์€๊ฒŒ, ๋ฆฌ์•กํŠธ ๋ฆฌ๋•์Šค๊ฐ€ ์ž๋™์œผ๋กœ ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜์„ ์„ค์ •ํ•œ๋‹ค๋Š” ๊ฒƒ! ๐Ÿ‘‰ ๊ทธ๋ž˜์„œ ๋ฆฌ๋•์Šค ์Šคํ† ์–ด์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๊ณ  ์ž๋™์œผ๋กœ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ์นด์šดํ„ฐ๋ฅผ ๋ฐ›๋Š”๋‹ค. 

 

๋ฆฌ๋•์Šค์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ๊ฒƒ!!

์ ˆ๋Œ€ ๊ธฐ์กด์˜ state๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค!!

๋Œ€์‹  ์ƒˆ๋กœ์šด state ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์„œ ํ•ญ์ƒ ์žฌ์ •์˜ํ•ด์•ผํ•œ๋‹ค. 

 

์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๋™์ž‘์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ํ”„๋กœ๊ทธ๋žจ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋ ค์›Œ ์งˆ ์ˆ˜ ์žˆ๋‹ค. 

๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋”๋ผ๋„ state๊ฐ€ ๋™๊ธฐํ™” ๋˜์ง€ ์•Š๋Š” ๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ side effect๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ณ , ๊ฐ’์ž๊ธฐ UI๊ฐ€ ๋”์ด์ƒ state๋ฅผ ์ •ํ™•ํžˆ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. 

const firstReducer = (state = initialState, action) => {
  if (action.type === "increment") {
  state.counter++;
    return {
      counter: state.counter,
      showCounter: state.showCounter,
    };
  }

์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด ์•ˆ๋œ๋‹ค!!

๊ฐ์ฒด์™€ ๋ฐฐ์—ด์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ฐธ์กฐ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๊ธฐ์กด์˜ state๋ฅผ ๋ณ€ํ˜•์‹œํ‚จ๋‹ค. 

 

 

โญ๏ธโญ๏ธ๋”ฐ๋ผ์„œ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ๋•Œ๋Š” ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ!โญ๏ธโญ๏ธ

 

const firstReducer = (state = initialState, action) => {
  if (action.type === "increment") {
    return {
      counter: state.counter + 1,
      showCounter: state.showCounter,
    };
  }

์ด๊ฒŒ ๋งž๋‹ค

 

ํŠนํžˆ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์„ ๊ฐ€์ง„ state์˜ ๊ฒฝ์šฐ ๊ธฐ์กด์˜ state๋ฅผ ์‹ค์ˆ˜๋กœ ๋ณ€ํ˜•์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์œ ์˜ํ•˜๊ธฐ!

๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ๊ธฐ์กด ๊ฐ์ฒด๋กœ ๊ฐ€์„œ ๊ฐ์ฒด ์†์„ฑ์ด ์กฐ์ž‘๋˜์ง€ ์•Š๋„๋ก ํ•ด์•ผํ•œ๋‹ค!

 

 

๐Ÿ˜ƒ ์ž˜๋ชป๋œ ๊ฐœ๋… ์ „๋‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €์˜ ์„ฑ์žฅ์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค๐Ÿค“