나의 개발일지

[Next.JS] Data Fetching 본문

Next.Js

[Next.JS] Data Fetching

heew0n 2024. 3. 23. 00:05

Data Fetching

 

React에서 일반적으로 data를 fetching 하는 방법

"use client";

import { useEffect, useState } from "react";

export default function Page() {
  const [isLoading, setIsLoading] = useState(true);
  const [movies, setMovies] = useState([]);
  const getMovies = async () => {
    const response = await fetch(
      "https://nomad-movies.nomadcoders.workers.dev/movies"
    );
    const json = await response.json();
    setMovies(json);
    setIsLoading(false);
  };
  useEffect(() => {
    getMovies();
  }, []);
  return <div>{isLoading ? "Loading..." : JSON.stringify(movies)}</div>;
}

 

 

 

 

api를 통해 db에 요청을 보내야 한다. 그렇기 때문에 백엔드에서 받아오는 시간이 길어지면 길어질수록 로딩 시간이 길어지게 된다.

 

 

 

 

항상 fetch는 client에서 일어난다.

 

 

 

서버 컴포넌트에서 fetch한다는 것은 1. useEffect, useState 를 쓰지 않아도 된다는 것  2. 로딩 상태도 구현하지 않아도 된다는 것!

 

 

client component에서는 metadata를 쓸 수 없다

넥제와 서버 컴포넌트가 있으면 api가 더 이상 필요없다

 

 

export const metadata = {
  title: "Home",
};
const URL = "https://nomad-movies.nomadcoders.workers.dev/movies";

async function getMovies() {
  const response = await fetch(URL);
  const json = await response.json();
  return json;
}

export default async function HomePage() {
  const movies = await getMovies();

  return <div>{JSON.stringify(movies)}</div>;
}

 

 

 

 

API를 사용하지 않는 걸 확인할 수 있다.

백엔드에서 실행되는 것이다!

fetch된 데이터가 존재하기 때문에 처음에만 진짜 fetch가 된다

 

 


 

Loading.tsx

 

 

 

우선 page.tsx 안에서 setTimeout으로 10초를 로딩시켜본다

백엔드가 data를 가져오는 시간을 늘리는 것!

 

 

그럼 이렇게 로딩이 되어진다. 이 때 화면에는 아무것도 표시되지 않는데 이를 위해서 not-found나 layout처럼 loading.tsx를 만들어 코드를 구현하면 된다. 

 

export default function Loading() {
  return <h2>Loading...</h2>;
}

 

 

로딩 중일 때, 내가 설정해놓은 코드대로 화면에 UI가 생성된다.