Frontend/Next.js

Next.js - Data fetching (React vs Next.js)

2-doooo-2 2024. 2. 11. 14:17
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ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ํŒŒ์ผ์ด ํ•„์ˆ˜์ ์œผ๋กœ ํ•„์š”ํ•˜๋‹ค. 

 

์ฐธ๊ณ ์ž๋ฃŒ 

728x90
๋ฐ˜์‘ํ˜•