Tech/Web

[Next.js] react query 적용 및 사용하기

철테코 2022. 3. 15. 23:21

Next.js란

리액트 프레임워크로 서버사이드 렌더링을 가능하게 하는 프레임워크입니다.
기존 리액트는 라우팅 등 개발에 필요한 수많은 라이브러리를 각각 추가해줘야 하는 번거로움이 있었는데
Next.js는 이러한 프론트엔드 개발에 필요한 다양한 기능을 내장 라이브러리로 제공합니다.
또한 추가적으로 서버 사이드 렌더링이 가능하여 SEO에 유리한 웹을 개발할 수 있습니다.

1. _app.js

// _app.js
import React from 'react';
import '../styles/globals.css'
import { wrapper } from "../store/store";
import { Hydrate, QueryClient, QueryClientProvider } from 'react-query'
import Layout from '../components/layout'
import { SessionProvider } from "next-auth/react"

function MyApp({ Component, pageProps: {session, ...pageProps}, }) {
  const [queryClient] = React.useState(() => new QueryClient())

  return (
    <SessionProvider session={session}>
      <QueryClientProvider client={queryClient}>
        <Hydrate state={pageProps.dehydratedState}>
          <Layout>
            <Component {...pageProps} />
          </Layout>
        </Hydrate>
      </QueryClientProvider>
    </SessionProvider>
  )
}

export default wrapper.withRedux(MyApp)

2. pages/dailyword.js

// pages/dailyword.js
import WordCarousel from "../components/organism/carousel/wordCarousel";
import { dehydrate, QueryClient, useQuery } from "react-query";
import Link from 'next/link'
import { fetchDailyword } from "./api/fetchDailyword"

export default function DailyWord() {

  const { isLoading, error, data } = useQuery('dailyword',() =>
    fetchDailyword(),
    {
      keepPreviousData: true,
      refetchOnMount: false,
      refetchOnWindowFocus: false,
    }
  );
  console.log(data)


  return (
      <div>
        <h2>DailyWord</h2>
        <WordCarousel slideItems={data.results}></WordCarousel>
      </div>
  );
}

export async function getServerSideProps(context) {

  const queryClient = new QueryClient();

  await queryClient.prefetchQuery(
    "dailyword", 
    async () => await fetchDailyword());

  return { 
    props: { 
      dehydratedState: dehydrate(queryClient),
    } 
  }
}

3. pages/api/fetchDailyword.js

// pages/api/fetchDailyword.js
import axios from "axios";

export const fetchDailyword = async () => {

  const API_KEY = "@@@@@@@@@";

  const { data } = await axios.get(
    `https://api.themoviedb.org/3/movie/popular?api_key=${API_KEY}`
  );

    return data;
}