inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

React 마스터 클래스: Part 3 - 실무 핵심 라이브러리 정복 (TypeScript, Zustand, React Hook Form, TanStack Query)

[실습] 16강. 상태 관리의 세대교체 — Context API의 한계를 넘어서는 Zustand의 혁명

Context API vs Zustand 그리고 Auth

Coi

작성한 질문수 11

0

안녕하세요.

Context API의 대안으로 Zustand를 사용할 때의 장점과 함께, Zustand가 반드시 Context API를 대체하는 것이 아니라 상태의 특성에 따라 전략적으로 선택해야 한다고 설명해주셨습니다.

예를 들어 다크 모드나 다국어 설정처럼 변경 빈도가 낮으면서 여러 컴포넌트에서 공유해야 하는 상태의 경우 Context API도 충분히 적합할 수 있다고 이해했습니다.

제가 이해한 바로는 Context API가 적합한 경우를 크게 다음과 같이 생각해볼 수 있을 것 같습니다.

  1. 특정 컴포넌트와 그 하위 컴포넌트에서만 공유해야 하는 상태

    • Provider의 범위를 해당 컴포넌트 트리로 제한하여 사용하는 경우

  2. 애플리케이션 전역에서 공유하지만 변경 빈도가 낮은 상태

    • 다크 모드

    • 다국어 설정

    • 전역 configuration 등

반면, 전역에서 사용하면서 변경이 빈번하거나 여러 상태를 세분화하여 구독해야 하는 경우에는 Zustand와 같은 외부 상태 관리 라이브러리가 더 적합할 수 있다고 이해했습니다.

1. Context API에 대한 제 이해가 맞을까요?

Context API와 Zustand를 선택할 때 단순히 Local vs Global만으로 구분하기보다는,

등을 함께 고려해야 한다고 이해했는데, 이 방향이 맞는지 궁금합니다.

혹시 이 외에도 Context API와 Zustand를 선택할 때 중요하게 봐야 하는 기준이 있을까요?

2. 그렇다면 Auth 상태는 어디에서 관리하는 것이 좋을까요?

Auth의 경우에는 실무, 프로젝트 작업을 할 때 상태 관리를 어떻게 해야할지 판단이 어렵고 로직을 짜는데 항상 이게 맞나? 괜찮나? 라는 고민을 가졌습니다.

예를 들어 서버에서 현재 로그인한 사용자 정보를 받아온다고 했을 때 다음과 같은 방법들을 생각해볼 수 있을 것 같습니다.

여기서 궁금한 점은 서버에서 가져온 auth/user 정보가 본질적으로 server state라면 TanStack Query의 cache를 그대로 single source of truth로 사용하는 것이 더 적절한지, 아니면 Context나 Zustand에 별도로 저장하여 client state로 관리하는 것이 적절한 경우도 있는지입니다.

특히 TanStack Query에서 가져온 데이터를 다시 Context나 Zustand에 저장하면 동일한 데이터가 두 곳에 존재하게 되는데, 이런 형태는 가급적 피해야 하는지도 궁금합니다.

3. React / Next.js와 인증 방식에 따라 기준이 어떻게 달라질까요?

Auth 상태 관리는 프레임워크와 인증 방식에 따라서도 달라질 것 같습니다.

예를 들어 다음 네 가지 경우를 생각해봤습니다.

  1. React + 클라이언트에서 JWT 관리

  2. React + 서버 Session 기반 인증

  3. Next.js + 클라이언트에서 JWT 관리

  4. Next.js + 서버 Session 기반 인증

각각의 경우에 인증의 source of truth를 어디에 두고, Context API / Zustand / TanStack Query 중 어떤 역할을 맡기는 것이 적절한지 궁금합니다.

단순히 “Auth는 Context”, “전역 상태는 Zustand”처럼 정해진 기준보다는,

인증 정보의 source of truth가 어디에 있는지, server state와 client state 중 어디에 해당하는지, 그리고 해당 상태를 어떤 범위에서 소비하고 변경하는지

를 기준으로 판단해야 할 것 같은데, 이 관점이 맞는지도 궁금합니다.

4. Route 접근 제한은 어느 계층에서 처리하는 것이 적절할까요?

Auth 상태 관리와 함께 궁금한 부분이 인증 여부에 따른 route 접근 제한입니다.

예를 들어 로그인한 사용자만 /dashboard, /mypage 등에 접근할 수 있도록 제한한다고 했을 때, React와 Next.js에서는 접근 방식이 다를 수 있다고 생각했습니다.

React + React Router v7

React SPA에서는 서버가 아닌 클라이언트에서 routing이 이루어지기 때문에 다음과 같은 방법들을 생각해볼 수 있을 것 같습니다.

이 경우 UI 레벨에서의 route protection과 실제 보안을 위한 서버의 인증/인가를 어떻게 구분해야 하는지 궁금합니다.

또한 Context나 Zustand의 isAuthenticated 같은 client state를 기준으로 route 접근을 제한하는 것이 적절한지, 아니면 서버의 session/token 검증 결과를 기준으로 접근 여부를 판단하는 것이 더 적절한지도 궁금합니다.

Next.js

Next.js에서는 React SPA와 달리 서버에서 인증 정보를 확인할 수 있기 때문에,

등 여러 계층에서 접근 제한을 처리할 수 있다고 알고 있습니다.

이때 궁금한 점은 어느 계층에서 route 접근을 제한하는 것이 가장 적절한지, 그리고 각각의 역할을 어떻게 구분해야 하는지입니다.

예를 들어,

“로그인하지 않은 사용자에게 페이지 자체를 보여주지 않는 것”과 “해당 사용자가 실제 데이터나 API에 접근하지 못하도록 보안을 적용하는 것”은 별개의 문제로 보고 각각 처리해야 하는지 궁금합니다.

결국 route protection 역시 Context API / Zustand 중 무엇을 사용하느냐보다,

인증의 Source of Truth가 어디에 있는지 → 어느 시점에 인증 여부를 확인할 수 있는지 → UI 접근 제어와 실제 서버의 인증/인가를 어느 계층에서 담당할 것인지

를 먼저 결정하는 것이 맞는지도 궁금합니다.


추가적으로 실무 관점에서의 예시도 궁금합니다.

가능하시다면 위 질문들에 대해 개념적인 기준뿐만 아니라, 강사님께서 실제 프로젝트를 설계하신다면 각각 어떤 방식을 선택하실지도 궁금합니다. 뿐만 아니라 실무에서 일반적으로 많이 사용하는 패턴이 있는지, 또는 정해진 표준이 없다면 강사님의 실무 경험에서는 어떤 구조를 주로 선택하셨고, 그렇게 선택하신 이유가 무엇인지도 함께 설명해주시면 정말 도움이 될 것 같습니다.

가능하다면 단순한 개념 설명뿐만 아니라 간단한 프로젝트 구조나 코드 예시도 함께 보고 싶습니다.

javascript react typescript frontend zustand

답변 0

110강부터 따라가기가 힘듭니다...

0

15

1

커서에서 붙여넣기

0

10

1

깃허브 사용시 폴더경로 관련질문

0

10

1

[reducer] 기능별 폴더 구조 설계/ 파일 분리로 유지 보수 가능한 아키텍처 구축

0

7

1

장치 의존성과 CSR

0

11

0

순수 함수 / 순수 컴포넌트

0

8

0

css box-sizing 관련 질문

0

17

2

스니펫이 이상해요

0

14

2

/output-style 명령어는 폐기 되었다고 나오네요.

0

19

1

프롬프트 작성시 html, css, javascript

0

14

1

Editor Component의 최적화 불가능 이슈

0

21

2

Cursor 창이 수업 내용과 달라요.

0

22

2

Supabase MCP 관련 질문입니다

0

23

1

에러핸들링- rootlayout에 관하여

0

18

2

useCallback ⊂ useMemo

0

28

2

강의 내용 누락

0

21

0

클로드 로그인 후 승인창이 안떠요

0

31

1

깃허브 저장소를 어디에 첨부하셨나요?

1

32

1

81강 실습 자료 없음

0

50

2

62강 실습자료가 잘못되었습니다.

0

42

1

27강 Context내 RSC 사용 관련 문의

0

123

3

문의관련 문의

0

109

2

[실습] 80강 없음

0

111

2

63,65 중복

0

154

1