ABOUT ME

์ตธ์ด์ž…๋‹ˆ๋‹ค๐Ÿ’›

Today
Yesterday
Total
  • React Redux
    ๊ณต๋ถ€ 2022. 7. 6. 22:17

    Redux๋ž€? ๐Ÿ‘€

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

    Redux ๊ธฐ๋ณธ ์šฉ์–ด ๐Ÿ—ฃ

    1. ์•ก์…˜(Action)

    ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์•ก์…˜์„ ์ผ์œผ์ผœ์•ผ ํ•œ๋‹ค. ์•ก์…˜์€ ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋˜๋ฉฐ, type ํ•„๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค.

    {
       type: 'ADD_TODO',
       data: {
           id: 1,
           text: '๋ฆฌ๋•์Šค ๋ฐฐ์šฐ๊ธฐ'
       }
    }
    

      2. ์•ก์…˜ ์ƒ์„ฑํ•จ์ˆ˜(Action Creator)

    ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜๋Š” ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ๋„ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

    function addTodo(data) {
     return {
       type: 'ADD_TODO',
       data,
     }
    }
    

      3. ๋ฆฌ๋“€์„œ(Reducer)

    ๋ฆฌ๋“€์„œ๋ฅผ ํ•œ๊ตญ์–ด๋กœ ํ•ด์„ํ•ด๋ณด๋ฉด ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋ฆฌ๋“€์„œ๋Š” ํ˜„์žฌ ์ƒํƒœ์™€ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„, ํ•„์š”ํ•˜๋‹ค๋ฉด ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋‹ค. ์•ก์…˜ ์œ ํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

    const count = 1
    
    // Reducer๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์—๋Š” ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์ธ์ž๋กœ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
    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๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’์ด ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
    

      4. ์Šคํ† ์–ด(Store)

    ์Šคํ† ์–ด์—๋Š” ์ƒํƒœ๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋Š” ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

    import { createStore } from 'redux';
    
    const store = createStore(rootReducer);
    

         5. ๋””์ŠคํŒจ์น˜(Dispatch)

    ์Šคํ† ์–ด ๋‚ด์žฅ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์ธ ๋””์ŠคํŒจ์น˜๋Š” ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ค˜์„œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    // Action ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ
    dispatch( { type: 'INCREASE' } );
    dispatch( { type: 'SET_NUMBER', payload: 5 } );
    
    // ์•ก์…˜ ์ƒ์„ฑ์ž(Action Creator)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
    dispatch( increase() );
    dispatch( setNumber(5) );
    

    Reducx Hooks ๐Ÿฃ

    React์—์„œ Redux๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Hooks ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณต

    • useSelector()

    ์ปดํฌ๋„ŒํŠธ์™€ state๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ Redux์˜ state์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋‹ค.

    // Redux Hooks ๋ฉ”์„œ๋“œ๋Š” 'redux'๊ฐ€ ์•„๋‹ˆ๋ผ 'react-redux'์—์„œ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
    import { useSelector } from 'react-redux'
    const counter = useSelector(state => state.counterReducer)
    console.log(counter) // 1
    
    • useDispatch()

    Action ๊ฐ์ฒด๋ฅผ Reducer๋กœ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ๋ฉ”์„œ๋“œ. ์œ„์—์„œ Dispatch๋ฅผ ์„ค๋ช…ํ•  ๋•Œ ์‚ฌ์šฉํ•œ dispatch ํ•จ์ˆ˜๋„ useDispatch()๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ.

    import { useDispatch } from 'react-redux'
    
    const dispatch = useDispatch()
    dispatch( increase() )
    console.log(counter) // 2
    
    dispatch( setNumber(5) )
    console.log(counter) // 5
    

    Redux์˜ ์„ธ๊ฐ€์ง€ ์›์น™ ๐Ÿฃ

    1. Single source of truth
    2. ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ณณ์—์„œ ๊ฐ€์ง€๊ณ  ์™€์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋””๋ฒ„๊น…์ด ์‰ฌ์›Œ์ง€๊ณ  ์„œ๋ฒ„์™€์˜ ์ง๋ ฌํ™”๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ  ์‰ฝ๊ฒŒ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„๋“ค์—ฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
    3. State is read-only
    4. ์ƒํƒœ๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๋ผ๋Š” ๋œป์œผ๋กœ, React์—์„œ ์ƒํƒœ๊ฐฑ์‹ ํ•จ์ˆ˜๋กœ๋งŒ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, Redux์˜ ์ƒํƒœ๋„ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, Action ๊ฐ์ฒด๊ฐ€ ์žˆ์–ด์•ผ๋งŒ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ๊ณผ ์—ฐ๊ฒฐ๋˜๋Š” ์›์น™์ž…๋‹ˆ๋‹ค.
    5. Changes are made with pure functions
      • ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” ์ด์ „ ์ƒํƒœ์™€ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋‹ค.
      • ํŒŒ๋ผ๋ฏธํ„ฐ ์™ธ์˜ ๊ฐ’์—๋Š” ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
      • ์ด์ „ ์ƒํƒœ๋Š” ์ ˆ๋Œ€๋กœ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ , ๋ณ€ํ™”๋ฅผ ์ค€ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      • ๋˜‘๊ฐ™์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ˜ธ์ถœ๋œ ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” ์–ธ์ œ๋‚˜ ๋˜‘๊ฐ™์€ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
      ๋ฆฌ๋•์Šค๋Š” ์–ธ์ œ์“ฐ๋Š”๊ฒŒ ์ข‹์„๊นŒ? ๐Ÿฅ
      1. ์•ฑ์˜ ์—ฌ๋Ÿฌ ์œ„์น˜์—์„œ ํ•„์š”ํ•œ ๋งŽ์€ ์–‘์˜ ์ƒํƒœ๋“ค์ด ์กด์žฌํ•  ๋•Œ (์ „์—ญ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋Š๊ปด์งˆ ๋•Œ)
      2. ์ƒํƒœ๋“ค์ด ์ž์ฃผ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ
      3. ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋กœ์ง์ด ๋ณต์žกํ•  ๋•Œ
      4. ์•ฑ์ด ์ค‘๊ฐ„ ๋˜๋Š” ํฐ ์‚ฌ์ด์ฆˆ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์— ์˜ํ•ด ์ฝ”๋“œ๊ฐ€ ๊ด€๋ฆฌ๋  ๋•Œ
      5. ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์‹œ์ ์„ ๊ด€์ฐฐํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ
      6. ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค. ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค.

    '๊ณต๋ถ€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

    [CSS] ๊ธฐ์ดˆ  (0) 2022.07.05
    Unit4 - [HTML] ๊ธฐ์ดˆ  (0) 2022.07.04
    [JavaScript] ๊ธฐ์ดˆ ์ œ์–ด๋ฌธ2  (0) 2022.07.01
    [JavaScript] ๊ธฐ์ดˆ  (0) 2022.06.30
    22.04.25 Learn how to learn  (0) 2022.06.29
Designed by Tistory.