[React] 어떤 상태관리 라이브러리를 써야할까?(Redux, Mobx, SWR, React Query)

sujin·2023년 2월 25일
1

React

목록 보기
16/16
post-thumbnail

상태관리 라이브러리 찍먹하기

요즘 개인적으로 사이드 프로젝트하면서 강의를 듣고 있는 중인데 SWR이라는 상태관리 라이브러리를 새롭게 알게되었다. 그 전에 공부했던 상태관리 라이브러리는 Redux 가 있었고 인턴을 할때는Mobx를 써봤고 현재 재직중인 회사에서는 React Query를 쓰고 있다. 이 와중에 또 새롭게 알게된 SWR까지...

의도치 않게 여러 상태관리 라이브러리를 조금씩 써보게 됐는데 쓰면 쓸수록 혼란스러움도 같이 커지는 기분이었달까ㅎㅎ (이전에 사용했던 상태관리 라이브러리에 익숙해지지 않은 상태에서 또 새로운것을 쓰게 되다 보니 그랬던 것 같다.) 그래서 이번 기회에 상태관리 라이브러리들의 특징과 차이점들에 대해서 정리하고 프로젝트 조건에 맞는 BEST 상태 관리 라이브러리를 쓰려고 한다.



💡 상태관리를 해야하는 이유

상태관리 라이브러리에 대해서 알아보기 전에 상태관리를 왜 해야할까?!

먼저, 리액트는 단방향 바인딩으로 부모 컴포넌트에서 자식컴포넌트로stateprops로 전달 할 수 있다. 여기서 프로젝트의 규모가 커지고 컴포넌트가 많아지면 state를 자식의 자식의 자식의 자식의 자식… 이런식으로 전달하게 되고 상태관리가 복잡해지게 된다.

  • 예를 들어 A > B > C > D 와같은 관계의 컴포넌트가 있다고 가정했을 때 D컴포넌트가 A컴포넌트의 state를 필요하다면 그 사이의 모든 컴포넌트(B,C)에 해당 state를 전달해줘야한다.
  • 이렇게 props 를 오로지 하위 컴포넌트로 전달하는 용도로만 쓰이는 컴포넌트들을 거치면서 컴포넌트 트리의 한 부분에서 다른 부분으로 데이터를 전달하는 과정을 props Drilling 이라고 한다.

따라서, 이런 문제를 해결하기 위해 등장한 것이 상태관리 라이브러리이고 상태관리를 통해 state를 전역 변수처럼 만들어 어떤 컴포넌트에서든 바로 접근 가능하도록 하는 것이다!


Redux

Redux는 리액트를 개발함에 있어 일종의 표준 상태관리 라이브러리로 여겨진다. 그래서 나 또한 React를 공부하면서 Redux를 공부했었다. 대부분의 React 애플리케이션 개발 환경 설정 시 자연스럽게 Redux가 마치 React 스택의 일부 인 것처럼 구성되어 있기도 하다.

✅ 특징

  • 데이터가 단방향으로 흐르는 구조
  • action reducer selector store 를 세팅하는 보일러플레이트 코드가 존재함
  • store 에 모든 상태를 저장하는 중앙 집중 방식 (store 는 외부 요소이기 때문에 리액트 내부에 접근이 불가능함)
  • store 내부 상태는 action 객체에 의해서만 변경이 가능함
    따라서, 모든 state 변화들이 하나의 store에만 집중되어 있고 단방향으로 일어나기 때문에 예측 가능한 결과가 나타남

❓보일러플레이트 코드
최소한의 변경으로 여러곳에서 재사용되며, 반복적으로 비슷한 형태를 띄는 코드를 말한다.

👍🏻 장점

  • 컴포넌트의 라이프사이클과 관계없이 전역 상태에서 비동기 데이터가 관리되기 때문에 캐싱과 같은 최적화 작업을 쉽게 수행이 가능하고 복잡한 사용자 시나리오에 대한 대응도 가능함
  • 오직 하나의 store 만 가지기 때문에 (객체 트리가 하나) 디버깅에 용이하다.

👎🏻 단점

  • 장황한 보일러플레이트 코드가 요구됨

Mobx

✅ 특징

  • 여러개의 store 를 둘 수 있으며, 여러개의 스토어를 관리하기 위한 루트 스토어를 만들어 이용
  • store 의 데이터를 action 발행 없이 업데이트 할 수 있음
  • 랜더링 대상이 되는 state 를 관찰 대상(observable value)라고 칭하며 @observable 데코레이터로 지정한 state는 관찰대상으로 지정되고 그 state 값이 변경 될 때마다 리랜더링 됨
  • 객체지향적으로 Class를 사용함 (Class 문법 사용)

👍🏻 장점

  • 리덕스와 달리 번잡한 보일러플레이트 코드들을 데코레이터 제공으로 해결함
  • 불변성 유지를 위한 노력이 불필요함 (proxy 를 사용하기 때문에)
  • 리덕스보다 러닝커브가 낮음

👎🏻 단점

  • 여러개의 store 를 갖고 있기 때문에 상태 변경 시 다수의 store 가 영향을 받을 수 있음 (테스트, 유지보수 측면에서 문제를 일으킬 수 있음)

SWR

✅ 특징

  • 캐시로부터 데이터를 반환한 후, fetch 요청(재검증)을 하고 마지막으로 최신 데이터를 제공
  • SWR은 동일한 키를 사용하며 그 요청이 자동으로 중복제거, 캐시, 공유되므로 단 한번의 요청만 API로 전송된다.
  • 실시간 경험이 가능 (포커스 시 갱신, 인터벌시에 갱신, 재연경 시에 갱신, 자동 갠신 비활성화하기도 가능)

❓캐시
자주 사용하는 데이터를 미리 복사해 임시 보관해놓는 장소

👍🏻 장점

  • 불필요한 요청 및 리렌더링을 줄임
  • 재사용 가능한 데이터 hook을 만드는 것이 쉬움

👎🏻 단점

딱히... 찾지 못했음...


React Query

✅ 특징

  • 클라이언트에 서버 상태를 가져오고 캐싱, 동기화하고 업데이트 하는 것을 쉽게 해줌
  • 데이터를 가져온 후 데이터를 저장하고 해당 데이터의 유효기간이 만료되었다고 판단되면 그때 다시 데이터를 refetching 함
  • 클라이언트와 서버의 데이터를 분리함

👍🏻 장점

  • 캐싱
  • get을 한 데이터에 update를 하면 자동으로 다시 get을 실행
  • 데이터가 오래되었다고 판단되면 다시 get
  • 동일 데이터를 여러번 요청하면 한번만 실행

👎🏻 단점

얘도 딱히...


✨ 마무리

이렇게 정리를 해봤는데 그래도 각 라이브러리의 특징 정도는 파악이 된 것 같다! 그래도 역시 코드는 직접 쳐보고 맛봐야 실감이 나는 것 같다. 그래서 이번 사이드 프로젝트에서 SWR을 열심히 써보고 겪는 시행착오에 대해서 블로그에 기록해볼 생각이다~!

profile
개발댕발

0개의 댓글