diff --git a/app/(protected)/(channelLinked)/channel/page.ts b/app/(protected)/(channelLinked)/channel/page.ts
deleted file mode 100644
index 6587a008..00000000
--- a/app/(protected)/(channelLinked)/channel/page.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { ChannelPage as default } from '@/pages/channel'
diff --git a/app/(protected)/(channelLinked)/channel/page.tsx b/app/(protected)/(channelLinked)/channel/page.tsx
new file mode 100644
index 00000000..ccf4445d
--- /dev/null
+++ b/app/(protected)/(channelLinked)/channel/page.tsx
@@ -0,0 +1,26 @@
+import type { Metadata } from 'next'
+import { ChannelPage } from '@/pages/channel'
+
+const title = '내 채널 분석 대시보드 | 인플레이스'
+const description =
+ '구독자 추이, 참여율, 시청자 분포를 한눈에 분석하고 카테고리 평균 대비 내 채널의 위치를 데이터로 확인하세요.'
+
+export const metadata: Metadata = {
+ title,
+ description,
+ openGraph: {
+ title,
+ description,
+ images: [{ url: '/og-channel-analyze.png' }],
+ },
+ twitter: {
+ card: 'summary_large_image',
+ title,
+ description,
+ images: ['/og-channel-analyze.png'],
+ },
+}
+
+export default function Page() {
+ return
+}
diff --git a/app/(protected)/(channelLinked)/videos/[videoId]/page.ts b/app/(protected)/(channelLinked)/videos/[videoId]/page.ts
deleted file mode 100644
index ff52fe45..00000000
--- a/app/(protected)/(channelLinked)/videos/[videoId]/page.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { VideoDetailPage as default } from '@/pages/videoDetail'
diff --git a/app/(protected)/(channelLinked)/videos/[videoId]/page.tsx b/app/(protected)/(channelLinked)/videos/[videoId]/page.tsx
new file mode 100644
index 00000000..e683b173
--- /dev/null
+++ b/app/(protected)/(channelLinked)/videos/[videoId]/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next'
+import { VideoDetailPage } from '@/pages/videoDetail'
+
+export const metadata: Metadata = {
+ title: '영상 분석 | 인플레이스',
+ openGraph: { title: '영상 분석 | 인플레이스' },
+ twitter: { title: '영상 분석 | 인플레이스' },
+}
+
+export default function Page() {
+ return
+}
diff --git a/app/(protected)/(channelLinked)/videos/layout.tsx b/app/(protected)/(channelLinked)/videos/layout.tsx
new file mode 100644
index 00000000..f6a195d7
--- /dev/null
+++ b/app/(protected)/(channelLinked)/videos/layout.tsx
@@ -0,0 +1,25 @@
+import type { Metadata } from 'next'
+
+const description =
+ '내 유튜브 영상별 조회수, 참여율, VPH, Outlier 지수를 분석해 성과 높은 콘텐츠 패턴을 발견하세요.'
+
+export const metadata: Metadata = {
+ description,
+ openGraph: {
+ description,
+ images: [{ url: '/og-channel-score.png' }],
+ },
+ twitter: {
+ card: 'summary_large_image',
+ description,
+ images: ['/og-channel-score.png'],
+ },
+}
+
+export default function VideosLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return children
+}
diff --git a/app/(protected)/(channelLinked)/videos/page.ts b/app/(protected)/(channelLinked)/videos/page.ts
deleted file mode 100644
index cf5c1795..00000000
--- a/app/(protected)/(channelLinked)/videos/page.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { VideosPage as default } from '@/pages/videos'
diff --git a/app/(protected)/(channelLinked)/videos/page.tsx b/app/(protected)/(channelLinked)/videos/page.tsx
new file mode 100644
index 00000000..e60fa720
--- /dev/null
+++ b/app/(protected)/(channelLinked)/videos/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next'
+import { VideosPage } from '@/pages/videos'
+
+export const metadata: Metadata = {
+ title: '영상 분석 대시보드 | 인플레이스',
+ openGraph: { title: '영상 분석 대시보드 | 인플레이스' },
+ twitter: { title: '영상 분석 대시보드 | 인플레이스' },
+}
+
+export default function Page() {
+ return
+}
diff --git a/app/(protected)/main/page.ts b/app/(protected)/main/page.ts
deleted file mode 100644
index de9b0415..00000000
--- a/app/(protected)/main/page.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { ChannelProfilePage as default } from '@/pages/main'
diff --git a/app/(protected)/main/page.tsx b/app/(protected)/main/page.tsx
new file mode 100644
index 00000000..9d8d9e14
--- /dev/null
+++ b/app/(protected)/main/page.tsx
@@ -0,0 +1,26 @@
+import type { Metadata } from 'next'
+import { ChannelProfilePage } from '@/pages/main'
+
+const title = '쉽고 빠르게 인플루언서를 찾고 분석하기 | 인플레이스'
+const description =
+ '데이터 기반으로 임팩트 있는 유튜브 인플루언서를 찾고, 내 채널을 성장시키세요. 브랜드와 크리에이터를 연결하는 유튜브 마케팅 플랫폼, 인플레이스.'
+
+export const metadata: Metadata = {
+ title,
+ description,
+ openGraph: {
+ title,
+ description,
+ images: [{ url: '/og-main.png' }],
+ },
+ twitter: {
+ card: 'summary_large_image',
+ title,
+ description,
+ images: ['/og-main.png'],
+ },
+}
+
+export default function Page() {
+ return
+}
diff --git a/app/(public)/page.ts b/app/(public)/page.ts
deleted file mode 100644
index 91ad8d32..00000000
--- a/app/(public)/page.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { HomePage as default } from '@/pages/home'
diff --git a/app/(public)/page.tsx b/app/(public)/page.tsx
new file mode 100644
index 00000000..00d42f1f
--- /dev/null
+++ b/app/(public)/page.tsx
@@ -0,0 +1,26 @@
+import type { Metadata } from 'next'
+import { HomePage } from '@/pages/home'
+
+const title = '쉽고 빠르게 인플루언서를 찾고 분석하기 | 인플레이스'
+const description =
+ '데이터 기반으로 임팩트 있는 유튜브 인플루언서를 찾고, 내 채널을 성장시키세요. 브랜드와 크리에이터를 연결하는 유튜브 마케팅 플랫폼, 인플레이스.'
+
+export const metadata: Metadata = {
+ title,
+ description,
+ openGraph: {
+ title,
+ description,
+ images: [{ url: '/og-main.png' }],
+ },
+ twitter: {
+ card: 'summary_large_image',
+ title,
+ description,
+ images: ['/og-main.png'],
+ },
+}
+
+export default function Page() {
+ return
+}
diff --git a/public/og-channel-analyze.png b/public/og-channel-analyze.png
new file mode 100644
index 00000000..635186b8
Binary files /dev/null and b/public/og-channel-analyze.png differ
diff --git a/public/og-channel-score.png b/public/og-channel-score.png
new file mode 100644
index 00000000..39fcd44e
Binary files /dev/null and b/public/og-channel-score.png differ
diff --git a/public/og-competitor.png b/public/og-competitor.png
new file mode 100644
index 00000000..40285b00
Binary files /dev/null and b/public/og-competitor.png differ
diff --git a/public/og-influencer.png b/public/og-influencer.png
new file mode 100644
index 00000000..6135539c
Binary files /dev/null and b/public/og-influencer.png differ
diff --git a/public/og-main.png b/public/og-main.png
new file mode 100644
index 00000000..8e2cc75a
Binary files /dev/null and b/public/og-main.png differ
diff --git a/public/og-me.png b/public/og-me.png
new file mode 100644
index 00000000..92213ff6
Binary files /dev/null and b/public/og-me.png differ
diff --git a/src/entities/home/featureCard/FeatureCard.tsx b/src/entities/home/featureCard/FeatureCard.tsx
index c00b4fa3..2985b575 100644
--- a/src/entities/home/featureCard/FeatureCard.tsx
+++ b/src/entities/home/featureCard/FeatureCard.tsx
@@ -1,3 +1,5 @@
+'use client'
+
import Image from 'next/image'
import { useRouter } from 'next/navigation'
import { Button } from '@/shared/ui/button'
diff --git a/src/pages/home/ui/HomePage.tsx b/src/pages/home/ui/HomePage.tsx
index 8b52279d..340f3c16 100644
--- a/src/pages/home/ui/HomePage.tsx
+++ b/src/pages/home/ui/HomePage.tsx
@@ -25,7 +25,7 @@ export default function HomePage() {
* 로딩 중 스클롤을 인식해 화면 최하단으로 랜더링 되는 것을 방지함.
*/
useEffect(() => {
- if (isInitializing) return
+ if (isInitializing || isLoggedIn) return
document.documentElement.classList.add('snap-landing')
const footer = document.querySelector('footer')
footer?.classList.add('snap-start')
@@ -33,7 +33,7 @@ export default function HomePage() {
document.documentElement.classList.remove('snap-landing')
footer?.classList.remove('snap-start')
}
- }, [isInitializing])
+ }, [isInitializing, isLoggedIn])
if (isInitializing || isLoggedIn) return null
diff --git a/src/pages/main/ui/ChannelProfilePage.tsx b/src/pages/main/ui/ChannelProfilePage.tsx
index 324ad61e..1df52b4b 100644
--- a/src/pages/main/ui/ChannelProfilePage.tsx
+++ b/src/pages/main/ui/ChannelProfilePage.tsx
@@ -7,7 +7,9 @@ import { useAuth } from '@/features/auth'
export function ChannelProfilePage() {
const { user } = useAuth()
- const channelId = user?.userChannelDetails?.youtubeChannelId as string
+ const channelId = user?.userChannelDetails?.youtubeChannelId
+
+ if (!channelId) return null
return (
diff --git a/public/mock-image.png b/src/shared/assets/mock/mock-image.png
similarity index 100%
rename from public/mock-image.png
rename to src/shared/assets/mock/mock-image.png