diff --git a/src/app/(auth)/login/layout.tsx b/src/app/(auth)/login/layout.tsx index 12ac91b8..29310c8e 100644 --- a/src/app/(auth)/login/layout.tsx +++ b/src/app/(auth)/login/layout.tsx @@ -1,25 +1,12 @@ import { ReactNode } from "react"; -import { METADATA } from "@/constants/metadata"; import ErrorBoundary from "@/error/error-boundary"; +import { createPageInfoMetadata } from "@/constants/metadata"; export function generateMetadata() { - const TITLE = "로그인"; - const DESCRIPTION = `${METADATA.title.default} 로그인`; - return { - ...METADATA, - title: TITLE, - description: DESCRIPTION, - openGraph: { - ...METADATA.openGraph, - title: TITLE, - description: DESCRIPTION, - }, - twitter: { - ...METADATA.twitter, - title: TITLE, - description: DESCRIPTION, - }, - }; + return createPageInfoMetadata( + "로그인", + "서비스를 이용하려면 로그인이 필요합니다." + ); } export default function LoginLayout({ children }: { children: ReactNode }) { diff --git a/src/app/(auth)/signup/layout.tsx b/src/app/(auth)/signup/layout.tsx index 88455070..2a760cc8 100644 --- a/src/app/(auth)/signup/layout.tsx +++ b/src/app/(auth)/signup/layout.tsx @@ -1,24 +1,11 @@ import { ReactNode } from "react"; -import { METADATA } from "@/constants/metadata"; +import { createPageInfoMetadata } from "@/constants/metadata"; export function generateMetadata() { - const TITLE = "회원가입"; - const DESCRIPTION = `${METADATA.title.default} 회원가입`; - return { - ...METADATA, - title: TITLE, - description: DESCRIPTION, - openGraph: { - ...METADATA.openGraph, - title: TITLE, - description: DESCRIPTION, - }, - twitter: { - ...METADATA.twitter, - title: TITLE, - description: DESCRIPTION, - }, - }; + return createPageInfoMetadata( + "회원가입", + "서비스 이용을 위한 회원가입 페이지입니다." + ); } export default function SignupLayout({ children }: { children: ReactNode }) { diff --git a/src/app/favicon-16x16.png b/src/app/favicon-16x16.png deleted file mode 100644 index 40b9251f..00000000 Binary files a/src/app/favicon-16x16.png and /dev/null differ diff --git a/src/app/favicon-32x32.png b/src/app/favicon-32x32.png deleted file mode 100644 index d777882b..00000000 Binary files a/src/app/favicon-32x32.png and /dev/null differ diff --git a/src/app/favicon.svg b/src/app/favicon.svg deleted file mode 100644 index 99c15dc7..00000000 --- a/src/app/favicon.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/app/myprofile/page.tsx b/src/app/myprofile/page.tsx index c492d964..72fbdfd6 100644 --- a/src/app/myprofile/page.tsx +++ b/src/app/myprofile/page.tsx @@ -1,5 +1,5 @@ import { Suspense } from "react"; -import { METADATA } from "@/constants/metadata"; +import { createPageInfoMetadata } from "@/constants/metadata"; import type { Metadata } from "next"; import { MyProfile } from "./_components"; import Loader from "@/components/loader/loader"; @@ -24,23 +24,12 @@ export async function generateMetadata({ case "account": tabTitle = "내 계정"; tabDescription = "내 계정 관리"; - break; } + const metadata = createPageInfoMetadata(tabTitle, tabDescription); + return { - ...METADATA, - title: tabTitle, - description: tabDescription, - openGraph: { - ...METADATA.openGraph, - title: tabTitle, - description: tabDescription, - }, - twitter: { - ...METADATA.twitter, - title: tabTitle, - description: tabDescription, - }, + ...metadata, robots: { index: false, follow: false, diff --git a/src/app/register/[id]/page.tsx b/src/app/register/[id]/page.tsx index e3b3231b..6cf26e34 100644 --- a/src/app/register/[id]/page.tsx +++ b/src/app/register/[id]/page.tsx @@ -1,6 +1,6 @@ import { cn } from "@/lib/utils"; import RegisterWine from "../_components/register-wine"; -import { METADATA } from "@/constants/metadata"; +import { createPageInfoMetadata } from "@/constants/metadata"; import type { Metadata } from "next"; import getRegisterWine from "@/api/register/get-register-wine"; @@ -24,21 +24,7 @@ export async function generateMetadata({ ? "와인 정보 수정 페이지" : "새 와인 등록 페이지"; - return { - ...METADATA, - title, - description: DESCRIPTION, - openGraph: { - ...METADATA.openGraph, - title: title, - description: DESCRIPTION, - }, - twitter: { - ...METADATA.twitter, - title: title, - description: DESCRIPTION, - }, - }; + return createPageInfoMetadata(title, DESCRIPTION); } const Page = async ({ params }: { params: Promise<{ id: string }> }) => { diff --git a/src/app/reviews/[reviewId]/edit/layout.tsx b/src/app/reviews/[reviewId]/edit/layout.tsx index ea616802..d326a22e 100644 --- a/src/app/reviews/[reviewId]/edit/layout.tsx +++ b/src/app/reviews/[reviewId]/edit/layout.tsx @@ -1,24 +1,8 @@ import React from "react"; -import { METADATA } from "@/constants/metadata"; +import { createPageInfoMetadata } from "@/constants/metadata"; export function generateMetadata() { - const TITLE = "리뷰 수정"; - const DESCRIPTION = `${METADATA.title.default} 리뷰 수정 페이지`; - return { - ...METADATA, - title: TITLE, - description: DESCRIPTION, - openGraph: { - ...METADATA.openGraph, - title: TITLE, - description: DESCRIPTION, - }, - twitter: { - ...METADATA.twitter, - title: TITLE, - description: DESCRIPTION, - }, - }; + return createPageInfoMetadata("리뷰 수정", "리뷰 수정 페이지"); } export default function EditLayout({ children, diff --git a/src/app/reviews/[reviewId]/write/layout.tsx b/src/app/reviews/[reviewId]/write/layout.tsx index 45cc5cca..eccdbad2 100644 --- a/src/app/reviews/[reviewId]/write/layout.tsx +++ b/src/app/reviews/[reviewId]/write/layout.tsx @@ -1,24 +1,8 @@ import React from "react"; -import { METADATA } from "@/constants/metadata"; +import { createPageInfoMetadata } from "@/constants/metadata"; export function generateMetadata() { - const TITLE = "리뷰 등록"; - const DESCRIPTION = `${METADATA.title.default} 리뷰 등록 페이지`; - return { - ...METADATA, - title: TITLE, - description: DESCRIPTION, - openGraph: { - ...METADATA.openGraph, - title: TITLE, - description: DESCRIPTION, - }, - twitter: { - ...METADATA.twitter, - title: TITLE, - description: DESCRIPTION, - }, - }; + return createPageInfoMetadata("리뷰 작성", "리뷰 작성 페이지"); } export default function WriteLayout({ diff --git a/src/app/wines/[id]/page.tsx b/src/app/wines/[id]/page.tsx index 80d9040e..44204e33 100644 --- a/src/app/wines/[id]/page.tsx +++ b/src/app/wines/[id]/page.tsx @@ -1,5 +1,5 @@ import { Suspense } from "react"; -import { METADATA } from "@/constants/metadata"; +import { createPageInfoMetadata } from "@/constants/metadata"; import type { Metadata, ResolvingMetadata } from "next"; import { cookies } from "next/headers"; import WineDetailContent from "@/app/wines/[id]/_components/wine-detail/wine-detail-content"; @@ -29,37 +29,23 @@ export async function generateMetadata( ); if (!response.ok) { - return { - title: "와인 상세 정보", - description: "와인 정보를 불러오는 데 실패했습니다.", - }; + return createPageInfoMetadata( + "와인 상세 정보", + "와인 정보를 불러오는 데 실패했습니다." + ); } const wine = await response.json(); const PAGE_TITLE = `${wine.name} 와인 상세 정보`; const DESCRIPTION = "와인 상세 정보 페이지입니다."; - return { - ...METADATA, - title: PAGE_TITLE, - description: DESCRIPTION, - openGraph: { - ...METADATA.openGraph, - title: PAGE_TITLE, - description: DESCRIPTION, - }, - twitter: { - ...METADATA.twitter, - title: PAGE_TITLE, - description: DESCRIPTION, - }, - }; + return createPageInfoMetadata(PAGE_TITLE, DESCRIPTION); } catch (error) { console.error(error); - return { - title: "와인 상세 정보", - description: "와인 정보를 불러오는 데 실패했습니다.", - }; + return createPageInfoMetadata( + "와인 상세 정보", + "와인 정보를 불러오는 데 실패했습니다." + ); } } diff --git a/src/app/wines/page.tsx b/src/app/wines/page.tsx index 30fe2ee1..f9cac65c 100644 --- a/src/app/wines/page.tsx +++ b/src/app/wines/page.tsx @@ -1,5 +1,5 @@ import { Suspense } from "react"; -import { METADATA } from "@/constants/metadata"; +import { createPageInfoMetadata } from "@/constants/metadata"; import WineRecommended from "@/app/wines/_components/wine-recommended/wine-recommended"; import Loader from "@/components/loader/loader"; import WineListSection from "./_components/wine-list-section/wine-list-section"; @@ -16,25 +16,10 @@ export async function generateMetadata({ const params = (await searchParams) ?? {}; const name = params.name ?? ""; - const PAGE_TITLE = name ? `${name} 검색 결과` : "맞춤 와인 찾기"; - const DESCRIPTION = - "매달 새롭게 만나는 와인 추천 콘텐츠와 다양한 필터로 나만의 와인을 찾아보세요."; - - return { - ...METADATA, - title: PAGE_TITLE, - description: DESCRIPTION, - openGraph: { - ...METADATA.openGraph, - title: PAGE_TITLE, - description: DESCRIPTION, - }, - twitter: { - ...METADATA.twitter, - title: PAGE_TITLE, - description: DESCRIPTION, - }, - }; + return createPageInfoMetadata( + name ? `${name} 검색 결과` : "맞춤 와인 찾기", + "매달 새롭게 만나는 와인 추천 콘텐츠와 다양한 필터로 나만의 와인을 찾아보세요." + ); } const WineListPage = async () => { diff --git a/src/constants/metadata.ts b/src/constants/metadata.ts index 41a6ef41..3ca4560f 100644 --- a/src/constants/metadata.ts +++ b/src/constants/metadata.ts @@ -1,6 +1,12 @@ +import type { Metadata } from "next"; import { SITE_NAME, SITE_URL, SITE_DESCRIPTION } from "./site"; -export const METADATA = { +/** + * 사이트 공통 메타데이터 + * @author yeonsu + */ +export const METADATA: Metadata = { + metadataBase: new URL(SITE_URL), title: { default: SITE_NAME, template: `%s | ${SITE_NAME}`, @@ -23,13 +29,7 @@ export const METADATA = { ], }, icons: { - icon: [ - { url: "/favicon-16x16.png", sizes: "16x16" }, - { url: "/favicon-32x32.png", sizes: "32x32" }, - { url: "/favicon.ico", sizes: "any" }, - { url: "/favicon.svg", type: "image/svg+xml" }, - ], - shortcut: ["/favicon.ico"], + icon: [{ url: "/favicon.ico", sizes: "any" }], apple: ["/apple-icon.png"], }, twitter: { @@ -48,3 +48,31 @@ export const METADATA = { follow: true, }, }; + +/** + * 페이지마다 다른 title과 description을 설정하기 위한 메타데이터 생성 함수 + * 공통 메타데이터를 기반으로 페이지별 정보를 덮어씌웁니다. + * @author yeonsu + * @param title : 해당 페이지 제목 + * @param description : 해당 페이지 설명 + */ +export const createPageInfoMetadata = ( + title: string, + description: string +): Metadata => { + return { + ...METADATA, + title, + description, + openGraph: { + ...METADATA.openGraph, + title: `${title} | ${SITE_NAME}`, + description, + }, + twitter: { + ...METADATA.twitter, + title: `${title} | ${SITE_NAME}`, + description, + }, + }; +};