Redux의 주요 개념 및 용어 정리

2020, Oct 20    

Redux란?

  • action이라는 이벤트를 사용하여 애플리케이션 상태를 관리하고 업데이트 하기 위한 패턴 및 라이브러리
  • 애플리케이션의 여러 부분에서 필요한 전역 상태를 관리함

Redux 라이브러리 도구

React-Redux

  • Redux 저장소와 상호작용할 수 있도록 하는 공식 패키지
// npm
npm install react-redux

// yarm
yarn add react-redux

Redux Toolkit

  • Redux 로직 작성에 권장되는 접근 방식 (Redux 앱 빌드에 필요한 함수와 패키지가 포함 되어있음)
## create-react-app 명령어를 통한 생성시
npx create-react-app my-app --template redux

## 이미 존재하는 프로젝트에 추가할 경우
# NPM
npm install @reduxjs/toolkit

# Yarn
yarn add @reduxjs/toolkit

Redux DevTools Extension

  • Redux 개발 도구

https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd

https://github.com/zalmoxisus/redux-devtools-extension

Redux 용어 및 개념

State Management (상태 관리)

  • 아래와 같은 상황에서는 부모컴포넌트로 state를 올려서 해결할 수 있지만 Redux는 상태 관리와 관련된 개념을 정의 및 분리하고 뷰와 상태 간의 독립성을 유지하는 규칙을 시행함으로써 코드에 더 많은 구조와 유지 관리 기능을 제공한다.
**function Counter() {
  // State(상태): a counter value
  const [counter, setCounter] = useState(0)

  // Action(액션): code that causes an update to the state when something happens
  const increment = () => {
    setCounter(prevCounter => prevCounter + 1)
  }

  // View(뷰): the UI definition
  return (
    <div>
      Value: {counter} <button onClick={increment}>Increment</button>
    </div>
  )
}**

Immutability (불변성)

  • Redux는 불변값을 변경하기 위해서 기존 객체를 복제하고 복제한 객체들을 수정하여 사용한다.
const obj = {
  a: {
    // To safely update obj.a.c, we have to copy each piece
    c: 3
  },
  b: 2
}

const obj2 = {
  // copy obj
  ...obj,
  // overwrite a
  a: {
    // copy obj.a
    ...obj.a,
    // overwrite c
    c: 42
  }
}

const arr = ['a', 'b']
// Create a new copy of arr, with "c" appended to the end
const arr2 = arr.concat('c')

// or, we can make a copy of the original array:
const arr3 = arr.slice()
// and mutate the copy:
arr3.push('c')

Action

  • type 속성값을 가진 자바스크립트 객체
  • type 필드는 작업을 설명하는 문자열이어야 함
const addTodoAction = {
  type: 'todos/todoAdded',
  payload: 'Buy milk'
}

Action Creators

  • 액션 객체를 생성하고 반환하는 함수
  • 일반적으로 사용하므로 매번 수동으로 액션 객체를 작성할 필요 없음
const addTodo = text => {
  return {
    type: 'todos/todoAdded',
    payload: text
  }
}

Reducers

  • stateaction 객체를 필요한 경우 상태를 업데이트 하는 방법을 결정하고, 새로운 상태를 반환함
  • Reducer 규칙
    • stateaction 인수를 기반으로 새 상태값만 계산해야 함
    • 기존의 state 를 수정할 수 없음. 기존 항목을 복사하고 복사된 값을 변경하여 업데이트 해야 함
    • 비동기 논리를 수행하거나 임의 값을 계산하거나 기타 부작용을 유발해서는 안됨
const initialState = { value: 0 }

function counterReducer(state = initialState, action) {
  // Check to see if the reducer cares about this action
  if (action.type === 'counter/increment') {
    // If so, make a copy of `state`
    return {
      ...state,
      // and update the copy with the new value
      value: state.value + 1
    }
  }
  // otherwise return the existing state unchanged
  return state
}

Store

  • 리덕스의 상태값을 갖는 객체
import { configureStore } from '@reduxjs/toolkit'

const store = configureStore({ reducer: counterReducer })

console.log(store.getState())
// {value: 0}

Dispatch

  • 상태를 업데이트하는 유일한 방법, 작업 객체를 호출하고 전달하는 것
store.dispatch({ type: 'counter/increment' })

console.log(store.getState())
// {value: 1}
const increment = () => {
  return {
    type: 'counter/increment'
  }
}

store.dispatch(increment())

console.log(store.getState())
// {value: 2}

Selectors

  • store 값에서 특정 정보를 부를 수 있는 함수 (반복되는 논리를 피할 수 있음)
const selectCounterValue = state => state.value

const currentValue = selectCounterValue(store.getState())
console.log(currentValue)
// 2

Middleware

  • 리듀서가 액션을 처리하기 전에 실행되는 함수