๐Ÿ“Frontend/๐Ÿ““etc

[WIL] Redux (feat. tool-kit)

Hoon2 2022. 10. 12. 22:52
728x90

โœ๏ธRedux ? ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€ ?

 

Redux๋ž€? ์™œ ์“ฐ๋Š”์ง€โ“ 

Redux๋Š” ์ƒํƒœ ์—…๋ฐ์ดํŠธ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ™์€ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•  ๋•Œ๋„ ์†์‰ฝ๊ฒŒ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์˜ค๊ฐ€๋ฉฐ props์™€ state๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ณต์žกํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์— store๋ฅผ ๋‘๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ „์—ญ์ƒํƒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ Context API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ, ๊ทœ๋ชจ๊ฐ€ ํฐ ๊ฒฝ์šฐ์—” ๋ฆฌ๋•์Šค๋กœ ํšจ์œจ์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

Redux์˜ 3๊ฐ€์ง€ ์›์น™ 

  • ๋‹จ์ผ์Šคํ† ์–ด
    • ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์—๋Š” ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šคํ† ์–ด๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ฝ๊ธฐ ์ „์šฉ ์ƒํƒœ
    • ๋ฆฌ๋•์Šค๋Š” ์ฝ๊ธฐ ์ „์šฉ ์ƒํƒœ์ด๋‹ค. ์ฝ๊ธฐ ์ „์šฉ ์ƒํƒœ์ธ ๊ฒƒ์€ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€๋˜์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ ์„ฑ๋Šฅ ์œ ์ง€๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์‹œ ์–•์€ ๋น„๊ต๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. *๋ถˆ๋ณ€์„ฑ : ๊ฐ’์ด๋‚˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. 
  • ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜ ๋ฆฌ๋“€์„œ
    • ๋ฆฌ๋“€์„œ๋Š” ๋ณ€ํ™”๋ฅผ ์ผ์œผ์ผœ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. state์™€ action๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ ์™ธ์˜ ๊ฐ’์—๋Š” ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ์กฐ๊ฑด์— ๋งž๋Š” ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

Redux ๊ธฐ๋ณธ ์šฉ์–ด

  • Store
    • ์Šคํ† ์–ด๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ €์žฅ์†Œ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋Š” ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. 
  • Action
    • ์Šคํ† ์–ด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด, ์•ก์…˜์„ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. ์•ก์…˜์€ ๊ฐ์ฒด์ด๋ฉฐ, type์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ์•ก์…˜ ๊ฐ์ฑ„๋Š” ์•ก์…˜์ƒ์„ฑํ•จ์ˆ˜์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง„๋‹ค.
  • Reducer
    • ๋ฆฌ๋“€์„œ๋Š” ํ˜„์žฌ ์ƒํƒœ์™€ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • Dispatch
    • ๋””์ŠคํŒจ์น˜๋Š” ์Šคํ† ์–ด์˜ ๋‚ด์žฅ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ค˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์ด๋‹ค.
  • Subscribe
    • ์Šคํ† ์–ด์˜ ๋‚ด์žฅ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋กœ, ๋ฆฌ๋ด์„œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, Subscribe๋œ ํ•จ์ˆ˜ ๋ฐ ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. 

  1. UI๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง๋  ๋•Œ, UI ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋•์Šค ์Šคํ† ์–ด์˜ ์ƒํƒœ์— ์ ‘๊ทผํ•˜์—ฌ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.
  2. ์ดํ›„ UI์—์„œ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด, ์•ฑ์€ ๋””์ŠคํŒจ์น˜๋ฅผ ์‹คํ–‰ํ•ด ์•ก์…˜์„ ์ผ์œผํ‚จ๋‹ค.
  3. ์ƒˆ๋กœ์šด ์•ก์…˜์„ ๋ฐ›์€ ์Šคํ† ์–ด๋Š” ๋ฆฌ๋“€์„œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฆฌ๋“€์„œ๋ฅผ ํ†ตํ•ด ๋‚˜์˜จ ๊ฐ’์„ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ์ €์žฅํ•œ๋‹ค.
  4. ์„œ๋ธŒ์Šคํฌ๋ผ์ด๋ธŒ๋œ UI์€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋กœ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๋ Œ๋”๋งํ•œ๋‹ค.

 

Redux Toolkit? 

๋ฆฌ๋•์Šค๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ์‚ฌ์šฉ ์‹œ 1๊ฐœ์˜ ์•ก์…˜์„ ์ƒ์„ฑํ•ด๋„ ์•ก์…˜ํƒ€์ž… ์ •์˜ -> ์•ก์…˜ํ•จ์ˆ˜ ์ƒ์„ฑ -> ๋ฆฌ๋“€์„œ ์ •์˜ ์˜ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. ๋งŽ์•„์ง€๋Š” ์•ก์…˜์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด redux-actions์„, ๋ถˆ๋ณ€์„ฑ ๋ณด์กด์„ ์œ„ํ•œ immer, store๊ฐ’์„ ํšจ์œจ์ ์œผ๋กœ ํ•ธ๋“ค๋งํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๊ธฐ ์œ„ํ•ด reselect, ๋น„๋™๊ธฐ ์ž‘์—…์„ ์œ„ํ•œ thunk ์™€ saga ๋“ฑ ๋ฆฌ๋•์Šค์˜ ์œ ํšจํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด 4~5๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๋‹ค.ํ•˜์ง€๋งŒ Redux Toolkit์€ ๋‚ด์žฅ๋œ ๊ธฐ๋Šฅ์œผ๋กœ saga๋ฅผ ์ œ์™ธํ•œ ์œ„์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.


๊ทธ๋ž˜์„œ ! ๋ฐ”๋€ Redux Toolkit์€์š”

  • Simple: ์Šคํ† ์–ด ์„ค์ •, ๋ฆฌ๋“€์„œ ์ƒ์„ฑ, ๋ถˆ๋ณ€์„ฑ ์—…๋ฐ์ดํŠธ ๋กœ์ง ์‚ฌ์šฉ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ ํฌํ•จ
  • Opitionated: ์Šคํ† ์–ด ์„ค์ •์— ๊ด€ํ•œ ๊ธฐ๋ณธ ์„ค์ • ์ œ๊ณต, ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” redux addon์ด ๋‚ด์žฅ
  • Powerful : Immer์— ์˜๊ฐ์„ ๋ฐ›์•„ '๋ณ€๊ฒฝ'๋กœ์ง์œผ๋กœ '๋ถˆ๋ณ€์„ฑ'๋กœ์ง ์ž‘์„ฑ ๊ฐ€๋Šฅ, state ์ „์ฒด๋ฅผ slice๋กœ ์ž๋™์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
  • Effective : ์ ์€ ์ฝ”๋“œ์— ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ

createSlice = action + reducer 

createSlice๋Š” Ducks ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด action๊ณผ reducer๋ฅผ ์ „๋ถ€ ๊ฐ€์ง„ ํ•จ์ˆ˜์ด๋‹ค.

import axios from 'axios';
import {createSlice, createAsyncThunk} from '@reduxjs/toolkit';

let initialState = {
    poke:[],
    list:[
        {id:1, text:'์•ˆ๋…•ํ•˜์„ธ์š”'}
    ],
    load:false
}

// thunk ์ƒ์„ฑ
export const fetchPoke = createAsyncThunk(
    'news/fetchPoke',
    async () => {
        const res = await axios.get('https://pokeapi.co/api/v2/pokemon/ditto');
        const data = res.data.species;
        return data;
    }
)

const newsSlice = createSlice({
    name:'news',
    initialState,
    reducers: {
        add:(state, action)=> {
            console.log(action.payload);
            state.list = [...state.list, {id:action.payload.id, text:action.payload.text}]
        },
        load(state, action) {
            state.load = !state.load
        }
    },
    extraReducers: {
        [fetchPoke.pending]:(state) => {
            console.log(state.load);
            state.load = !state.load;
        },
        [fetchPoke.fulfilled]:(state, action) => {
            state.load = !state.load;
            state.poke.push({name:action.payload.name, url:action.payload.url});
        }
    }
})
const newsActions = newsSlice.actions;
export {newsActions};

export default newsSlice.reducer;

 

createAsyncThunk

createAsyncThunk์—์„œ๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›๋Š”๋ฐ ์ฒซ ๋ฒˆ์งธ๋กœ ์•ก์…˜์˜ ํƒ€์ž…, ๋‘ ๋ฒˆ์งธ๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ๋Š” axios๋กœ APIํ†ต์‹ ์„ ํ•˜๊ณ  data๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋กœ์ง์ด๋‹ค. ๋ฐ›์•„์˜จ data๋ฅผ return์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

 

extraReducers

thunk๋Š” promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ promise์˜ ์ƒํƒœ์—๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

pending
fulfilled
reject

 

unwrap ?

unwrap()์€ thunk์—์„œ ๋น„๋™๊ธฐ ํ†ต์‹ ์œผ๋กœ ์–ป์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

const temp = async () => {
    const result = await dispatch(fetchPoke()).unwrap();
    console.log(result);
  }

 

๐ŸŽฏ์ถœ์ฒ˜

https://freestrokes.tistory.com/160

 

React Redux ์•Œ์•„๋ณด๊ธฐ

React Redux ์•Œ์•„๋ณด๊ธฐ React์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Redux์— ๋Œ€ํ•ด ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. 1. Redux Redux๋Š” ์ƒํƒœ ์—…๋ฐ์ดํŠธ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ

freestrokes.tistory.com

 

https://velog.io/@sweet_pumpkin/%EB%AC%B4%EC%9E%91%EC%A0%95%EB%94%B0%EB%9D%BC%ED%95%98%EA%B8%B0-%EC%B5%9C%EA%B3%A0-%EB%A6%AC%EB%8D%95%EC%8A%A4%EC%95%BC-%EA%B3%A0%EB%A7%99%EB%8B%A4-Redux-Redux-Toolkit-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

 

์ตœ๊ณ  ๋ฆฌ๋•์Šค์•ผ ๊ณ ๋ง™๋‹ค! Redux & Redux Toolkit ์•Œ์•„๋ณด๊ธฐ

๋ฆฌ๋•์Šค๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜๋กœ, ํ˜„์žฌ๊นŒ์ง€ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๊ณ  ์žˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ๋ž€ UI์™€ UX์— ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, ์„œ๋ฒ„์™€ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.๊ฐ„๋‹จํ•œ ํ”„๋กœ์ 

velog.io

 

https://velog.io/@djaxornwkd12/Redux-Toolkit-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

 

Redux Toolkit ์•Œ์•„๋ณด๊ธฐ

์˜ค๋Š˜์€ ๋ฆฌ๋•์Šค ํˆดํ‚ท์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž~! Redux Toolkit์ด๋ž€ ์‚ฌ์šฉ์ด์œ  Redux Toolkit์€ Redux๋ฅผ ๋” ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Redux์—์„œ ๊ณต์‹ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ๋„๊ตฌ์ด๋‹ค. Redux Toolkit์€ ์•„๋ž˜์™€ ๊ฐ™์€ Redux์˜ ๋ฌธ์ œ์ 

velog.io

 

 

728x90