From e77bb6067b1d763c9294a178bd2c669f2007208a Mon Sep 17 00:00:00 2001 From: leeleeleeleejun Date: Sat, 1 Nov 2025 15:58:00 +0900 Subject: [PATCH 01/11] =?UTF-8?q?refactor:=20HydrationBoundary=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EB=8A=94=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20force-dynamic=20=EC=B6=94=EA=B0=80=20-=20ssg?= =?UTF-8?q?=EB=A1=9C=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=8B=9C=20=ED=98=84=EC=9E=AC=20=EC=84=9C=EB=B2=84=20=EB=AF=B8?= =?UTF-8?q?=EA=B5=AC=EC=B6=95(=EC=97=90=EB=9F=AC=20=EB=B0=9C=EC=83=9D)?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=20=EC=9A=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/app/events/food-slot/page.tsx | 2 ++ apps/web/app/events/lucky-draw/page.tsx | 2 ++ apps/web/app/likes/page.tsx | 2 ++ apps/web/app/page.tsx | 2 ++ apps/web/app/places/new/page.tsx | 2 ++ apps/web/app/requests/[id]/page.tsx | 2 ++ apps/web/app/requests/page.tsx | 4 +++- 7 files changed, 15 insertions(+), 1 deletion(-) diff --git a/apps/web/app/events/food-slot/page.tsx b/apps/web/app/events/food-slot/page.tsx index 8ba2663..e8d45c9 100644 --- a/apps/web/app/events/food-slot/page.tsx +++ b/apps/web/app/events/food-slot/page.tsx @@ -4,6 +4,8 @@ import FoodSlotMachine from './FoodSlotMachine' import { Header } from '@repo/ui/components/Header' import { HeaderBackButton } from '@/_components/HeaderBackButton' +export const dynamic = 'force-dynamic' + const Page = async () => { return ( <> diff --git a/apps/web/app/events/lucky-draw/page.tsx b/apps/web/app/events/lucky-draw/page.tsx index dd64c0f..add3cf9 100644 --- a/apps/web/app/events/lucky-draw/page.tsx +++ b/apps/web/app/events/lucky-draw/page.tsx @@ -8,6 +8,8 @@ import { HydrationBoundaryPage } from '@/HydrationBoundaryPage' import { useEventQueries } from '@/_apis/queries/event' import { InfoPopover } from './_components/InfoPopover' +export const dynamic = 'force-dynamic' + const Page = () => { return ( { return ( = { FAIL: 'fail', } +export const dynamic = 'force-dynamic' + const PlaceNewPage = () => { const { Step, nextStep } = useFunnel(STEP_ORDER) diff --git a/apps/web/app/requests/[id]/page.tsx b/apps/web/app/requests/[id]/page.tsx index f7aa1c3..7f21b84 100644 --- a/apps/web/app/requests/[id]/page.tsx +++ b/apps/web/app/requests/[id]/page.tsx @@ -2,6 +2,8 @@ import { RequestDetailPage } from './RequestDetailPage' import { HydrationBoundaryPage } from '@/HydrationBoundaryPage' import { useRequestQueries } from '@/_apis/queries/request' +export const dynamic = 'force-dynamic' + const Page = async ({ params }: { params: Promise<{ id: string }> }) => { const { id } = await params diff --git a/apps/web/app/requests/page.tsx b/apps/web/app/requests/page.tsx index 89d8579..7c7a67a 100644 --- a/apps/web/app/requests/page.tsx +++ b/apps/web/app/requests/page.tsx @@ -8,7 +8,9 @@ import { useRequestQueries } from '@/_apis/queries/request' import { HydrationBoundaryPage } from '@/HydrationBoundaryPage' import { RequestPlacesList } from './_components/RequestPlacesList' -const Page = () => { +export const dynamic = 'force-dynamic' + +const Page = async () => { return ( { From c66d43855fae8f6ed84944d8c8152a1f7289fa94 Mon Sep 17 00:00:00 2001 From: leeleeleeleejun Date: Sat, 1 Nov 2025 16:00:46 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20=EB=8F=99=EC=A0=81=20=EC=A7=80?= =?UTF-8?q?=EB=8F=84=20=EB=A0=8C=EB=8D=94=EB=A7=81=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20MapComponent=20=EB=B0=8F=20MapContainer=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/app/map/{MapPage.tsx => MapComponent.tsx} | 4 +++- apps/web/app/map/MapContainer.tsx | 10 ++++++++++ apps/web/app/map/page.tsx | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) rename apps/web/app/map/{MapPage.tsx => MapComponent.tsx} (98%) create mode 100644 apps/web/app/map/MapContainer.tsx diff --git a/apps/web/app/map/MapPage.tsx b/apps/web/app/map/MapComponent.tsx similarity index 98% rename from apps/web/app/map/MapPage.tsx rename to apps/web/app/map/MapComponent.tsx index da6b44d..83d6dee 100644 --- a/apps/web/app/map/MapPage.tsx +++ b/apps/web/app/map/MapComponent.tsx @@ -18,7 +18,7 @@ import { UserMarker, PlaceMarker } from './_components/Marker' import { CurrentLocationButton } from './_components/CurrentLocationButton' import { PreviewPlace } from './_components/PreviewPlace' -export const MapPage = () => { +const MapComponent = () => { const [map, setMap] = useState(null) const [isCenteredOnUser, setIsCenteredOnUser] = useState(false) const [currentBounds, setCurrentBounds] = useState(null) @@ -102,3 +102,5 @@ export const MapPage = () => { ) } + +export default MapComponent diff --git a/apps/web/app/map/MapContainer.tsx b/apps/web/app/map/MapContainer.tsx new file mode 100644 index 0000000..139eeb9 --- /dev/null +++ b/apps/web/app/map/MapContainer.tsx @@ -0,0 +1,10 @@ +'use client' + +import dynamic from 'next/dynamic' + +const MapComponent = dynamic(() => import('./MapComponent'), { + ssr: false, + loading: () =>
지도 로딩 중...
, +}) + +export const MapContainer = () => diff --git a/apps/web/app/map/page.tsx b/apps/web/app/map/page.tsx index 9d85955..cb0df35 100644 --- a/apps/web/app/map/page.tsx +++ b/apps/web/app/map/page.tsx @@ -1,12 +1,12 @@ import { OnlyLeftHeader } from '@repo/ui/components/Header' import { BottomNavigation } from '@/_components/BottomNavigation' -import { MapPage } from '@/map/MapPage' +import { MapContainer } from './MapContainer' const Page = () => { return ( <> - + ) From 2dec101c34fbd5ef8f086fd623aebceff251cc03 Mon Sep 17 00:00:00 2001 From: leeleeleeleejun Date: Sat, 1 Nov 2025 21:05:23 +0900 Subject: [PATCH 03/11] =?UTF-8?q?feat:=20layout.tsx=20metadata=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/app/layout.tsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 8505b3d..090f227 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -10,8 +10,19 @@ import { NaverMapProvider } from '@/NaverMapProvider' import { HeroProvider } from '@/HeroProvider' export const metadata: Metadata = { - title: 'Create Turborepo', - description: 'Generated by create turbo', + title: '공주대 맛집', + description: '공주대학교 캠퍼스별 근처 맛집', + openGraph: { + title: '공주대 맛집', + description: `공주대학교 캠퍼스별 근처 맛집`, + locale: 'ko-KR', + siteName: 'knu-matzip.vercel.app', + url: `https://knu-matzip.vercel.app`, + type: 'website', + }, + // verification: { + // google: "", + // }, } const pretendard = localFont({ From 8f7a573c53bba0a74128243862139e3c965276c6 Mon Sep 17 00:00:00 2001 From: leeleeleeleejun Date: Sat, 1 Nov 2025 21:25:43 +0900 Subject: [PATCH 04/11] =?UTF-8?q?feat:=20layout.tsx=EC=97=90=20metadataBas?= =?UTF-8?q?e=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/app/layout.tsx | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 090f227..51dcad5 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -9,15 +9,21 @@ import { Column } from '@repo/ui/components/Layout' import { NaverMapProvider } from '@/NaverMapProvider' import { HeroProvider } from '@/HeroProvider' +const SITE_URL = new URL('https://knu-matzip.vercel.app') + export const metadata: Metadata = { - title: '공주대 맛집', - description: '공주대학교 캠퍼스별 근처 맛집', + metadataBase: SITE_URL, + title: { + template: '공주대 맛집 | %s', + default: '공주대 맛집', + }, + description: '공주대학교 캠퍼스(천안, 공주, 예산) 근처 맛집을 찾아보세요.', openGraph: { title: '공주대 맛집', - description: `공주대학교 캠퍼스별 근처 맛집`, + description: '공주대학교 캠퍼스별 맛집 정보', locale: 'ko-KR', - siteName: 'knu-matzip.vercel.app', - url: `https://knu-matzip.vercel.app`, + siteName: '공주대 맛집', + url: '/', type: 'website', }, // verification: { From 2945fb0db8e0f521d31b587af290eefe7ecd03e2 Mon Sep 17 00:00:00 2001 From: leeleeleeleejun Date: Sat, 1 Nov 2025 21:28:16 +0900 Subject: [PATCH 05/11] =?UTF-8?q?feat:=20=EC=98=A4=EB=8A=98=20=EB=AD=90=20?= =?UTF-8?q?=EB=A8=B9=EC=A7=80=3F=20=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=20?= =?UTF-8?q?=EB=A9=94=ED=83=80=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/app/events/food-slot/page.tsx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/apps/web/app/events/food-slot/page.tsx b/apps/web/app/events/food-slot/page.tsx index e8d45c9..9cb3e4c 100644 --- a/apps/web/app/events/food-slot/page.tsx +++ b/apps/web/app/events/food-slot/page.tsx @@ -1,3 +1,4 @@ +import type { Metadata } from 'next' import { HydrationBoundaryPage } from '@/HydrationBoundaryPage' import { useCategoryQueries } from '@/_apis/queries/category' import FoodSlotMachine from './FoodSlotMachine' @@ -6,6 +7,21 @@ import { HeaderBackButton } from '@/_components/HeaderBackButton' export const dynamic = 'force-dynamic' +const pageTitle = '오늘 뭐 먹지?' +const pageDescription = + "선택 장애가 고민인가요? '오늘 뭐 먹지?' 슬롯머신으로 공주대 근처 맛집 메뉴를 추천받아보세요!" + +export const metadata: Metadata = { + title: pageTitle, + description: pageDescription, + openGraph: { + title: `공주대 맛집 | ${pageTitle}`, + description: pageDescription, + locale: 'ko-KR', + type: 'website', + }, +} + const Page = async () => { return ( <> From bcc5e8b05e78d83b77d3c5486d8cce93d740367d Mon Sep 17 00:00:00 2001 From: leeleeleeleejun Date: Sat, 1 Nov 2025 21:47:16 +0900 Subject: [PATCH 06/11] =?UTF-8?q?feat:=20=EC=B9=B4=ED=85=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=83=81=ED=83=9C=20=EA=B4=80=EB=A6=AC=EB=A5=BC=20?= =?UTF-8?q?=EB=9D=BC=EC=9A=B0=ED=84=B0=20=EA=B8=B0=EB=B0=98=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20-=20URL=EA=B3=BC=20UI=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=EA=B0=80=20=ED=95=AD=EC=83=81=201:1=EB=A1=9C?= =?UTF-8?q?=20=EB=8F=99=EA=B8=B0=ED=99=94=20-=20replaceState=EC=9D=84=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=B4=20=EA=B9=9C=EB=B9=A1=EC=9E=84=20?= =?UTF-8?q?=EB=B0=A9=EC=A7=80=20-=20metaData=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../categories/[id]/CategoryDetailPage.tsx | 34 ++++++++++++------- apps/web/app/categories/[id]/page.tsx | 28 +++++++++++++-- 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/apps/web/app/categories/[id]/CategoryDetailPage.tsx b/apps/web/app/categories/[id]/CategoryDetailPage.tsx index f5e0252..2459c71 100644 --- a/apps/web/app/categories/[id]/CategoryDetailPage.tsx +++ b/apps/web/app/categories/[id]/CategoryDetailPage.tsx @@ -1,6 +1,6 @@ 'use client' -import { useState } from 'react' +import { usePathname } from 'next/navigation' import { useSuspenseQuery } from '@tanstack/react-query' import { useCategoryQueries } from '@/_apis/queries/category' import { Icon } from '@repo/ui/components/Icon' @@ -9,21 +9,24 @@ import { Header } from '@repo/ui/components/Header' import { Flex } from '@repo/ui/components/Layout' import { HeaderBackButton } from '@/_components/HeaderBackButton' import { RowCategories, Places } from './_components' +import { Suspense, useEffect } from 'react' +import { Spinner } from '@heroui/react' -type Props = { - initId: string -} - -export const CategoryDetailPage = ({ initId }: Props) => { - const [id, setId] = useState(initId) - +export const CategoryDetailPage = () => { const { data: categories } = useSuspenseQuery(useCategoryQueries.list()) - const activeCategory = categories.find((category) => category.id === id) + const activeCategoryId = usePathname().split('/')[2] || '0' + const activeCategory = categories.find( + (category) => category.id === activeCategoryId, + ) const setIdFunc = (id: string) => { - setId(id) + window.history.replaceState(null, '', `/categories/${id}`) } + useEffect(() => { + document.title = `공주대 맛집 | ${activeCategory?.name}` + }, [activeCategory]) + return ( <>
{ } className={'border-b-1 border-gray-50'} /> - - + + {/*Todo: 맛집 리스트 스켈레톤으로 변경하기*/} + }> + + ) } diff --git a/apps/web/app/categories/[id]/page.tsx b/apps/web/app/categories/[id]/page.tsx index 64321d2..ac8be29 100644 --- a/apps/web/app/categories/[id]/page.tsx +++ b/apps/web/app/categories/[id]/page.tsx @@ -1,17 +1,39 @@ +import type { Metadata } from 'next' import { HydrationBoundaryPage } from '@/HydrationBoundaryPage' import { useCategoryQueries } from '@/_apis/queries/category' import { CategoryDetailPage } from '@/categories/[id]/CategoryDetailPage' +import { getCategories } from '@/_apis/services/category' -const Page = async ({ params }: { params: Promise<{ id: string }> }) => { - const { id } = await params +export async function generateMetadata({ + params, +}: { + params: Promise<{ id: string }> +}): Promise { + const { id: categoryId } = await params + const data = await getCategories() + const categoryName = data?.find(({ id }) => id === categoryId)?.name + + return { + title: `${categoryName}`, + description: `공주대학교 근처 ${categoryName} 맛집`, + openGraph: { + title: `공주대 맛집 | ${categoryName}`, + description: `공주대학교 근처 ${categoryName} 맛집`, + locale: 'ko-KR', + type: 'website', + }, + } +} + +const Page = () => { return ( { await queryClient.prefetchQuery(useCategoryQueries.list()) }} > - + ) } From b6118cc5a1ab5ea535a961429ec29bc0d8670c64 Mon Sep 17 00:00:00 2001 From: leeleeleeleejun Date: Sat, 1 Nov 2025 21:59:45 +0900 Subject: [PATCH 07/11] =?UTF-8?q?feat:=20=EC=A3=BC=EB=B3=80=20=EB=A7=9B?= =?UTF-8?q?=EC=A7=91=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=A9=94=ED=83=80?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/app/map/page.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps/web/app/map/page.tsx b/apps/web/app/map/page.tsx index cb0df35..828e45d 100644 --- a/apps/web/app/map/page.tsx +++ b/apps/web/app/map/page.tsx @@ -1,6 +1,21 @@ import { OnlyLeftHeader } from '@repo/ui/components/Header' import { BottomNavigation } from '@/_components/BottomNavigation' import { MapContainer } from './MapContainer' +import type { Metadata } from 'next' + +const pageTitle = '주변 맛집' +const pageDescription = '지도로 내 근처 공주대 주변 맛집의 위치를 확인하세요.' + +export const metadata: Metadata = { + title: pageTitle, + description: pageDescription, + openGraph: { + title: `${pageTitle} | 공주대 맛집`, + description: pageDescription, + locale: 'ko-KR', + type: 'website', + }, +} const Page = () => { return ( From 045b3409962f6046b95aea5172e1d7b78b53b203 Mon Sep 17 00:00:00 2001 From: leeleeleeleejun Date: Sat, 1 Nov 2025 22:04:21 +0900 Subject: [PATCH 08/11] =?UTF-8?q?feat:=20=EB=A7=9B=EC=A7=91=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=A9=94=ED=83=80?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/app/places/[id]/page.tsx | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/apps/web/app/places/[id]/page.tsx b/apps/web/app/places/[id]/page.tsx index 58da0f9..4a9dfca 100644 --- a/apps/web/app/places/[id]/page.tsx +++ b/apps/web/app/places/[id]/page.tsx @@ -1,6 +1,31 @@ +import type { Metadata } from 'next' import { usePlaceQueries } from '@/_apis/queries/place' import { HydrationBoundaryPage } from '@/HydrationBoundaryPage' import { PlaceDetailPage } from './PlaceDetailPage' +import { getPlaceDetail } from '@/_apis/services/place' + +export async function generateMetadata({ + params, +}: { + params: Promise<{ id: string }> +}): Promise { + const { id } = await params + + const data = await getPlaceDetail(id) + const { placeName } = data + const pageDescription = `공주대학교 근처 ${placeName} 맛집 상세 정보` + + return { + title: `${placeName}`, + description: pageDescription, + openGraph: { + title: `공주대 맛집 | ${placeName}`, + description: pageDescription, + locale: 'ko-KR', + type: 'website', + }, + } +} const Page = async ({ params }: { params: Promise<{ id: string }> }) => { const { id } = await params From 3a79456287b09ab46ff0c62ec903100c231a61fe Mon Sep 17 00:00:00 2001 From: leeleeleeleejun Date: Sat, 1 Nov 2025 22:18:54 +0900 Subject: [PATCH 09/11] =?UTF-8?q?feat:=20favicon=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/app/favicon.ico | Bin 8267 -> 1150 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/web/app/favicon.ico b/apps/web/app/favicon.ico index 3f804c026c253d52f61b6f70ec351d1044e6bd8a..04340d78cb52362641d0ce5cfbe686677e388e18 100644 GIT binary patch literal 1150 zcmZ{j%WG3X7{$M0q1p=82dyp|+$hDB;L4r27yJ)&;i5YiwIQUNvsCnt4xcUO;&j&y#0UZDLoJvA^!9@^v$1wQpVvqvqTz5@=jP^gdwW|mnT#?6{lwbGSNLv#+hEFE5)G=VbPTZ^E2sTmH}Rod-PsXW-=E;K1ySduDECVdiSJYR1qg zHE4f;r-0`#$lizk7hv?P!JL1>wWtAM&)m)fqSfr z^D*Bb#`YR_(C4?n>ld)=@tZ4y888Tp{_GE6b(jZp-QWRu2?F3Fcm*DUZfe@E<2NG5 amqfmIiNw!|csfpL*Vuh~jymeA@cjm+QTSf~ literal 8267 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 a5CHzt!@LfZ#gcC&0Cki$vQpVR{Qm$*Br?$e From bced125c4c37a6bea5edeebaea19720f41853606 Mon Sep 17 00:00:00 2001 From: leeleeleeleejun Date: Sun, 2 Nov 2025 14:45:00 +0900 Subject: [PATCH 10/11] =?UTF-8?q?feat:=20=EC=B0=9C=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EB=A9=94=ED=83=80=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/app/likes/page.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps/web/app/likes/page.tsx b/apps/web/app/likes/page.tsx index 528bbf3..37a8167 100644 --- a/apps/web/app/likes/page.tsx +++ b/apps/web/app/likes/page.tsx @@ -1,3 +1,4 @@ +import type { Metadata } from 'next' import { usePlaceQueries } from '@/_apis/queries/place' import { OnlyLeftHeader } from '@repo/ui/components/Header' import { VerticalScrollArea } from '@repo/ui/components/Layout' @@ -7,6 +8,20 @@ import { BottomNavigation } from '@/_components/BottomNavigation' export const dynamic = 'force-dynamic' +const pageTitle = '찜 맛집' +const pageDescription = '내가 직접 고른 공주대 주변 찜 맛집 리스트!' + +export const metadata: Metadata = { + title: pageTitle, + description: pageDescription, + openGraph: { + title: `${pageTitle} | 공주대 맛집`, + description: pageDescription, + locale: 'ko-KR', + type: 'website', + }, +} + const Page = () => { return ( Date: Sun, 2 Nov 2025 15:34:20 +0900 Subject: [PATCH 11/11] =?UTF-8?q?feat:=20PlaceNewPage=EC=97=90=EC=84=9C=20?= =?UTF-8?q?dynamic=20export=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/app/places/new/page.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/web/app/places/new/page.tsx b/apps/web/app/places/new/page.tsx index d77f3ff..5a26834 100644 --- a/apps/web/app/places/new/page.tsx +++ b/apps/web/app/places/new/page.tsx @@ -50,8 +50,6 @@ const STEP_ORDER: Record = { FAIL: 'fail', } -export const dynamic = 'force-dynamic' - const PlaceNewPage = () => { const { Step, nextStep } = useFunnel(STEP_ORDER)