๐React fetch ๋ฐฉ๋ฒ
import { useEffect,useState } from "react";
export default function tomato() {
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>
{isLoading ? "Loading" : JSON.stringify(movies)}
</div>
)
}
fetch์ ํญ์ client์์ ์ผ์ด๋๋ค. ์ฆ ๋ธ๋ผ์ฐ์ ๊ฐ api์์ฒญ์ ๋ณด๋ธ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ง์ ๋ค๋ฅธ ๋๊ตฐ๊ฐ Networkํญ์ ํตํด api์ ํค์ ๊ฐ ์ค์ํ ์ ๋ณด๋ฅผ ์์๋ผ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋ํ ์ด๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ ์ ์๋ค๋ ์ด์ผ๊ธฐ์ด๊ธฐ๋ ํ๋ค.
ํ์ง๋ง Next.js ๋ฐฑ์๋๋ API ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ํต์ ํ ์ ์๋ค.
Next.js์์ server component๋ฅผ ํตํด fetch๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ useState, useEffect์ ๊ฐ์ ๊ฒ๋ค์ ํ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ด๋ป๊ฒ ์ด๋ฐ ์ผ์ด ๊ฐ๋ฅํ ๊น?
๋ฐฑ์๋ ๊ฐ๋ฐ์๋ ํญ์ API๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. ๊ทธ๋์ผ ํ๋ก ํธ์๋ ์ฆ React ์ฑ์ด API์ ํต์ ํ ์ ์์๋ค.
ํ์ง๋ง ์ต์ ๋ฒ์ ์ Next.js๊ฐ ์๋ค๋ฉด API๋ ๋ ์ด์ ํ์์๋ค.
์ async๋ฅผ ์ฌ์ฉํ ๊น? -> await์ ์ฌ์ฉํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ด๋ค. -> await์ ์ด๋ค ์ผ์ด ๋ฐ์ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ค๊ณ ์ฌ์ฉํ๋ค. -> await์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ฐ๋์ ๋ถ๋ชจ ํจ์์ async๊ฐ ์์ด์ผ ํ๋ค.
๐Next.js fetch ๋ฐฉ๋ฒ
export const metadata = {
title: 'Home',
}
const URL = "https://nomad-movies.nomadcoders.workers.dev/movies"
async function getMoives() {
const response = await fetch(URL);
const json = response.json();
return json
}
export default async function Hoempage() {
const movies = await getMoives();
return(
<div>
{JSON.stringify(movies)}
</div>
)
}
์์ ์ฝ๋๋ useState, useEffect์์ด fetchํ Next.js ์ฝ๋์ด๋ค. ์ ์ด๋ฐ ์ผ์ด ๊ฐ๋ฅํ ๊ฒ์ผ๊น?
Next.js๋ ํ๋ ์์ํฌ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
server component์์ next.js๊ฐ ๋ด๊ฐ fetchํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ตํ๋ค. ๋ํ
fetch๋ url์ ์บ์ฑ์์ผ์ฃผ๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ์ฒซ๋ฒ์งธ fetch๋ง api์ ์์ฒญํ๊ณ ๋๋จธ์ง๋ ๊ฐ์ง์ด๋ค.
ํ์ง๋ง
์์ฃผ ๋น ๋ฅด๊ธด ํ์ง๋ง ์๋ฒ๋ฅผ ์ฒ์ ํฌ ๋ ๋ก๋ฉ ์ํ๋ ์์ง ์กด์ฌํ๋ค.
๋ํ API์ ์ฒซ๋ฒ์งธ ์์ฒญ์ด ๋ํ ์๋ต์ด ๋๋ฆฌ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ฒญํ๋ค๋ฉด ๋ก๋ฉ ์ํ๊ฐ ๊ธธ์ด์ง ์ ์๋ค.
Next.js๋ ์ด๋ ๊ฒ ๋ก๋ฉ์๊ฐ์ด ๊ธธ์ด์ง๋ฉด ํํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ์ง๋ ๋ชปํ ์ฑ ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ ๋๊น์ง ์ฌ์ฉ์๊ฐ ๊ธฐ๋ค๋ฆฌ๊ณ ๋ง ์์ ์ ์๋ค.
โ๏ธLoading Components
(home) / loading.tsx
export default function Loading() {
return <h2>Loading...</h2>
}
(home) / page.tsx
export const metadata = {
title: 'Home',
}
const URL = "https://nomad-movies.nomadcoders.workers.dev/movies"
async function getMovies() {
await new Promise((resolve) => {setTimeout(resolve,10000)})
console.log("i'm fetching!!!")
const response = await fetch(URL);
const json = response.json();
return json
}
export default async function Hoempage() {
const movies = await getMovies();
return(
<div>
{JSON.stringify(movies)}
</div>
)
}
- ์์ ๊ฐ์ ํ์ผ๊ตฌ์กฐ๋ฅผ ํตํด home.tsx๊ฐ ๋ก๋ฉ๋๋ ๋์ loading.tsxํ์ผ์ด ๋ธ๋ผ์ฐ์ ์ ๋ณด์ฌ์ง๋ค. ํ์ await๋ component์์ HTML์ด ๋ฐํ๋๋ฉด ๊ทธ๊ฑธ ๋ธ๋ผ์ฐ์ ์ ๋๊ฒจ์ฃผ๊ณ ํ๋ก ํธ์๋์์ ๋ณํ๋๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- ์ด ์์๋ streaming์ฒ๋ผ http๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.
- ํ๋ ์์ํฌ๊ฐ ์ฐ๋ฆฌ์ ํ์ด์ง๋ฅผ ์์ HTML ๋ถ๋ถ์ผ๋ก ๋๋๊ณ ์ค๋น๋ ๋ถ๋ถ๋ค์ ํ๋์ฉ ๋ณด์ฌ์ค๋ค. ์ด๊ฒ์ ๋ ๋์์ ๋ง์ ๊ฒ๋ค์ fetchํ ์ ์๋ค๋ ์๋ฏธ์ด๋ค.
- ๋ก๋ฉ๋๊ณ ์๋ ํ์๋ HTTP์์ฒญ์ด ์ค์ ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ์์ฒญ์ด ์์ง ๋๋์ง ์์๋ค๋ ํ์์ด๋ค.
์ด๋ ๊ฒ ํจ์ผ๋ก์จ useState๋ ๊ทธ ์ด๋ค ๊ฒ๋ ์ฌ์ฉํ์ง ์๊ณ ๋ฐฑ์๋์์ fetch๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ก๋ฉ๋๋ ๋์ ์ฌ์ฉ์๋ ๋ก๋ฉ ์ปดํฌ๋ํธ๋ฅผ ๋ณผ ์ ์๋ค๋ 2๊ฐ์ง ์ฅ์ ์ ๋ค ๊ฐ์ถ๊ฒ ๋์๋ค.
์ด๋ loading ํ์ผ pageํ์ผ์ด ํ์์ ์ผ๋ก ํ์ํ๋ค.
์ฐธ๊ณ ์๋ฃ
'Frontend > Next.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Next.js - Auth.js( NextAuth.js) ๋ฅผ ์ด์ฉํ Keycloak๊ณผ์ ์ธ์ฆ ์ฒ๋ฆฌ ๊ณผ์ (0) | 2024.09.24 |
---|---|
Next.js - next.js์์ session ํ์ฉํ๊ธฐ (0) | 2024.09.23 |
Next.js 14๋ฒ์ - Layouts,Metadata,Dynamic Routes (0) | 2024.02.08 |
Next.js - ์คํฌ๋กค ์ ๋ ๊ฐ์ด๋ ๊ตฌํ (0) | 2023.12.19 |
Next.js - ๊ฐ๋ก ์คํฌ๋กค ๋ฐ ๊ตฌํ (0) | 2023.12.19 |