👉상태
- React에서 State는 component 안에서 관리되는 것
👉component 간의 정보 공유
- 자식 컴포넌트들 간의 다이렉트 데이터 전달 불가능
- 부모 컴포넌트를 통해 주고 받음
- 자식이 많으면 상태 관리 매우 복잡
- 상태를 관리하는 상위 컴포넌트에서 계속 내려받는 props drilling 이슈가 생김
👉 상태 관리 라이브러리(툴)을 써야하는 이유
- 전역 상태 저장소 제공
- props drilling 이슈 해결
확실히 react-redux가 recoil보다 압도적으로 많이 사용함
Javascript 상태관리 라이브러리
상태(State)는 컴포넌트 내부에서 사용하는 데이터, 컴포넌트 내부에서 사용하는 데이터
상태가 관리되는 하나의 공간
Action 객체가 dispatch() 메서드에 전달 -> dispatch()를 통해 Reducer를 호출 -> Reducer는 새로운 Store를 생성
페이스북에서 만든 React 상태 관리 라이브러리
react가 기본적으로 단방향 데이터 흐름이고 복잡한 상태 관리를 위해 상태를 끌어올리거나 redux같은 상태관리 라이브러리를 사용해야하지만,
recoil은 기존 react 컴포넌트 내에서 상태를 관리할 수 있게 해줌
Recoil은 React의 Context API와 유사한 방식으로 상태를 관리
컴포넌트 내에서 상태를 정의하고 사용, 다른 컴포넌트에서도 해당 상태를 사용할 수 있음
Redux와 같은 별도의 상태 관리 라이브러리를 사용하지 않아도 되는 장점
Recoil은 비동기 상태 관리도 지원
Promise나 async/await을 사용하여 비동기 처리, 상태 변화를 감지하여 자동으로 컴포넌트 업데이트함
개발자 도구 제공하여 상태 변화 쉽게 추적하고 디버깅 할 수 있음
Recoil은 부트캠프에서 사용해본적 없는 라이브러리이므로 예시를 한번 곱씹어보겠다
import { atom, useRecoilState} from 'recoil';
// 상태 정의
const counterState = atom({
key: 'counterState',
default: 0,
});
// 컴포넌트에서 상태 사용
function Counter() {
const [count, setCount] = useRecoilState(counterState);
function handleClick() {
setCount(count + 1);
}
return(
<div>
<p>Count : {count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
}
위의 코드를 처음 사용해보았기 때문에 해석해보자면
atom() 함수
- Recoil에서 상태를 정의하는 함수
- counterState는 하나의 원자상태(atom state)를 나타냄
이 상태는 key와 default속성을 가지고 있음
key속성은 상태를 식별하는데 사용되는 고유한 문자열
default속성은 초기 상태를 설정
Counter 함수 컴포넌트
- Counter 함수 컴포넌트는 Recoil 상태를 사용하는 React 함수 컴포넌트
useRecoilState()훅
- Recoil에서 상태를 읽고쓰기 위해 사용
- 훅은 하나의 Recoil 상태(atom state)를 사용하며,
배열의 첫 번째 요소는 현재 상태 값이고, 두 번째 요소는 상태를 업데이트하는 함수- counterState를 사용하여 현재의 count값을 가져오고, setCount 함수를 사용하여 이 값을 업데이트
handleClick 함수
- handleClick 함수는 버튼이 클릭되었을 때 호출
- 이 함수는 setCount 함수를 사용하여 count 값을 1 증가
Render 메소드
- Counter 컴포넌트는 count값을 화면에 렌더링하고, 클릭 이벤트가 발생했을 때 handleClick 함수를 호출하는 버튼을 렌더링
해당 프로젝트는 책과 관련된 주제로 구성된 커뮤니티, 도서소개, 설문조사, 중고거래, 독립서점 소개 등등 다양한 컨텐츠를 제작한 사이트이다.
여기서 전역으로 상태 관리할 목적인 데이터 값은 유저 세션이고 해당 데이터를 전역관리해서 로그인시 어느 페이지에서도 로그인 상태를 유지시킬 목적으로 사용하였다.
수 많은 컴포넌트별 공유되어야 할 데이터들은 많이 있지만 왠만한 데이터들은 props 한두번으로 공유가 가능하였고,
그 중 전역관리할 데이터가 유저 데이터 1개 뿐이였기 때문에 recoil vs redux를 비교하게 되었다.
Redux는 액션, 리듀서, 스토어 등의 개념을 이해하고 사용해야 하는 반면, Recoil은 React의 상태를 직접적으로 관리할 수 있도록 돕고, 유지보수가 훨씬 간단하다
즉, 우리가 사용해야할 라이브러리는 Redux Toolkit이였는데, 해당 코드는 기본 코드량이 Recoil보다 압도적으로 커서 홈페이지 성능에 오히려 방해가 된다고 판단하였다.
Redux에선 상태를 전달해야 업데이트가 되지만, Recoil에선 상태를 직접 공유하고 업데이트 할 수 있다
Redux에선 상태 변화에 따라 모든 하위 컴포넌트가 다시 렌더링 되는 문제가 발생될 수 있는데, Recoil은 상태의 변화가 해당 상태를 구독하는 컴포넌트에서만 영향을 미치도록 되어 있다.
사실 다양한 채택 이유가 있지만 그 중에서 가장 큰 이유는 바로
그 자체에 초점을 두었기 때문이다.
코드가 많아지면 성능이 감소되는 문제가 있기 때문에 상대적으로 사용방법도 쉬우면서 코드량도 적은 Recoil이 우리 프로젝트에 적용한게 가장 큰 이유라 볼 수 있다.
실제로도 props로만 데이터 관리를 진행하다 코드 리펙토링을 하며 전역 상태 관리를 하다보니 성능 개선에 큰 도움이 되었을거라 판단된다
https://hanamon.kr/%ec%83%81%ed%83%9c%ea%b4%80%eb%a6%ac%eb%8f%84%ea%b5%ac-%ed%95%84%ec%9a%94%ec%84%b1/
https://despiteallthat.tistory.com/192