이름은 알고 있었지만 회사에 입사하면서 처음 써본 기술스택이라 공식문서를 읽어보게 되었다. 다 읽지는 못했지만 읽어본 만큼 정리해본다.
기존의 상태 관리 라이브러리는 클라이언트의 상태를 관리하기에는 적합했지만 서버의 상태 관리하는데는 적합하지 않았다. 하지만 react-query는 아래의 문제를 해결하며 서버의 상태 관리를 지원한다.
component, hook에서 query를 구독할 때 사용함
function Component(){
const info = useQuery({queryKey : ["key"], queryFn : fetchSomething})
return //...
}
queryKey : 쿼리의 캐싱을 관리하는 기준이 됨
queryFn : Promise를 반환하는 함수
useQuery가 반환한 결과에 포함된 것들
- isLoading : 쿼리에 데이터가 아직 없음
서버의 상태를 변경하는 query에 사용 (데이터 생성, 수정, 삭제)
사용법은 useQuery와 비슷함
useMutation({
mutationFn: addTodo,
onMutate: (variables) => {
//mutationFn 실행전에, addTodo에 전달되는 매개변수가 똑같이 전달됨
return { id: 1 }
},
onError: (error, variables, context) => {
//error 발생시
},
onSuccess: (data, variables, context) => {
// mutation 성공
},
onSettled: (data, error, variables, context) => {
// 에러가 나거나 안나거나 상관없이 무조건 실행됨
}
})
mutationAsync
- mutation이 Promise를 반환하게 할때 사용
retry
const mutation = useMutation({
mutationFn: addTodo,
retry: 3,
})
react query에서 오래된 데이터를 최신화 해주지만 서버의 상태를 변경하는 작업을 하면 기존의 캐싱된 데이터들은 최신화가 필요하게 됨 (데이터 생성시 추가된 데이터까지 새로 조회해야함)
QueryClient
의 invalidateQueries로 의도적으로 데이터를 업데이트 할 수 있도록 지원함
// 캐시의 모든 쿼리를 다 무효화 (업데이트)
queryClient.invalidateQueries()
// 'todos'로 시작하는 모든 쿼리 무효화
queryClient.invalidateQueries({ queryKey: ['todos'] })
위의 예제처럼 queryKey를 이용해 원하는 쿼리만 업데이트 시킬 수 있다.