๊ด€๋ฆฌ ๋ฉ”๋‰ด

Bin's Blog

[์œ ๋ฐ๋ฏธx์Šค๋‚˜์ดํผํŒฉํ† ๋ฆฌ] 10์ฃผ ์™„์„ฑ ํ”„๋กœ์ ํŠธ ์บ ํ”„ 28์ผ์ฐจ - Redux ๋ณธ๋ฌธ

ํ•™์Šต์ผ์ง€

[์œ ๋ฐ๋ฏธx์Šค๋‚˜์ดํผํŒฉํ† ๋ฆฌ] 10์ฃผ ์™„์„ฑ ํ”„๋กœ์ ํŠธ ์บ ํ”„ 28์ผ์ฐจ - Redux

hotIce 2023. 7. 3. 22:52
728x90

 

๐Ÿค” Redux๋ž€?

๐Ÿ‘‰ Redux๋Š” ๋ฆฌ์•กํŠธ ์ƒํƒœ๊ณ„์—์„œ ๊ฐ€์žฅ ์‚ฌ์šฉ๋ฅ ์ด ๋†’์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ๋“ค๊ฒŒ ๋  ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง๋“ค์„ ๋‹ค๋ฅธ ํŒŒ์ผ๋“ค๋กœ ๋ถ„๋ฆฌ์‹œ์ผœ์„œ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์†์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค

๐Ÿ‘‰ Redux๋Š” useState์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณ€ํ•˜๋Š” ๊ฐ’๋“ค์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด๋‹ค. ๋‹ค๋งŒ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด Redux๋Š” ์ „์—ญ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. 

๐Ÿ‘‰ Props๋ฅผ ๊ฐ€์ง€๊ณ  ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ฐ„๋‹จํ•œ ์ƒํ™ฉ์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณต์žกํ•ด์ง€๊ณ  ์ปดํฌ๋„ŒํŠธ์˜ ๊ณ„์ธต์ด ๊นŠ์–ด์งˆ์ˆ˜๋ก ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ผํ•œ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜, ๋น„๋™๊ธฐ ์ž‘์—…์œผ๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋”์šฑ ๊ทธ๋ ‡๋‹ค. 

 

๐Ÿ‘‰ ๋ฆฌ๋•์Šค์˜ 3๊ฐ€์ง€ ๊ทœ์น™

1๏ธโƒฃ ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์—๋Š” ํ•˜๋‚˜์˜ ์Šคํ† ์–ด

2๏ธโƒฃ ์ƒํƒœ๋Š” ์ฝ๊ธฐ์ „์šฉ(์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•œ๋‹ค. )

3๏ธโƒฃ ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ํ•จ์ˆ˜, Reducer๋Š” ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜(์ด์ „ ์ƒํƒœ ์ ˆ๋Œ€ ๊ฑด๋“ค์ง€ ์•Š๊ณ , ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚จ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜) 

 

๐Ÿ‘‰ ๋ฆฌ๋•์Šค์˜ ๊ธฐ๋ณธ ํ๋ฆ„

1๏ธโƒฃ ํ•˜๋‚˜์˜ ์ค‘์•™ ๋ฐ์ดํ„ฐ store๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. (๋ฐ์ดํ„ฐ๋Š” state(์ƒํƒœ)๋ฅผ ๋งํ•œ๋‹ค.)

2๏ธโƒฃ ์ƒํƒœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋“ค์˜ state ๊ฐ’์„ ์ˆ˜์ •ํ•ด์ค„ reducer ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.

3๏ธโƒฃ dispatch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ reducer์—๊ฒŒ state ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋ผ๊ณ  action ๊ฐ’๊ณผ ํ•จ๊ป˜ ์š”์ฒญํ•œ๋‹ค. 

 

๐Ÿ‘‰ ์˜ˆ์‹œ(์ˆซ์ž ์ฆ๊ฐ€, ๊ฐ์†Œ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ)

1๏ธโƒฃ ์ค‘์•™ store ๊ธฐ๋ณธ ์„ค์ •

import { configureStore } from "@reduxjs/toolkit"
import counterSlice from "./counterSlice"
import { logger } from "redux-logger";


// state slice๋Š” ์ด๋ฆ„์„ ๋ฐ”๊ฟ”๋„ ๋œ๋‹ค.   
const store = configureStore({
    reducer: {
    	counter : counterSlice,
    },
    middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(logger),

});

export default store;

๐Ÿ‘‰ configureStore์€ Redux ์Šคํ† ์–ด๋ฅผ ์‰ฝ๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ ๊ด€๋ฆฌ์— ์ง‘์ค‘ํ•˜๋ฉด์„œ  Redux๋ฅผ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

๐Ÿ‘‰ ๋ฏธ๋“ค์›จ์–ด๋Š” action์ด dispatch ๋˜์–ด์„œ reducer์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ์ค‘๊ฐ„์— ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ค. ์•ก์…˜์„ ๊ฐ€๋กœ์ฑ„์„œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ฑฐ๋‚˜, ์•ก์…˜์„ ์ทจ์†Œํ•˜๊ฑฐ๋‚˜, ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋“ฑ์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ‘‰ ๊ธฐ์กด์˜ ๋ฏธ๋“ค์›จ์–ด์— logger์€ ์•ก์…˜๊ณผ ๊ทธ์— ๋”ฐ๋ฅธ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ์ฝ˜์†”์— ๊ธฐ๋กํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด์ด๋‹ค. 

 

2๏ธโƒฃ slice ์ƒ์„ฑ

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

const initialState = {
   value: 0
}


export const counterSlide = createSlice({
   name : "conuter",
   initialState,
   reducers: {
      addCounter : (state) => {
         state.value += 1;
      }
      minusCounter : (state) => {
         state.value -= 1;
      }
   }
});

export default counterSlice.reducer;

export const { addCounter, minusCounter} = counterSlice.actions

๐Ÿ‘‰ createSlice์—์„œ ์ž๋™์œผ๋กœ ์•ก์…˜ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค๊ณ  reducer๋ฅผ ์กฐํ•ฉํ•œ๋‹ค. 

๐Ÿ‘‰ createSlice๋ฅผ ํ†ตํ•ด์„œ 3๊ฐ€์ง€์˜ ๊ทœ๊ฒฉ์— ๋งž๊ฒŒ ์ƒ์„ฑํ•œ๋‹ค. 1.์ด๋ฆ„, 2.์ดˆ๊ธฐ ์ƒํƒœ,  3. reducers ์•ˆ์— reducer ํ•จ์ˆ˜ ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. 

๐Ÿ‘‰ counterSlice.reducer์€ ์ตœ์ข…์ ์œผ๋กœ ์ƒ์„ฑ๋œ Reducer๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. slice reducer์„ ์˜๋ฏธํ•œ๋‹ค. 

๐Ÿ‘‰ ๊ทธ๋ฆฌ๊ณ  createSlice ํ•จ์ˆ˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ reducer ํ•จ์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ์•ก์…˜ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค. ์•ก์…˜ ์ƒ์„ฑ์ž๋“ค์€ counterSlice.actions ๊ฐ์ฒด์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ์•ˆ ๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

function addCounter() {
  return {
    type: 'counter/addCounter'
  }
}

function minusCounter() {
  return {
    type: 'counter/minusCounter'
  }
}

dispatch(addCounter());
dispatch(minusCounter());

 

3๏ธโƒฃ dispatch ์‚ฌ์šฉํ•˜์—ฌ state ๋ณ€๊ฒฝ

import { useDispatch, useSelector } from "react-redux";
import { addCounter, minusCounter } from "../store/counterSlice"

const Counter = () => {
     const count = useSelector((store) => store.counter.value)
	
     const dispatch = useDispatch();
     
     const addHandler = () => {
        dispatch(addCounter())
     };
     
     const minusHandler = () => {
       dispatch(minusCounter());
     }
	
     return (
       <div>
         <h1>counter</h1>
         <p>count: {count}</p>
         <div>
       	 <button onClick={addHandler}>์ฆ๊ฐ€</button>
         <button onClick={minusHandler}>๊ฐ์†Œ</button>
       	 </div>
       </div>
     
     )
}

 

๐Ÿ‘‰ dispatch๋ฅผ ์ด์šฉํ•ด์„œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

๐Ÿ‘‰ useSelector๋ฅผ ์ด์šฉํ•ด์„œ ์–ด๋–ค ์Šฌ๋ผ์ด์Šค์— ์ƒํƒœ๋ฅผ ์ด์šฉํ•˜๊ณ  ์‹ถ์€์ง€ ์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

๐Ÿ‘‰ ์—ฌ๊ธฐ ์•ก์…˜ ์ƒ์„ฑ์ž์— ์ž ๊น ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ฉด dispatch ํ•จ์ˆ˜๋Š” ์•ก์…˜์„ ๋ฐœํ–‰ํ•˜๊ณ , reducer์—์„œ ์ด ์•ก์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. 

 

๐Ÿ‘‰ ์•ก์…˜ ์ƒ์„ฑ์ž ๊ธฐ๋ณธ ํ˜•ํƒœ 

function addTodo(text) {
  return {
    type: 'ADD_TODO',
    payload: text
  };
}

๐Ÿ‘‰ ์ด ์•ก์…˜์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์Šคํ† ์–ด์— ๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ ๋ฌถ์Œ์ด๋‹ค. ๋ฐ˜๋“œ์‹œ type ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋‹ค. ๊ฐ์ฒด ํ˜•ํƒœ์ด๋‹ค. 

 

4๏ธโƒฃ Redux ์Šคํ† ์–ด React ์•ฑ์— ์—ฐ๊ฒฐ

import { Provider } from "react-redux";
import Counter from "../src/components/Counter"
import store from "../src/store";

function App() {
  return (
    <Provider store={store}>
      <div>
        <Counter />
      </div>
    </Provider>
  );
}

export default App;

๐Ÿ‘‰ ํ•ญ์ƒ Provider๋ฅผ ํ†ตํ•ด ์Šคํ† ์–ด๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ ์œ„์น˜ํ•˜๊ณ , store๋ผ๋Š” prop์„ ํ†ตํ•ด Redux ์Šคํ† ์–ด๋ฅผ ๋ฐ›๋Š”๋‹ค. 

 

 

 

 

 

๋ณธ ํ›„๊ธฐ๋Š” ์œ ๋ฐ๋ฏธ-์Šค๋‚˜์ดํผํŒฉํ† ๋ฆฌ 10์ฃผ ์™„์„ฑ ํ”„๋กœ์ ํŠธ์บ ํ”„ ํ•™์Šต ์ผ์ง€ ํ›„๊ธฐ๋กœ ์ž‘์„ฑ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

728x90