1. 데이터를 가져오는 기본 방법

1.1 서버에서 fetch API로 가져오기

export default async function Page() {
  const data = await fetch('<https://api.vercel.app/blog>')
  const posts = await data.json()
  return (
    <ul>
      {posts.map((post) => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  )
}

1.2 데이터베이스에서 직접 가져오기

import { db, posts } from '@/lib/db'

export default async function Page() {
  const allPosts = await db.select().from(posts)
  return (
    <ul>
      {allPosts.map((post) => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  )
}

2. 효율적인 데이터 페칭 패턴

2.1 컴포넌트 외부에 함수 선언하기

// 컴포넌트 파일 최상단에 함수 선언
async function getArtist(username: string) {
  const res = await fetch(`https://api.example.com/artist/${username}`)
  return res.json()
}

async function getAlbums(username: string) {
  const res = await fetch(`https://api.example.com/artist/${username}/albums`)
  return res.json()
}

// 컴포넌트에서 사용
export default async function Page({ params }) {
  const { username } = await params
  const artistData = getArtist(username)    // 요청 시작
  const albumsData = getAlbums(username)    // 병렬로 요청 시작

  const [artist, albums] = await Promise.all([artistData, albumsData])

  return (
    <>
      <h1>{artist.name}</h1>
      <Albums list={albums} />
    </>
  )
}