๊ฐœ๋ฐœ/React

[๋ฆฌ์•กํŠธ] React-Query - 1. data fetch & error

๋ฐ(Ming) ๐Ÿˆ‍โฌ› 2023. 5. 8. 16:08
728x90
๋ฐ˜์‘ํ˜•

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 ๊ณต์‹๋ฌธ์„œ

 

 

 

728x90