[React] TanStack-Query (React-Query)
- -
๐ฃ ๋ค์ด๊ฐ๊ธฐ ์ ์!_!
์ด๋ฒ ๊ฒ์๋ฌผ์์๋ TanStack Query์ ๋ํด์ ์ ๋ฆฌํด ๋ณผ ๊ฒ์ด๋ค!_! ํน์ ์์ง React Query๋ผ๊ณ ์๊ณ ์๋ ๊ฐ?! React Query๋ 2022๋ 8์์ TanStack Query๋ก ๋ณ๊ฒฝ๋์๋ค. ๊ทธ ์ด์ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ React ์ธ์๋ Vue ๋ฐ Svelte์ ๊ฐ์ ์ฌ๋ฌ ํ๋ ์์ํฌ๋ฅผ ์ง์ํ๋๋ก ํ์ฅ๋จ์ ๋ฐ๋ผ React๋ฅผ ๋์ด ๋ค์ํ ๋ฒ์ ์ ํตํฉํ๊ณ ๋ ๊ด๋ฒ์ํ ๋ค์ค ํ๋ ์์ํฌ ์ ํธ๋ฆฌํฐ๋ฅผ ๊ฐ์กฐํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ!_!
์๋ฌดํผ ์ด๋ฒ ๊ฒ์๋ฌผ์์๋ ํ๋ก์ ํธ ์ค์น ๋ฐ ์ ํ ๋ฐฉ๋ฒ๊ณผ tanstack query ์ฌ์ฉ ์ด์ ๊ทธ๋ฆฌ๊ณ ์ฃผ์ ํจ์์ ๋ํด์ ์ดํด๋ณด๊ณ , ๋ค์ ๊ฒ์๋ฌผ์์ tanstack query ์ฌ์ฉ๋ฒ, query ๋์ ์ดํด, ๋์ query ํจ์ ๋ฐ query key, ์ฟผ๋ฆฌ ํ์ฑํ ๋นํ์ฑํ ๋ฑ์ ์ฐจ๋ก์ฐจ๋ก ์ ๋ฆฌํด๋ณด๊ฒ ๋ฐ!
๐ฃ TanStack Query ์ฌ์ฉํ๋ ์ด์ ?
1. TanStack Query ๋?
TanStack Query๋ React, Vue ๋ฐ Svelte๋ฅผ ํฌํจํ ์ฌ๋ฌ ํ๋ ์์ํฌ๋ฅผ ์ง์ํ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. ์ต์ํ์ ์์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋๊ธฐํ, ์บ์ฑ ๋ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ๋ฐ์ดํธ๋ฅผ ๋จ์ํ ํจ. TanStack Query๋ ํ๋ ์์ํฌ ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด๋ API๋ฅผ ์ ๊ณตํ์ฌ ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ฒ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ๋ค๋ชฉ์ ์ด๊ณ ํจ์จ์ ์.
TanStack Query์ ๊ฐ์ฅ ์ค์ํ ๊ธฐ๋ฅ์๋ ์๋ ์ ๋ฐ์ดํธ ๋ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ค์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์บ์ํ๋ useMutation๊ณผ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋๊ด์ ์ ๋ฐ์ดํธ๋ก ๋ฐ์ดํฐ ์์ ์ ์ฒ๋ฆฌํ๋ useMutation์ด ํฌํจ ๋จ. ์ด๋ฌํ ๊ธฐ๋ฅ์ ๋น๋๊ธฐ์ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํ์ฌ ์ง์๋๋ ํ๋ ์์ํฌ ์ ๋ฐ์ ๊ฑธ์ณ ๊ฐ๋ ฅํ๊ณ ์ผ๊ด๋ API๋ฅผ ์ ๊ณตํจ.
2. ๊ทธ๋์ ์ฌ์ฉํ๋ ์ด์ ๋?
๊ฐ๋จํ ์ค๋ช ํ๋ฉด ์๋์ ๊ฐ์.
refetch๊ธฐ๋ฅ๊ณผ ์บ์์ฒ๋ฆฌ๊ฐ ํธ๋ฆฌ!_!
์๋ ์บ์ฑ, ๋๊ธฐํ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ๋ฐ์ดํธ๋ฅผ ํตํด ์๋ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ์ฌ ํจ์จ์ฑ์ ๋์ธ๋ค๊ท!
- React ๋ด๋ถ์์ HTTP ํธ๋ฆฌํ๊ฒ ์์ฒญ ๊ฐ๋ฅ
- ๋ฆฌ์กํธ ํ๋ก์ ํธ์์ ๋ฐฑ์๋ ์ฐ๊ฒฐ ํธ๋ฆฌ
- ํ๋ก ํธ์๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐฑ์๋ ๋ฐ์ดํฐ์ ๋๊ธฐํ๋ ์ํ๋ก ์ ์ง
- ๋ฌผ๋ก ๋ฐ๋์ tanstack์ด ํ์ํ ๊ฒ์ ์๋
- ํ์ง๋ง ์ด์ฉํ๋ฉด ์ฝ๋ ๊ฐ๊ฒฐํ๊ณ ํธ๋ฆฌ
์ด๋ ๊ฒ๋ง ์ดํด๋ณด๋ฉด ์๋ง๋ fetch ๊ฐ ์๋๋ฐ ์ ๊ตณ์ด tanstack-query๋ฅผ ์ฌ์ฉํ ๊น? ๋ผ๋ ์๋ฌธ์ ์ด ์๊ธธ ๊ฒ์. ์๋์์ fetch์ ๋น๊ต๋ฅผ ํ์ฌ ์ดํด๋ณด๊ฒ ์!
โท fetch์ tanstack-query์ ๋น๊ต
(์ฝ๋) ๊ธฐ์กด์ useEffect์ fetch๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์
import { useEffect, useState } from 'react';
import LoadingIndicator from '../UI/LoadingIndicator.jsx';
import ErrorBlock from '../UI/ErrorBlock.jsx';
import EventItem from './EventItem.jsx';
export default function NewEventsSection() {
const [data, setData] = useState();
const [error, setError] = useState();
const [isLoading, setIsLoading] = useState(false);
useEffect(() => {
async function fetchEvents() {
setIsLoading(true);
const response = await fetch('http://localhost:3000/events');
if (!response.ok) {
const error = new Error('An error occurred while fetching the events');
error.code = response.status;
error.info = await response.json();
throw error;
}
const { events } = await response.json();
return events;
}
fetchEvents()
.then((events) => {
setData(events);
})
.catch((error) => {
setError(error);
})
.finally(() => {
setIsLoading(false);
});
}, []);
let content;
if (isLoading) {
content = <LoadingIndicator />;
}
if (error) {
content = (
<ErrorBlock title="An error occurred" message="Failed to fetch events" />
);
}
if (data) {
content = (
<ul className="events-list">
{data.map((event) => (
<li key={event.id}>
<EventItem event={event} />
</li>
))}
</ul>
);
}
return (
<section className="content-section" id="new-events-section">
<header>
<h2>Recently added events</h2>
</header>
{content}
</section>
);
}
- useEffect ๋ด์์ fetch ๋๋ฆฌ๊ณ , useState์ data์ ๋ด์์ฃผ๊ณ , error ๋isLoading์ ํตํด์ ์ํ ํ์ ํด์ฃผ๊ณ ~ ๋ฑ
- ์ฌ์ค ๋๋ ์ ์ฝ๋๊ฐ ๋ ์ต์ํ์ง๋ง, ์ด ์ฝ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ๋งค๋ฒ ๊ธด ์ฝ๋๋ฅผ ์์ฑํด์ผ ํจ. ๋ฌผ๋ก ์ปค์คํ ํ ์ผ๋ก ๋ง๋ค๊ฑฐ๋ ํ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ๊ฐ์ํํ๊ฑฐ๋ ์ฌ์ฌ์ฉํ ์ ์์(๋ญ ์๋ฅผ๋ค๋ฉด useHTTP)
- ๊ทธ๋ ์ง๋ง ์๋์ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ ๋ถ์กฑํจ์ด ์๋๋ฐ,
- ํ์ง๋ง ๋ค๋ฅธ ํญ์ผ๋ก ์ด๋ํ ํ ๋ค์ ์น์ฌ์ดํธ๋ก ๋์์์ ๋, refetch๊ฐ ๋์ง ์์(๋์์ ํจ์จ์ ๊ตฌํ ์ํด์๋ ์ฝ๋ ์ถ๊ฐ ํ์)
- ์บ์์ฒ๋ฆฌ - ๊ฐ์ ธ์จ ๋ฐ์ดํฐ ์บ์์ฒ๋ฆฌํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ ํ, ํ์ํ ๋ ๋ค์ ์ฌ์ฉ
๐ฃ ํ๋ก์ ํธ ์ค์น ๋ฐ ์ ํ
1. ์ค์น
https://tanstack.com/query/latest/docs/framework/react/overview
Overview | TanStack Query React Docs
TanStack Query (FKA React Query) is often described as the missing data-fetching library for web applications, but in more technical terms, it makes fetching, caching, synchronizing and updating server state in your web applications a breeze. Motivation Mo
tanstack.com
์์ ํํ์ด์ง์์ latest๋ก ์ค์นํ๋ฉด ํธ๋ฆฌ
npm i @tanstack/react-query
์ฐธ๊ณ ๋ก 5๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์.
App() ์ปดํฌ๋ํธ์ wrapping
react-query์ useQuery ํ ์ ์ฌ์ฉํ๋ ค๋ฉด ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ component๋ฅผ tanstack-query๊ฐ ์ ๊ณตํ๋ provider component๋ก ๊ฐ์ธ์ผ ํจ.
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
const queryClient = new QueryClient();
function App() {
return (
<QueryClientProvider client={queryClient}>
<RouterProvider router={router} />;
</QueryClientProvider>
);
}
๐ฃ TanStack Query์ ์ฃผ์ ๊ตฌ์ฑ ์์
1. useQuery
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์บ์ํ์ฌ ์๋์ผ๋ก ์๋ฒ์ ๋๊ธฐํํ๊ณ ํ์์ ๋ฐ๋ผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ ๋ฐ์ดํธ. ์๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ ผ๋ฆฌ์ ํ์์ฑ์ ์ต์ํํ์ฌ ์ํ ๊ด๋ฆฌ๋ฅผ ๋์ฑ ๊ฐ๋จํ๊ณ ํจ์จ์ ์ผ๋ก ๋ง๋ฆ.
2. useMutation
๋ด์ฅ๋ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ํตํด ์์ฑ, ์ ๋ฐ์ดํธ ๋๋ ์ญ์ ์์ ์ ์ํํ์ฌ ๋ฐ์ดํฐ ์์ ์ ๊ด๋ฆฌ. useMutation ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์์ ์ค์ UI์ ์๋ต์ฑ๊ณผ ์ผ๊ด์ฑ์ด ์ ์ง ๊ฐ๋ฅ.
2. QueryClient
์ฟผ๋ฆฌ ๋ฐ ๋ณํ์ ๊ตฌ์ฑ ๋ฐ ๊ด๋ฆฌ๋ฅผ ์ค์ ์ง์คํํ์ฌ ์ฟผ๋ฆฌ ์บ์๋ฅผ ์กฐ์ํ๊ณ ๊ฒ์ฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณต. ์บ์ฑ ์ ์ฑ , ์ฟผ๋ฆฌ ๋ฌดํจํ ๋ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ค์ ๊ฐ์ ธ์ค๊ธฐ์ ๋ํ ์ ์ญ ์ ์ด๋ฅผ ์ฉ์ดํ๊ฒ ๊ฐ๋ฅ.
๋ค์ ๊ฒ์๋ฌผ์์๋ ๊ธฐ๋ณธ์ ์ธ tanstack-query
์ฌ์ฉ๋ฒ์ ๋ํด ๋ค๋ค๋ณด๊ฒ ๋ค(useQuery, isPending, isError, error ๋ฑ)
'FrontEnd > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
public๊ณผ assets ํด๋์ ์ฐจ์ด์ (1) | 2024.06.13 |
---|
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค