본문 바로가기

Hanghae99

221207 TIL 팀과제 1

 Q3. <form>을 사용할 때, <button type="submit">을 함께 사용하면 리덕스 데이터가 초기화 되는데, 왜 초기화 되는 지 생각해봅시다.

<form> 은 어떤 역할을 할까?

  • HTML <form> 요소는 이용자의 정보들을 입력받는 구역에 많이 사용는데, 입력받은 정보들을 클라이언트에서 서버로 데이터를 보내는 역할을 하는 입력양식 태그입니다.
  • <form>이 작동하는 방식

  • 리액트에서는 보통 state로 form의 value를 관리하고 submit 이벤트로 원하는 동작을 실행합니다.
  • <form> 태그 내에 있는 <button type="submit">은 click시에 submit 후에 새로고침을 수반하게 됩니다.
  • 그 이유는 양식을 제출한 후에 새로운 입력 양식을 화면에 보여주어야 하기 때문입니다.
    • <button> 은 type=”submit”을 쓰지 않아도 새로고침을 수행합니다.
      • 왜냐하면 <button> 의 기본 속성은 submit 이기 때문입니다.
      • 그렇기 때문에 <button>에는 type 속성을 명시해 두는 것이 좋습니다.
      • <button>의 type에는 총 3가지 속성이 있습니다.
        1. submit: 버튼이 서버로 양식 데이터를 제출합니다. 지정하지 않은 경우 기본값이며, 유효하지 않은 값일 때도 사용합니다.
        2. reset: 모든 컨트롤을 초깃값으로 되돌립니다.
        3. button: 기본 행동이 없으며 클릭했을 때 아무것도 하지 않습니다. 클라이언트측 스크립트와 연결할 수 있습니다.
      • 그렇기 때문에 MDN 문서에도 아래와 같이 안내가 되어 있습니다.
      • <button>: 버튼 요소출처: https://developer.mozilla.org/ko/docs/Web/HTML/Element/button
      • 양식 제출용 버튼이 아니라면 type특성을 button으로 지정하는걸 잊지 마세요. 기본값에서는 버튼을 눌렀을 때 양식 데이터를 제출하고, (존재하지 않는) 응답을 불러오려고 시도하는 과정에서 문서의 현재 상태가 사라질 수 있습니다.

‘새로고침’을 하면 Redux의 데이터는 왜 초기화 되는걸까?

  • 그 이유는 redux를 사용하는 react는 SPA 로서 CSR 방식으로 렌더링을 하기 때문입니다.
    • SPA 란?
      • SPA는 Single Page Application 의 약자로서 쉽게 말하면 하나의 페이지로 구성된 어플리케이션입니다.
      • SPA는 하나의 HTML 파일을 가지고 나머지는 javascript를 이용해서 동적으로 화면을 구성합니다.
      • 즉, 최초 로딩 때 실행한 HTML 파일에서 변경되지 않는 부분은 그대로 두고 변경되는 부분만 다시 렌더링하여 효율적인 변경이 가능합니다.
    • CSR이란?
      • CSR은 Client Side Rendering의 약어로서, 인터넷 브라우저와 같은 클라이언트에서 렌더링 하는 렌더링 방식을 말합니다.
      • 다시 말해, 서버로부터 css,js 링크만 있는 빈 HTML파일 (Json 파일)을 전송받아 클라이언트에서 렌더링하는 방식입니다.
    • 이처럼 CSR 방식을 사용하는 react에서 새로고침을 하게되면 브라우저는 처음에 세팅되어 있던 데이터를 새로 받아오게 됩니다.
    • 그렇기 때문에 ‘새로고침’ 시에 redux의 모든 데이터는 초기값으로 돌아가는 것입니다.

Q4. 새로고침 시에도 리덕스 내의 데이터를 유지하려면 어떤 방법을 써야할까요?

redux-persist를 사용하면 됩니다.

  • redux-persist는 새로고침시에도 redux의 state가 초기화 되지 않도록 합니다.
  • 그 방식은 local storage 또는 session에 저장하고자 하는 reducer state를 저장하여, 새로고침 하여도 저장 공간에 있는 데이터를 redux에 불러오는 것입니다.
    • Local storage란?
      • html5에서 제공하는 Web storage로는 local storage와 session storage가 있다.
      • 둘다 웹의 데이터를 클라이언트에 저장할수 있는 저장소의 역할을 한다.
      • 그러나 가장 큰 차이점은 지속성이다.
      Local storage Session storage
      1. 도메인마다 별로도 저장소가 생성된다. 따라서 도메인만 같으면 브라우저가 달라도 저장된 데이터가 공유된다. 1. 세션(브라우저)이 종료되면 저장된 데이터가 사라진다.
      2. 시간 제한이 없고, 심지어 브라우저가 꺼져도 데이터가 남아있음. 2. 도메인이 같아도 다른 브라우저를 실행하면 각각의 저장소가 생성된다.
      3. 값을 지우기 위해서는 직접 지워야 한다.  

redux-persist 설치 방법

  • 아래 명령어를 터미널에 입력해서 redux-persist를 설치한다.
npm install redux-persist
  • configStore에 아래와 같은 code를 삽입한다. 
// reducers/index.js
import { combineReducers } from "redux";
// persistStore, persistReducer 를 추가
➊ import { persistStore,persistReducer } from "redux-persist";
// localStorage에 저장하고 싶은 경우에 아래와 같이 code 추가
➋ import storage from "redux-persist/lib/storage";
// session 에 data를 저장하고 싶으면 아래 code를 추가해준다.
// import storageSession from 'redux-persist/lib/storage/session'

import auth from "./auth";
import board from "./board";
import studio from "./studio";

➌ const persistConfig = {
  key: "root",
  storage,   // localStorage에 저장합니다
  whitelist: ["auth"] // auth, board, studio 3개의 reducer 중에 auth reducer만 localstorage에 저장합니다.
  // 만약에 blacklist가 있다면 그것만 제외합니다
	// 예시 blacklist: ["auth"]
};

export const rootReducer = combineReducers({
  auth,
  board,
  studio
});

// 이 구문을 추가해주어야 합니다.
➍ export default persistReducer(persistConfig, rootReducer);
  • Root component가 있는 code를 추가해주어야 합니다.
  • root component는 기본적으로 App.jsx 파일에 있지만, 아래와 같이 index.js파일에서 app을 감싸주어도 됩니다.
// src/index.js

import React from "react";
import ReactDOM from "react-dom";
import { createStore, applyMiddleware, compose } from "redux";
import { Provider } from "react-redux";
➊ import { persistStore } from "redux-persist";
➋ import { PersistGate } from "redux-persist/integration/react";
import App from "./App";
import configureStore from "./store";
import { rootReducer } from "./reducers";

const store = createStore(rootReducer);
➌ const persistor = persistStore(store);

const Root = () => (
  <Provider store={store}>
    ➍ <PersistGate loading={null} persistor={persistor}>
      <App />
    </PersistGate>
  </Provider>
);

ReactDOM.render(<Root />, document.getElementById("root"));

 

'Hanghae99' 카테고리의 다른 글

221211 WIL 항해99 4주차  (0) 2022.12.11
221208 TIL 언어스터디 4회차  (0) 2022.12.09
221205 TIL React 숙련주차 1  (0) 2022.12.05
221203 WIL 항해99 3주차  (0) 2022.12.02
221201 TIL 주특기 언어 스터디 3회차  (0) 2022.12.02