노트

generateMetadata

generateMetadata

프런트엔드#nextjs · 연결된 개념 8개

쉽게 말하면

generateMetadata는 페이지마다 간판과 진열창 사진을 내용에 맞게 그때그때 만들어 다는 함수예요. 그래서 상품 링크를 공유하면 SNS 미리보기에 그 상품의 제목과 이미지가 나오죠.

비유가 깨지는 곳 간판을 만들려고 페이지와 같은 데이터를 다시 불러도 괜찮아요. 같은 fetch는 한 요청 안에서 한 번만 돌아요. 다만 서버 컴포넌트에서만 내보낼 수 있고, 15부터 params는 await해야 해요.

generateMetadata()는 Next.js App Router에서 라우트 파라미터나 데이터에 따라 title, description, Open Graph(OG) 같은 메타데이터를 동적으로 만드는 서버 함수다. 값이 고정이면 export const metadata = { … }로 충분하다.

export async function generateMetadata(
  { params }: { params: Promise<{ id: string }> },
): Promise<Metadata> {
  const { id } = await params                      // 15부터 params는 Promise
  const { name: title, summary: description, thumbnail } = await getProduct(id)
  return {
    title,
    description,
    openGraph: { title, images: [thumbnail] },
  }
}
  • 페이지와 같은 데이터를 다시 불러도 된다. 같은 fetch는 한 요청 안에서 한 번만 실행된다. fetch가 아닌 조회는 React.cache로 감싼다(Next.js 캐시 계층)
  • 상속: 레이아웃의 title 값을 { template: '%s | 사이트명', default: '사이트명' } 객체로 두면 하위 페이지가 title로 준 '상품 상세'가 상품 상세 | 사이트명이 된다. 하위에서 같은 키를 다시 내보내면 덮어쓴다
  • 두 번째 인자 parent(ResolvingMetadata)로 상위 메타데이터를 읽어 확장할 수 있다(예: 부모의 OG 이미지 뒤에 추가)
  • Open Graph·Twitter 카드는 SNS(Social Networking Service) 공유 미리보기 태그(og:title, og:image)가 된다
  • 서버 컴포넌트에서만 내보낼 수 있다. 'use client' 파일에서는 에러다
  • generateStaticParams와 헷갈리지 않는다. 그쪽은 빌드 때 미리 만들 경로 목록을 정한다(CSR·SSR·SSG·ISR)

검색엔진과 공유 미리보기는 서버 HTML(HyperText Markup Language)에 태그가 있어야 읽으므로 서버 렌더가 필요하다. 링크를 공유할 때 따라가는 출처 정보는 Origin·Referer 헤더와 Referrer-Policy 참고.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • loading 경계와 레이아웃 끌어올리기

    Next.js App Router에서 loading.tsx는 같은 세그먼트의 page와 그 아래(하위 layout 포함)를 suspense로 감싸지만, **같은 세그먼트의 layout은 감싸지 않는다**. 그래서 데이터를 기다릴 필요가 없는 공통 UI(탭바, 필터 헤더)를 page에서 layout으로 끌어올리면 스켈레톤에 덮이지 않고 처음부터 실제 모습으로 보인다.

  • next-intl과 서버 컴포넌트 친화 i18n

    next-intl은 Next.js App Router와 서버 컴포넌트를 전제로 설계된 국제화(Internationalization, i18n) 라이브러리다. 번역 메시지를 React Context가 아니라 요청 단위 설정 함수에서 읽어서, 번역만 쓰는 컴포넌트를 서버 컴포넌트로 남길 수 있다.

  • 부분 사전 렌더링(PPR)

    PPR(Partial Prerendering)은 한 라우트를 빌드 때 만든 정적 셸(Static Shell)과 요청 때 채우는 동적 구멍으로 나눠, 셸은 즉시 보내고 구멍은 스트리밍으로 채우는 렌더링 모델이다. Next.js 16에서 Cache Components(cacheComponents: true)를 켜면 기본 동작이다(2026 기준).

  • "use cache"와 Cache Components

    'use cache'는 Next.js 16의 Cache Components 모델에서 async 함수나 컴포넌트의 반환값을 캐시하라고 명시하는 지시어(Directive)다. 아무것도 표시하지 않으면 매 요청 실행되고, 캐시하고 싶은 곳에만 직접 붙인다(옵트인, Opt-in).

  • Next.js output: 'standalone'

    output: 'standalone'은 next build가 프로덕션 실행에 필요한 파일만 골라 .next/standalone 폴더에 모아 주는 빌드 출력 모드다. 이 폴더는 node_modules를 다시 설치하지 않고 node server.js 하나로 실행된다.

보기 옵션