Recoil

Recoil Getting Starting

μœ€μƒπŸ˜Ž 2024. 7. 4. 01:08
React μƒνƒœκ΄€λ¦¬ 라이브러리

μƒνƒœ(State)

 Reactμ—μ„œ μƒνƒœ(State)λŠ” μ»΄ν¬λ„ŒνŠΈ μ•ˆμ—μ„œ λ™μ μœΌλ‘œ λ³€ν•  수 μžˆλŠ” 데이터λ₯Ό μ˜λ―Έν•œλ‹€. λ³€μˆ˜, 객체, ν•¨μˆ˜ λ“± 이런 것듀이 μƒνƒœκ°€ λœλ‹€.

예λ₯Ό λ“€μ–΄, ν•¨μˆ˜ 같은 κ²½μš°μ—λŠ” μ‚¬μš©μžκ°€ λ²„νŠΌμ„ 클릭할 λ•Œλ§ˆλ‹€ ν•˜λ‚˜μ˜ λ³€μˆ˜μΈ 숫자λ₯Ό μ¦κ°€μ‹œν‚€λŠ” κΈ°λŠ₯이 λ‹΄κ²¨μžˆλŠ” ν•¨μˆ˜κ°€ μžˆλ‹€λ©΄ κ·Έ ν•¨μˆ˜λŠ” μƒνƒœκ°€ λœλ‹€.

 

μƒνƒœκ΄€λ¦¬ 이유

 μž‘은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” 것은 κ°„λ‹¨ν•˜λ‹€. λŒ€ν‘œμ μœΌλ‘œ useStateκ°€ μžˆλ‹€. ν•˜μ§€λ§Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 컀지고 μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈκ°€ μƒν˜Έμž‘μš©ν•  λ•Œ, μƒνƒœ κ΄€λ¦¬λŠ” 점점 λ³΅μž‘ν•΄μ§‘λ‹ˆλ‹€. λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈμ— useStateλ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μ—†κ³  props둜 μ „λ‹¬ν•˜λŠ” 것에도 ν•œκ³„κ°€ 있기 λ•Œλ¬Έμ΄λ‹€.

 μ˜ˆλ₯Ό λ“€μ–΄, μ‚¬μš©μž 정보에 λŒ€ν•œ 데이터가 λ‹΄κ²¨μžˆλŠ” μƒνƒœ(state)κ°€ μžˆλ‹€. 이 μ‚¬μš©μžμ— λŒ€ν•œ 정보가 ν•„μš”ν•œ μ»΄ν¬λ„ŒνŠΈκ°€ νšŒμ›κ°€μž…, 둜그인 λ“± μ‚¬μš©μž 인증 μ»΄ν¬λ„ŒνŠΈμ™€ 자기 정보듀을 λ³Ό 수 μžˆλŠ” λ§ˆμ΄νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈκ°€ μžˆλ‹€κ³  ν•΄λ³΄μž. 이 두 μ»΄ν¬λ„ŒνŠΈλŠ” λ‹€λ₯Έ νŽ˜μ΄μ§€λ‘œ λΆ„λ₯˜λ˜λŠ” μ»΄ν¬λ„ŒνŠΈμΈλ° ꡳ이 λ‘˜ 쀑 ν•˜λ‚˜μ˜ μ»΄ν¬λ„ŒνŠΈμ— useStateλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μž μ •λ³΄μ˜ μƒνƒœλ₯Ό μ΄ˆκΈ°ν™”ν•˜μ—¬ λ‚˜λ¨Έμ§€ ν•˜λ‚˜μ˜ μ»΄ν¬λ„ŒνŠΈμ— props둜 전달할 μ΄μœ κ°€ μ—†λ‹€.(Props Drilling λ°©μ§€) μ•„λ‹ˆλ©΄ 두 μ»΄ν¬λ„ŒνŠΈμ— 각자 useStateλ₯Ό μ‚¬μš©ν•˜λ©΄ λ˜μ§€ μ•Šλƒ 라고 ν•˜λ©΄ κ²°κ΅­ μ»΄ν¬λ„ŒνŠΈλ“€μ΄ 이루어 ν•˜λ‚˜μ˜ ν”„λ‘œμ νŠΈκ°€ λ˜λŠ”λ° ν”„λ‘œμ νŠΈκ°€ μˆ˜μ •λ˜μ–΄ μ΅œμ‹ ν™” ν•  λ•Œλ§ˆλ‹€ 각 μ»΄ν¬λ„ŒνŠΈμ˜ μƒνƒœλ“€μ΄ λ…λ¦½μ μ΄κ²Œ 되면 ν”„λ‘œμ νŠΈκ°€ κΌ¬μ΄λ©΄μ„œ ν˜Όλž€μ΄ 생길 수 μžˆλ‹€.

 λ”°λΌμ„œ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈλ“€μ΄ μ΅œμ‹  μƒνƒœλ₯Ό μ‰½κ²Œ κ³΅μœ ν•˜κ³  μ—…λ°μ΄νŠΈν•  수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€. κ²°κ΅­ μƒνƒœκ΄€λ¦¬ 라이브러리λ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ μΌκ΄€λœ 데이터 관리가 되며 μ½”λ“œλ„ κ°„μ†Œν™”λœλ‹€. 그리고 μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈλ₯Ό μˆ˜μ •ν•˜λŠ” λŒ€μ‹  쀑앙 μƒνƒœ 관리 μ½”λ“œλ§Œ μˆ˜μ •ν•˜λ©΄ 되기 λ•Œλ¬Έμ— μœ μ§€λ³΄μˆ˜λ„ μš©μ΄ν•΄μ§„λ‹€.

μƒνƒœκ΄€λ¦¬ 라이브러리 - Redux, MobX, Recoil, etc...

 

πŸ‘οΈ‍πŸ—¨οΈ Recoil

Recoil μ„€μΉ˜

npm install recoil

npm i recoil

Atom

Recoilμ—μ„œμ˜ μƒνƒœ(State) λ‹¨μœ„
atom을 톡해 μƒνƒœλ₯Ό μ €μž₯ν•˜λ©΄ μ–΄λ–€ μ»΄ν¬λ„ŒνŠΈμ—μ„œλ‚˜ 읽고 μ“Έ 수 μžˆλ‹€.
→ atom의 값을 μ½λŠ” μ»΄ν¬λ„ŒνŠΈλ“€μ€ μ•”λ¬΅μ μœΌλ‘œ atom을 ꡬ독 (atom을 importν•˜μ—¬ atom의 μƒνƒœλ₯Ό 뢈러옴)
atom을 κ΅¬λ…ν•˜λŠ” λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈλŠ” atom의 μƒνƒœκ°€ μ΅œμ‹ ν™” 될 λ•Œλ§ˆλ‹€ 재 λ Œλ”λ§λ˜λŠ” κ²°κ³Όκ°€ λ°œμƒν•œλ‹€.
atom의 μƒνƒœλ₯Ό μ‚¬μš© (읽기, μˆ˜μ •(μ“°κΈ°))ν•˜κΈ° μœ„ν•΄μ„œ useRecoilState() μ‚¬μš©
// app.ts
import React from 'react';
import {
  RecoilRoot,
  atom,
  selector,
  useRecoilState,
  useRecoilValue,
} from 'recoil';

const App: React.FC = () => {
  return (
    <RecoilRoot>
      <CharacterCounter />
    </RecoilRoot>
  );
};

export default App;
// src/atoms/textAtom.ts
import { atom } from 'recoil';

export const textState = atom<string>({
  key: 'textState', // keyκ°’
  default: '', // κΈ°λ³Έ μ„ΈνŒ…(μ΄ˆκΈ°ν™”λœ)κ°’
});
// ./CharacterCounter.tsx
import React from 'react';
import TextInput from './TextInput';
import CharacterCount from './CharacterCount';

const CharacterCounter: React.FC = () => {
  return (
    <div>
      <TextInput />
      <CharacterCount />
    </div>
  );
};

export default CharacterCounter;
// ./TextInput.tsx
import React, { ChangeEvent } from 'react';
import { useRecoilState } from 'recoil';
import { textState } from './atoms/textAtom';
const TextInput: React.FC = () => {
  const [text, setText] = useRecoilState(textState);

  const onChange = (event: ChangeEvent<HTMLInputElement>) => {
    setText(event.target.value);
  };

  return (
    <div>
      <input type="text" value={text} onChange={onChange} />
      <br />
      Echo: {text}
    </div>
  );
};

export default TextInput;

Selector

νŒŒμƒλœ μƒνƒœ(derived state) : μƒνƒœμ˜ λ³€ν™”
즉, νŒŒμƒλœ μƒνƒœλ₯Ό μ–΄λ–€ λ°©λ²•μœΌλ‘œλ“  μ£Όμ–΄μ§„ μƒνƒœλ₯Ό μˆ˜μ •ν•˜λŠ” 순수 ν•¨μˆ˜μ— μ „λ‹¬λœ μƒνƒœμ˜ κ²°κ³Όλ¬Ό
→ μƒνƒœλ₯Ό μˆ˜μ •, 가곡등을 ν•˜λŠ” return값이 μ‘΄μž¬ν•˜λŠ” ν•¨μˆ˜
ν•¨μˆ˜μ˜ 값을 λΆˆλŸ¬μ™€ 읽기 μœ„ν•΄μ„œ useRecoilValue() μ‚¬μš©
// src/atoms/textAtom.ts
...
export const charCountState = selector<number>({
  key: 'charCountState',
  get: ({ get }) => {
    const text = get(textState);
    return text.length;
  },
});
// ./CharacterCount.tsx
import React from 'react';
import { useRecoilValue } from 'recoil';
import { charCountState } from './atoms/textAtom';

const CharacterCount: React.FC = () => {
  const count = useRecoilValue(charCountState);

  return <>Character Count: {count}</>;
};

export default CharacterCount;
useRecoilState() : writableν•œ μƒνƒœ → useState처럼 setν•¨μˆ˜ 쑴재 (μˆ˜μ • 즉, setting이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έ)
useRecoilValue : read only μƒνƒœ → λ³€μˆ˜, μƒμˆ˜μ— μ΄ˆκΈ°ν™” ν•˜μ—¬ 뢈러였기만 κ°€λŠ₯ (λ”°λΌμ„œ return값이 μžˆλŠ” ν•¨μˆ˜μ— 주둜 μ‚¬μš©)