Skip to content

๐ŸŸ [P1] fix(frontend): most pages missing metadata exports โ€” no SEO/OG tagsย #81

Description

@teddylee777

์ปจํ…์ŠคํŠธ ๋ธ”๋ก

Key Value
Category frontend
Checklist ISS-UI-04 โ€” Missing generateMetadata/metadata export (SEO + OG tags)
Priority P1 ๐ŸŸ 
Scan Date 2026-04-16
Flagged By main-session verification

์š”์•ฝ

  • WHAT: frontend/src/app/ ํ•˜์œ„ 14๊ฐœ page.tsx/layout.tsx ์ค‘ root layout.tsx ํ•˜๋‚˜๋งŒ metadata export๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ. ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…, admin, chat ํŽ˜์ด์ง€ ๋ชจ๋‘ OG/Twitter ๋ฉ”ํƒ€ ๋ˆ„๋ฝ
  • WHY: ๋ชจ๋“  ๊ณต์œ  ๋งํฌ๊ฐ€ ๋™์ผํ•œ root metadata๋ฅผ ์‚ฌ์šฉ โ€” ํŽ˜์ด์ง€๋ณ„ title/description ์—†์Œ. ๊ฒ€์ƒ‰ ์—”์ง„ SEO ์†์‹ค + Slack/Discord/Twitter ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ €ํ•˜
  • WHERE: frontend/src/app/(auth)/login/page.tsx, (auth)/register/page.tsx, (main)/page.tsx, (main)/admin/**/page.tsx, ๊ธฐํƒ€ page.tsx ํŒŒ์ผ๋“ค
  • SEVERITY: HIGH โ€” ๊ณต๊ฐœ ๋ฐฐํฌ ์‹œ SEO/shareability ์ง์ ‘ ์˜ํ–ฅ

Evidence

# File Line Finding Flagged By Confidence
1 frontend/src/app/layout.tsx โ€” export const metadata ์กด์žฌ (root๋งŒ) main-session High
2 frontend/src/app/(auth)/login/page.tsx โ€” metadata export ์—†์Œ main-session High
3 frontend/src/app/(auth)/register/page.tsx โ€” metadata export ์—†์Œ main-session High
4 frontend/src/app/(main)/admin/page.tsx โ€” metadata export ์—†์Œ main-session High
5 frontend/src/app/(main)/admin/users/page.tsx โ€” metadata export ์—†์Œ main-session High
6 frontend/src/app/(main)/admin/settings/page.tsx โ€” metadata export ์—†์Œ main-session High
7 frontend/src/app/(main)/admin/approvals/page.tsx โ€” metadata export ์—†์Œ main-session High
8 frontend/src/app/(auth)/pending-approval/page.tsx โ€” metadata export ์—†์Œ main-session High
9 frontend/src/app/(auth)/account-suspended/page.tsx โ€” metadata export ์—†์Œ main-session High
10 frontend/src/app/(auth)/verify-request/page.tsx โ€” metadata export ์—†์Œ main-session High

์ด 13/14 ํŒŒ์ผ์—์„œ metadata ๋ˆ„๋ฝ.

์˜ํ–ฅ ๋ถ„์„

์˜ํ–ฅ ๋ฒ”์œ„

  • ๋ชจ๋“  ๊ณต๊ฐœ URL (์ฃผ๋กœ ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…/๋žœ๋”ฉ)
  • Slack/Discord/Twitter/LinkedIn ๋ฏธ๋ฆฌ๋ณด๊ธฐ
  • Google/Bing SEO ์ธ๋ฑ์‹ฑ

์žฅ์•  ์‹œ๋‚˜๋ฆฌ์˜ค

  1. ์‚ฌ์šฉ์ž๊ฐ€ Slack์— ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ URL ๊ณต์œ 
  2. ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์นด๋“œ์— root layout์˜ generic title/description๋งŒ ํ‘œ์‹œ
  3. ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์ธ์ง€ ์•Œ์•„๋ณผ ์ˆ˜ ์—†์Œ โ€” ํด๋ฆญ ์ฃผ์ €
  4. ๋˜๋Š” Google ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ๋™์ผ title/description๋กœ ํ‘œ์‹œ โ†’ ํด๋ฆญ๋ฅ  ์ €์กฐ

๊ธด๊ธ‰๋„

  • ๊ณต๊ฐœ OSS ํ”„๋กœ์ ํŠธ๋กœ์„œ marketing/SEO ์ค‘์š”
  • Vercel ๋ฐฐํฌ ๋ฒ„ํŠผ์ด README์— ์žˆ์–ด ๋‹ค์ˆ˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์ฒด ๋ฐฐํฌํ•˜๋Š”๋ฐ, ๊ฐ ๋ฐฐํฌ๋ณธ์˜ ๊ธฐ๋ณธ SEO๊ฐ€ ๋ถ€์‹ค

์ œ์•ˆ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

์ ‘๊ทผ ๋ฐฉ๋ฒ•

๊ฐ ๋ผ์šฐํŠธ segment์— ์ ์ ˆํ•œ metadata ์ถ”๊ฐ€:

// frontend/src/app/(auth)/login/page.tsx
import type { Metadata } from \"next\";

export const metadata: Metadata = {
  title: \"Sign In\",
  description: \"Sign in to access your LangGraph Chat UI.\",
};

admin ๋ผ์šฐํŠธ ๊ทธ๋ฃน์€ layout.tsx์—์„œ ๊ณตํ†ต metadata ์„ค์ •:

// frontend/src/app/(main)/admin/layout.tsx
export const metadata: Metadata = {
  title: {
    template: \"%s โ€” Admin\",
    default: \"Admin\",
  },
  robots: { index: false, follow: false }, // admin์€ ๊ฒ€์ƒ‰ ์—”์ง„ ์ œ์™ธ
};

i18n ๋ผ๋ฒจ์„ ํ™œ์šฉํ•ด locale๋ณ„ metadata:

// app/(auth)/login/page.tsx
export async function generateMetadata(): Promise<Metadata> {
  const t = await getTranslations(\"login\");
  return {
    title: t(\"meta.title\"),
    description: t(\"meta.description\"),
  };
}

๋Œ€์•ˆ

  • root layout์—๋งŒ ๋ชจ๋“  ๊ฒƒ ๋ชฐ๊ธฐ: ํŽ˜์ด์ง€๋ณ„ ๊ตฌ๋ถ„ ์•ˆ๋จ โ€” ํ˜„์žฌ ์ƒํƒœ, ํ•ด๊ฒฐ ์•ˆ๋จ
  • Client-side <Head>: Next.js 15 App Router๋Š” metadata API ์‚ฌ์šฉ ๊ถŒ์žฅ, react-head ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋Œ€์•ˆ์ด์ง€๋งŒ SSR SEO์— ๋ถˆ๋ฆฌ

์ˆ˜์šฉ ๊ธฐ์ค€

  • ๋ชจ๋“  ์ฃผ์š” page.tsx์— metadata ๋˜๋Š” generateMetadata ์ถ”๊ฐ€ (์ตœ์†Œ title, description)
  • admin ๋ผ์šฐํŠธ๋Š” robots: { index: false } ์ถ”๊ฐ€
  • Open Graph ํƒœ๊ทธ (og:title, og:description, og:image) ํฌํ•จ
  • ํ…Œ์ŠคํŠธ: ๊ฐ ํŽ˜์ด์ง€ ๋นŒ๋“œ ํ›„ view-source:์—์„œ <meta> ํƒœ๊ทธ ํ™•์ธ
  • ํ…Œ์ŠคํŠธ ์ปค๋งจ๋“œ: cd frontend && pnpm build && curl -s http://localhost:3000/login | grep '<title>'

์ฐธ์กฐ

  • ๊ด€๋ จ ํŒŒ์ผ: frontend/src/app/**/page.tsx, frontend/src/app/**/layout.tsx
  • Checklist ํ•ญ๋ชฉ: ISS-UI-04
  • Next.js 15 Metadata API
  • ๊ด€๋ จ ์ด์Šˆ: ์—†์Œ

์žฌํ˜„ ๋ฐฉ๋ฒ•

์‚ฌ์ „ ์กฐ๊ฑด

  • dev ์„œ๋ฒ„ ์‹คํ–‰

๋‹จ๊ณ„

  1. curl -s http://localhost:3000/login | grep '<title>'
  2. root layout์˜ title๋งŒ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธ
  3. <meta property=\"og:title\"> ์กด์žฌ ํ™•์ธ

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ

ํŽ˜์ด์ง€๋ณ„ ๊ณ ์œ  title, og:title, og:description

์‹ค์ œ ๊ฒฐ๊ณผ

๋ชจ๋“  ํŽ˜์ด์ง€์— root layout์˜ ๋™์ผํ•œ title๋งŒ

๊ด€๋ จ ์ฝ”๋“œ ์ปจํ…์ŠคํŠธ

File Role Relevance
frontend/src/app/layout.tsx Root metadata (์œ ์ผํ•œ ๊ธฐ์กด ๊ตฌํ˜„) ์ฐธ๊ณ  ํ…œํ”Œ๋ฆฟ
frontend/src/app/(auth)/**/page.tsx ์ธ์ฆ ํŽ˜์ด์ง€๋“ค ์ˆ˜์ • ๋Œ€์ƒ (๋‹ค์ˆ˜)
frontend/src/app/(main)/admin/**/page.tsx admin ํŽ˜์ด์ง€๋“ค ์ˆ˜์ • ๋Œ€์ƒ (๋‹ค์ˆ˜)
frontend/src/i18n/messages/*.json i18n ๋ฉ”์‹œ์ง€ metadata ๋ฒˆ์—ญ์— ํ™œ์šฉ

Detected by oh-my-braincrew `omb:issue` scan
Category: frontend | Scan date: 2026-04-16
`omb-issue-scan category=frontend checklist=ISS-UI-04`

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions