📚 이론정리/React & Next.js

✏️ Recoil 사용하기

서카츄 2024. 3. 2. 05:13

 

Docs

 

Recoil 시작하기 | Recoil

React 애플리케이션 생성하기

recoiljs.org

 

 

 


 

Recoil의 상태관리

Recoil은 원자 기반의 상태 관리 방식을 사용한다.

상태는 원자의 단위로 관리되고, 컴포넌트는 이 원자의 구독자가 된다.

 

 

상태 업데이트 방식

Recoil은 상태 변경 시 전체 컴포넌트 트리를 재렌더링하지 않고, 변경된 원자의 구독자만 재렌더링한다.

React Hooks와 유사하게 작성되어 있다. 예를 들어 useRecoilState, useRecoilValue 등의 Hooks이 있다.

 

 


 

🤔 이쯤에서 궁금한 Recoil과 Zustand의 차이점

  Recoil Zustand
상태관리  원자 기반의 상태 관리 방식을
상태는 원자라는 단위로 관리,
컴포넌트는 이 원자의 구독자가 됨.
스토어 기반의 상태 관리 방식
상태는 하나의 전역 스토어에 관리,
컴포넌트는 이 스토어에서 상태를 가져옴.
상태 업데이트 방식 전체 컴포넌트 트리를 재렌더링하지 않고,
변경된 원자의 구독자만 재렌더링
스토어 전체를 구독하고 있는
컴포넌트만 재렌더링
API React Hooks와 유사한 스타일,
useRecoilState, useRecoilValue 등
간단한 API를 제공,
상태와 액션을 포함하는 하나의 객체를 작성하고, useStore Hook을 사용하여 접근
성능 Recoil은 변경된 원자의 구독자만 재렌더링하므로 대규모 애플리케이션에서 성능이 더 좋을 수 있다. Zustand는 상대적으로 더 간단하고 사용이 편리하여 소규모 프로젝트에 더 적합할 수 있다.

 

따라서 프로젝트의 규모와 복잡도, 팀의 선호도에 따라 Recoil 또는 Zustand 중 하나를 선택하면 된다.

하지만 둘다 써본 입장에서는 둘다 기본적으로 사용하기 쉬웠지만

Recoil을 좀더 써보고 왜 요새 트랜드는 Zustand를 쓰는지 판단 해 봐야 할 것 같다..

결국은 전역상태 관리는 개인 선호도에 따라 갈라질 것 같다!

 

 


 

Recoil 설치

npm install recoil
//또는
yarn add recoil

 

 

 

RecoilRoot

recoil 상태를 관리하는 컴포넌트에 RecoilRoot를 넣어준다.

Next.js 을 사용하면 따로 provider 컴포넌트로 만들어서 넣어줘도 된다.

 

import React from 'react';
import {
  RecoilRoot,
  atom,
  selector,
  useRecoilState,
  useRecoilValue,
} from 'recoil';

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

 

 

또는

RecoilProvider.tsx

"use client";
import { RecoilRoot } from "recoil";
import { AuthProvider } from "./AuthProvider";

const RecoilProvider = ({ children }: { children: React.ReactNode }) => {
  return (
    <RecoilRoot>
      <AuthProvider>{children}</AuthProvider>
    </RecoilRoot>
  );
};

export default RecoilProvider;

 

 


 

사용법

초기값을 관리하는 파일 만들기

index.ts

import { atom } from "recoil";

export const isEditState = atom({
  key: "isEditState", //변수명
  default: false, //초기값
});

 

key는 변수명(컴포넌트에서 사용할 이름)

default는 초기값을 의미한다.

 

 

 

 

 

사용하려는 컴포넌트

import { useState } from "react";

const Edit = () => {
  const [isEdit, setIsEdit] = useState(false);
  return <div>Recoil 연습하기</div>;
};

export default Edit;

 

기존 컴포넌트에서는 이렇게 사용할 것인데

useState와 유사하니 내가 알기 쉽게 정리하자면,

useState 대신 useRecoilState

false자리엔 대신 isEditState로 바꿔준다.

 

 

 

 

 

적용한 결과

import { isEditState } from "@/store";
import { useRecoilState } from "recoil";

const Edit = () => {
  const [isEdit, setIsEdit] = useRecoilState(isEditState);
  return <div>Recoil 연습하기</div>;
};

export default Edit;

 

store에 있는 isEditState 내용을 가져와서 사용한다! 라고 보면된다.

useRecoilState에서 가져오고, isEditState에 있는 내용을 꺼내와서

isEdit 이름으로 바꿔서 사용한다고 생각하면 된다!