리액트 쿼리란?
- Fetching, Caching, 서버 데이터와의 동기화를 지원해주는 라이브러리
기존 미들웨어의 한계
1. 보일러 플레이트 : 코드량이 너무 많아짐.
2. 규격화 문제 : Redux는 본래 비동기 데이터 관리를 위한 전문 라이브러리가 아님.
리액트 쿼리의 강점?
- 보일러 플레이트 만들다가 오류가 발생할 일이 없다.
- 사용방법이 기존 Redux-thunk 대비 너무 쉽고 직관적이다.
const response = await axios get('http://~~~')
Create, Update, Delete)에 해당.<script>
import { useQuery } from 'react-query';
import { fetchTodoList } from '../api/fetchTodoList';
function App() {
const info = useQuery('todos', fetchTodoList);
}
</script>
a. 첫번째 인자, Query Keys라고 부를 수 있는 todos
Query keys 는 refetching 하는 데에 쓰임.
캐싱(Caching)을 처리하는 데에도 쓰임.
앱 전체 맥락에서 이 쿼리를 공유하는 방법으로도 쓰임.
(어느 컴포넌트에 뿌려져 있어도 같은 key면 쿼리 및 데이터를 보장)
잠깐 Query Keys에 대해...
QK는 위의 예제처럼 한 단어일 수도 있고, 배열의 형태일 수도 있고, nested 객체일 수도 있다.
key라는 말이 의미하듯, 모든 QK는 Unique! 해야한다.
<script>
const query1 = useQuery('qk', api); // unique
const query2 = useQuery('qk2', api); // not unique
const query3 = useQuery('qk2', api); // not unique
</script>
useQuery('todos', ...)
위의 예제는 내부적으로 다음과 같이 해석할 수 있다.
queryKey === ['todos']
<script>
// ID가 5인 todo 아이템 1개
useQuery(['todo', 5], ...)
// queryKey === ['todo', 5]
// ID가 5인 todo 아이템 1개인데, preview 속성은 true
useQuery(['todo', 5, { preview: true }], ...)
// queryKey === ['todo', 5, { preview: true }]
// todolist 전체인데, type은 done
useQuery(['todos', { type: 'done' }], ...)
// queryKey === ['todos', { type: 'done' }]
</script>
b. 두 번째 인자, 쿼리 함수라 부를 수 있는 'fetchTodoList'
i. 쿼리 함수는 promise 객체를 return.
ii. promise 객체는 반드시 data를 resolve 하거나 에러를 내야만 한다.
a. useQuery를 통해 얻은 결과물은 객체.
b. 그 안에 내가 '조회'를 요청한 결과에 대한 거의 모든 정보가 들어있으며, 그 과정에 대한 정보도 다음과 같이 포함되어 있다.
i. 시작하면, isLoading이 true.
ii. 조회 결과 오류가 나면 isError가 true isLoading은 false.
iii. 조회 결과가 정상이면 isSuccess가 true isLoading은 false.