์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

Next.js data fetching ํ•˜๋Š” ๋ฐฉ๋ฒ•

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

by loeybho 2024. 5. 25. 12:06

๋ณธ๋ฌธ

๊ณต๋ถ€ ๊ณ„๊ธฐ ๐Ÿ“š

๋ณธ๊ฒฉ์ ์ธ ํ”„๋กœ์ ํŠธ์— ๋“ค์–ด๊ฐ€๊ธฐ ์•ž์„œ, next.js๋กœ data fetingํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด๋ณด์ž.

 

๊ฐœ๋… ๐Ÿ“ƒ

data๋ฅผ Fetchingํ•˜๋Š” ๋™์•ˆ ํ™”๋ฉด์— ์•„๋ฌด๊ฒƒ๋„ ๋‚˜์˜ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Loading ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

 

ํ™œ์šฉ ์˜ˆ์‹œ ๐Ÿช„

๊ธฐ์กด์— ํ–ˆ๋˜ 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"
    );
    console.log(response);
    const json = await response.json();
    setMovies(json);
    setIsLoading(false);
  };

  useEffect(() => {
    getMovies();
  }, []);

  return <div>{isLoading ? "Loading..." : JSON.stringify(movies)}</div>;
}

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋Š” ์–ธ์ œ๋‚˜ data๋ฅผ ํด๋ผ์ด์–ธํŠธ์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ API๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ์‹ ๋ฒ„์ „์˜ Next.js์—์„œ๋Š” 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>;
}

์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ•˜์—ฌ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. useState, useEffect๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ๋กœ๋”ฉ ์ƒํƒœ ์—ญ์‹œ ์—†์–ด์ง„๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. -> ์ด๋Š” fetch๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Network ํƒญ์— ๊ฐ€๋„ movies๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋ฐฑ์—”๋“œ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

Suspense๊ฐ€ await์˜ ์—ญํ• ์„ ํ•ด์ค€๋‹ค. Movieinfo๊ฐ€ ์™„๋ฃŒ ๋˜๋“ , MovieVideo๊ฐ€ ์™„๋ฃŒ๋˜๋“  ๊ฐ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ํŒจ์นญํ•ด์˜จ๋‹ค. ์„œ๋กœ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š” ๊ตฌ์กฐ์ด๊ธฐ๋•Œ๋ฌธ์— ๋”์šฑ ํ˜์‹ ์ ์ž„. 

 

 

์—๋Ÿฌ ํ•ธ๋“ค๋ง

error.tsx ์ƒ์„ฑ

"use client";

export default function ErrorOMG() {
  return <h2>lol something broke...</h2>;
}

์ด๋ ‡๊ฒŒ ์—๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋†“์œผ๋ฉด, ์ž์‹ ์š”์†Œ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ด๋‹น ํŒŒ์ผ์ด ๋Œ€์‹  ๋œฌ๋‹ค.

 

๋‹จ, ์œ„์˜ ์—๋ŸฌํŒŒ์ผ์€ movies/[id]์—๋งŒ ํ•ด๋‹น๋˜์–ด ๋‚˜ํƒ€๋‚œ๋‹ค.

 

์˜ค๋ฅ˜ ํ•ธ๋“ค๋ง๊ณผ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…์ด ๊ฐ€์žฅ ์‰ฌ์›Œ์ง„ ๊ฒƒ ๊ฐ™๋‹ค.