✅ 왜 Metadata 대신 next-seo를 사용해야 할까?

Next.js 15에서는 Metadata API를 사용하여 SEO 메타태그를 설정할 수 있지만, next-seo를 사용하는 것이 더 유리한 상황이 많습니다.
아래 이유를 보면 언제 Metadata가 좋고, 언제 next-seo를 사용하는 것이 더 나은지 알 수 있습니다.


🚀 1. Metadata API의 한계

📌 1-1. Metadata는 서버 컴포넌트에서만 사용 가능

  • Metadata는 서버 컴포넌트에서만 동작하며, 클라이언트 컴포넌트에서는 사용할 수 없음
  • 즉, 동적인 SEO 업데이트(예: 사용자 인터랙션에 따른 메타태그 변경)가 불가능
  • 클라이언트 컴포넌트("use client"가 포함된 컴포넌트)에서는 Metadata를 직접 사용할 수 없음

예제: Metadata는 클라이언트에서 사용할 수 없음

"use client";
import { Metadata } from "next"; // ❌ 사용 불가

export default function ClientComponent() {
  return <h1>이 컴포넌트에서는 Metadata를 사용할 수 없음</h1>;
}

반면, next-seo는 서버 & 클라이언트 모두에서 동작 가능

"use client";
import { NextSeo } from "next-seo";

export default function ClientComponent() {
  return <NextSeo title="클라이언트 SEO 적용" description="클라이언트에서도 SEO 가능" />;
}

📌 1-2. Metadata는 동적 SEO 업데이트가 불가능

  • Metadata는 서버에서 정적인 HTML을 생성할 때만 동작
  • 즉, 페이지가 렌더링된 후에 SEO 정보를 변경할 수 없음
  • 하지만 next-seo는 클라이언트에서도 SEO 변경이 가능하여 SPA 환경에서도 SEO 업데이트 가능

예제: next-seo는 동적으로 SEO 변경 가능

"use client";
import { NextSeo } from "next-seo";
import { useState } from "react";

export default function DynamicSeo() {
  const [title, setTitle] = useState("초기 제목");

  return (
    <div>
      <NextSeo title={title} description="SEO 동적 업데이트 가능" />
      <button onClick={() => setTitle("변경된 제목")}>제목 변경</button>
    </div>
  );
}

📌 Metadata API는 위와 같은 동적 업데이트가 불가능


📌 1-3. Metadata는 클라이언트 네비게이션 시 SEO가 초기화될 수 있음

  • Next.js는 서버에서 Metadata를 초기 렌더링할 때만 사용
  • 클라이언트에서 페이지 이동 시 Metadata가 자동으로 변경되지 않음
  • 반면, next-seo는 클라이언트 라우팅 시에도 SEO를 유지하며 동작

🚀 2. next-seo를 사용하면 좋은 이유

비교 항목 Metadata (Next.js 기본 SEO) next-seo (라이브러리)

서버 컴포넌트에서 사용 가능 ✅ 가능 ✅ 가능
클라이언트 컴포넌트에서 사용 가능 ❌ 불가능 ✅ 가능
SEO 동적 업데이트 가능 ❌ 불가능 ✅ 가능 (클라이언트에서 변경 가능)
페이지 네비게이션 시 SEO 유지 ❌ 초기화 가능성 있음 ✅ 유지됨
Open Graph & Twitter Meta 자동 지원 ⭕ 일부 가능 ✅ 자동 지원
설정 간편함 ✅ 기본 제공 ✅ 더 유연한 설정 가능

🚀 3. Metadata & next-seo를 함께 사용해야 하는 경우

서버에서 정적 SEO 설정 → Metadata 사용
클라이언트에서 동적 SEO 업데이트 필요 → next-seo 사용

📌 최적의 조합은 Metadata + next-seo를 함께 사용하는 것

// ✅ 서버에서 SEO 설정 (SSR)
export async function generateMetadata({ params }: { params: { slug: string } }): Promise<Metadata> {
  return {
    title: "서버에서 설정된 SEO",
    description: "이것은 서버에서 설정된 SEO 메타데이터입니다.",
  };
}

// ✅ 클라이언트에서 동적 SEO 업데이트 가능 (CSR)
export default function BlogPostPage() {
  return (
    <>
      <NextSeo
        title="클라이언트에서 SEO 변경 가능"
        description="이것은 next-seo를 사용하여 클라이언트에서 설정된 SEO입니다."
      />
      <h1>SEO 설정 완료</h1>
    </>
  );
}

🎯 🚀 결론: 언제 Metadata를 쓰고, 언제 next-seo를 써야 할까?

  1. 서버에서만 정적인 SEO 설정이 필요하다면 Metadata 사용
    • 정적인 블로그 게시물
    • 페이지별 기본 SEO 설정
    • ✅ 빠르고 기본적인 SEO 설정 가능
  2. 클라이언트에서도 SEO 변경이 필요하다면 next-seo 사용
    • 사용자 인터랙션에 따라 동적 SEO 업데이트
    • 페이지 네비게이션 시 SEO 유지
    • ✅ SPA 환경에서도 SEO 최적화 가능
  3. 최적의 방식: Metadata + next-seo 병행 사용
    • Metadata → SSR에서 초기 SEO 설정
    • next-seo → 클라이언트에서 SEO 유지 및 동적 변경 가능
    • SEO 성능 최적화 + 유연한 동작 가능

🚀 즉, next-seo는 SEO 설정을 더 유연하고 동적으로 만들 수 있기 때문에, Metadata와 함께 사용하면 최고의 결과를 얻을 수 있음! 🔥