๐ŸณReact | Recoil-persist ์‚ฌ์šฉํ•˜๊ธฐ

์›์˜ยท2023๋…„ 7์›” 13์ผ
3

์ƒˆ๋กœ์šด ์ง€์‹๐Ÿ’ก

๋ชฉ๋ก ๋ณด๊ธฐ
10/15
post-thumbnail

๐Ÿง์ƒํ™ฉ

React ํ”„๋กœ์ ํŠธ ์ค‘ ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์œ ์ €์˜ ์ •๋ณด๋ฅผ Recoil Atom์„ ์‚ฌ์šฉํ•ด ์ „์—ญ์œผ๋กœ ์ €์žฅํ–ˆ๋‹ค.
props๋ฅผ ํ†ตํ•ด ์œ ์ € ์ •๋ณด๋ฅผ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š์•„๋„ Atom์— ์ ‘๊ทผํ•˜์—ฌ ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ์œ ์ € ์ •๋ณด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์—ˆ์Œ๐Ÿ‘๐Ÿป
๊ทธ๋Ÿฌ๋‚˜... ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ฒŒ๋˜๋ฉด Recoil Atom์ด ์ดˆ๊ธฐํ™”๋˜์–ด ์ €์žฅ๋œ ์œ ์ € ์ •๋ณด๊ฐ€ ํœ˜๋ฐœ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๐Ÿ’€ (์ด๋Š” Recoil Atom์ด ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ•จ)
์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์ €์žฅํ•œ ์ƒํƒœ๋ฅผ ์ง€์†ํ•˜๊ธฐ ์œ„ํ•ด Recoil-persist๋ฅผ ์‚ฌ์šฉํ•ด๋ด„โœ๐Ÿป


๐Ÿ”ŽRecoil-persist

  • Recoil ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์œ„ํ•œ ํŒจํ‚ค์ง€
  • Recoil ์ƒํƒœ๋ฅผ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋‚˜ ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ
  • ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด๋„ Recoil ์ƒํƒœ ์œ ์ง€๋จ

๐Ÿ’กRecoil-persist ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

1. recoil-persist ์„ค์น˜, ์‚ฌ์šฉํ•  ํŒŒ์ผ์—์„œ import

  • ์„ค์น˜
npm install recoil-persist
  • ์‚ฌ์šฉํ•  ํŒŒ์ผ์—์„œ import
import { recoilPersist } from 'recoil-persist'

2. ์˜ต์…˜ ์„ค์ •

  • key : ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋  ํ‚ค ์ด๋ฆ„
  • storage : ์ €์žฅํ•  ์Šคํ† ๋ฆฌ์ง€ ์„ ํƒ (localStorage or sessionStorage)
const { persistAtom } = recoilPersist({
  key: 'persist-atom-key',
  storage: localStorage,
})

3. ์›ํ•˜๋Š” atom์— ์˜ต์…˜ ์ถ”๊ฐ€

  • ์›ํ•˜๋Š” atom์— effects_UNSTABLE: [์„ค์ •ํ•œ ์˜ต์…˜๋ช…] ์ถ”๊ฐ€
    ํ•ด๋‹น atom์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์„ค์ •ํ•œ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋˜๊ณ , ์ƒˆ๋กœ๊ณ ์นจํ•ด๋„ atom ๊ฐ’ ์œ ์ง€๋จ
export const ExAtom = atom({
  key: 'ExAtom',
  default: 0,
  effects_UNSTABLE: [persistAtom],
});

๐Ÿ’กRecoil Atom์œผ๋กœ ์œ ์ € ์ •๋ณด ์ €์žฅํ•œ ๊ฒฝ์šฐ (Recoil-persist ์‚ฌ์šฉ X)

์ฝ”๋“œ

  • UserAtom.js
    ์œ ์ € ์ •๋ณด ๊ฐ์ฒด(id, password)๋ฅผ ์ €์žฅํ•˜๋Š” Recoil Atom
import { atom } from 'recoil';

export const UserAtom = atom({
  key: 'UserAtom',
  default: { id: '', password: '' },
});
  • Page1.jsx
    input์œผ๋กœ ์œ ์ € ์ •๋ณด ์ž…๋ ฅ๋ฐ›์•„์„œ ๊ทธ ๊ฐ’ UserAtom์— ์ €์žฅ
    ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด Page2.jsx๋กœ ์ด๋™
import { useRecoilState } from 'recoil';
import { UserAtom } from './recoil/UserAtom';
import { useNavigate } from 'react-router-dom';

export default function Page1() {
  const navigate = useNavigate();
  const [userInfo, setUserInfo] = useRecoilState(UserAtom);

  const handleIdInput = (event) => {
    setUserInfo({ ...userInfo, id: event.target.value });
  };

  const handlePassWordInput = (event) => {
    setUserInfo({ ...userInfo, password: event.target.value });
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    navigate('/page2');
  };

  return (
    <>
      <h1>ํŽ˜์ด์ง€1</h1>
      <label htmlFor='id'>์•„์ด๋””</label>
      <input type='text' id='id' value={userInfo.id} onChange={handleIdInput} />
   
      <label htmlFor='password'>๋น„๋ฐ€๋ฒˆํ˜ธ</label>
      <input
        type='password'
        id='password'
        value={userInfo.password}
        onChange={handlePassWordInput}
      />

      <button type='submit' onClick={handleSubmit}>
        ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™
      </button>
    </>
  );
}
  • Page2.jsx
    UserAtom์— ์ ‘๊ทผํ•ด์„œ ํ˜„์žฌ ์ €์žฅ๋œ ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด
import { useRecoilValue } from 'recoil';
import { UserAtom } from './recoil/UserAtom';

export default function Page2() {
  const userInfo = useRecoilValue(UserAtom);
  console.log(userInfo);
  
  return (
    <>
      <h1>ํŽ˜์ด์ง€2</h1>
      
      <strong>recoil์— ์ €์žฅ๋œ id: </strong>
      <span>{userInfo.id}</span>
      
      <strong>recoil์— ์ €์žฅ๋œ password: </strong>
      <span>{userInfo.password}</span>
    </>
  );
}

์‹คํ–‰

  • ํŽ˜์ด์ง€1์—์„œ Recoil Atom์— ์ €์žฅํ•œ ์œ ์ €์ •๋ณด๋ฅผ ํŽ˜์ด์ง€2์—์„œ ๊ฐ€์ ธ์™€ ์ž˜ ์ฐํžˆ์ง€๋งŒ,
    ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๋ฉด ์ €์žฅ๋œ ์œ ์ €์ •๋ณด๊ฐ€ ์ดˆ๊ธฐํ™”๋จ

๐Ÿ’กRecoil-persist ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

์ฝ”๋“œ

  • UserAtom.js
    Recoil-persist ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉํ•ด ์œ ์ € ์ •๋ณด ๊ฐ์ฒด ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ
import { atom } from 'recoil';
import { recoilPersist } from 'recoil-persist';

const { persistAtom } = recoilPersist({
  key: 'user',
  storage: localStorage,
});

export const UserAtom = atom({
  key: 'UserAtom',
  default: { id: '', password: '' },
  effects_UNSTABLE: [persistAtom],
});
  • Page1.jsx , Page2.jsx ์œ„์™€ ๋™์ผ

์‹คํ–‰

  • ํŽ˜์ด์ง€1์—์„œ Recoi-persist ํ™œ์šฉํ•ด ์ €์žฅํ•œ ์œ ์ €์ •๋ณด๋ฅผ ํŽ˜์ด์ง€2์—์„œ ๊ฐ€์ ธ์™€ ์ž˜ ์ฐํž˜
    ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์œ ์ €์ •๋ณด ์ €์žฅ๋จ
    ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด๋„ ์œ ์ €์ •๋ณด ์œ ์ง€๋จ



  • ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ๋Š” sessionStorage์— ์ €์žฅํ–ˆ์Œ!โœ๐Ÿป (์ฝ”๋“œ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ)
  • ์ด์œ 
    localStorage์— ์œ ์ € ์ •๋ณด๋ฅผ ์ €์žฅํ•œ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ป๋‹ค ์ผœ๋„ ๋กœ๊ทธ์ธ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜๋Š”๋ฐ,
    ์ƒˆ๋กœ๊ณ ์นจ ์‹œ์—๋งŒ ์œ ์ง€๋˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์„ ๋„๋ฉด ์ •๋ณด๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ์›ํ•ด์„œ sessionStorage์— ์ €์žฅํ•˜๊ธฐ๋กœ ๊ฒฐ์ •
profile
ํ™”์ดํŒ…~~^ใ…^/

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 7์›” 13์ผ

๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์œ ์ € ์ •๋ณด ์ €์žฅ์„ ์˜ˆ์‹œ๋กœ ์„ค๋ช…ํ•ด์ฃผ์…”์„œ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์› ์Šต๋‹ˆ๋‹ค ๊ธ€ ์ž˜ ์ฝ์—ˆ์–ด์š”!! ใ…Žใ…Ž

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ