state-management · high priority
TanStack Query (React Query) 완전 정복
서버 상태 관리의 표준 — 캐싱, 동기화, 낙관적 업데이트
intermediate 난이도4시간토스당근카카오네이버배민
시작 전
이해도
매우 낮음
학습 개요
탄생 배경
쉬운 설명
복잡한 개념을 실생활 비유로 설명합니다.
“스마트 냉장고”
React Query는 스마트 냉장고입니다. 식재료(서버 데이터)를 자동으로 재고 관리합니다. staleTime은 "유통기한 확인 전 기다리는 시간"이고, gcTime은 "유통기한 지난 재료를 버리기까지 기다리는 시간"입니다. 낙관적 업데이트는 주문한 재료가 배달 오기 전에 이미 요리를 시작하는 것입니다.
핵심 개념
서버 상태 vs 클라이언트 상태
서버 상태
- 서버에서 가져오는 비동기 데이터
- 여러 사용자/탭에서 공유
- 언제든 stale해질 수 있음
- → React Query로 관리
1// React Query2const { data: posts } = useQuery({3 queryKey: ['posts'],4 queryFn: () => fetchPosts(),5});
클라이언트 상태
- 브라우저에만 존재하는 UI 상태
- 로컬에서만 의미 있음
- 서버와 동기화 불필요
- → useState/Zustand로 관리
1// useState2const [isModalOpen, setIsModalOpen] = useState(false);3const [selectedTab, setSelectedTab] = useState('all');
실무 적용
어떤 상황에서 사용하는가
댓글 목록 CRUD — 목록 조회, 추가, 삭제, 낙관적 업데이트
어떻게 적용하는가
useQuery로 댓글 목록 조회. useMutation으로 추가/삭제. 삭제 시 낙관적 업데이트로 즉시 UI 반영 후 서버 확인. queryClient.invalidateQueries로 관련 쿼리 재검증. 에러 시 스냅샷으로 롤백.
흔한 실수와 안티패턴
- QueryKey를 하드코딩 문자열로 사용하면 오타 발생 위험 — 팩토리 패턴 권장
- staleTime: 0이 기본값 — 매번 서버 요청이 발생할 수 있음, 적절한 설정 필요
- mutation 후 invalidateQueries를 안 하면 UI가 이전 데이터를 보여줌
- useQuery 결과를 로컬 state에 복사하면 동기화 문제 발생
면접 질문
중급토스당근카카오네이버
답변 방향 힌트
캐싱, 중복 요청, 동기화, 보일러플레이트
반드시 언급할 키워드
- 자동 캐싱
- 백그라운드 업데이트
- 중복 요청 dedup
- 로딩/에러 상태 자동 관리
예상 꼬리 질문
- 낙관적 업데이트가 실패하면 어떻게 처리하나요?
- React Query와 Zustand를 함께 쓸 때 어떻게 역할을 나누나요?