React-Query
๋น๋๊ธฐ ํต์ fetch, axios ๋ฑ์ ์ฌ์ฉํ๋ฉด์ ์๋ฒ ์ํ ๊ด๋ฆฌ ๋ฐ ๋น๋๊ธฐ ๋ก์ง์ ์ฝ๊ฒ ๋ค๋ฃจ๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋น๋๊ธฐ ํต์ ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ช ๊ฐ์ง ์์ง๋ง react-query๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฒญ์ ๋ณด๋ด๋ ์ฝ๋ฐฑํจ์๋ฅผ ์ ๋ฌํ๊ธฐ๋ง ํ๋ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํด์ฃผ๋ ๋ง์ ๊ธฐ๋ฅ๋ค(์บ์ฑ, ๊ฐ ์ ๋ฐ์ดํธ, ์๋ฌ ํธ๋ค๋ง ๋ฑ)์ ์ด์ฉํ ์ ์์ผ๋ฉฐ ์ฝ๋๋ ๋งค์ฐ ๊ฐ๋จํด์ง๋๋ค.
์ฌ์ฉํ๋ ์ด์
์๋ฒ๋ก๋ถํฐ ๊ฐ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ ๋ฐ์ดํธ๋ฅผ ํด์ผํ๋ ๋ก์ง์ store์์ ๊ฐ๋ฐํด์ผํ๋ ๊ฒฝ์ฐ๋ค์ด ๋ง์ต๋๋ค. store๋ client์์ state๋ฅผ ์ ์งํ๋ฉด์ ๋ด๋ถ์ client data ์ server data ๊ฐ ๊ณต์กด์ ํ๊ฒ ๋๋ ์๊ฐ์ด ์๊ฒจ๋ฉ๋๋ค. ๋ฐ์ดํฐ๋ค์ด ์๋ก ์ํธ์์ฉํ๋ฉด์ ํผ๋์ ๋น์ด๋ด๋๋ฐ react-query๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ, ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌ์์ผ์ค๋๋ค. ์์์ ์ธ๊ธํ๋ฏ์ด ๊ฐ์ fetchํ๋ ๊ฒ ๋ง๊ณ ๋ ๋ค์ํ ๊ธฐ๋ฅ์ด ๋ง๋ค๋ณด๋ ์ฌ์ฉํด์ผํ ์ด์ ๊ฐ ๋ฉ๋๋ค.
- ์บ์ฑ
- getํ๋ ๋ฐ์ดํฐ๋ฅผ updateํด์ฃผ๋ฉด ๋ค์ get์ ์คํ์์ผ์ค๋ค
- ๋์ผํ ๋ฐ์ดํฐ ์ฌ๋ฌ๋ฒ ์์ฒญํ๋ฉด ํ๋ฒ๋ง ์์ฒญํ๋ค
- ๋ฌดํ์คํฌ๋กค
- ๋น๋๊ธฐ ๊ณผ์ ์ ์ ์ธ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
์ ๋๊ฐ ์์ต๋๋ค.
React-Query๋ก ๋น๋๊ธฐ Data fetchํ๊ธฐ
์ด์ ์ react์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ useState, useEffect๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. ์ด ๋ฒ์ ผ์ ์ฝ๋์ ๋น๊ต๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค.
โถ React-query ์ฌ์ฉ
import React from 'react';
import { useQuery} from "react-query";
import axios from "axios";
const fetchSuperHeroes = () => {
return axios.get('http://localhost:4000')
}
export const RqSuperHeroesPage = (props) => {
const {isLoading, data, isError, error } = useQuery('super-heroes', fetchSuperHeroes)
if(isLoading){
return <h2>LOading....</h2>
}
if(isError){
return <h2>{error.message}</h2>
}
return (
<>
<h2>RQ Super Heroes Page</h2>
{data?.data.map(hero => {
return <div>{hero.name}</div>
})}
</>
)
}
react-query๋ react-hook๊ณผ ๋น์ทํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค. ๋ ๊ฐ์ง์ ์ธ์ ๊ฐ์ ๋ฐ์์ ์งํ๋ฉ๋๋ค. id์ callbackํจ์๋ก id๋ string ํ์ ์ ๋ฐ์ ์ ์๊ณ ์บ์ฑ์ํค๊ณ ๋ค์ ๋ถ๋ฌ์ค๊ธฐ ์ํ key๊ฐ์ ๋๋ค. react-query๋ ํ ๋ฒ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ๋ฒ๋ฆฌ์ง ์๊ณ ์ ์ฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ์ฅ์ํจ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์์ค๊ธฐ ์ํด์ key๊ฐ์ด ํ์ํฉ๋๋ค.
isLoading, isError๋ useQuery hook ์ค ํ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋, ์๋ฌ๋ฅผ ๋ฐ๋ ๊ฒ๋๋ค.
โถ useState & useEffect ์ฌ์ฉ
import React, { useState, useEffect} from 'react';
import axios from 'axios';
export const SuperHeroesPage = (props) => {
const [isLoading, setIsLoading] = useState(true);
const [data, setData] = useState([]);
const [error, setError] = useState('');
useEffect(() => {
axios.get('http://localhost:4000/').then((res) => {
setData(res.data)
setIsLoading(false)
}).catch((error) =>{
setError(error.message)
setIsLoading(false)
})
},[])
if(isLoading){
return <h2>Loading....</h2>
}
if(error){
return <h2>{error}</h2>
}
return (
<>
<h2>Super Heroes Page</h2>
{data.map(hero => {
return <div>{hero.name}</div>
})}
</>
)
};
useState๋ฅผ ์ฐ๋ ์ฝ๋๋ react-query๋ฅผ ์ฌ์ฉํ ์ฝ๋์ ๋นํด์ ๊ต์ฅํ ๊ธธ์ด์ง๋ค๋ ์ ์ ๋ณด์ค ์ ์์ต๋๋ค.
๐๐ป React-query ๊ณต์๋ฌธ์