useState를 이용해 데이터를 저장할 공간을 만든다.useEffect를 사용해 컴포넌트가 마운트될 때 데이터를 가져온다.fetch()를 사용해 API 요청을 보낸다.response.json()으로 응답을 JSON으로 변환한다.setState()를 통해 상태를 업데이트한다.JSON.stringify(movies) 등을 출력해본다."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>
<div>{isLoading ? "Loading..." : JSON.stringify(movies)}</div>
</div>
);
}
export const metadata = {
title: "Home",
};
const URL = "https://nomad-movies.nomadcoders.workers.dev/movies";
async function getMovies() {
await new Promise((resolve) => setTimeout(resolve, 5000));
const response = await fetch(URL);
const json = await response.json();
return json;
}
export default async function HomePage() {
const movies = await getMovies();
return (
<div>
<div>{JSON.stringify(movies)}</div>
</div>
);
}
await new Promise((resolve) => setTimeout(resolve, 5000));
| 항목 | React.js | Next.js (App Router) |
|---|---|---|
| 실행 위치 | 브라우저 (Client Side) | 서버 (Server Side) |
| API 노출 | O (보안 취약) | X (보안 우수) |
| 상태 관리 | useState / useEffect | 필요 없음 (async + fetch만) |
| 초기 로딩 | 직접 처리 (isLoading 등) | 자동 처리 + 캐싱 지원 |
| 로딩 트릭 | 직접 로딩 UI 작성 | 서버 응답 기다리는 동안 화면 안 보임 |
React.js와 Next.js는 데이터 패칭 방식이 완전히 다름.
→ 캐싱, 보안, 속도 면에서 Next.js가 훨씬 유리함.
→ 하지만 상황에 따라 로딩 처리나 UX를 고려해야 하므로, 각 방식의 장단점을 이해하고 적절하게 선택하는 것이 중요!