Post

리액트 상태 관리 라이브러리

상태 관리에 대한 3가지 접근 방식

  • Flux

    • 저장소, 액션, 리듀서 등을 이용해서 상태를 업데이트하는 방식
    • Redux, zustand
  • Proxy

    • 컴포넌트에 사용되는 일부 상태를 자동으로 감지해서 업데이트 하는 방식
    • Mobx, Valtio
  • Atomic

    • 원자를 이용하여 상태를 관리하고, 분산하는 방식
    • Atom(원자; 상태의 단위)는 상태를 관리하기 위한 구성 요소
    • Recoil, Jotai

#Redux Redux toolkit

redux 공식 문서
redux toolkit 공식 문서

중앙 집중식 스토리지와 상태 업데이트를 위한 reducer를 사용한다.
단방향 데이터 흐름

  • action이 발생되면 디스패치에 의해 중앙 스토어에 변경된 사항이 저장되고, 변경된 사항이 자동으로 업데이트 된다.

장점

  • 탄탄한 커뮤니티와 버그가 생겨도 해결하기 쉽다.
  • 참고할만한 보일러플레이트가 많다.
  • 미들웨어를 사용하면 비동기 처리를 할 수 있다.
  • 단방향 데이터 흐름이기때문에 reducer 등의 단위 테스트가 비교적 쉽다.
  • 액션에 따른 모든 변경을 추적할 수 있다.
  • 상태를 쉽게 예측할 수 있고, 유지보수가 편리하다.

단점

  • 구조가 매우 복잡하다.
  • 상태 관리를 위해 작성해야하는 코드들이 불필요하게 많다.
  • 새로 고침 시 리덕스 store의 state가 초기화된다.
    • redux-persist를 설치해서 sessionStorage, localStorage에 저장할 수 있다.
  • Hook 기반의 상태관리 라이브러리가 아니다.

Redux를 사용하면 좋은 경우

  • 큰 규모의 코드베이스로 많은 사람들이 작업해야할 때

#Zustand

zustand github

Zustand는 독일어로 ‘상태’라는 뜻을 가진 라이브러리이며 Jotai를 만든 카토 다이시가 제작에 참여하고 적극적으로 관리하는 라이브러리이다.

Zustand 특징

  • 특정 라이브러리에 엮이지 않는다
  • 한 개의 중앙에 집중된 형식의 스토어 구조를 활용한다
  • 상태를 정의하고 사용하는 방법이 단순하다
  • Context API를 사용할 때와 달리 상태 변경 시 불필요한 리랜더링을 일으키지 않도록 제어하기 쉽다.
  • 동작을 이해하기 위해 알아야 하는 코드 양이 아주 적다.

장점

  • 187KB의 작은 크기
  • 사용법이 간단하다
  • 작성해야하는 코드가 적다
  • Redux devtools 이용해서 디버깅할 수 있다
  • subscribe 기능을 사용하면 자주 렌더링 되는 항목에 대해 렌더링을 유발하지 않고 변경할 수 있다.
  • Hook 기반으로 만들 수 있다.

사용방법

  • create 함수를 이용하여 상태와 상태를 변경하는 액션을 정의한다.
1
2
3
4
5
6
7
8
import create from "zustand";

// set 함수를 통해서만 상태를 변경할 수 있다
const useStore = create((set) => ({
  bears: 0,
  increasePopulation: () => set((state) => ({ bears: state.bears + 1 })),
  removeAllBears: () => set({ bears: 0 })
}));

#Recoil

공식문서

장점

  • useState 훅과 비슷, 직관적이면서 간단한 구조이다.
  • Selector를 사용하여 비동기 처리를 할 수 있다.

단점

  • devtool 이 없어 디버깅이 상대적으로 불편하다.
  • 전역 상태에 직접 접근하여 상태를 업데이트 할 수 있기 때문에 어느 컴포넌트가 언제 상태를 변경하는지 알기 어렵다
  • 업데이트가 느리다.

#jotai

공식문서

atom : 상태조각, 아주 작은 단위의 상태
atomic model을 기반으로 만든 상태 관리 라이브러리

출처:https://velog.io/@turret1234/React-Jotai%EB%84%8C-%EB%88%84%EA%B5%AC%EB%83%90

장점

  • useState 훅과 비슷, 직관적이면서 간단한 구조이다.
  • 사용이 쉽다.
  • 비동기처리를 위해 별도의 라이브러리를 설치할 필요가 없다.
  • 리렌더링 문제를 줄여주고, selectAtom, splitAtom과 같은 유틸을 지원해준다.
  • react-quey등의 다른 라이브러리들과 쉽게 연동할 수 있다.

참고 사이트

This post is licensed under CC BY 4.0 by the author.