๐ 03. head & meta & SEO: ๊ตฌ๊ธ์ด ๋ด ํ์ด์ง๋ฅผ ์ดํดํ๋ ๋ฐฉ๋ฒ
๐ ๊ฐ์
meta charset, viewport, description, OG ํ๊ทธ, favicon, Next.js Metadata API๊น์ง โ head ์์ ๋ชจ๋ ๊ฒ์ 5๋ ์ฐจ์ ์ธ์ด๋ก ํด์ํฉ๋๋ค.
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 20๋ถ / ํต์ฌ ํํธ๋ง: 12๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[head์ ์ญํ ] โ [ํ์ meta ํ๊ทธ] โ [SEO meta ํ๊ทธ] โ [OG/Twitter ์นด๋] โ [Next.js Metadata API]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
-
<head>์์ ๋ญ ๋ฃ์ด์ผ ํ๋์ง, ์ ๋ฃ๋์ง ์ค๋ช ํ ์ ์๋ค. - SEO ๊ธฐ๋ณธ meta ํ๊ทธ์ OG(Open Graph) ํ๊ทธ๋ฅผ ์ง์ ์์ฑํ ์ ์๋ค.
- Next.js์
MetadataAPI๋ก ๋์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ์ ์๋ค. -
<head>์์ ํ๊ทธ ์์๊ฐ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ค๋ช ํ ์ ์๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์
): "์ํธ ๋, ์นด์นด์คํก์ผ๋ก ์ฐ๋ฆฌ ์ฌ์ดํธ ๋งํฌ ๊ณต์ ํ๋๋ ๊ทธ๋ฅ URL๋ง ๋์์. ๋ค๋ฅธ ์ฌ์ดํธ๋ค์ ์ธ๋ค์ผ ์ด๋ฏธ์ง๋ ์ ๋ชฉ์ด ์์๊ฒ ๋์ค๋๋ฐ... ๊ทธ๋ฆฌ๊ณ ์์ ๋์ด '๊ตฌ๊ธ ๊ฒ์ ๊ฒฐ๊ณผ์ ์ค๋ช
์ด ์ ๋์จ๋ค'๊ณ ํ๋๋ฐ,
<head>์์ ๋ญ ๋ ๋ฃ์ด์ผ ํ๋ ๊ฑฐ์์?" - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "๋ง์์,
<head>๋ ์ฌ์ฉ์ ๋์ ์ ๋ณด์ด์ง๋ง, ๊ตฌ๊ธยท์นด์นด์คยท์ฌ๋ ๊ฐ์ ํฌ๋กค๋ฌ๋ค์ด ์ ์ผ ๋จผ์ ์ฝ๋ '๋ช ํจ'์ด์์. ๋ช ํจ์ ์ ๋๋ก ์ ๋ง๋ค๋ฉด ๊ฒ์์๋ ์ ๊ฑธ๋ฆฌ๊ณ , ๊ณต์ ํ์ ๋ ๋ฏผ๋ฏ URL๋ง ๋กํ๋ ๋์ค๋ ๊ฑฐ์ฃ ."
๐ค ์ ์์์ผ ํ๋๊ฐ
์์๋ค ์ปค๋ฎค๋ํฐ ๋ง์ผํ ํ์ด ํ๋ณด๋ฅผ ์์ํ๋ค. ์์ฒ ์ด๊ฐ ๋ง๋ ์ฌ์ดํธ ๋งํฌ๋ฅผ ์นด์นด์คํก ๋จ์ฒด๋ฐฉ์ ๊ณต์ ํ๋๋ฐ...
๐จ ์์(๋์์ด๋): "์์ฒ ๋, ๋งํฌ ๊ณต์ ํ๋ฉด ์ด๋ฏธ์ง๋ ์ ๋ชฉ์ด ๋์์ผ ํ๋๋ฐ ์ URL๋ง ๋์ค์ฃ ? ๋ค๋ฅธ ์ปค๋ฎค๋ํฐ๋ ์ธ๋ค์ผ์ด ์์๊ฒ ๋ถ๋๋ฐ..."
๐ ์์(PM): "Google์์ '์์๋ค ์ปค๋ฎค๋ํฐ ๋ฆฌ์กํธ ๊ฒ์ํ' ์ณ๋ ์ฐ๋ฆฌ ์ฌ์ดํธ๊ฐ ์ฒซ ํ์ด์ง์ ์ ๋์์. SEO ์์ ์ ํ ๊ฑฐ์์?"
์์ฒ ์ด๊ฐ ๋ง๋ <head> ์ ํ์ฌ ์ํ:
<!-- โ ์์ฒ ์ด์ ์ต์ด head: ์ฌ์ค์ ์๋ฌด๊ฒ๋ ์์ -->
<head>
<title>์์๋ค ์ปค๋ฎค๋ํฐ</title>
<link rel="stylesheet" href="styles.css" />
</head>์ด ์ํ๊ฐ ๋ฌธ์ ์ธ ์ด์ :
- ๊ตฌ๊ธ์ ๊ฒ์ ์ค๋ช (description)์ด ์์ โ ํฌ๋กค๋ฌ๊ฐ ๋ณธ๋ฌธ์์ ์์๋ก ์๋ผ ์
- OG ํ๊ทธ ์์ โ ์นด์นด์ค/์ฌ๋์์ URL๋ง ํ์
charset์์ โ ํ๊ธ ๊นจ์ง ์ ์์viewport์์ โ ๋ชจ๋ฐ์ผ์์ ํ๋ฉด ํฌ๊ธฐ ์๋ง
๐ 1. head์ ์ญํ ๊ตฌ๋ถ
<head> ์์ ๋ค์ด๊ฐ๋ ์์๋ค์ ๋ฑ ๋ ๊ฐ์ง ์ญํ ๋ก ๋๋์ด:
| ์ญํ | ๋ํ ํ๊ทธ | ๋๊ตฌ๋ฅผ ์ํ๊ฐ |
|---|---|---|
| ๋ ๋๋ง ํ์ ์ ๋ณด | charset, viewport, CSS <link> | ๋ธ๋ผ์ฐ์ |
| ๋ฉํ๋ฐ์ดํฐ/SEO/์์ | title, description, OG ํ๊ทธ, favicon | ๊ฒ์์์งยทํฌ๋กค๋ฌยทSNS |
๐ง 2. ํ์ meta ํ๊ทธ 4์ข ์ธํธ
2-1. charset โ ๋ฌธ์ ์ธ์ฝ๋ฉ
<!-- ๋ฐ๋์ <head>์ ์ฒซ ๋ฒ์งธ ์ค์, ์ฒซ 1024 ๋ฐ์ดํธ ์ด๋ด์ ์์ด์ผ ํจ -->
<meta charset="UTF-8" />UTF-8์ด ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ธ์ฝ๋ฉ์ ์ถ์ธกํด์ผ ํด. ์๋ชป ์ถ์ธกํ๋ฉด ํ๊ธ์ด ????? ๋ก ๊นจ์ ธ. ์์น๊ฐ ์ค์ํด: ๋ธ๋ผ์ฐ์ ๋ ํ์ผ์ ์ฝ์ผ๋ฉด์ ์ธ์ฝ๋ฉ์ ์ฆ์ ์์์ผ ํ๋ฏ๋ก, ๋ฌธ์ ์ต์๋จ 1024๋ฐ์ดํธ ์ด๋ด์ ์์ด์ผ ํ๋ค.
2-2. viewport โ ๋ชจ๋ฐ์ผ ๋์
<meta name="viewport" content="width=device-width, initial-scale=1.0" />width=device-width: ๋ทฐํฌํธ ๋๋น๋ฅผ ๊ธฐ๊ธฐ ์ค์ ๋๋น์ ๋ง์ถคinitial-scale=1.0: ์ด๊ธฐ ์ค ๋ ๋ฒจ 1๋ฐฐ (ํ๋/์ถ์ ์์)
์ด๊ฒ ์์ผ๋ฉด ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฐ์คํฌํ ์ฌ์ด์ฆ(980px)๋ก ๋ ๋๋งํ ํ ์ถ์ํด์ ๋ณด์ฌ์ค. ๊ธ์จ๊ฐ ์์ฒญ ์๊ฒ ๋ณด์ด๋ ๊ทธ๊ฒ.
2-3. title โ ํญ ์ ๋ชฉ + ๊ฒ์๊ฒฐ๊ณผ ์ ๋ชฉ
<title>๋ฆฌ์กํธ ์ํ๊ด๋ฆฌ ๋น๊ต | ์์๋ค ์ปค๋ฎค๋ํฐ</title>- ๊ฒ์๊ฒฐ๊ณผ์์ ํ๋์ ํด๋ฆญ ๋งํฌ๊ฐ ๋๋ ๊ฐ์ฅ ์ค์ํ SEO ์์
- ์ ์ ๊ธธ์ด: 50~60์ ์ด๋ด (์ด ์ด์์ ๊ตฌ๊ธ์์
...๋ก ์๋ฆผ) - ํ์:
ํ์ด์ง ํต์ฌ ํค์๋ | ์ฌ์ดํธ๋ช๊ถ์ฅ
2-4. description โ ๊ฒ์๊ฒฐ๊ณผ ์ค๋ช
<meta
name="description"
content="Zustand, Jotai, Redux Toolkit์ ์ค๋ฌด ๊ด์ ์ผ๋ก ๋น๊ต๋ถ์ํฉ๋๋ค. 150์ ์ด๋ด์ ํต์ฌ ์์ฝ." />- ๊ฒ์๊ฒฐ๊ณผ์์ ์ ๋ชฉ ์๋ ํ์์ผ๋ก ๋์ค๋ 2~3์ค ์ค๋ช
- CTR(ํด๋ฆญ๋ฅ )์ ์ง์ ์ํฅ์ ์ค
- ์ ์ ๊ธธ์ด: 120~160์ ์ด๋ด
๐ข 3. OG (Open Graph) ํ๊ทธ โ ์์ ๊ณต์ ์ ๋ช ํจ
OG ํ๊ทธ๋ ์นด์นด์คํก, ์ฌ๋, ํ์ด์ค๋ถ, ํธ์ํฐ์์ ๋งํฌ๋ฅผ ๊ณต์ ํ์ ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์นด๋ ๋ฅผ ๋ง๋ค์ด์ฃผ๋ ํ์ค ๋ฉํ๋ฐ์ดํฐ์ผ.
<!-- OG ๊ธฐ๋ณธ 4์ข
(ํ์) -->
<meta property="og:title" content="๋ฆฌ์กํธ ์ํ๊ด๋ฆฌ ๋น๊ต โ Zustand vs Jotai" />
<meta property="og:description" content="์ค๋ฌด ๊ฐ๋ฐ์๊ฐ ์ง์ ๋น๊ตํ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ๋ ์ด๋์คํ" />
<meta property="og:image" content="https://ysdeveloper.community/og-images/react-state.png" />
<meta property="og:url" content="https://ysdeveloper.community/posts/react-state" />
<meta property="og:type" content="article" /> <!-- website, article, video ๋ฑ -->
<!-- Twitter ์นด๋ (Twitter/X ์ ์ฉ) -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="๋ฆฌ์กํธ ์ํ๊ด๋ฆฌ ๋น๊ต โ Zustand vs Jotai" />
<meta name="twitter:description" content="์ค๋ฌด ๊ฐ๋ฐ์๊ฐ ์ง์ ๋น๊ตํ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ" />
<meta name="twitter:image" content="https://ysdeveloper.community/og-images/react-state.png" />OG ์ด๋ฏธ์ง ์คํ:
- ๊ถ์ฅ ํฌ๊ธฐ: 1200 ร 630px (๊ฐ๋ก 2:1 ๋น์จ)
- ์ต์ ํฌ๊ธฐ: 600 ร 315px
- ํ์ผ ํ์: PNG/JPEG (๋๋ฌด ํฌ๋ฉด ๋ก๋ฉ ์ง์ฐ)
๐ Next.js ์ฐ๊ฒฐ ๊ณ ๋ฆฌ:
app/api/og/route.tsx
Next.js์ImageResponseAPI๋ก OG ์ด๋ฏธ์ง๋ฅผ ๋์ ์ผ๋ก ์์ฑํ ์ ์์ด์.
์์๋ค ์ปค๋ฎค๋ํฐ์ฒ๋ผ ๊ฒ์๊ธ๋ง๋ค ๋ค๋ฅธ OG ์ด๋ฏธ์ง๊ฐ ํ์ํ ๊ฒฝ์ฐ์ ๋งค์ฐ ์ ์ฉํด์.
๐ผ๏ธ 4. ๊ธฐํ head ํ์ ์์
<!-- favicon: ๋ธ๋ผ์ฐ์ ํญ์ ํ์๋๋ ์์ด์ฝ -->
<link rel="icon" href="/favicon.ico" />
<!-- ๊ณ ํด์๋๋ฅผ ์ํ PNG ์์ด์ฝ -->
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<!-- Apple ๊ธฐ๊ธฐ์ ํํ๋ฉด ์ ์ฅ ์์ด์ฝ -->
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<!-- ์ ๊ทํ URL: ๊ฐ์ ์ฝํ
์ธ ๊ฐ ์ฌ๋ฌ URL์ ์์ ๋ ์๋ณธ ์ง์ (์ค๋ณต SEO ํจ๋ํฐ ๋ฐฉ์ง) -->
<link rel="canonical" href="https://ysdeveloper.community/posts/react-state" />
<!-- preload: ๊ณง ํ์ํ ๋ฆฌ์์ค๋ฅผ ๋ฏธ๋ฆฌ ๋ค์ด๋ก๋ (LCP ์ด๋ฏธ์ง, ํฐํธ ๋ฑ) -->
<link rel="preload" href="/fonts/Pretendard.woff2" as="font" type="font/woff2" crossorigin />โ๏ธ 5. Next.js Metadata API โ ๋์ SEO ์๋ํ
๐ฃ ์์ฒ : "๊ทธ๋ผ Next.js์์๋ ๋งค ํ์ด์ง๋ง๋ค <head> ๋ฅผ ์ง์ ์ง์ผ ํ๋์?"
๐ฆ ์ํธ ๋ฆฌ๋: "Next.js 13+ App Router์์๋ Metadata ๊ฐ์ฒด๋ generateMetadata ํจ์๋ก ๊น๋ํ๊ฒ ์ฒ๋ฆฌํด์. ์ค๋ณต ์์ด ์๋์ผ๋ก <head> ์ ์ฃผ์
ํด์ฃผ๊ฑฐ๋ ์."
// app/layout.tsx โ ์ฌ์ดํธ ์ ์ญ ๋ฉํ๋ฐ์ดํฐ ๊ธฐ๋ณธ๊ฐ
import type { Metadata } from "next";
export const metadata: Metadata = {
title: {
default: "์์๋ค ์ปค๋ฎค๋ํฐ",
// ํ์ ํ์ด์ง์์ %s ๊ฐ ํ์ด์ง ์ ๋ชฉ์ผ๋ก ์นํ๋จ
template: "%s | ์์๋ค ์ปค๋ฎค๋ํฐ",
},
description: "ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ค์ ์คํฐ๋ ๋งค์นญ ์ปค๋ฎค๋ํฐ",
openGraph: {
type: "website",
locale: "ko_KR",
url: "https://ysdeveloper.community",
siteName: "์์๋ค ์ปค๋ฎค๋ํฐ",
},
};// app/posts/[id]/page.tsx โ ๊ฒ์๊ธ ํ์ด์ง ๋์ ๋ฉํ๋ฐ์ดํฐ
import type { Metadata } from "next";
// generateMetadata: ์๋ฒ์์ ์คํ, DB/API ์กฐํ ๊ฐ๋ฅ
export async function generateMetadata({
params,
}: {
params: { id: string };
}): Promise<Metadata> {
const post = await fetchPost(params.id);
return {
// template ์ ์ฉ โ "๋ฆฌ์กํธ ์ํ๊ด๋ฆฌ ๋น๊ต | ์์๋ค ์ปค๋ฎค๋ํฐ"
title: post.title,
description: post.summary,
openGraph: {
title: post.title,
description: post.summary,
// ๊ฒ์๊ธ๋ณ ๋์ OG ์ด๋ฏธ์ง (Next.js ImageResponse ํ์ฉ)
images: [`/api/og?title=${encodeURIComponent(post.title)}`],
type: "article",
publishedTime: post.createdAt,
},
};
}๐ฆ ์ํธ ๋ฆฌ๋: "Next.js Metadata API๊ฐ ์ข์ ์ด์ ๋ ์ค๋ณต ํ๊ทธ ์๋ ์ ๊ฑฐ, SSR์์ ์ฌ๋ฐ๋ฅธ ์ด๊ธฐ HTML ์์ฑ, TypeScript ์๋์์ฑ๊น์ง ์ง์ํด์ ์ค์๋ฅผ ์ค์ฌ์ค์."
๐ ์์ฑ๋ head ํ ํ๋ฆฟ
<!doctype html>
<html lang="ko">
<head>
<!-- [1] ์ธ์ฝ๋ฉ (๊ฐ์ฅ ๋จผ์ ) -->
<meta charset="UTF-8" />
<!-- [2] ๋ทฐํฌํธ (๋ชจ๋ฐ์ผ ํ์) -->
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- [3] ํต์ฌ SEO -->
<title>๋ฆฌ์กํธ ์ํ๊ด๋ฆฌ ๋น๊ต | ์์๋ค ์ปค๋ฎค๋ํฐ</title>
<meta name="description" content="Zustand, Jotai๋ฅผ ์ค๋ฌด ๊ด์ ์ผ๋ก ๋น๊ตํฉ๋๋ค." />
<link rel="canonical" href="https://ysdeveloper.community/posts/react-state" />
<!-- [4] OG ์์
๊ณต์ -->
<meta property="og:title" content="๋ฆฌ์กํธ ์ํ๊ด๋ฆฌ ๋น๊ต" />
<meta property="og:description" content="์ค๋ฌด ๊ฐ๋ฐ์ ๋น๊ต ๋ถ์" />
<meta property="og:image" content="https://ysdeveloper.community/og/react-state.png" />
<meta property="og:url" content="https://ysdeveloper.community/posts/react-state" />
<meta property="og:type" content="article" />
<!-- [5] ๋ ๋๋ง ๋ฆฌ์์ค (CSS: ๋ ๋ ๋ธ๋กํน์ด๋ฏ๋ก ์ต๋ํ ์๋จ, preload ๋จผ์ ) -->
<link rel="preload" href="/fonts/Pretendard.woff2" as="font" type="font/woff2" crossorigin />
<link rel="stylesheet" href="/styles.css" />
<!-- [6] ์์ด์ฝ -->
<link rel="icon" href="/favicon.ico" />
<!-- [7] JS: defer๋ก Non-blocking -->
<script src="/app.js" defer></script>
</head>
<body>...</body>
</html>๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. ๋ค์ ์ค ์นด์นด์คํก ๋งํฌ ๊ณต์ ์ ์ธ๋ค์ผ ์ด๋ฏธ์ง๋ฅผ ํ์ํ๊ธฐ ์ํด ๋ฐ๋์ ํ์ํ meta ํ๊ทธ๋?
- A)
<meta name="description" content="..."> - B)
<meta property="og:image" content="..."> - ๊ฐ)
<meta name="viewport" content="width=device-width"> - ๋ผ)
<meta charset="UTF-8">
โ ์ ๋ต: B
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: ์นด์นด์คํก, ์ฌ๋, ํ์ด์ค๋ถ ๋ฑ์ SNS๋ ๋งํฌ๋ฅผ ๊ณต์ ํ ๋ ํด๋น URL์ HTML์ ์๋ฒ์์ ํฌ๋กค๋งํฉ๋๋ค. ์ด๋
<head>์ OG(Open Graph) ํ๊ทธ๋ฅผ ์ฝ์ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์นด๋๋ฅผ ์์ฑํ๋๋ฐ, ์ด๋ฏธ์ง๋og:image๊ฐ ๋ด๋นํด์. - ์ค๋ต ํผ๋๋ฐฑ:
description์ ๊ตฌ๊ธ ๊ฒ์ ๊ฒฐ๊ณผ์ฉ์ด๊ณ ,viewport๋ ๋ชจ๋ฐ์ผ ๋ ๋๋ง์ฉ,charset์ ์ธ์ฝ๋ฉ ์ ์ธ์ด์์. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "๊ฒ์ ์ค๋ช
=
description, SNS ์นด๋ ์ด๋ฏธ์ง =og:image"
Q2. Next.js App Router์์ ๊ฒ์๊ธ๋ณ ๋ค๋ฅธ ์ ๋ชฉ์ <title> ์ ์๋์ผ๋ก ๋ฃ์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํ๋๊ฐ?
โ
์ ๋ต: page.tsx ์์ generateMetadata ํจ์๋ฅผ export ํ๊ณ , params ๋ก ๋ฐ์ ๊ฒ์๊ธ ID๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ค { title: post.title } ์ ๋ฐํ
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: Next.js App Router์
generateMetadata๋ ์๋ฒ ์ปดํฌ๋ํธ์ฒ๋ผ ์๋ฒ์์ ์คํ๋์ด SSR ์์ ์ ์ฌ๋ฐ๋ฅธ<title>์<head>์ ์ฃผ์ ํด์ค์.layout.tsx์์title.template: "%s | ์์๋ค ์ปค๋ฎค๋ํฐ"๋ฅผ ์ค์ ํด๋๋ฉด, ํ์ ํ์ด์ง์์ ๋ฐํํtitle์ด ์๋์ผ๋ก%s์๋ฆฌ์ ๋ค์ด๊ฐ ์์ฑ๋ ์ ๋ชฉ์ด ๋ผ์. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "์ ์ ๋ฉํ =
export const metadata, ๋์ ๋ฉํ =export async function generateMetadata"
Q3. ์์ฒ ์ด์ ํ ์คํธ ํ์
์์(PM)๊ฐ ์์ฒญํ๋ค. "๊ตฌ๊ธ์์ '์์๋ค ์ปค๋ฎค๋ํฐ ๋ฆฌ์กํธ ์คํฐ๋' ๊ฒ์ํ๋ฉด ์ฐ๋ฆฌ ์ฌ์ดํธ๊ฐ 1ํ์ด์ง์ ๋์์ผ๋ฉด ์ข๊ฒ ์ด์. ๊ทธ๋ฆฌ๊ณ ๊ฒ์ ๊ฒฐ๊ณผ์ '๋ฆฌ์กํธ ๊ณต๋ถ ์ปค๋ฎค๋ํฐ โ ๋งค์นญ๋ถํฐ ์คํฐ๋ ์ด์๊น์ง' ๋ผ๋ ์ค๋ช ์ด ๋์์ผ ํด์."
์์ฒ ์ด๊ฐ ๊ตฌํํด์ผ ํ ๊ฐ์ฅ ์ค์ํ ๋ ๊ฐ์ง meta ํ๊ทธ๋?
โ
์ ๋ต: โ <title> ์ ํต์ฌ ํค์๋ ํฌํจ, โก <meta name="description"> ์ ์์ฒญ ๋ฌธ๊ตฌ ์์ฑ
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: ๊ตฌ๊ธ ๊ฒ์๊ฒฐ๊ณผ์์ ํ๋ ์ ๋ชฉ ๋งํฌ๋
<title>์์, ๊ทธ ์๋ ํ์ ์ค๋ช ํ ์คํธ๋<meta name="description">์์ ๊ฐ์ ธ์์. description์ด ์์ผ๋ฉด ๊ตฌ๊ธ์ด ๋ณธ๋ฌธ์์ ์์๋ก ์๋ผ ์ฐ๋๋ฐ, ์์ ๋์ด ์ํ๋ ๋ฌธ๊ตฌ๊ฐ ๋ณด์ฅ๋์ง ์์์. - ์ค๋ต ํผ๋๋ฐฑ: ์์ฒ ๋, OG ํ๊ทธ๋ SNS ๊ณต์ ์ฉ์ด๋ผ ๊ตฌ๊ธ ๊ฒ์ ๊ฒฐ๊ณผ ์ค๋ช
์๋ ์ํฅ์ ์ฃผ์ง ์์์. ๊ฒ์ ๊ฒฐ๊ณผ =
title+description์ด์์. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "๊ตฌ๊ธ ๊ฒ์ ๊ฒฐ๊ณผ์ ์ ๋ชฉ + ์ค๋ช
=
<title>+<meta name='description'>"
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋ OG ํ๊ทธ ์ถ๊ฐํ๊ณ ์นด์นด์คํก์์ ๋งํฌ ํ
์คํธํ์ ๋ ์ธ๋ค์ผ์ด ๋ฑ ๋์จ ์๊ฐ... ์ง์ง ์๋ฆ ๋์๋ค. ๊ทธ๋์ <title> ๋ง ๋ฌ๋ ์๋ ๊ฒ ๋ถ๋๋ฌ์ธ ์ ๋. <head> ๋ ๋์ ์ ๋ณด์ด๋ ๋ถ๋ถ์ด๋ผ ์ํํ ํ๋๋ฐ, ์ฌ์ค ์ด๊ฒ ๊ตฌ๊ธ ๋ด์ด ์ ์ผ ๋จผ์ ์ฝ๋ ๋ช
ํจ์ด๋ผ๋ ๊ฒ ์ด์ ํผ๋ถ๋ก ๋๊ปด์ง๋ค.
๐ก "
<head>๋ ์ฌ์ฉ์ ๋์ ์ ๋ณด์ด์ง๋ง, ๊ตฌ๊ธยท์นด์นด์คยท์ฌ๋์ด ์ ์ผ ๋จผ์ ์ฝ๋ ๋ช ํจ์ด๋ค. ๋ช ํจ์ด ๋ถ์คํ๋ฉด ์๋ฌด๋ฆฌ ์ข์ ์ฌ์ดํธ๋ ์ธ์์ ์ ๋๋ก ์๋ ค์ง์ง ์๋๋ค."
์์ ๋ํํ
SEO ๊ฐ์ ์ดํ ๊ตฌ๊ธ ์์น ์ฝ์ ์งํ ๋ณด์ฌ๋๋ ธ๋๋ "์ด๊ฒ ๋๋ค?" ํ๊ณ ๊น์ง ๋๋ผ์
จ๋ค. ๊ทธ ํ์ ๋ณด๋ ค๊ณ ๊ฐ๋ฐํ๋ ๊ฒ ๊ฐ์์ ์ค๋๋ฐ๋ผ ๋ฟ๋ฏํ๋ค. ํด๊ทผํ๊ณ ์ง์์ Next.js Metadata API๋ก OG ์ด๋ฏธ์ง๊น์ง ๋์ ์ผ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ ๋ ํ๋ด์ผ๊ฒ ๋ค.
๐ ๋ ์์๋ณด๊ธฐ