๊ธฐ์กด์ ์ ์ธํ atom์ ์ /ํ ์ฒ๋ฆฌํ์ฌ ์๋ก์ด ๊ฐ์ ๋ฆฌํดํ๊ฑฐ๋ ๊ธฐ์กด atom์ ๊ฐ์ ์์ ํ๋ ์ญํ ์ ์ํํ๋ค.
์ฐธ์กฐํ atom์ ๊ฐ์ด ์ต์ ํ๋๋ฉด ์๋์ผ๋ก selector์ ๊ฐ๋ ์ต์ ํํ๋ฏ๋ก, ๊ด๋ฆฌํ๊ธฐ์๋ ๊ฐํธํ๋ค.
ํค๊ฐ์ผ๋ก selector๋ฅผ ๊ตฌ๋ถํ ์ ์๋ id์ธ key, selector์ value๋ฅผ ๋ฐํํ๋ get ํจ์๊ฐ ํ์ํ๋ค.

selector์ ์์ ์ get function์ ํตํด atom์ ๊ฐ์ ธ์ ์ํ๋ฅผ ๋ณํํ๋ ๊ฒ์ด๋ค.
get ํจ์๋ options๋ผ๋ ์ธ์๋ฅผ ๋ฐ์ผ๋ฉฐ ํธ์ถ๋๋๋ฐ options๋ ๊ฐ์ฒด๋ก ๋ด๋ถ์ get function์ด ๋ค์ด์๋ค.
๊ฐ์ฒด ๋ด๋ถ์ get function์ ์ฌ์ฉํด selector ๋ด๋ถ๋ก atom์ ๊ฐ๊ณ ์ฌ ์ ์๋ ๊ฒ์ด๋ค.
์๋ ์ฝ๋๋ฅผ ์ค๋ช ํ์๋ฉด get()์ ํตํด atom์ ๊ฐ์ ธ์ด์ผ๋ก์จ seletor๋ atom์ ๋ณด๊ณ ์๋ ์ํ๊ฐ ๋๋ค.
atom์ด ๋ณ๊ฒฝ๋๋ฉด seletor ๋ํ ๋ณํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๋ฆฌํด๋ selecor ๊ฐ์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ useRecoilValue()๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ฐ๊ธฐ ๊ฐ๋ฅํ ์ํ๋ฅผ ๋ฐํํ๋ค.
state๋ฅผ ํน์ ๊ฐ์ผ๋ก ์์ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฒ์ด๋ค.
์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ state๋ฅผ ์์ ํ set function, ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ์๋ก์ด ๊ฐ์ ๋ํ๋ด๋ newValue ์ด๋ค.
atom๊ณผ ๋์ผํ๊ฒ useRecoilState๋ฅผ selector๋ก ์ฐ๊ณ ์๋ค๋ฉด ๊ฒฐ๊ณผ ๊ฐ์ผ๋ก ๋ฐฐ์ด์ ๋ฐ๊ฒ ๋๋ค.
์ฒซ ๋ฒ์งธ ์์๋ get function์ผ๋ก ๋ถํฐ ๋ฆฌํดํ ๊ฐ์ด๋ฉฐ, ๋ ๋ฒ์งธ ์์๋ selector์ set property๋ฅผ ์คํ์ํค๋ set ํจ์๊ฐ ๋๋ค.
atom, selector ๋ชจ๋ useRecoilState๋ฅผ ํตํด ๊ฐ ์์ ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
๋ถ์ ์๊ฐ์ผ๋ก, ์๊ฐ์ ๋ถ์ผ๋ก ๋ณํ์์ผ์ฃผ๋ ํ๋ก๊ทธ๋จ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๋ถ๊ณผ ์๊ฐ์ ์ ๋ ฅํ input ํ๊ทธ์ ์ ๋ ฅ๊ฐ์ value๋ก ์ฌ์ฉํ๊ธฐ ์ํ atom์ ์ ์ํด์ฃผ์๋ค.
// ์
๋ ฅ๊ฐ state
import { atom } from "recoil";
export const minuteState = atom<number>({
key: "minute",
default: 0,
});
// ๋ถ -> ์๊ฐ, ์๊ฐ -> ๋ถ ๋ณํ
export const convertMinuteSelector = selector<number>({
key: "minuteToHour",
get: ({ get }) => {
const minute = get(minuteState);
return minute / 60;
},
set: ({ set }, newMinute) => {
const minute = Number(newMinute) * 60;
set(minuteState, minute);
},
});

์ ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด set function์ ๋๋ฒ ์งธ ์ธ์๋ก newValue๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ ๋ ฅ๊ฐ์ newValue๋ก ๋ฐ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
์ฐธ๊ณ