리덕스

  • 최근에 많이 사용하는 전역 상태 관리 방식은 Recoil입니다.
    • 리덕스에서는 비동기 처리를 위해서는 Redux Thunk나 Redux Saga와 같은 미들웨어를 사용해야 했는데 recoil은 비동기 처리를 기반으로 작성되었기 때문에 바로 활용할 수가 있습니다.
  • 하지만 기존 사용자가 많은 것은 Redux입니다.
    • 기존 사용자가 많은 경우 사용자 커뮤니티가 잘 구축되어 있기 때문에 유지 보수가 편리하며 문제 발생 시 더 도움을 받기 쉽습니다.

1. Data Binding

  • 이전의 데이터 관리에는 mvc패턴을 사용했었는데 문제가 생겨서 flux패턴을 사용하게 되었습니다.
  • jQuery나 DOM API로 데이터를 보여주려면 직접 js에 접근해서 코드까지 수정해야 했습니다.
$('p').text(unreadCount);

1. 1. 단방향

  • React가 단방향입니다.
  • SetState → State → view로 한 방향으로 갑니다.

1. 2. 양방향

2. MVC Pattern

  • 리덕스가 나온 이유는 MVC 패턴이 불편해서 나온 것입니다.
  • MVC 패턴은 이렇습니다.Action → Controller → Model ↔  View
  • Model
    • 데이터입니다.
  • View
    • 화면, html, layout입니다.
  • Controller
    • EventHandler와 Event를 처리하는 로직이 있는 곳입니다.
    • 데이터와 View를 이어주는 역할을 합니다.
    • 이벤트가 오면 적절한 로직이 실행되도록 합니다.

2. 1. 너무 많이 쓰일 때 이런 문제가 생겼습니다.

  • Controller
    • →Model
    • →Model
    • →Model
    • →Model
  • 규모가 커지니까 너무 복잡해졌습니다.
  • 새로운 개발자가 합류했을 때 코드 이해가 어렵게 되었습니다.

3. Flux 패턴

  • 단방향 데이터 흐름이 핵심입니다.
  • 다음과 같습니다.
Action -> Dispatcher -> Store -> View
  • 리덕스에서 사용하는 용어들이 여기에 다 들어있습니다.
  • Action이 발행되면 해당 Action에 영향이 있는 모든 View가 갱신(rerender)됩니다. 흐름이 단방향이기 때문에 어디에서 어떤 일이 일어나는지 알 수 있습니다.
  • Dispatcher
    • 이것을 통해 action을 발행합니다.
  • Store
    • 데이터와 비즈니스 로직을 가지고 있는 저장소입니다.
  • View
    • 보여지는 화면입니다.

4. 리덕스(Redux) Intro

4. 1. 왜 사용할까요?

  • Props가 위 컴포넌트에서 아래 컴포넌트로 받아서 계속 내려 보내야 하는데, 이 과정이 너무 불편하기 때문에 사용합니다.
  • 데이터를 저장할 때 LocalStroage를 사용합니다. 그런데 LocalStroage는 말 그대로 로컬에 저장되기 때문에 사용자가 데이터에 접근할 수 있는 상태가 됩니다. 하지만 Redux에 상태가 저장되어 있다면 사용자가 볼 수 없기 때문에 보안성이 더 크다고 볼 수 있습니다.
  • Redux로 상태 관리를 하기 좋은 것들은 다음과 같습니다.
    • Dark Mode, 로그인 정보, 언어 설정
    • 이런 것들은 전역에서 상태를 관리하고 있는 것들이기 때문에 리덕스를 사용하면 좋습니다.

4. 2. Redux

	     ------Action ------
             ↓		        ↑	                 
Action -> Dispatch -> Store -> View
  • Store: 전체가 관리되는 공간
  • Action : State변화를 일으킬 수 있는 현상등이라고 생각할 수 있습니다. 행동 정보를 가지고 있습니다.
  • Dispatcher : Action이 일어나면 Dispatcher가 state를 업데이트시킵니다.
  • View: state가 변경되면 View에서 감지하고 화면에 반영합니다. (Rerender)
  • 즉, 한 방향으로 진행됩니다.

4. 3. Redux의 세 가지 원칙

  • 전체 상태값이 하나의 객체로 표현됩니다.
    • React App의 store는 단 하나입니다!
  • 상태값(state)은 읽기 전용입니다.
    • setState처럼 Redux에서 state관리하는 것입니다.
  • 상태값(state)은 순수 함수에 의해서만 변경되어야 합니다.
    • state의 값을 바꾸는 함수가 필요합니다.
    • 그 함수를 reducer라고합니다.
    • 이 함수는 순수함수(pure fuction)이어야 합니다.
      • 순수함수란 Input은 항상 같은 Output을 반환하는 함수입니다.
      • ex) a + b ⇒ (a+b)
      • random(), New date(), fetch → 이런 것들은 순수함수가 아닙니다.

5. Redux 사용

5.1. 언제 사용하나요?

  • 모달
    • 모달 창은 클릭하면 열고 아니면 닫고 이런 코드가 있겠죠?
    • 상태(state)는 showModal 이 불리언(boolean)으로 되어 있을 것입니다.
    • true가 되면 모달이 열릴 것입니다.
    • portal이라는 것이 있습니다.
      • 모달이 열릴 곳을 미리 만들어 놓는 것입니다.

5.2. Action

5.2.1. Action의 생김새

{
	type: 'SHOW_MODAL'
}

5.2.2. Action의 특징

  • 액션은 객체입니다.
  • 액션은 반드시 ‘type’ 프로퍼티가 있어야 합니다.
  • 일반적으로 type은 어떤 행동을 설명하는 문자열입니다. (조작하고 싶은 내용)
  • type 이외에 다른 프로퍼티를 가져도 되는데 주로 부가적인 데이터를 전달하고 싶을 때 사용합니다.

5.2.3. Action의 정의

react 프로젝트에서 사용할 action은 객체 리터럴로 바로 정의하는 것이 아니라, action을 만들어주는 함수를 통해 만듭니다. 이러한 함수를 Action Creator(액션 생성자)라고 합니다.

// showModal이 Action 생성자
function showModal() {
	return { type: 'SHOW_MODAL'}  // <- Action!
}

Action은 일반적으로 '행동 정보'인 type만 갖고 있지는 않고, 부가적인 정보를 포함하고 있습니다.

function showModal({ title }) {
	return { type: 'SHOW_MODAL', title }
}
  • view에서 액션이 발생되므로, 이때 view에 따라 다양한 추가적인 정보를 넘기게 됩니다.

action 생성은 이렇게 showModal 함수를 호출하면 됩니다.

showModal({ title: '로그인' });

5.3.1. Reducer의 형태

(state, action) => nextState

5.3.2. Reducer의 정의

function modal(state, action) {

  switch(action.type) {
    case 'SHOW_MODAL':   // SHOW_MODAL 이라는 action이 발행되면
      return {
        ...state, // state 객체 중에서 이전에 있는 값들을 같이 불러와서 보내야 하기 때문에 ...state를 사용했습니다.
        showModal: true  // 전역 state 중에서 showModal의 값을 true로 바꿉니다.
      };
    case 'CLOSE_MODAL':
      return {
        ...state,
        showModal: false
      };
    default:
      return state;
  }

}

5.4. Store

//index.js
import { createStore } from 'redux'
import modalReducer from './ModalReducer';

const **store** = createStore(modalReducer);
  • redux에서 제공하는 createStore 함수 생성
  • store를 생성할 때 reducer를 인자로 전달

5.5. 기타

  • 폴더 구조는 redux - store 로 만든 경우도 있고
  • store를 바로 넣는 경우도 있습니다.

♧ 이 내용은 원티드, 위코드 프리온보딩 코스 강의를 들으면서 정리한 내용입니다.

Last modified: 2022년 02월 13일

Comments

Write a Reply or Comment

Your email address will not be published.