/components/movie-info.tsx
const API_URL = "<https://nomad-movies.nomadcoders.workers.dev/movies>"
async function getMovie(id: string) {
await new Promise((response) => setTimeout(response, 3000))
const response = await fetch(`${API_URL}/${id}`)
return response.json()
}
export default async function MovieInfo({id}: {id: string}) {
const movie = await getMovie(id)
return <h6>{JSON.stringify(movie)}</h6>
}
/components/movie-videos.tsx
const API_URL = "<https://nomad-movies.nomadcoders.workers.dev/movies>"
async function getVideos(id: string) {
await new Promise((response) => setTimeout(response, 5000))
const response = await fetch(`${API_URL}/${id}/videos`)
return response.json()
}
export default async function MovieVideos({id}: {id: string}) {
const videos = await getVideos(id)
return <h6>{JSON.stringify(videos)}</h6>
}
/movies/[id]/page.tsx
import MovieVideos from "../../../components/movie-videos";
import MovieInfo from "../../../components/movie-info";
import {Suspense} from "react";
export default async function MovieDetail({params: {id}}: {params: {id: string}}) {
return <div>
<Suspense fallback={<h1>Loading movie info</h1>}>
<MovieInfo id={id} />
</Suspense>
<Suspense fallback={<h1>Loading movie video</h1>}>
<MovieVideos id={id} />
</Suspense>
</div>
}
Promise.all을 사용하여 여러 데이터 페칭 함수를 동시에 시작함으로써 전체 페칭 시간을 단축함.MovieInfo와 MovieVideos라는 두 개의 별도 컴포넌트를 생성하여 각기 다른 데이터 소스를 페칭함.
async function으로 정의getMovie 함수 사용)movie.title을 UI에 표시async function으로 정의getVideos 함수 사용)JSON.stringify로 표시Suspense 컴포넌트를 사용하여 각 데이터 페칭 컴포넌트의 로딩 상태를 개별적으로 관리함.
MovieInfo와 MovieVideos 각각에 대해 별도의 로딩 상태를 표시하여 사용자에게 즉각적인 피드백을 제공함.