์‹œ์ž‘ํ•˜๋ฉฐ

๋‹ˆํŒ… ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ recoil์ด๋ผ๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅด ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ณด์•˜๋‹ค. ๊ธฐ์กด์— ๊ตฌ์„ฑ์ด ๋‹ค ์žกํ˜€์žˆ์–ด์„œ ์ƒˆ๋กœ์šด ์ƒํƒœ ์ถ”๊ฐ€, ๊ธฐ์กด์— ์žˆ๋˜ ์ƒํƒœ ์‚ฌ์šฉ ๋“ฑ์˜ ๊ฒƒ๋“ค๋งŒ ํ•ด๋ณด์•˜๋Š”๋ฐ ํ”„๋กœ์ ํŠธ์—์„œ recoil์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ atom, selector์— ๋Œ€ํ•œ ๊ฐœ๋…์ ์ธ ๋ถ€๋ถ„์ด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๊ณต์‹๋ฌธ์„œ ๋ฅผ ์ฝ์–ด๋ณด์•˜๋‹ค.

Recoil

Recoil์€ React๋ฅผ ์œ„ํ•œ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

  • ์ž‘๊ณ  React์Šค๋Ÿฌ์šด

Recoil์€ React์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋น ๋ฅด๊ณ  ์œ ์—ฐํ•œ ๊ณต์œ ๋˜๋Š” ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”.

  • ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ทธ๋ž˜ํ”„

ํŒŒ์ƒ ๋ฐ์ดํ„ฐ์™€ ๋น„๋™๊ธฐ ์ฟผ๋ฆฌ๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜์™€ ํšจ์œจ์ ์ธ ๊ตฌ๋…์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

  • ๊ต์ฐจํ•˜๋Š” ์•ฑ ๊ด€์ฐฐ

์ฝ”๋“œ ๋ถ„ํ• ์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ์•ฑ ์ „์ฒด์˜ ๋ชจ๋“  ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ด€์ฐฐํ•˜์—ฌ ์ง€์†์„ฑ, ๋ผ์šฐํŒ…, ์‹œ๊ฐ„ ์ด๋™ ๋””๋ฒ„๊น… ๋˜๋Š” ์‹คํ–‰ ์ทจ์†Œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ฐœ๋…

๊ฐœ์š”

Recoil์„ ์‚ฌ์šฉํ•˜๋ฉด atoms(๊ณต์œ  ์ƒํƒœ)์—์„œ selectors(์ˆœ์ˆ˜ ํ•จ์ˆ˜)๋ฅผ ๊ฑฐ์ณ React ์ปดํฌ๋„ŒํŠธ๋กœ ๋‚ด๋ ค๊ฐ€๋Š” data-flow graph๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. Atoms๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์˜ ๋‹จ์œ„๋‹ค. Selectors๋Š” atoms ์ƒํƒœ๊ฐ’์„ ๋™๊ธฐ ๋˜๋Š” ๋น„๋™๊ธฐ ๋ฐฉ์‹์„ ํ†ตํ•ด ๋ณ€ํ™˜ํ•œ๋‹ค.

Atoms

Atoms๋Š” ์ƒํƒœ์˜ ๋‹จ์œ„์ด๋ฉฐ, ์—…๋ฐ์ดํŠธ์™€ ๊ตฌ๋…์ด ๊ฐ€๋Šฅํ•˜๋‹ค. atom์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด ๊ฐ๊ฐ์˜ ๊ตฌ๋…๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ฐ˜์˜ํ•˜์—ฌ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋œ๋‹ค.

const fontSizeState = atom({
  key: 'fontSizeState',
  default: 14
});

Atom๋Š” ๋””๋ฒ„๊น…, ์ง€์†์„ฑ ๋ฐ ๋ชจ๋“  atoms์˜ map์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๊ณ ๊ธ‰ API์— ์‚ฌ์šฉ๋˜๋Š” ๊ณ ์œ ํ•œ ํ‚ค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํ‚ค ๊ฐ’์€ ์ „์—ญ์ ์œผ๋กœ ๊ณ ์œ ํ•˜๋„๋ก ํ•ด์•ผํ•œ๋‹ค. React ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ์ฒ˜๋Ÿผ ๊ธฐ๋ณธ๊ฐ’๋„ ๊ฐ€์ง„๋‹ค. ์ปดํฌ๋„ŒํŠธ์—์„œ atom์„ ์ฝ๊ณ  ์“ฐ๋ ค๋ฉด useRecoilState๋ผ๋Š” ํ›…์„ ์‚ฌ์šฉํ•œ๋‹ค. useState์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๊ณต์œ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

const [fontSize, setFontSize] = useRecoilState(fontSizeState);

์ถ”๊ฐ€์„ค๋ช…

atom()ํ•จ์ˆ˜๋Š” ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ RecoilState ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…
atom๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” Hooks

  • useRecoilState(): atom์„ ์ฝ๊ณ  ์“ฐ๋ ค๊ณ  ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Hook
  • useRecoilValue(): atom์„ ์ฝ๊ธฐ๋งŒ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Hook
  • useSetRecoilState(): atom์— ์“ฐ๋ ค๊ณ ๋งŒ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Hook
  • useResetRecoilState(): atom์„ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Hook

Selectors

Selector๋Š” atoms๋‚˜ ๋‹ค๋ฅธ selectors๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„๋“ค์ด๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜(pure function)๋‹ค. ์ƒ์œ„์˜ atoms, selectors๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ํ•˜์œ„์˜ selector ํ•จ์ˆ˜๋„ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋“ค์€ selectors๋ฅผ atoms์ฒ˜๋Ÿผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ selectors๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋“ค๋„ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋œ๋‹ค.
Selectors๋Š” ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒŒ์ƒ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ์— ์‚ฌ์šฉ๋œ๋‹ค. ์ตœ์†Œํ•œ์˜ ์ƒํƒœ ์ง‘ํ•ฉ๋งŒ atoms์— ์ €์žฅํ•˜๊ณ  ๋‹ค๋ฅธ ํŒŒ์ƒ ๋ฐ์ดํ„ฐ๋Š” selectors์— ๋ช…์‹œ๋œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ณ„์‚ฐํ•จ์œผ๋กœ์จ ์“ธ๋ชจ์—†๋Š” ์ƒํƒœ์˜ ๋ณด์กด์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

const fontSizeLabelState = selector({
  key: 'fontSizeLabelState',
  get: ({ get }) => {
    const fontSize = get(fontSizeState);
    const unit = 'px';
    
    return `${fontSize}${unit}`;
  }
})

get์†์„ฑ์€ ๊ณ„์‚ฐ๋  ํ•จ์ˆ˜๋‹ค. ์ „๋‹ฌ๋˜๋Š” get ์ธ์ž๋ฅผ ํ†ตํ•ด atoms์™€ ๋‹ค๋ฅธ selectors์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ๋“ค์— ์ ‘๊ทผํ•˜๋ฉด ์ข…์† ๊ด€๊ณ„๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ, ๋‹ค๋ฅธ ๊ฒƒ๋“ค์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์ด ํ•จ์ˆ˜๋„ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค.
Selectors๋Š” useRecoilValue()๋ฅผ ์‚ฌ์šฉํ•ด ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. useRecoilValue()๋Š” ํ•˜๋‚˜์˜ atom์ด๋‚˜ selector๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๋Œ€์‘ํ•˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Recoil ์‹œ์ž‘ํ•˜๊ธฐ

RecoilRoot

recoil ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋ถ€๋ชจ ํŠธ๋ฆฌ ์–ด๋”˜๊ฐ€์— ๋‚˜ํƒ€๋‚˜๋Š” RecoilRoot๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์žฅ ์ข‹์€ ์žฅ์†Œ๋‹ค.

๋งˆ์น˜๋ฉฐ

๊ณต์‹๋ฌธ์„œ์—์„  ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ๋‚˜ ํ…Œ์ŠคํŒ… ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋„ ๊ฐ€์ด๋“œํ•ด์ฃผ๊ณ  ์žˆ๋‹ค. ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ ์‹œ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.