๐ป ์ค์ ํ๋ก๊ทธ๋๋ฐ | 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์ ์ ๊ทน ์ถ์ฒํฉ๋๋ค. ๊ฐ๋ฐ์ ๋ถ๋ค์๊ฒ ํ์คํ ์์ฐ์ฑ์ ๋์ด๊ณ ์ฆ๊ฑฐ์์ ์ ์ฌํ ๊ฒ์ ๋๋ค.๐
๋๊ธ
๋๊ธ ์ฐ๊ธฐ