// app/(home)/page.tsx// useState로 상태변화가 생기므로 "use client""use client";import{ useEffect, useState }from"react";exportdefaultfunctionPage(){// 현재 로딩 상태인지 파악하는 isLoadingconst[isLoading, setIsLoading]=useState(true);// 영화 정보 상태를 담는 moviesconst[movies, setMovies]=useState();// getMovies 함수 설정constgetMovies=async()=>{const responses =awaitfetch("https://nomad-movies.nomadcoders.workers.dev/movies");const json =await responses.json();setMovies(json);setIsLoading(false);};// useEffect를 통해 life cycle을 관리useEffect(()=>{getMovies();},[]);return<div>{isLoading ?"Loading...":JSON.stringify(movies)}</div>;}
client component에서는 metadata를 사용할 수 없음
IsLoading 초기 값으로 true
movies 초기 값 없음
getMovies 함수는 영화정보 url을 fetch하여 response에 담고, 이를 json() 메서드로 변환 해당 데이터를 setMovies 상태 함수에 호출하고, setIsLoading 함수를
false로 전달
이 getMovies 함수는 의존성 배열이 없는 useEffect의 콜백함수에서 호출되어, mount 단계에서 실행됨
Mount시, Data Fetch하는 예시
이러한 Data Fetch의 경우, url이 보호되지 않음
2-2. Server Component에서 Data Fetching
클라이언트 컴포넌트에서 API를 통해 Data fetch할 때, 중요한 내용이 클라이언트에 유출될 수 있으나, 서버 단에서 Data fetch하면, 서버에 fetch된 데이터가 캐싱되어 중요한 내용을 보호할 수
있음
metadata를 사용할 수 있음
async/await 사용
// app/(home)/page.tsx// 메타데이터exportconst metadata ={
title:"Home",};// 요청할 URLconstURL="https://nomad-movies.nomadcoders.workers.dev/movies";// 비동기로 URL을 요청하는 함수 페이지 컴포넌트 밖에서 정의asyncfunctiongetMovies(){// 서버 컴포넌트이므로 콘솔 출력 안됨console.log("im fetching!");// fetch 시, next.js는 fetch 정보를 기억함const response =awaitfetch(URL);const json =await response.json();return json;}// 페이지 컴포넌트 앞에 async넣고 URL 요청 함수를 동기적으로 호출exportdefaultasyncfunctionHomePage(){const movies =awaitgetMovies();return<div>{JSON.stringify(movies)}</div>;}
하지만 서버에서 Data Fetch이 오래 걸리면 그만큼 클라이언트 단에서 로딩 시간이 길어짐