✅ 왜 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를 써야 할까?
- 서버에서만 정적인 SEO 설정이 필요하다면 Metadata 사용
- 정적인 블로그 게시물
- 페이지별 기본 SEO 설정
- ✅ 빠르고 기본적인 SEO 설정 가능
- 클라이언트에서도 SEO 변경이 필요하다면 next-seo 사용
- 사용자 인터랙션에 따라 동적 SEO 업데이트
- 페이지 네비게이션 시 SEO 유지
- ✅ SPA 환경에서도 SEO 최적화 가능
- 최적의 방식: Metadata + next-seo 병행 사용
- Metadata → SSR에서 초기 SEO 설정
- next-seo → 클라이언트에서 SEO 유지 및 동적 변경 가능
- ✅ SEO 성능 최적화 + 유연한 동작 가능
🚀 즉, next-seo는 SEO 설정을 더 유연하고 동적으로 만들 수 있기 때문에, Metadata와 함께 사용하면 최고의 결과를 얻을 수 있음! 🔥