주어진 시간에 대해 시스템을 나타내는 것으로 언제든지 변경될 수 있음, 즉 문자열, 배열, 객체등의 형태로 응용 프로그램에 저장된 데이터
=> 개발자 입장에서 관리해야하는 데이터들 !
UI/UX의 중요성과 함께 프로덕트 규모가 많이 커지고 FE에서 수행하는 역할이 늘어남 => 관리하는 상태가 많아짐!
상태를 관리하는 방법에 대한 것 -> 프로덕트가 커짐에 따라 어려움도 커짐
상태들은 시간에 따라 변화함
React에선 단방향 바인딩이므로 Props Drilling 이슈도 존재
Redux와 MobX 같은 라이브러리를 활용해 해결하기도 함
어플에서 쓰이는 화면은 웹뷰를 통해 관리하는 페이지가 많기 때문에 상태관리가 중요하다. 그 중 상태관리에 대한 고민. . . . Store는 전역 상태가 저장되고 관리되는 공간인데.. 상태관리보단 API 통신코드 ..?
상태관리 영역이 서버값을 저장하는데까지 확장
API 통신 관련 코드가 모두 Store에 ?
또, 반복되는 isFetching, isError 등 API 관련 상태
또또, 반복되는 비슷한 구조의 API 통신 코드
Client에서 제어하거나 소유되지 않은 원격의 공간에서 관리되고 유지됨
Fetching이나 Updating에 비동기 API가 필요함
다른 사람들과 공유되는 것으로 사용자가 모르는 사이에 변경될 수 있음
신경 쓰지 않는다면 잠재적으로 "out of date"가 될 가능성을 지님
=> FE에서 이 값들이 저장되어있는 state들은 일종의 캐시
Client State vs Server State의 Key Point는 Ownership이 있는곳 . .
이러한 상태관리에 대한 고민에서의 해답은 React Query ! ! !
onSuccess, onError, onSettled: query fetching 성공 / 실패 완료 시 실행할 Side Effect 정의
enabled: 자동으로 query를 실행시킬지 말지 여부
retry: query 동작 실패 시, 자동으로 retry 할지 결정하는 옵션
select: 성공 시 가져온 data를 가공해서 전달
keepPreviousData: 새로운 fetching시 이전 데이터 유지 여부
refetchInterval: 주기적으로 refetch 할지 결정하는 옵션
Mutation: 데이터 생성/수정/삭제 용
Cache-Control: max-age=600, stale-while-revalidate=30
이렇게 동작하면 Latency가 숨겨지겠죠?
(stale-if-error도 이 명세에 있어요)
이러고 나온것이 react-query, swr, etc
cacheTime: 메모리에 얼마만큼 있을건지(해당 시간 이후 GC에 의해 처리, default 5분)
staleTime: 얼마의 시간이 흐른 후에 데이터를 stale 취급할 것인지(default 0)
refetchOnMount, refetchOnWindowFocus, refetchOnReconnect -> true이면 Mount, window focus, reconnect 시점에 data가 stale이라고 판단되면 모두 refetch(모두 default true)

Queries에서 cached data는 언제나 stale 취급
각 시점에서 data가 stale이라면 항상 refetch 발생
inactive Query들은 5분 뒤 GC에 의해 처리
Query 실패 시 3번까지 retry 발생
어떻게 Server State들을 전역상태처럼 관리할까요?
Store는 Client State들만 남아 목적에 맞고 심플하게
Server State들은 React Query와 함께 간단하고 파워풀
Component는 조금 길어졌지만 Container 컴포넌트 같기도. . .