์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

React.js(12) - react-redux, react-cookies

SolartheNomad 2023. 5. 3. 16:20

๐Ÿ‘ฉ‍๐ŸŽ“ react - redux

- redux์™€ react๋ฅผ ์—ฐ๋™ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๋„๋ก ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. 

- store์„ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ๋งค๋ฒˆ ์ƒ์†ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์Šคํ† ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ๋‚ด์— ์ค‘๋ณต๋œ ์ฝ”๋“œ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

- react-redux์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๊ณผ์ • : ์Šคํ† ์–ด โžก ์ปดํฌ๋„ŒํŠธ โžก ์•ก์…˜ โžก ๋ฆฌ๋“€์„œ โžก ์Šคํ† ์–ด 

- ์Šคํ† ์–ด โžก ์ปดํฌ๋„ŒํŠธ ๊ณผ์ •์—์„œ connect๋ผ๋Š” react-redux ๋‚ด์žฅ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. 

- ์ปดํฌ๋„ŒํŠธ โžก ์•ก์…˜ ๊ณผ์ •์—์„œ connect๋ผ๋Š” react-redux ๋‚ด์žฅ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. 

 

 

โœ react-redux ์„ค์น˜ํ•˜๊ธฐ 

npm install --save react-redux

 

๐Ÿ“‚ src ํด๋” ํ˜•ํƒœ

โœ index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import {createStore} from 'redux';  //redux์—์„œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์— ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ 
import {Provider} from 'react-redux';//react-redux์—์„œ react-redux ์—ฐ๊ฒฐ์— ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ : store ์ƒ์†์— ํ•„์š”ํ•œ ํŒจํ‚ค์ง€์ž„
import reducers from './reducers';

const store = createStroe(reducers);

const listener =()=>{
     ReactDOM.render(
         <Provider>  //Provider ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด  ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ์—์„œ Props ๊ฐ’์„ ๋‹ค์‹œ ์ „๋‹ฌํ•ด์ค„ ํ•„์š”์—†์ด ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ฐ€๋Šฅํ•จ
            <App indexProp="react"/>  //App ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜ indexProp์— ๊ฐ’์„ ํ• ๋‹นํ•ด์„œ App์˜ props์œผ๋กœ ์ „๋‹ฌํ•ด์ค€๋‹ค. 
         </Provider>,
         document.getElementById('root')
     );
};

store.subscribe(listener);
listener();

 

- <Provider></Provider>๋กœ ๊ฐ์‹ธ์ธ Props ๊ฐ’๋“ค์€ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

๐Ÿ”จConnect ์‚ฌ์šฉํ•˜๊ธฐ 

 

โœ App.js

import React from "react";
import { Component } from "react";
import {Connect} from 'react-redux;'  //react-redux ํŒจํ‚ค์ง€์—์„œ connect ํ•จ์ˆ˜๋ฅผ ์ž„ํ‘œํŠธํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋กํ•จ 
import StrAddButton from "../StrAddButton";

class App extends Component {  //App class : ํ™”๋ฉด์— ๋ Œ๋”๋ง๋  ๋‚ด์šฉ์„ ์ •์˜
  render() {
    return (
     <div>
      <h1>Start React</h1>
      {/* <span>{this.props.store.getState().data.str}</span><br/>*/}
      <span>{this.props.str}</span><br/>  //span ํƒœ๊ทธ๋กœ props์—์„œ ๋ฐ›์•„์˜จ str ๊ฐ’์„ ํ‘œ์‹œํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ 
      {/*<StrAddButton store = {this.props.store}/> */}
      <StrAddButton AppProp="200"/>
     </div>
     );
     
   }  
 }  
 
 
let mapStateToProps = (state, props) =>{
  console.log('Props from index.js :' + props.indexProp)
  return {
    str : state.data.str,
  };
};

App = Connect(mapStateToProps, null)(App);   //import ํ•œ ๋’ค์— ๊ฐ€์žฅ ๋จผ์ € ์ ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

export default App;

 

๐Ÿ“š Connect ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ 

App = Connect(mapStateToProps, null)(App);

- App ์ปดํฌ๋„ŒํŠธ๋ฅผ Connect(mapStateToProps, null)(App) ํ˜•์‹์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ๋‚ด๋ณด๋‚ธ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด App ์ปดํฌ๋„ŒํŠธ์—์„œ Redux์˜ state ๊ฐ’์„ props๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

- ์›๋ž˜ Connect(mapStateToProps, mapDispatchToProps)์ธ๋ฐ ์—ฌ๊ธฐ์„œ๋Š” mapStateToProps๋งŒ ์‹คํ–‰๋˜๋ฏ€๋กœ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋‹น์—ฐํžˆ null์ด ๋œ๋‹ค. 

 

 

mapStateToProps ํ•จ์ˆ˜ ์ •์˜ํ•˜๊ธฐ 

- index.js์™€ App.js๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ํ•จ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜์ž! 

let mapStateToProps = (state, props) =>{
  console.log('Props from index.js :' + props.indexProp)
  return {
    str : state.data.str,
  };
};

- state์™€ props๋ฅผ ๋ฐ›๋Š”๋ฐ state๋Š” ์—ฌ๊ธฐ์„œ ์Šคํ† ์–ด์˜ state์ด๊ณ  props๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋ฐ›์€(App์˜ ๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ๋Š” index.js) props๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ App ์ปดํฌ๋„ŒํŠธ์˜ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์• ์ด๋‹ค.

- ์œ„์˜ props๋Š” index.js์—์„œ ์ „๋‹ฌ๋ฐ›์€ props.indexProps = "react"์ด๋ฏ€๋กœ react๊ฐ€ console.log์„ ํ†ตํ•˜์—ฌ ์ถœ๋ ฅ๋˜๋ฉฐ, (props ์ฒ˜๋ฆฌ ๋ถ€๋ถ„) store๋Š” ์Šคํ† ์–ด์˜ state ๋ณ€์ˆ˜ str ๋ณ€์ˆ˜๊ฐ’์œผ๋กœ ํ• ๋‹น๋˜์–ด ๋ฐ˜ํ™˜๋œ๋‹ค. 

 

๐Ÿ“š {this.props.str}

<span>{this.props.str}</span><br/>

- return {str : state.data.str, };๋กœ ๋ฐ›์•„์˜จ ์Šคํ† ์–ด ๋ฐ์ดํ„ฐ๋ฅผ App ์ปดํฌ๋„ŒํŠธ์˜ props์˜ str ๋ณ€์ˆ˜๋กœ ํ• ๋‹นํ•˜์—ฌ ์ถœ๋ ฅํ•ด์ค€๋‹ค. 

 

<StrAddButton AppProp="200"/>

- StrAddButton ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜ AddProp์— 200 ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•ด props๋กœ ์ „๋‹ฌํ•œ๋‹ค.

 

 

 

 

 

๐Ÿ‘ฉ‍๐Ÿ’ป Dispatch ํ•จ์ˆ˜

- ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋ฐ”์ธ๋”ฉ๋œdispatch ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค. 

Redux store์— action ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด

Action์„ Store์— ์ „๋‹ฌํ•˜์—ฌ ํ•ด๋‹น Action์— ๋”ฐ๋ฅธ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค. ์ดํ›„, ํ•ด๋‹น ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ€ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌ๋˜์–ด UI๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. 

 

 

โœ StrAddButton.js

- Redux store์— ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•จ 

import React, {Component} from 'react';
import {add} from './actions'; // ์•ก์…˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ import  : add()
import {Connect} from 'react-redux;'  // react-redux ํŒจํ‚ค์ง€์—์„œ connect ํ•จ์ˆ˜๋ฅผ ์ž„ํฌํŠธํ•ด์™€์„œ React์™€ Redux ์—ฐ๊ฒฐ

class StrAddButton extends Component {
    render() {
        return (
        //    <input value = 'Add200' type = "button" onClick = {this.addString}/>
              <input value = "200" type = "button" onClick = {this.props.addString} />
        )
        // ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ฌธ์ž์—ด์ด ์ถ”๊ฐ€๋˜๋Š” ํ•จ์ˆ˜ : addtring 
    }

   // addString =()=>{
   //     this.props.store.dispatch(add());

   // }
}

let mapDispatchToPRops = (dispatch, props) =>{
    console.log('Props from App.js : ' + props.AddProp)//๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์ธ App์—์„œ ๋ฐ›์•„์˜จ Prop์„ ์ถœ๋ ฅํ•ด์ค€๋‹ค. 
    return {
        addString : () => dispatch(add()) //dispatch ํ•จ์ˆ˜๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‚ด ํ•จ์ˆ˜์ธ addString์— ๋ฐ”์ธ๋”ฉํ•˜๊ณ  , addStringํ•จ์ˆ˜๋Š” Props์— ํ• ๋‹น๋จ 
    //๊ธฐ์กด์˜ addString ํ•จ์ˆ˜๋Š” dispatch ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ๊ธฐ์กด์˜ ๋‘ ํ•จ์ˆ˜๋ฅผ ๋ฐ”์ธ๋”ฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„ ํ•จ์ˆ˜์„ ์–ธ์€ ๋ถˆํ•„์š”ํ•จ
    // ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. const addString=()=> dsipatch(add())
    };
};

StrAddButton = Connect(null, mapDispatchToPRops)(StrAddButton);  //connectํ•จ์ˆ˜์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ๋ณด์ง€๋ง๊ณ  ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ๋ณด์ž

export default StrAddButton;

 

๐Ÿ“š addString()

- store.dispatch() ๋ฉ”์„œ๋“œ : Action์„ Store์— ์ „๋‹ฌํ•˜์—ฌ ํ•ด๋‹น Action์— ๋”ฐ๋ฅธ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ์˜ action์€ add()ํ•จ์ˆ˜์ด๋‹ค. ๋”ฐ๋ผ์„œ add() ํ•จ์ˆ˜๊ฐ€ props์ธ Stroe๋กœ ์ „๋‹ฌ๋˜๊ฒŒ ๋œ๋‹ค. โžก Redux store์˜ dispatch() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ๋˜์–ด Redux state๋ฅผ ๋ณ€๊ฒฝํ•จ 

 

 

๐Ÿ“š mapDispatchToProps

- dispatch ํ•จ์ˆ˜๋ฅผ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜์— ๋ฐ”์ธ๋”ฉํ•จ ์ฆ‰, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋ฐ”์ธ๋”ฉ๋œ dispatch ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค. 

- ๋ฆฌ๋“€์„œ์— ์•ก์…˜์„ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜์ธ dispatch๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ์‚ฌ์šฉํ•œ๋‹ค. 

- StrAddButton ์ปดํฌ๋„ŒํŠธ๋ฅผ Redux์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์นœ๊ตฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ 

- dispatch ํ•จ์ˆ˜๋ฅผ props๋กœ ๋งคํ•‘ํ•ด์ฃผ๊ณ  ์•ก์…˜์„ dispatchํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค. 

 

 

๐Ÿ“š redux ๋ฏธ๋“ค์›จ์–ด

- ์•ก์…˜์„ dispatch ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ณ  ๋ฆฌ๋“€์„œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „๊ณผ ์‹คํ–‰๋œ ํ›„์— ์ฒ˜๋ฆฌ๋˜๋Š” ๊ธฐ๋Šฅ

- redux ํŒจํ‚ค์ง€์—์„œ ์ง€์›ํ•˜๋Š” applyMiddleware ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

โœ index.js

import React from "react";
import { ReactDOM } from "react-dom";
import './index.css';
import App from './components/App';
import {createStore} from 'redux';
import {Provider} from 'react-redux';
import reudcers from './reducers';
import {applyMiddleware} from 'redux';


const CallMiddleware = store => nextMiddle => action => {
  console.log('1. reducer ์‹คํ–‰ ์ „');
  console.log('2. action.type : ' + action.type+', store str: ' + store.getState().data.str);
  let result = nextMiddle(action);
  console.log('3. reducer ์‹คํ–‰ ํ›„');
  console.log('4. action.type : ' + action.type + ', store str :' + store.getState().data.str );
  return result;
}


const store = createStore(reudcers, applyMiddleware(CallMiddleware));

const listener =() =>{
  ReactDOM.render (
    <Provider store= {store} >
      <App indexProp = "react"/>
    </Provider>,
    document.getElementById('root')
  );

};

store.subscribe(listener);
listener();

 

๐Ÿ“š createStore

- store๋ฅผ ์ƒ์„ฑํ•จ

- reducer์„ ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ, applyMiddleware์„ ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์˜จ๋‹ค. ์ด๋•Œ applyMiddleware์€ CallMiddleware์„ ์ธ์ž๋กœ ๋ฐ›์•„์˜จ๋‹ค. 

const store = createStore(reudcers, applyMiddleware(CallMiddleware));

 

 

๐Ÿ“š CallMiddleware ํ•จ์ˆ˜

- Redux ์Šคํ† ์–ด์˜ ์ƒํƒœ๋ฅผ ๋ฐ›์•„์„œ ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” nextMiddle ํ•จ์ˆ˜์™€ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„์„œ ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋กœ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•จ

const CallMiddleware = store => nextMiddle => action => {
  console.log('1. reducer ์‹คํ–‰ ์ „');
   //store ๋งค๊ฐœ ๋ณ€์ˆ˜ ์‹คํ–‰ : ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ action ๊ฐ์ฒด์˜ type ์†์„ฑ๊ณผ ์Šคํ† ์–ด์˜ ์ƒํƒœ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋Š”์ค‘์ž„
  console.log('2. action.type : ' + action.type+', store str: ' + store.getState().data.str);
    //store ๋งค๊ฐœ๋ณ€์ˆ˜ ์‹คํ–‰ ํ›„ nextMiddleware ์‹คํ–‰ 
    // ๋‹ค์Œ์˜ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜ ํ˜น์€ ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜ ์‹คํ–‰ : ๋‹ค์Œ์˜ ์•ก์…˜ ์‹คํ–‰
  let result = nextMiddle(action);
  // ๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ๋Š” ๋‹ค์Œ์— ์‹คํ–‰ํ•  ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฆฌ๋“€์„œ๋ฅผ ์‹คํ–‰ํ•จ 
 
  console.log('3. reducer ์‹คํ–‰ ํ›„');
  // ๋ฆฌ๋“€์„œ๊ฐ€ ์‹คํ–‰ํ›„ ์•ก์…˜์˜ type ๋ณ€์ˆ˜์™€ store์˜ ์ƒํƒœ ๋ณ€์ˆ˜ str์˜ ๊ฐ’์„ ๋กœ๊ทธ๋กœ ์ถœ๋ ฅํ•จ
  console.log('4. action.type : ' + action.type + ', store str :' + store.getState().data.str );
  return result;
}

 

๐Ÿ“š listener()

- Redux ์Šคํ† ์–ด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜

- ReactDOM.render ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ App ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

 

๐Ÿ“š Provider 

- Redux ์Šคํ† ์–ด๋ฅผ App ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•œ๋‹ค.

 

 

๐Ÿ‘ฉ‍๐ŸŽ“ react-cookies 

 

โœ react cookies ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

npm install react-cookies --save

 

โœ App.js

import React from "react";
import { Component } from "react";
import CookieSave from './R085_cookieSave'

class App extends Component {  //App class : ํ™”๋ฉด์— ๋ Œ๋”๋ง๋  ๋‚ด์šฉ์„ ์ •์˜
  render() {
    return (
     <div>
      <h1>Start React</h1>
      <CookieSave/>
     </div>
     );
     
   }  
 
 
 


export default App;

 

โœ R085_cookieSave.js

import React from "react";
import { Component } from "react";
import cookie from 'react-cookies';  //react-cookies ํŒจํ‚ค์ง€๋ฅผ ์ž„ํฌํŠธํ•ด ์‚ฌ์šฉํ•จ

class R085_cookieSave extends Component {
    componentDidMount() {
        const expires = new Date()  //ํ˜„์žฌ์˜ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์žฅํ•จ์ˆ˜(new Date()) ๋ฅผ expires ๋ณ€์ˆ˜์— ํ• ๋‹นํ•จ
        expires.setMinutes(expires.getMinutes() + 60)  //expires.getMinute() : expires ๋ณ€์ˆ˜์˜ ์‹œ๊ฐ„์„ ๋ถ„์œผ๋กœ ํ™˜์‚ฐ ํ•จ์ˆ˜ ๋ฉ”์„œ๋“œ์ž„. 60์„ ๋”ํ–ˆ์œผ๋ฏ€๋กœ ์ง€๊ธˆ์‹œ๊ฐ„์—๋‹ค๊ฐ€ 60์„ ๋”ํ•ด์ฃผ๋Š” ๊ฒƒ์„ setMinute๋กœ ๋‹ค์‹œ ํ• ๋‹นํ•œ๋‹ค.
        cookie.save('userid' , "React" ,{
            path : '/',   //path : ์ฟ ํ‚ค๊ฐ’ ์ €์žฅ ์„œ๋ฒ„ ๊ฒฝ๋กœ ํ• ๋‹น
            expires,  //expires : ์ฟ ํ‚ค์˜ ์œ ํšจ์‹œ๊ฐ„ : 1์‹œ๊ฐ„๋™์•ˆ ์ฟ ํ‚ค๊ฐ€ ์›น๋ธŒ๋ผ์šฐ์ €์— ๋‚จ๊ฒŒ ๋จ 
            // secure : true //https ๋ถ€์—ฌ
            //httpOnly : true  //document.cookie๋กœ ์ฟ ํ‚ค์ ‘๊ทผ์„ ๋ง‰๊ธฐ ์œ„ํ•ด true๊ฐ’ ๋ถ€์—ฌ
            /*react-cookis์˜ save ํ•จ์ˆ˜์˜ ์„ธ๊ฐ€์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ : userid : ์ฟ ํ‚ค์˜ ํ‚ค, React: ์ฟ ํ‚ค๊ฐ’, ์„ธ๋ฒˆ์งธ๋Š” ์ฟ ํ‚ค์˜ต์…˜*/
        });
    }

    render () {
        return (
            <><h3>react-cookies Save</h3></>
        )
    }
}

export default R085_cookieSave;

โœ ๊ฒฐ๊ณผ ํ™”๋ฉด

 

๐Ÿ“š react-cookies load

- ์›น๋ธŒ๋ผ์šฐ์ €์— ๋‚จ์•„์žˆ๋Š” ์ฟ ํ‚ค๋ฅผ key๋กœ ์ ‘๊ทผํ•ด value๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜ 

 

โœ App.js

import React from "react";
import { Component } from "react";
import CookieLoad from './R086_cookieLoad'

class App extends Component {  //App class : ํ™”๋ฉด์— ๋ Œ๋”๋ง๋  ๋‚ด์šฉ์„ ์ •์˜
  render() {
    return (
     <div>
      <h1>Start React</h1>
      <CookieLoad/>
     </div>
     );
     
   }  
 
 
 


export default App;

 

โœ R086_cookieLoad.js

import React, {Component} from 'react';
import cookie from 'react-cookies';

class R086_cookieLoad extends Component {
    componentDidMount() {   //๋ Œ๋”๋ง์„ ํ•˜๋ฉด์„œ ์ œ์ผ ์ฒซ๋ฒˆ์งธ๋กœ ์‹คํ–‰๋˜๋Š” ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜
        const expires = new Date()
        expires.setMinutes(expires.getMinutes() + 60)
        cookie.save('userid', "react200"   //์ฟ ํ‚ค ์ƒ์„ฑ
        ,{
            path : '/',
            expires,
            //secure : true
            // httpOnly : true
        });
        setTimeout(function() {  
            alert(cookie.load('userid'))
        }, 1000);  //1์ดˆ ๋’ค์— alert๋ฅผ ๋„์šด๋‹ค. : ์ฟ ํ‚ค๊ฐ€ ์ €์žฅ๋˜๊ธฐ ์œ„ํ•œ ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„์ž„
        //์ด๋–„ cookie.load('userid')์—์„œ userid๋Š” ์ฟ ํ‚ค์˜ key์ด๋‹ค. 
    }

    render() {
        return (
            <><h3>react-cookies Load</h3></>
        )
    }
}

export default R086_cookieLoad;

 

๐Ÿ“š setTimeout (ํ•จ์ˆ˜, OO์‹œ๊ฐ„)

- OO์ดˆ ๋’ค์— ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ด

 

๐Ÿ“š cookie.load(ํ‚ค)

- ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’ ์ถœ๋ ฅ

 

โœ ๊ฒฐ๊ณผ ํ™”๋ฉด

๐Ÿ”จ react-cookies remove 

- ์›น ๋ธŒ๋ผ์šฐ์ €์— ๋‚จ์•„์žˆ๋Š” ์ฟ ํ‚ค๋ฅผ key๋กœ ์ ‘๊ทผํ•˜์—ฌ ์‚ญ์ œํ•˜๋Š” ๋ฉ”์„œ๋“œ 

 

โœ App.js

import React from "react";
import { Component } from "react";
import CookieRemove from './R087_cookieRemove'

class App extends Component {  //App class : ํ™”๋ฉด์— ๋ Œ๋”๋ง๋  ๋‚ด์šฉ์„ ์ •์˜
  render() {
    return (
     <div>
      <h1>Start React</h1>
      <CookieRemove/>
     </div>
     );
     
   }  
 
 
 


export default App;

 

โœ R087_cookieRemove.js

import React, { Component } from "react";
import cookie from 'react-cookies';

class R087_cookieRemove extends Component{
    componentDidMount() {
        const expires = new Date()
        expires.setMinutes(expires.getMinutes() + 60)
        cookie.save('userid', "react",{
            path :'/',
            expires,
            //secure : true,
            //httpOnly : true
        });
        setTimeout(function() {
            cookie.remove('userid', {path : '/'});  //setTimeout(function, 1000)
        }, 1000);
        setTimeout (function() {
            alert(cookie.load('userid'))  //setTimeout(function, 2000)
        }, 2000);
    }

    render() {
        return (
            <><h3>react-cookies Remove</h3></>
        )
    }
}

export default R087_cookieRemove;

 

 

๐Ÿ“š cookie.remove(ํ‚ค์ด๋ฆ„, {path : '์ฟ ํ‚ค ์ €์žฅ ๊ฒฝ๋กœ'})

- ์ฟ ํ‚ค ์ €์žฅ๊ฒฝ๋กœ์— ์ €์žฅ๋œ ์ฟ ํ‚ค ์ค‘ 'ํ‚ค์ด๋ฆ„'์„ ์‚ญ์ œํ•œ๋‹ค. 

 

โœ ๊ฒฐ๊ณผ ํ™”๋ฉด