React

[React] Ep2. Recoil API

모리스🙂 2025. 4. 8. 15:27

 

안녕하세요. 모리스입니다.😊

지난 포스트에서는 React의 Recoil에 대해 아주 간단하게 찍먹해 보았는데요.

이번 포스트는 Recoil에서 자주 사용되는 API 몇 가지에 대해 작성해 보려 합니다.!

 

📒 RecoilRoot

Recoil 상태를 사용하려면, 반드시 컴포넌트 트리 최상위에 RecoilRoot를 선언해야 해요. 그래야 전역에서 상태를 감지하고 관리할 수 있겠죠?

React Native에서는 보통 루트 컴포넌트인 App.js에 Recoil Root를 선언해요.

import React from 'react';
import { RecoilRoot } from 'recoil';

function App() {
  return (
    <RecoilRoot>
      <Screen />
    </RecoilRoot>
  );
}

 


📒 atom()

atom은 Recoil에서 상태를 나타내는 가장 기본 단위예요. atom() 함수는 쓰기 가능한 RecoilState 객체를 반환해요.

const myAtom = atom({
  key: 'myAtom',      // 전역 고유 키
  default: 0,         // 초기값
});

주요 옵션

  • key: atom을 고유하게 식별하는 문자열로, 앱 전체에서 중복되면 안 돼요.
  • default: 초기값. Promise, 다른 atom 또는 selector도 가능해요.
  • effects_UNSTABLE: atom의 생명 주기 이벤트에 반응하는 커스텀 effect들을 정의할 수 있어요.
  • dangerouslyAllowMutability: 객체의 내부 상태를 변경 가능하게 만들 수 있어요. 특별한 경우에만 사용하는 게 좋아요.

💡 자주 사용하는 Recoil Hook들

  • useRecoilState() – 읽고 쓰기 모두 가능
  • useRecoilValue() – 읽기 전용
  • useSetRecoilState() – 쓰기 전용
  • useResetRecoilState() – 초기값으로 리셋
  • useRecoilCallback() – 컴포넌트 외부에서 값 읽기

Hook에 대한 자세한 설명은 다음 포스트에서 다뤄볼게요.

import React from 'react';
import { View, Text, TouchableOpacity } from 'react-native';
import { atom, useRecoilState } from 'recoil';

const counter = atom({
  key: 'myCounter',
  default: 0,
});

function Counter() {
  const [count, setCount] = useRecoilState(counter);
  const incrementByOne = () => setCount(prev => prev + 1);

  return (
    <View>
      <Text>Count: {count}</Text>
      <TouchableOpacity onPress={incrementByOne}>
        <Text>Increment</Text>
      </TouchableOpacity>
    </View>
  );
}

 


📒 selector()

저번 포스트에서도 나왔던 selector입니다~!! 한 번 더 보고 넘어가 볼게요.

selector는 atom의 상태를 기반으로 파생 상태를 계산하는 순수 함수예요. get만 있으면 읽기 전용이고, set도 포함하면 쓰기 가능한 상태로 만들 수 있어요.

const mySelector = selector({
  key: 'mySelector',
  get: ({ get }) => {
    const value = get(myAtom);
    return value * 2;
  },
});

주요 옵션

  • key: selector를 고유하게 식별하는 문자열
  • get: 파생 상태를 계산하는 함수. get()을 사용해 다른 atom이나 selector 값을 가져올 수 있어요.
  • set (선택): selector를 통해 상태를 변경할 수 있어요.
  • dangerouslyAllowMutability: 객체 변경을 허용하는 옵션 (권장 X)

동적 의존성

get() 함수 안에서 조건에 따라 사용하는 의존성을 바꿀 수 있어요. 아래 예시처럼 조건문 안에서 get()을 호출하면, 해당 selector는 실제로 사용된 의존성만 구독하게 돼요.

const toggleState = atom({ key: 'Toggle', default: false });

const mySelector = selector({
  key: 'MySelector',
  get: ({ get }) => {
    const toggle = get(toggleState);
    return toggle ? get(selectorA) : get(selectorB);
  },
});

쓰기 가능한 Selector 예시

const proxySelector = selector({
  key: 'ProxySelector',
  get: ({ get }) => ({
    ...get(myAtom),
    extraField: 'hi',
  }),
  set: ({ set }, newValue) => set(myAtom, newValue),
});

입력 값을 변환해야 한다면 DefaultValue 인스턴스를 체크해야 해요.

const transformSelector = selector({
  key: 'TransformSelector',
  get: ({ get }) => get(myAtom) * 100,
  set: ({ set }, newValue) =>
    set(myAtom, newValue instanceof DefaultValue ? newValue : newValue / 100),
});

비동기 Selector

비동기 요청도 가능해요. get() 함수가 Promise를 반환하면, 해당 selector는 비동기 상태를 가지게 돼요.

const myQuery = selector({
  key: 'MyQuery',
  get: async ({ get }) => {
    const param = get(queryParamState);
    return await myAsyncQuery(param);
  },
});

 


📒 인용 출처

 

 

selector(options) | Recoil

Selector는 Recoil에서 함수나 파생된 상태를 나타낸다. 주어진 종속성 값 집합에 대해 항상 동일한 값을 반환하는 부작용이 없는 "순수함수"라고 생각하면 된다. get 함수만 제공되면 Selector는 읽기

recoiljs.org

 

 

atom(options) | Recoil

atom은 Recoil의 상태를 표현한다. atom() 함수는 쓰기 가능한 RecoilState 객체를 반환한다.

recoiljs.org

 

잘 못되었거나 수정할 부분이 있다면 언제든 댓글로 혼내주시길 바랍니다.!!

오늘도 긴 글 읽어주셔서 감사합니다.😊

'React' 카테고리의 다른 글

[React] Ep3. Recoil Hook  (0) 2025.04.08
[React] Ep1. Recoil 시작하기  (1) 2025.04.08
[React] Ep2. Hook API  (0) 2025.04.07
[React] Ep1. Hook API  (2) 2025.04.07