귀여운 눈높이에서 작성된, 🐰

하루 한 걸음씩, 성장 하는 중 입니다 🫶🏻

Studying/React

리액트 공부하기 - 상태 관리 라이브러리 총정리: 장단점 비교

creamymood 2025. 5. 5. 13:28

공부하다보니, useState는 거의 이제 이해한 것 같아서 편리한데,

 

전역으로 상태관리 하려면.. context API가 제일 간단하고 쉬워보여서, 이것만 쓰고 싶은데... (리덕스 싫어..)

 

그런데 역시나 장단점이 있다. 전부 공부하고 적재적소에 써야 할 듯. ~ .. 야호 ~


우선 제일 좋아하는 context API를 자세히 알아보자.

더보기

리액트에서 전역 상태 관리를 할 때 Context API는 가장 기본적이고 간단한 방법 중 하나예요. 특히 앱이 작거나 중간 규모일 때는 굳이 Redux나 Zustand 같은 외부 라이브러리를 쓰지 않아도 되고, Context + useReducer 조합만으로도 충분히 효율적인 구조를 만들 수 있어요.

✓Context API의 장점

  • 간단하고 가볍다: 외부 라이브러리 설치 없이 바로 사용 가능.
  • 리액트 내장 기능이라 배우기도 쉽고 공식 문서도 잘 되어 있음.
  • 작은 프로젝트나 전역 데이터가 많지 않은 경우 적합함.

✓ 단점

  • 불필요한 리렌더링 이슈: 하위 컴포넌트들이 전부 다시 렌더링될 수 있음.
  • 복잡한 상태 로직 처리에는 한계: 예를 들어 상태가 깊고, 여러 모듈로 나눠야 할 경우 관리가 어려워짐.
  • 성능 최적화가 번거로움: 값이 자주 바뀌는 Context는 성능 저하를 일으킬 수 있음.

✨ 팁

  • useReducer + Context를 같이 쓰면 더 구조적으로 관리할 수 있어요.
  • 여러 context로 나눠서 성능을 분산시키는 것도 좋은 방법이에요.
  • 더 복잡해지면 그때 Redux Toolkit, Zustand, Jotai 같은 걸 고려해도 늦지 않아요.

context API에 불필요한 렌더링 이슈가 있었다니..

그러면 리덕스나 주스탄드는 이런 단점이 없어? 왜? 어떤 원리의 차이야 ? 

더보기

네, Context API는 불필요한 리렌더링 문제가 있을 수 있고,
Redux나 Zustand는 그런 문제를 더 잘 피할 수 있는 구조를 갖고 있어요.

 

 왜 Context는 불필요한 리렌더링이 발생할까?

리액트에서는 Context의 value가 바뀌면
그 Context를 구독하고 있는 모든 하위 컴포넌트가 리렌더링돼요.

예를 들어:

<MyContext.Provider value={count}>
  <CompA />  // count랑 관련 없음
  <CompB />  // count를 쓰는 컴포넌트
</MyContext.Provider>

count가 바뀌면, CompA, CompB 모두 리렌더링돼요.
CompA는 사실 count랑 관련 없는데도요.
이게 Context의 구조적 한계예요.

 

Redux, Zustand는 어떻게 다르냐면?

이 라이브러리들은 구독(subscription) 단위가 더 정교해요.
특히:

 Redux

  • useSelector(state => state.something)으로 필요한 부분만 선택.
  • 내부적으로 === 비교(얕은 비교)를 통해 값이 바뀐 경우에만 리렌더링.
  • 즉, selector 함수로 직접 리렌더링 범위를 좁힘.

 Zustand

  • 상태 자체가 proxy처럼 동작해서, 사용한 부분만 자동 추적함.
  • 예를 들어 useStore(state => state.count)처럼 쓰면,
    count만 바뀌었을 때만 컴포넌트가 리렌더링돼요.
  • 훨씬 자동화되고 최적화된 구조예요.

 그래서, 작은 프로젝트는 Context로 충분하지만,
상태가 자주 바뀌거나 성능이 중요한 경우는 Redux나 Zustand가 좋아요.


상태관리방법 설명 장점 단점
useState 리액트의 기본 훅으로 컴포넌트의 로컬 상태를 관리. - 간단하고 직관적 - 컴포넌트 내 상태만 관리 가능- 여러 상태를 다룰 때 코드가 복잡해질 수 있음
useReducer 더 복잡한 상태 로직을 다룰 때 유용. dispatch와 action을 사용하여 상태를 업데이트. - 상태 업데이트 로직을 더 세밀하게 제어 가능- 상태 업데이트가 많을 때 유용 - useState보다 다소 복잡할 수 있음- 더 많은 코드 작성 필요
Context API 전역 상태를 관리하는 방법으로, React의 기본 기능. 특정 데이터를 여러 컴포넌트에서 공유할 때 유용. - 여러 컴포넌트에서 상태 공유가 쉬움- React 내장 기능이라 별도의 라이브러리 필요 없음 - 상태 업데이트 성능 문제 발생 가능- 컴포넌트 트리 깊어질수록 성능 저하가 있을 수 있음
Redux 전역 상태 관리 라이브러리로, 중앙에서 상태를 관리하고 액션을 통해 상태를 업데이트. - 복잡한 상태 로직을 깔끔하게 관리 가능- 미들웨어를 통해 비동기 처리 용이- 개발자 도구가 잘 제공됨 - 코드가 복잡해질 수 있음- 설정 및 사용법이 상대적으로 어렵고, boilerplate 코드가 많음
MobX 상태 관리 및 상태 변경을 자동으로 추적하는 라이브러리. - 상태 변화가 자동으로 UI에 반영됨- 코드가 간결하고 직관적 - React와의 통합이 필요하고 설정이 다소 복잡할 수 있음- 상태가 변경되는 방식이 명확하지 않을 때 추적 어려움
Recoil React에서 상태를 관리하기 위한 라이브러리로, 상태를 atom 단위로 나누어 관리. - 상태 관리가 직관적이고 세밀함- 비동기 상태 및 의존성 관리 용이 - 아직 새로운 라이브러리여서 커뮤니티나 문서가 부족할 수 있음- 성능에 영향이 있을 수 있음
Zustand 간단하고 직관적인 상태 관리 라이브러리로, 상태를 전역적으로 관리. - 설정이 간단하고 직관적- React와 쉽게 통합 가능- 성능이 뛰어남 - 비교적 적은 커스터마이징이 가능하며, 복잡한 상태 관리를 위한 추가 작업이 필요할 수 있음
XState 상태 머신과 상태 차트를 기반으로 상태를 관리하는 라이브러리. - 상태 머신 패턴을 사용하여 복잡한 상태 흐름을 관리- 예측 가능한 상태 변화를 제공 - 설정이 복잡할 수 있음- 상태 관리의 단순함을 추구하는 경우 과도하게 느껴질 수 있음

위 표는 리액트에서 사용할 수 있는 상태 관리 방법들을 요약한 것입니다.  예를 들어, 간단한 상태 관리는 useState나 useReducer로 충분할 수 있지만, 더 복잡한 상태 관리가 필요한 경우 Redux나 MobX와 같은 라이브러리를 선택하는 것이 좋습니다.


요즘 실무에선 뭐가 제일 많이 쓰여 ? 근데 초보 개발자는 다 공부해야겠지 ?

더보기

실무에서 요즘 가장 많이 쓰이는 상태 관리 라이브러리는 ReduxZustand 외에도 React QueryRecoil도 점점 인기를 끌고 있어요.
하지만 가장 널리 사용되는 건 여전히 Redux (특히 Redux Toolkit)이에요.
왜냐하면:

실무에서 많이 쓰이는 라이브러리

  1. Redux (Redux Toolkit)
    • 대규모 프로젝트나 팀 협업이 많은 프로젝트에서 여전히 많이 쓰임.
    • 미들웨어를 통한 비동기 처리상태 추적에 강점이 있음.
    • 자동화된 개발 툴 (DevTools) 덕분에 디버깅이 쉬워요.
  2. Zustand
    • 작은 규모의 프로젝트에서는 Zustand가 점점 인기를 끌고 있음.
    • 설정이 간단하고, 훨씬 직관적이라 초보 개발자에게 쉽게 접근할 수 있음.
    • 성능이 우수하고, 작고 효율적인 애플리케이션에 적합.
  3. React Query
    • 서버 상태 관리 라이브러리로, API 호출 결과를 자동으로 캐시하고 관리해줘요.
    • 데이터 패칭 및 캐싱을 쉽게 처리할 수 있어서, 백엔드 통신이 많은 앱에서 사용.
  4. Recoil
    • 상태 관리의 단순화성능 최적화를 목표로 만든 라이브러리.
    • 특히 공유된 상태파생된 상태를 효율적으로 관리할 수 있음.

👨‍💻 초보 개발자는 다 공부해야 할까?

초보 개발자라면 모든 걸 다 공부할 필요는 없어요.
초기에는 필요한 것만 먼저 배우고, 점차적으로 깊이를 늘려가는 게 좋아요.

  1. 기본적인 상태 관리useStateuseReducer부터 시작해요.
  2. 작은 프로젝트간단한 상태 관리Context APIZustand로 충분히 해결 가능해요.
  3. 대규모 프로젝트협업이 많아질수록 Redux를 공부하는 게 중요해져요.
  4. React QueryRecoil은 백엔드 통신이나 복잡한 상태 관리가 필요할 때 선택적으로 공부하면 좋겠어요.

🧑‍🏫 공부 방법

  • Context API → 상태 관리의 기본을 이해하고, 컴포넌트 간 데이터 전달을 익히기.
  • Zustand → 간단한 전역 상태 관리를 통해, 직관적인 코드 작성법 익히기.
  • Redux → 복잡한 애플리케이션에서 상태를 효율적으로 관리하는 방법을 익히기.
  • React Query서버 상태 관리API 통신을 배우기.

결론적으로, 초보자는 간단한 상태 관리부터 시작하고,
필요한 때 ReduxReact Query를 공부하는 방식이 좋아요.
이렇게 하면 효율적으로 실력을 쌓을 수 있어요!

지피티 선생님이 정답은 아니지만 ~

이렇게 공부하면 효율적일 것 같습니다. 다음 글은 zustand 관련 글!