일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- django virtualenv
- Variable declaration
- Python Class
- 파이썬
- Kotlin Class
- 자바 기본타입
- 성공
- 도전
- Kotlin 클래스 속성정의
- 넥스트js
- Kotlin else if
- 파이썬 제어문
- 장고 가상환경
- 파이썬 클래스
- NextJs
- Python
- github
- python Django
- 파이썬 반복문
- git
- 희망
- Kotlin 조건문
- activate 오류
- 파이썬 장고
- 다중조건문
- Kotlin If
- 좋은글
- Kotlin 클래스
- 강제 타입변환
- 클래스 속성
Archives
- Today
- Total
키모스토리
#7. fetch 본문
반응형
Client Side Fetch
"use client" 키워드 필요
- 클라이언트에서 페이지 render 후에 useEffect를 이용하여 fetch 를 요청해서 ui를 다시 render 함
- use client 를 선언해야 했기 때문에 meta data 도 해당 페이지에 적용 할 수 없음
- React App <=========> API <========> DB
"use client"
import { useEffect, useState } from "react"
// use client 선언으로 metatdata 사용불가가
// export const metadata = {
// title: "Home Page",
// }
export default function HomePage() {
const [isLoading, setIsLoading] = useState(true);
const [movies, setMovies] = useState([]);
const getMovies=async ()=>{
await fetch('https://nomad-movies.nomadcoders.workers.dev/movies')
.then((res) => res.json())
.then((data) => {
setMovies(data);
setIsLoading(false);
});
};
useEffect(()=>{
getMovies();
},[]);
return (
<div>
<h1>Hello, Next Movie!!</h1>
<div>
{isLoading ?"Loding Data..." : JSON.stringify(movies)}
</div>
</div>
)
}
Server Side Fetch
// use client 삭제
import { useEffect, useState } from "react"
// metadata 사용가능
export const metadata = {
title: "Home",
}
// server side async fetch 함수
// 서버에서 실행되기 때문에 api key 등 민감한 데이터를 다룰 수 있음
const URL = "https://nomad-movies.nomadcoders.workers.dev/movies";
async function getMovies(){
const response=await fetch(URL);
const json=await response.json();
return json;
}
// page function을 async 해주고
// 함수 내에서 fetch 결과를 받음
export default async function HomePage() {
const movies = await getMovies();
return (
<div>
<h1>Hello, Next Movie!!</h1>
<div>
{JSON.stringify(movies)}
</div>
</div>
)
}
- 서버쪽에서 fetch를 모두 완료 한 후에 클라이언트로 render해줌
- 또한, fetch 결과 cache 에 저장하여 다시 페이지로 이동을 하게 되면 cache 된 데이터를 보여줌
문제점
- 서버에서 모든 fetch 작업을 완료 할때 까지 클라이언트에 응답을 하지 않고 지연하게 됨
- fetch 작업중 로딩 표시 및 애러처리 작업 추가필요
loading.tsx
route groups (괄호그룹명) 폴더 내에 loading.tsx파일을 만들어 주면
해당 page.tsx가 backend 작업이 완료되기 전까지 loading.tsx 파일 내용을 보여주며
모든 작업이 완료 된 후에 page.tsx내용을 render 함
영화목록 수정
import Link from "next/link";
export const metadata = {
title: 'MOVIES',
}
// fetch 주소, async, await
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 MovieHome() {
const movies = await getMovies();
return (
<div>
<h1>Hello, Next Movie!!</h1>
<div>
{(movies).map((movie)=> (
<li key={movie.id}>
<Link href={`/movies/${movie.id}`}>{movie.title}</Link>
</li>
))}
</div>
</div>
)
}
반응형
'Web Devlopment > NextJs' 카테고리의 다른 글
#9. Error handling (0) | 2025.03.28 |
---|---|
#8. fetch - Promise.all, Suspense (0) | 2025.03.28 |
#6. Dynamic Routes (0) | 2025.03.27 |
#5. metadata (0) | 2025.03.27 |
#4. layout (0) | 2025.03.27 |