250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- v8 원리
- 리액트
- this
- 웹 크롤링
- 리액트 메모이제이션
- 코어자바스크립트
- 항해99 부트캠프
- FP 특징
- 함수형 프로그래밍 특징
- 항해99 미니프로젝트
- 테스트 코드 툴 비교
- 렌더링 최적화
- 항해99
- 알고리즘
- toggle-btn
- gql restapi 차이
- chromatic error
- JS module system
- 자바스크립트 엔진 v8
- 리덕스
- 리액트 렌더링 최적화
- 항해99 사전스터디
- jwt
- 리액트 메모
- next js
- 실행컨텍스트
- Js module
- 웹팩 기본개념
- 타입스크립트
- js배열 알고리즘
Archives
- Today
- Total
Jaeilit
리액트 쿼리 (React query) 본문
728x90
https://react-query.tanstack.com/overview
리액트 쿼리가 리덕스를 따라 잡은 모습(2022.02)
React query 소개
대부분의 기존상태관리 라이브러리는 클라이언트 상태 작업에 적합하지만 비동기 또는 서버 상태 작업에는 그다지 좋지 않다.
서버 상태가 완전히 다르기 때문이다.
서버 상태
- 제어하거나 소유하지 않는 위치에 원격으로 유지
- Fetching이나 Updating에 비동기 API가 필요함
- 다른 사람들과 공유되는 것으로 사용자가 모르는 사이에 변경될 수 있음(중복)
- 신경 쓰지 않는다면 잠재적으로 "out of date"가 될 가능성을 지님
애플리케이션에서 서버의 상태 특성을 파악하면 진행하면서 더 많은 문제가 발생 함,
- 캐싱
- 동일한 데이터에 대한 여러 요청을 단일 요청으로 중복 제거
- 백그라운드에서 오래된 데이터 업데이트
- 데이터가 언제 만료되는지 알고 있기
- 데이터 업데이트를 최대한 빨리 반영
- 페이지네이션 및 lazyLoading 과 같은 성능 최적화
- 서버 상태의 메모리 및 가비지 수집 관리
- 구조적 공유를 통한 쿼리 결과 메모
리액트 쿼리를 사용하면 서버상태의 까다로운 문제와 트러블을 극복하고 앱 데이터가 제어를 시작하기 전에 앱 데이터를 제어 할 수 있다.
리쿼리 공식 문서 예제
import { QueryClient, QueryClientProvider, useQuery } from 'react-query'
const queryClient = new QueryClient()
export default function App() {
return (
<QueryClientProvider client={queryClient}>
<Example />
</QueryClientProvider>
)
}
function Example() {
// userQuery 의 첫번재 인수는 key 값, 두번째는 fetch 함수
const { isLoading, error, data } = useQuery('repoData', () =>
fetch('https://api.github.com/repos/tannerlinsley/react-query').then(res =>
res.json()
)
)
// useQuery 의 반환 값으로 isLoading, err, data 등이 있다.
if (isLoading) return 'Loading...'
if (error) return 'An error has occurred: ' + error.message
return (
<div>
<h1>{data.name}</h1>
<p>{data.description}</p>
<strong>👀 {data.subscribers_count}</strong>{' '}
<strong>✨ {data.stargazers_count}</strong>{' '}
<strong>🍴 {data.forks_count}</strong>
</div>
)
}
Query Client
- 캐싱관리를 위해 QueryClient 인스턴스를 사용한다.
- Query Client 를 생성 후 Provider를 최상단 컴포넌트에서 감싸준다.
useQuery(queryKey, queryFn, option)
const { data, isLoading } = useQuery(queryKey, queryFunction, options)
- 첫번째 인수로 query key 로 unique key 를 사용한다.
- query key 에는 문자열과 배열을 넣을 수 있다.
- 두번째 인수로 fetch 함수를 넣을 수 있다. (axios.get(...))
useQuery return data
- data : fetch 에서 리턴한 Promise reslove 된 데이터
- isLoading : 저장 된 캐시가 없는 상태에서 데이터를 요청 중일 때 true
- isFetching : 캐시가 있거나 없거나 데이터가 요청 중일 때 true
Mutation
- 서버의 데이터 변경 요청을 할때 사용 하는 함수로 Create, Update, Delete 요청과 같이 API 통신으로 서버 상태에 side-effect가 일어난 경우 사용 합니다.
function App() {
const mutation = useMutation(fetch, {
//성공시
onSuccess: () => {
// key 값에 대한 query 무효화
queryClient.invalidateOueries('key')
),
//에러시
onError: (err) => {
console.log(err)
},
// 성공이든 에러든 finally
onSettled:(data, err, variables, context) => {
console.log("finally")
}
}
return (
<div>
// isLoading
{mutation.isLoading ? (
'Adding todo...'
) : (
<>
// isError
{mutation.isError ? (
<div>An error occurred: {mutation.error.message}</div>
) : null}
// isSuccess
{mutation.isSuccess ? <div>Todo added!</div> : null}
<button
onClick={() => {
// mutate
mutation.mutate({ id: new Date(), title: 'Do Laundry' })
}}
>
Create Todo
</button>
</>
)}
</div>
)
}
// mutation 도 useQuery 와 마찬가지로 isLoading, isError 등을 리턴 값으로 가진다.
728x90
'TIL' 카테고리의 다른 글
Apollo Client (0) | 2022.02.10 |
---|---|
React Query vs SWR (0) | 2022.02.10 |
SWR (데이터 가져오기를 위한 React Hooks) (0) | 2022.02.10 |
imageKit 라이브러리 사용 이유 (0) | 2021.12.20 |
CRA에서 eject 없이 webpack-bundle-analyzer 사용하기 (0) | 2021.12.06 |