๋ณธ๊ฒฉ์ ์ธ ํ๋ก์ ํธ์ ๋ค์ด๊ฐ๊ธฐ ์์, 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]์๋ง ํด๋น๋์ด ๋ํ๋๋ค.
์ค๋ฅ ํธ๋ค๋ง๊ณผ ํ์ด์ง ๋ผ์ฐํ ์ด ๊ฐ์ฅ ์ฌ์์ง ๊ฒ ๊ฐ๋ค.