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 |
Tags
- 자바스크립트
- react pattern
- Next.js
- 동적계획법
- 코테
- 스택
- React Query
- 타입스크립트
- 리액트 패턴
- Supabase
- TypeScript
- 코어자바스크립트
- react router dom
- 토이 프로젝트
- React
- styled component
- tailwind
- reduxtoolkit
- 코딩테스트
- revalidatepath
- 리액트
- 그리디
- 토이프로젝트
- Form
- 프로그래머스
- 리덕스
- 프론트엔드
- JavaScript
- 리액트 라우터 돔
- tanstack query
Archives
- Today
- Total
느려도 한걸음씩
TanStack Query - (3) useQuery로 데이터 패칭하기 본문
🪄 useQuery로 데이터 패칭하기
이번 포스트에서는 TanStack Query의 핵심 훅인 useQuery를 사용해서 실제로 Supabase에서 캐빈 데이터를 불러와 보겠습니다. 아래는 CabinTable 컴포넌트 코드입니다.
🔍 useQuery란?
useQuery는 React 컴포넌트 안에서 서버의 데이터를 쉽게 가져오고, 로딩 상태, 에러 처리, 캐싱까지 자동으로 관리해주는 훅입니다. 기본적인 사용법은 아래와 같습니다
const { data, isLoading, error } = useQuery({
queryKey: ["key"],
queryFn: fetchFunction,
});
import { useQuery } from "@tanstack/react-query";
import styled from "styled-components";
import { getCabins } from "../../services/apiCabins";
import Spinner from "../../ui/Spinner";
import CabinRow from "./CabinRow";
const Table = styled.div`
border: 1px solid var(--color-grey-200);
font-size: 1.4rem;
background-color: var(--color-grey-0);
border-radius: 7px;
overflow: hidden;
`;
const TableHeader = styled.header`
display: grid;
grid-template-columns: 0.6fr 1.8fr 2.2fr 1fr 1fr 1fr;
column-gap: 2.4rem;
align-items: center;
background-color: var(--color-grey-50);
border-bottom: 1px solid var(--color-grey-100);
text-transform: uppercase;
letter-spacing: 0.4px;
font-weight: 600;
color: var(--color-grey-600);
padding: 1.6rem 2.4rem;
`;
function CabinTable() {
const {
isLoading,
data: cabins,
error,
} = useQuery({
queryKey: ["cabin"],
queryFn: getCabins,
});
if (isLoading) return <Spinner />;
return (
<Table role='rable'>
<TableHeader role='row'>
<div></div>
<div>Cabin</div>
<div>Capacity</div>
<div>Price</div>
<div>Discount</div>
<div></div>
</TableHeader>
{cabins.map((cabin) => (
<CabinRow cabin={cabin} key={cabin.id} />
))}
</Table>
);
}
export default CabinTable;
import supabase from "./supabase";
export async function getCabins() {
const { data, error } = await supabase.from("cabins").select("*");
if (error) {
console.error(error);
throw new Error("Cabins could not be loaded");
}
return data;
}
🧩 queryKey와 queryFn
- queryKey: 이 쿼리의 고유한 키입니다. 캐싱의 기준이 되기 때문에 동일한 key를 가진 쿼리는 데이터를 공유합니다. 위 예제에서는 "cabin"이라는 key를 사용하고 있습니다.
- queryFn: 실제 데이터를 불러오는 함수입니다. 여기서는 Supabase에서 데이터를 가져오는 getCabins 함수가 사용됩니다.
🌀 isLoading, data, error
useQuery는 다양한 상태 값을 제공합니다:
- isLoading: 데이터를 처음 불러오는 중일 때 true가 됩니다. 이때는 <Spinner />를 보여주도록 처리했습니다.
- data: 서버에서 받아온 실제 데이터입니다. 여기서는 캐빈 객체 배열이 들어오게 됩니다.
- error: 데이터를 불러오는 데 실패했을 경우 에러 객체가 들어옵니다.
🧠 staleTime과 캐싱 기능
TanStack Query는 기본적으로 캐싱 기능을 가지고 있습니다. 덕분에 동일한 queryKey를 가진 쿼리는 다시 요청하지 않고 캐시된 데이터를 그대로 보여줍니다. 이 기능 덕분에 처음 페이지에 접속할 때만 데이터를 fetching하고, 이후에는 네트워크 요청 없이 빠르게 데이터를 사용할 수 있죠.
기본 설정에서 staleTime은 0이지만, 원하는 경우 아래처럼 조정해서 캐시 유지 시간을 설정할 수 있습니다
staleTime을 설정하면 설정한 시간이 지난뒤 데이터를 다시 fetching합니다
'FE develop > TanStack Query' 카테고리의 다른 글
TanStack Query - (5) Prefetching 기능 (0) | 2025.04.14 |
---|---|
TanStack Query - (4) useMutation으로 데이터 변형하기 (0) | 2025.04.10 |
TanStack Query - (2) Setup 하기 (0) | 2025.04.10 |
TanStack Query - (1) Tanstack Query란? (0) | 2025.04.10 |