nextjs,tailwindcss,vercel

[ nextjs SEO ์ฒดํฌ๋ฆฌ์ŠคํŠธ ] 1 - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ , ๋ฉ”ํƒ€ ํƒœ๊ทธ

์ฃผ์˜ ๐Ÿฑ 2024. 5. 15. 15:16
728x90

๋ชฉํ‘œ SEO (๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”)๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰์—”์ง„์—์„œ ์›น์‚ฌ์ดํŠธ๊ฐ€ ์ƒ์œ„ ๋…ธ์ถœ๋˜๋„๋ก ํ•จ

๋ฐฐ๊ฒฝ : ๊ตฌ๊ธ€์€ ๊ตฌ๊ธ€๋ด‡์ด๋ผ๋Š” ์›น ํฌ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ์‚ฌ์ดํŠธ๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ๋Œ์•„๋‹ค๋‹ˆ๋ฉฐ ์ˆ˜์ง‘ํ•œ๋‹ค. ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ๋“ค์€ ๊ตฌ๊ธ€ ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์–ด ๋ถ„์„๋˜๊ณ , ์ธ๋ฑ์Šค์— ๋ฐ˜์˜๋œ๋‹ค. ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰์‹œ์—๋Š” ์ด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณด๋‹ค ์ ์ ˆํ•œ ํŽ˜์ด์ง€๊ฐ€ ์ƒ์œ„์— ๋‚˜ํƒ€๋‚˜๋„๋ก ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. 

 

๊ตฌ๊ธ€๋ด‡์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, SPA ๋“ฑ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์ถ•ํ•œ ์›น์‚ฌ์ดํŠธ์—์„œ๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 

CSR๋งŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/ํ”„๋ ˆ์ž„์›Œํฌ๋Š” SEO์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋ฉด ํฌ๋กค๋Ÿฌ๋Š” ์ฒ˜๋ฆฌ๋ฅผ ๋ฉˆ์ถ”๊ฒŒ ๋˜์–ด ์ฝ˜ํ…์ธ ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

Next.js๋Š” SEO์— ๊ฐ•ํ•˜๋‹ค. SSR์ด๋‚˜ SSG๋ฅผ ํ™œ์šฉํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ์— ์ดˆ๊ธฐ์— ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š”๋ฐ์— ์‹œ๊ฐ„์„ ์Ÿ์ง€ ์•Š์•„๋„ ํฌ๋กค๋Ÿฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๊ฒ€์ƒ‰์—”์ง„์— ์‹ฃ๊ณ  ์‹ถ์€ ํŽ˜์ด์ง€๋Š” SSR/SSG๋ฅผ ํ™œ์šฉํ•˜๋„๋ก ํ•˜์ž. 

 

 

 

SEO ์ฒดํฌ๋ฆฌ์ŠคํŠธ (ํ‚ค์›Œ๋“œ)

  • Meta tags

    JSON-LD Schema

    Sitemap

    robots.txt

    Link tags

    Script optimization

    Image optimization

 

ํ•˜๋‚˜์”ฉ ๋ณด๋„๋ก ํ•˜์ž

 

1.   Meta tags (๋ฉ”ํƒ€ ํƒœ๊ทธ)

๋ฉ”ํƒ€ ํƒœ๊ทธ๋Š” <head> ์•ˆ์˜ <meta>์š”์†Œ๋กœ, ์›น์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ ์—”์ง„๊ณผ ์†Œ์…œ ๋ฏธ๋””์–ด ํ”Œ๋žซํผ์— ์ œ๊ณตํ•œ๋‹ค

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช… ; https://nextjs.org/docs/app/building-your-application/optimizing/metadata

 

[๋ฉ”ํƒ€ํƒœ๊ทธ์— ํฌํ•จ๋˜๋Š” ์‚ฌํ•ญ]

  • title
  • description 
    • ๊ฐ๊ฐ ํŽ˜์ด์ง€์˜ ์ œ๋ชฉ๊ณผ ๊ฐœ์š”๋ฅผ ๊ธฐ์ˆ 
    • ํฌ๋กค๋Ÿฌ๊ฐ€ ์ˆ˜์ง‘ํ•ด, ๊ฒ€์ƒ‰์—”์ง„์— ํ‘œ์‹œํ•  ๋•Œ ์ œ๋ชฉ๊ณผ ์„ค๋ช…์ด ๋œ๋‹ค. 
  • keywords
  • robots
  • viewport
  • charSet
    • charSet๊ณผ ๋ทฐํฌํŠธ๋Š” Next.js ์•ฑ ๋ผ์šฐํ„ฐ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜๋ฏ€๋กœ ์ •์˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

Open Graph meta tags:

-property ์†์„ฑ์ธ og:๋กœ ์‹œ์ž‘ํ•˜๋Š” <meta> ํƒœ๊ทธ๋Š” OGP(Open Graph Protocol)์šฉ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•œ๋‹ค. 

- ๋‹ค์‹œ ๋งํ•˜๋ฉด , SNS์—์„œ ํ•ด๋‹น ํŽ˜์ด์ง€ ๋งํฌ๋ฅผ ๊ณต์œ ํ–ˆ์„ ๋•Œ ์ธ๋„ค์ผ์„ ํ‘œ์‹œํ•˜๋Š” ๋‚ด์šฉ์„ ์ •์˜ํ•œ๋‹ค. 

  • og:site_name
    • ํŽ˜์ด์ง€ ์‚ฌ์ดํŠธ๋ช… 
  • og:locale
  • og:title
    • ํŽ˜์ด์ง€์˜ ์ œ๋ชฉ
  • og:description
    • ํŽ˜์ด์ง€์˜ ์„ค๋ช…๋ฌธ
  • og:type
    • ๊ฐ์ฒด ํƒ€์ž… (video, movie, webpage, article,,)
  • og:url
    • ํŽ˜์ด์ง€์˜ URL
  • og:image
    • ์ธ๋„ค์ผ ์ด๋ฏธ์ง€์˜ URL
  • og:image:alt
  • og:image:type
  • og:image:width
  • og:image:height

 


  • static metadata์˜ ๊ฒฝ์šฐ export const metadata
  • dynamic data์˜ ๊ฒฝ์šฐ generateMetadata
import type { Metadata } from 'next'
 
// either Static metadata
export const metadata: Metadata = {
  title: '...',
}
 
// or Dynamic metadata
export async function generateMetadata({ params }) {
  return {
    title: '...',
  }
}

 

 

static metadata

์ •์  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ page.tsx ํ˜น์€ layout.tsx ์•ˆ์— export const metadata ๋กœ ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค. 

import type { Metadata } from 'next'
 
export const metadata: Metadata = {
  title: '...',
  description: '...',
}
 
export default function Page() {}
  • title
    • ์ œ๋ชฉ ์ •์˜
    • ๋ฌธ์ž์—ด ํ˜น์€ template object ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฌธ์ž์—ด
 
layout.js | page.js
 
export const metadata = {  title: 'Next.js',}
<head> output
 
<title>Next.js</title>

 

<template object>

 

app/layout.tsx
import type { Metadata } from 'next' export const metadata: Metadata = {  
title: {    
template: '...',    default: '...',    absolute: '...', 
},

}

 

 

 

ํŒ)

app/layout.tsx ์— ํ•œ๋ฒˆ ์ ์šฉํ•ด๋†“์œผ๋ฉด ํ•˜์œ„ ํŽ˜์ด์ง€์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž๋™ ์ ์šฉ์ด ๋œ๋‹ค. 

app/about/page.tsx ์— ๋‹ค์Œ ์‚ฝ์ž…

import type { Metadata } from 'next'
 
export const metadata: Metadata = {}
 
// Output: <title>Acme</title>

 


viewport 

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์ง€์›

//app/layout.tsx

import type { Viewport, Metadata } from "next";
 
export const viewport: Viewport = {
  width: "device-width",
  initialScale: 1,
  themeColor: "#ffffff"
};

https://nextjs.org/docs/app/api-reference/functions/generate-viewport

 


Dynamic Metadata

 [id]/page.tsx ์™€ ๊ฐ™์€ ๋™์ ์ธ ํŽ˜์ด์ง€์— ์‚ฌ์šฉํ•œ๋‹ค. 

 generateMetadata function์œผ๋กœ ์ˆ˜ํ–‰

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

 

 

์ถœ์ฒ˜ : https://nextjs.org/docs/app/api-reference/functions/generate-metadata#template-object

๋ฐ˜์‘ํ˜•