Canonical URLSEO 최적화중복 콘텐츠 해결frontend

[문서] Next.js App Directory에서 Canonical 태그 작성

KUKJIN LEE
KUKJIN LEE
2025년 2월 21일
388

Canonical이란?

Canonical(정식 URL)은 검색 엔진에 여러 유사한 페이지 중 "원본" 또는 "선호되는" 버전을 알려주는 HTML 요소입니다. 이는 중복 콘텐츠 문제를 해결하고 검색 엔진 최적화(SEO)를 개선하는 데 중요한 역할을 합니다.

 

  • 검색 엔진에 우선순위가 높은 URL을 알려줍니다.

  • 여러 유사한 페이지의 SEO 가치를 하나로 통합합니다.

  • URL 파라미터나 세션 ID로 인한 중복 콘텐츠 문제를 해결합니다.

 

모든 페이지에서 설정해야 하는가?

  • 동일한 콘텐츠가 여러 URL로 접근 가능한 경우

  • 모바일과 데스크톱 버전의 페이지가 별도로 존재하는 경우

  • 제품 페이지에서 필터링이나 정렬 옵션으로 인해 여러 URL이 생성되는 경우

  • 프린트 버전 페이지가 별도로 존재하는 경우

 

Canonical 태그를 사용하면 SEO에 도움이 될 수 있으므로, 가능하면 모든 페이지에 설정하는 것을 권장합니다.

 

Next.js App Directory에서 Canonical 설정하기

Next.js App Directory에서는 메타데이터 API를 사용하여 Canonical URL을 쉽게 설정할 수 있습니다.

 

1. 정적 메타데이터 사용

정적 페이지의 경우, layout.tsx 또는 page.tsx 파일에서 직접 메타데이터를 정의할 수 있습니다.

import type { Metadata } from 'next'

export const metadata: Metadata = {
  title: '페이지 제목',
  description: '페이지 설명',
  canonical: 'https://kakao.gg/canonical-article',
}

export default function Page() {
  // 페이지 컴포넌트
}

2. 동적 메타데이터 생성

동적 라우팅을 사용하는 페이지의 경우, generateMetadata 함수를 사용하여 동적으로 Canonical URL을 설정할 수 있습니다.

import type { Metadata } from 'next'

type Props = {
  params: { id: string }
  searchParams: { [key: string]: string | string[] | undefined }
}

export async function generateMetadata(
  { params, searchParams }: Props,
  parent: ResolvingMetadata
): Promise<Metadata> {
  const id = params.id

  // 데이터 fetching 로직
  const product = await fetchProduct(id)

  return {
    title: product.title,
    description: product.description,
    canonical: `https://kakao.gg/frontend/${id}`,
  }
}

export default function Page({ params, searchParams }: Props) {
  // 페이지 컴포넌트
}

주의사항

  1. 자기 참조 Canonical: 페이지의 Canonical URL은 항상 해당 페이지 자신을 가리켜야 합니다.

  2. 절대 URL 사용: Canonical URL은 항상 절대 URL을 사용해야 합니다.

  3. 일관성 유지: 한 번 설정한 Canonical URL은 가능한 한 변경하지 않는 것이 좋습니다.

  4. HTTPS 사용하기.

관련 글

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