[React] redux-persist

2023. 2. 11. 15:32·React/실험실
반응형

redux는 이미 많은 개발자가 사용하는 상태 관리 라이브러리이다. 

React의 상태 관리 라이브러리는 한 가지 고려할 점이 있는데, 일반적인 상태와 같이 새로고침 시 상태가 사라진다. 

 

이것을 해결하기 위해서 local 또는 session 을 사용해서 reducer를 저장해서 새로고침 시 데이터를 

redux에 가져올 수 있다. 

 

다음과 같은 기능을 redux-persist가 제공해준다. 

 

설치 

yarn add @reduxjs/toolkit react-redux redux-persist

reduxjs/toolkit과 react-redux는 redux를 사용하기 위해서 설치했고 redux-persist는 따로 설치해야 한다. 

 

만약 타입스크립트를 사용한다면, 

yarn add -D @types/redux-persist

추가로 설치해주면 된다. 

 

persist Store 정의 

import { combineReducers, configureStore } from "@reduxjs/toolkit";
import { persistReducer, persistStore } from "redux-persist";
import storageSession from "redux-persist/lib/storage/session";

import Counter from "./counter";
import User from "./user";

const reducers = combineReducers({
  counter: Counter.reducer,
  user: User.reducer,
});

const persistConfig = {
  key: "root",
  storage: storageSession,
  whitelist: ["user"],
};

export const store = configureStore({
  reducer: persistReducer(persistConfig, reducers),
  devTools: process.env.NODE_ENV !== "production",
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({ serializableCheck: false }),
});

export const persistor = persistStore(store);

전체적으로는 redux 세팅과 동일하지만 다른 부분이 있다. 

 

const persistConfig = {
  key: "root",
  storage: storageSession,
  whitelist: ["user"],
};

persist store의 설정을 나타낸다. 

key는 storage에 저장되는 key 명칭을 의미하고, storage는 local과 session을 설정할 수 있다. 

 

만약 localStorage에 저장하고 싶다면 

import storage from 'redux-persist/lib/storage

sessionStorage의 경우에는 

import storageSession from 'redux-persist/lib/storage/session

를 불러와서 넣어주면 된다. 

 

whitelist의 경우 허용하는 reducer를 지정하는 것이며, blacklist도 설정이 가능하다. 

blacklist는 해당하는 reducer만 제외하고 저장하는 것이다. 

 

export const store = configureStore({
  reducer: persistReducer(persistConfig, reducers),
  
  // ...
});

reducer들을 하나의 Root Reducer로 합쳐주는 configureStore에서 reducer 부분을 persistReducer로 설정과

함께 추가한다.

 

persistReducer는 redux-persist와 리덕스모듈 정보를 종합해서 persist 정보를 반환한다. 

 

export const persistor = persistStore(store);

마지막으로 persistStore는 persist 전용 store를 만들기 위해서 사용한다. 

정의된 store 내용에 따라 리덕스 데이터를 유지시킬 수 있는 리덕스 스토어를 생성한다. 

 

import { Provider } from "react-redux";
import { PersistGate } from "redux-persist/integration/react";
import Home from "./pages/home";
import { persistor, store } from "./redux/store";

function App() {
  return (
    <Provider store={store}>
      <PersistGate loading={null} persistor={persistor}>
        <Home />
      </PersistGate>
    </Provider>
  );
}

export default App;

이제 persist를 설정한다. 

 

<PersistGate loading={null} persistor={persistor}>
  // ...
</PersistGate />

PersistGate는 리덕스 스토어에 유지시키고자 하는 데이터를 문제없이 저장하고 불러올 수 있도록 

UI 렌더링을 지연시키는 역할을 한다. 

 

여기서 사용되는 loading은 UI 렌더링의 지연시간을 나타낸다. 

null 또는 ms 단위로 설정할 수 있다. loading={1000}을 할 경우 1초 뒤에 UI가 렌더링된다. 

 

실행

persist로 지정한 데이터는 애플리케이션에서 확인이 가능한데, 

다음과 같이 데이터가 저장되어 있다. 

반응형
저작자표시 비영리 변경금지 (새창열림)

'React > 실험실' 카테고리의 다른 글

[React] swiper 부드럽게 흐르는 슬라이드  (0) 2023.03.15
[React] useForm  (0) 2023.03.05
[React] Compound Component 패턴  (1) 2023.02.04
[React] Context Module Function 패턴  (0) 2023.02.02
[React] Context API 언제 사용해야할까?  (0) 2023.01.31
'React/실험실' 카테고리의 다른 글
  • [React] swiper 부드럽게 흐르는 슬라이드
  • [React] useForm
  • [React] Compound Component 패턴
  • [React] Context Module Function 패턴
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    next.js
    다이소
    바질
    리얼학습일기
    리얼클래스
    redux
    CCNA
    영어회화
    Node.js
    네이버 부스트캠프
    react
    webpack
    javascript
    Docker
    리액트
    프로그래머스
    네트워크
    영어독학
    ReactNative
    식물
    타입스크립트
    ChatGPT
    덤프
    바질 키우기
    Babel
    자바스크립트
    CSS
    알고리즘
    typescript
    타일러영어
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[React] redux-persist
상단으로

티스토리툴바