metadatanext.js metadatagenerateMetadataNext.js generateMetadatametadata generateMetadata 차이

Next.js에서 metadata와 generateMetadata 차이점 및 사용법

KUKJIN LEE
KUKJIN LEE
2024년 9월 9일
190

Next.js에서 SEO와 메타데이터 설정을 위해 metadatagenerateMetadata 두 가지 방법을 제공합니다.

 

1. metadata: 정적 메타데이터 설정

metadata 객체는 빌드 시점에 결정되는 정적 메타데이터를 설정할 때 사용합니다.

export const metadata: Metadata = {
  title: 'Kakao.GG Tech Blog',
  description: 'Hello this is Kakao.GG Tech Blog',
  openGraph: {
    title: 'About Kakao.GG',
    description: 'Make something fun',
    images: [{ url: '/images/kakaogg.png' }],
  },
}
  • 빌드 시 결정되는 고정 값

  • 동적 데이터가 필요 없는 경우에 적합

  • 간단하고 직관적인 사용법

 

2. generateMetadata: 동적 메타데이터 생성

generateMetadata 함수는 요청 시 동적으로 메타데이터를 생성해야 할 때 사용합니다.

export async function generateMetadata({ params }: Props): Promise<Metadata> {
  const post = await fetchPost(params.id)
  return {
    title: `${post.title} | Kakao.GG`,
    description: ${post.description},
  }
}
  • 요청 시점에 동적으로 메타데이터 생성

  • 비동기 함수로 외부 데이터 fetch 가능

  • URL 파라미터나 동적 데이터 기반 메타데이터에 적합

 

metadata vs generateMetadata: 언제 무엇을 사용해야 할까?

  • metadata

    • 데이터 유형: 정적

    • 비동기 처리: 불가능

    • 사용: 고정 페이지

    • 성능: 빠름 (빌드 시 생성)

  • generateMetadata

    • 데이터 유형: 동적

    • 비동기 처리: 가능

    • 사용: 동적 콘텐츠 페이지

    • 성능: 상대적으로 느림 (요청 시 생성)

 

주의사항

  1. TypeScript 사용 시 Metadata 타입을 import하여 타입 안정성 확보

  2. generateMetadata에서 무거운 작업은 피하고, 필요한 데이터만 입력

 

정적일 때 generateMetadata를 사용하는 건 잘못된 것일까?

generateMetadata는 본래 동적인 메타데이터를 설정하기 위한 비동기 함수이므로, 다음과 같은 이유로 비동적인 데이터를 처리할 때는 metadata를 사용하는 것이 권장됩니다.

  1. 성능 최적화: generateMetadata는 비동기 함수로 설계되어 있어, 호출 시점에 불필요한 비동기 처리가 발생할 수 있습니다. 정적인 메타데이터는 불필요한 비동기 처리를 할 필요가 없기 때문에 metadata가 더 효율적입니다.

  2. 코드 가독성 및 유지보수: 정적인 데이터를 처리하는 데에 generateMetadata를 사용하면, 다른 개발자가 이 코드를 읽을 때 해당 메타데이터가 동적으로 생성된다고 오해할 수 있습니다. 반면, metadata를 사용하면 이 데이터가 정적임을 명확하게 표현할 수 있습니다.

  3. Next.js 관례: Next.js에서는 metadata정적 메타데이터를 설정하는 데에, generateMetadata동적 메타데이터를 생성하는 데에 사용됩니다. 이러한 관례를 따르면, 프로젝트의 일관성을 유지하고 더 쉽게 유지보수할 수 있습니다.

따라서, 정적인 데이터가 필요한 경우에는 metadata를 사용하고, 동적으로 데이터를 받아와야 할 때 generateMetadata를 사용하는 것이 더 나은 선택입니다.

관련 글

TypeScript any 린트 에러(no-explicit-any) 근본적으로 해결하기

TypeScript 프로젝트에서 @typescript-eslint/no-explicit-any 린트 에러는 단순 규칙 비활성화로 해결할 문제가 아닙니다. 눈 앞 문제는 해결할 수 있지만, TypeScript를 사용하는 가장 중요한 이유를 위배하게 됩니다. any 타입은...

2025년 7월 23일269

JSP 주석, 아직도 `` 쓰시나요? 올바른 사용법

코드를 작성하다 보면 주석을 남기는 경우가 많습니다. 하지만 JSP 환경에서 어떤 주석을 사용하냐에 따라 보안 수준과 성능 이 크게 달라집니다. 표준 주석: 서버 사이드 주석 &lt;%-- --%&gt; JSP 페이지 내 개발 관련 주석은 &lt;%-- --%&gt; 를 사용하는게 좋습니다...

2025년 7월 9일144

쉽게 만드는 React Tab 라이브러리 react-tabs

개발자가 커스텀 스타일을 쉽게 적용할 수 있도록 최소한의 스타일만 제공하여 유연한 스타일링 이 가능한 라이브러리입니다. 상태 관리가 내장되어 있어 탭 선택 및 패널 표시 로직을 직접 구현할 필요 없이 간편하게 사용할 수 있습니다. 기본 사용법 먼저, 라이브러리를 설치합...

2025년 6월 17일173

Next.js 환경 변수 NEXT_PUBLIC 접두사 역할

NEXT_PUBLIC 접두사를 붙이면 변수의 접근 범위가 완전히 달라집니다. 이 차이점을 이해하는 것이 안전하고 효율적인 Next.js 애플리케이션을 구축하는 데 중요합니다. NEXT_PUBLIC 접두사가 없는 환경 변수 (서버 전용) NEXT_PUBLIC 접두사 없이...

2025년 6월 13일156