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.