๐Ÿ’ป ์‹ค์ „ ํ”„๋กœ๊ทธ๋ž˜๋ฐ | React ์ƒํƒœ ๊ด€๋ฆฌ ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Recoil ์™„๋ฒฝ ํ™œ์šฉ๋ฒ• ๐Ÿš€

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ: ํšจ๊ณผ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Recoil์˜ ์ค‘์š”์„ฑ

React ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ ์ƒํƒœ ๊ด€๋ฆฌ์— ๊ณ ๋ฏผํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ React.js์™€ Tailwind CSS ๊ธฐ๋ฐ˜์˜ ํ”„๋กœ์ ํŠธ์— ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Recoil์„ ๋„์ž…ํ•ด๋ณธ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ, ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Recoil์˜ ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ์‹ค์ œ ํ™œ์šฉ ๋ฐฉ๋ฒ•์„ ์ž์„ธํžˆ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”ฅ Recoil์ด ์ œ๊ณตํ•˜๋Š” ์ฃผ์š” ํŠน์ง• ๋ฐ ์žฅ์ 

  • Atoms: ์†์‰ฝ๊ฒŒ ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.
  • Selectors: ์ƒํƒœ๋ฅผ ๊ฐ€๊ณตํ•˜๊ณ  ๊ณ„์‚ฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ„ํŽธํ•œ ํ•™์Šต ๊ณก์„ : ๋ฆฌ๋•์Šค์— ๋น„ํ•ด ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋‚ฎ๊ณ , ์ง๊ด€์ ์ด๋ฉฐ ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘ฅ ์˜ˆ์ œ๋กœ ์•Œ์•„๋ณด๋Š” Recoil์˜ ์‹ค์ œ ํ™œ์šฉ ์‚ฌ๋ก€

์ž์ฃผ ํ•„์š”๋กœ ํ•˜๋Š” ์‚ฌ๋ก€์ธ '๊ณตํ†ต ์‚ฌ์šฉ์ž ์ƒํƒœ ๊ด€๋ฆฌ'๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ด…์‹œ๋‹ค.

1. ์‚ฌ์šฉ์ž ์ƒํƒœ Atom ๋งŒ๋“ค๊ธฐ

// atoms.js
import { atom } from 'recoil';

// ์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ณต์œ ํ•˜๋Š” atom
export const userState = atom({
  key: 'userState',
  default: null,
});

2. ์‚ฌ์šฉ์ž ์ƒํƒœ ์—…๋ฐ์ดํŠธ (์ปดํฌ๋„ŒํŠธ์—์„œ atom ์ƒํƒœ ๋ณ€๊ฒฝํ•˜๊ธฐ)

'ํšŒ์›๊ฐ€์ž…' ํผ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

// SignUp.js
import React, { useState } from 'react';
import { useSetRecoilState } from 'recoil';
import { userState } from './atoms';

function SignUp() {
  const [name, setName] = useState('');
  const [email, setEmail] = useState('');
  const setUserState = useSetRecoilState(userState);

  const handleSignUp = () => {
    setUserState({ // userState atom ์—…๋ฐ์ดํŠธ
      name: name,
      email: email,
    });
  };

  return (
    <div>
      <h2>ํšŒ์›๊ฐ€์ž…</h2>
      <input type="text" onChange={(e) => setName(e.target.value)} placeholder="์ด๋ฆ„" />
      <input type="email" onChange={(e) => setEmail(e.target.value)} placeholder="์ด๋ฉ”์ผ" />
      <button onClick={handleSignUp}>ํšŒ์›๊ฐ€์ž…</button>
    </div>
  );
}

export default SignUp;

3. ์‚ฌ์šฉ์ž ์ƒํƒœ์— ์ ‘๊ทผํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

// UserProfile.js
import React from 'react';
import { useRecoilState } from 'recoil';
import { userState } from './atoms';

function UserProfile() {
  const [user] = useRecoilState(userState);

  return (
    <div>
      {user ? (
        <div>
          <h2>ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค, {user.name}!</h2>
          <p>์ด๋ฉ”์ผ: {user.email}</p>
        </div>
      ) : (
        <p>์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ณด๋ ค๋ฉด ๋กœ๊ทธ์ธ ํ•ด์ฃผ์„ธ์š”.</p>
      )}
    </div>
  );
}

export default UserProfile;

โœ… Recoil ํ™œ์šฉ ์‹œ ๊ผญ ๊ธฐ์–ตํ•  ์‹ค์šฉ์ ์ธ ํŒ๊ณผ ์ฃผ์˜ ์‚ฌํ•ญ

  • Atoms์™€ Selectors์˜ key ๊ฐ’์€ ์ „์—ญ์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ atoms๋ฅผ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ  ๊ด€๋ฆฌํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
  • ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ Selectors๋ฅผ ์‚ฌ์šฉํ•ด ์ƒํƒœ๋ฅผ ๊ฐ€๊ณตํ•˜๋Š” ๋ฐฉ์‹์„ ์ ๊ทน ํ™œ์šฉํ•˜์„ธ์š”.

๐ŸŒ Recoil์˜ ๋ฏธ๋ž˜ ์ „๋ง: React ์ƒํƒœ๊ณ„ ์†์˜ ์ „๋ง๊ณผ ์ „๋ฌธ๊ฐ€ ์˜๊ฒฌ

Recoil์€ ํŽ˜์ด์Šค๋ถ์—์„œ ์ง์ ‘ ๊ฐœ๋ฐœํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, React์™€์˜ ๋†’์€ ํ˜ธํ™˜์„ฑ๊ณผ ์นœํ™”์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์•ž์œผ๋กœ๋„ React ์ƒํƒœ๊ณ„์—์„œ ์ง€์†์ ์œผ๋กœ ์ฃผ๋ชฉ๋ฐ›์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ง€์†์ ์ธ ์—…๋ฐ์ดํŠธ์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ ๊ทน์ ์ธ ์ง€์›์œผ๋กœ ๋ฏธ๋ž˜๊ฐ€ ๋”์šฑ ๋ฐ๋‹ค๊ณ  ์ „๋ง๋ฉ๋‹ˆ๋‹ค.

๐Ÿšฉ ๋งˆ์น˜๋ฉฐ

Recoil ๋•๋ถ„์— React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ์˜ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์ง๊ด€์ ์ด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์ธ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๋ถ€ํ„ฐ ๊ธฐ์—…์˜ ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ๊นŒ์ง€, ์ƒํƒœ ๊ด€๋ฆฌ์— ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ๊ณ  ๊ณ„์‹œ๋‹ค๋ฉด Recoil์„ ์ ๊ทน ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค์—๊ฒŒ ํ™•์‹คํžˆ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ณ  ์ฆ๊ฑฐ์›€์„ ์„ ์‚ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.๐Ÿ˜‰

๋Œ“๊ธ€

๊ฐ€์žฅ ๋งŽ์ด ๋ณธ ๊ธ€