From 32fcc5a78d4951e6ff9399d83362ab9e66fc34cd Mon Sep 17 00:00:00 2001 From: JeongwooSeo Date: Wed, 21 Jan 2026 23:56:04 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=82=AC=EC=9D=B4=ED=8A=B8=EB=A7=B5?= =?UTF-8?q?=EC=97=90=20=ED=8F=AC=EC=8A=A4=ED=8A=B8,=20=EC=8B=9C=EB=A6=AC?= =?UTF-8?q?=EC=A6=88,=20=ED=8F=AC=ED=8A=B8=ED=8F=B4=EB=A6=AC=EC=98=A4=20UR?= =?UTF-8?q?L=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EC=9A=B0=EC=84=A0=EC=88=9C=EC=9C=84=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/sitemap.ts | 57 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/app/sitemap.ts b/app/sitemap.ts index ddd95c0..fdb2c86 100644 --- a/app/sitemap.ts +++ b/app/sitemap.ts @@ -3,17 +3,41 @@ import dbConnect from '@/app/lib/dbConnect'; import Post from '@/app/models/Post'; export default async function sitemap(): Promise { - const baseUrl = process.env.NEXT_PUBLIC_DEPLOYMENT_URL || process.env.NEXTAUTH_URL || 'http://localhost:3000'; - const staticPages = [ + const baseUrl = + process.env.NEXT_PUBLIC_DEPLOYMENT_URL || + process.env.NEXTAUTH_URL || + 'http://localhost:3000'; + + const staticPages: MetadataRoute.Sitemap = [ { url: baseUrl, lastModified: new Date(), changeFrequency: 'weekly' as const, + priority: 1.0, }, { url: `${baseUrl}/posts`, lastModified: new Date(), + changeFrequency: 'daily' as const, + priority: 0.9, + }, + { + url: `${baseUrl}/portfolio`, + lastModified: new Date(), + changeFrequency: 'monthly' as const, + priority: 0.8, + }, + { + url: `${baseUrl}/series`, + lastModified: new Date(), changeFrequency: 'weekly' as const, + priority: 0.7, + }, + { + url: `${baseUrl}/tags`, + lastModified: new Date(), + changeFrequency: 'weekly' as const, + priority: 0.6, }, ]; @@ -23,16 +47,41 @@ export default async function sitemap(): Promise { } await dbConnect(process.env.DB_URI); - const posts = await Post.find({}).sort({ date: -1 }); + // 포스트 URL 생성 + const posts = await Post.find({}).sort({ date: -1 }); const postUrls = posts.map((post) => { const postDate = new Date(post.updatedAt || post.date); + // 최신 포스트는 높은 우선순위, 오래된 포스트는 낮은 우선순위 + const priority = Math.max(0.5, 0.9 - posts.indexOf(post) * 0.01); return { url: `${baseUrl}/posts/${post.slug}`, lastModified: postDate, + changeFrequency: 'monthly' as const, + priority: Math.min(priority, 0.9), // 최대 0.9까지만 (홈페이지가 1.0) }; }); - return [...staticPages, ...postUrls]; + // 시리즈 URL 생성 (포스트에서 고유한 시리즈만) + const seriesIds = Array.from( + new Set(posts.filter((p) => p.seriesId).map((p) => p.seriesId)) + ); + const seriesUrls = seriesIds.map((seriesId) => ({ + url: `${baseUrl}/series/${seriesId}`, + lastModified: new Date(), + changeFrequency: 'weekly' as const, + priority: 0.7, + })); + + // 포트폴리오 URL 생성 (고정된 포트폴리오 항목들) + const portfolioSlugs = ['shipfriend', 'preview', 'primitive', 'storyhelper']; + const portfolioUrls = portfolioSlugs.map((slug) => ({ + url: `${baseUrl}/portfolio/${slug}`, + lastModified: new Date(), + changeFrequency: 'monthly' as const, + priority: 0.8, + })); + + return [...staticPages, ...postUrls, ...seriesUrls, ...portfolioUrls]; }