Skip to content

feat(IN-320): EP-01, 02 페이지 SEO 적용#137

Merged
kimYunHyeong merged 9 commits into
developfrom
IN-320
May 31, 2026
Merged

feat(IN-320): EP-01, 02 페이지 SEO 적용#137
kimYunHyeong merged 9 commits into
developfrom
IN-320

Conversation

@kimYunHyeong

@kimYunHyeong kimYunHyeong commented May 29, 2026

Copy link
Copy Markdown
Collaborator

📌 작업 개요

홈페이지 SEO 적용
로그인 후 랜딩 페이지 SEO 적용
채널 분석 페이지 SEO 적용
영상 성과 분석 페이지 SEO 적용

🗂 작업 유형

해당하는 항목에 x를 채워 주세요.

  • 기능 추가 (feat)
  • 버그 수정 (fix)
  • 리팩토링 (refactor)
  • 스타일 / UI 수정 (style)
  • 성능 개선 (perf)
  • 테스트 (test)
  • 기타 (chore, docs 등)

✏️ 작업 내용

✅ 셀프 체크리스트

머지 전 직접 확인해 주세요.

  • 로컬에서 정상 동작 확인
  • 불필요한 콘솔 로그, 주석, 디버그 코드 제거
  • 타입 에러 없음

💬 리뷰어에게

EP-03부터는 현재 PR이 머지 되지 않아서 충돌 방지를 위해 이후 개발 진행하겠습니다.

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 채널 분석, 영상 분석, 프로필 페이지에 검색 엔진 및 소셜 미디어 공유 최적화(메타데이터) 추가
    • 영상 섹션에 전용 레이아웃 추가
  • 버그 수정

    • 로그인 상태에 따른 홈페이지 스크롤 스냅 동작 개선
  • 리팩토링

    • 컴포넌트 구조 최적화 및 클라이언트 컴포넌트 지정 개선

@vercel

vercel Bot commented May 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
inflace Ready Ready Preview, Comment May 31, 2026 2:30pm

@coderabbitai

coderabbitai Bot commented May 29, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@kimYunHyeong, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 23 minutes and 16 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 5033ffcb-1a9b-453e-9978-06f28ced381c

📥 Commits

Reviewing files that changed from the base of the PR and between 1054a02 and 2251cb5.

📒 Files selected for processing (1)
  • src/pages/main/ui/ChannelProfilePage.tsx

개요

Next.js 라우트 구조를 표준화하여 모든 페이지의 메타데이터를 .tsx 파일에 선언하도록 통합하고, 기존 .ts 재내보내기 구문을 제거했습니다. 또한 홈페이지의 로그인 상태 기반 동작을 개선하고 클라이언트 컴포넌트 책임을 명확히 했습니다.

변경 사항

라우트 메타데이터 및 페이지 구조 표준화

Layer / File(s) 요약
공개 홈페이지 메타데이터 및 진입점
app/(public)/page.tsx
공개 홈페이지의 제목, 설명, OpenGraph, Twitter 메타데이터를 정의하고 HomePage 컴포넌트를 래핑하는 Page 엔트리포인트를 추가합니다.
보호된 메인 프로필 페이지 구조
app/(protected)/main/page.ts, app/(protected)/main/page.tsx
메인 프로필 라우트의 기본 내보내기를 .ts에서 제거하고 .tsx 페이지에 메타데이터와 ChannelProfilePage 렌더링을 추가합니다.
비디오 섹션 공유 레이아웃 및 메타데이터
app/(protected)/(channelLinked)/videos/layout.tsx
비디오 섹션의 자식 라우트에 적용될 OpenGraph 이미지와 Twitter 카드 메타데이터를 정의하고 children 래퍼를 구성합니다.
비디오 목록 및 상세 페이지 메타데이터
app/(protected)/(channelLinked)/videos/page.ts, app/(protected)/(channelLinked)/videos/page.tsx, app/(protected)/(channelLinked)/videos/[videoId]/page.ts, app/(protected)/(channelLinked)/videos/[videoId]/page.tsx
비디오 목록과 상세 페이지의 메타데이터를 .tsx에 선언하고 해당 페이지 컴포넌트를 렌더링하며, 기존 .ts 재내보내기 구문을 제거합니다.
채널 분석 페이지 메타데이터
app/(protected)/(channelLinked)/channel/page.ts, app/(protected)/(channelLinked)/channel/page.tsx
채널 분석 페이지의 대시보드 관련 메타데이터를 정의하고 ChannelPage를 렌더링하는 .tsx 페이지를 추가하며, 기존 .ts 재내보내기를 제거합니다.

홈페이지 인증 동작 및 컴포넌트 책임 개선

Layer / File(s) 요약
로그인 상태 기반 스냅 스크롤 제어
src/pages/home/ui/HomePage.tsx
snap-landing/snap-start 클래스 제어 useEffect의 조기 반환 조건을 확장하여 isLoggedIn 상태 변화에도 반응하고, 의존성 배열에 isLoggedIn을 추가합니다.
FeatureCard 클라이언트 컴포넌트 마킹
src/entities/home/featureCard/FeatureCard.tsx
'use client' 디렉티브를 추가하여 클라이언트 환경에서 렌더링되도록 명시합니다.

예상 검토 시간

🎯 2 (Simple) | ⏱️ ~10분

추천 검토자

  • juuhye

🐰 라우트를 정렬하고 메타데이터를 담으니

페이지들이 반짝반짝 새 옷을 입었네!

로그인 상태도 민감하게 반응하고

클라이언트도 제 역할을 찾았으니

인플레이스의 길도 한층 명확해졌다오! 🌟

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 SEO 적용이라는 주요 변경 사항을 명확히 요약하고 있으며, 대상 페이지(EP-01, 02)도 구체적으로 명시되어 있습니다.
Description check ✅ Passed 작업 개요에서 4개의 구체적인 커밋 링크를 통해 각 페이지별 SEO 적용 내용을 참고할 수 있도록 제시했으며, 작업 유형, 셀프 체크리스트, 리뷰어 노트가 모두 작성되어 있습니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch IN-320

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🧹 Nitpick comments (2)
src/pages/main/ui/ChannelProfilePage.tsx (1)

1-1: ⚡ Quick win

여기도 @/ alias import로 맞춰주세요.

src 하위 파일이라 상대 경로보다 alias를 쓰는 쪽이 프로젝트 규칙과 맞습니다.

💡 제안 수정
-import { ChannelProfileClient } from './ChannelProfileClient'
+import { ChannelProfileClient } from '`@/pages/main/ui/ChannelProfileClient`'

As per coding guidelines, src/**/*.{ts,tsx}: Path Alias @/* 사용하여 ./src/*로 import

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/pages/main/ui/ChannelProfilePage.tsx` at line 1, Update the import in
ChannelProfilePage.tsx to use the project path-alias instead of a relative path:
replace the local './ChannelProfileClient' import with the alias import for the
same module (use '`@/pages/main/ui/ChannelProfileClient`') so the
ChannelProfileClient import follows the src/* -> `@/`* guideline.
src/pages/home/ui/HomePage.tsx (1)

2-2: ⚡ Quick win

상대 경로 대신 @/ alias를 사용하세요.

이 파일은 src 하위라서 ./HomeAuthGuard보다 alias import로 맞추는 편이 현재 규칙과 일관됩니다.

💡 제안 수정
-import HomeAuthGuard from './HomeAuthGuard'
+import HomeAuthGuard from '`@/pages/home/ui/HomeAuthGuard`'

As per coding guidelines, src/**/*.{ts,tsx}: Path Alias @/* 사용하여 ./src/*로 import

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/pages/home/ui/HomePage.tsx` at line 2, Change the relative import in
HomePage.tsx to use the project path alias instead of a local relative path:
replace "import HomeAuthGuard from './HomeAuthGuard'" with an alias import that
points to the same module (e.g. import HomeAuthGuard from
'`@/pages/home/ui/HomeAuthGuard`'), ensuring the symbol HomeAuthGuard is imported
via the `@/` alias to conform to the src/**/*.{ts,tsx} import rule.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@app/`(protected)/(channelLinked)/channel/page.tsx:
- Around line 1-26: This file defines metadata and a Page component inline;
convert it to the App Router re-export pattern by removing the local metadata
and Page implementation and instead re-export the page and metadata from the
shared page module (the module that currently exports ChannelPage, e.g.
'`@/pages/channel`' or its index.ts). Specifically, replace the inline exports
with re-exports such as exporting the page default and metadata from the
existing src/pages channel module (ensure you re-export the same symbol names
that module provides, e.g. export { default, metadata } from '`@/pages/channel`'
or equivalent), and delete the local const title/description and the Page
function.

In `@app/`(protected)/(channelLinked)/videos/[videoId]/page.tsx:
- Around line 1-12: Replace the inline page component with a re-export so the
dynamic route follows the app/*/page.ts re-export convention: instead of
defining export const metadata and default function Page that returns
VideoDetailPage, re-export the page module and its metadata from the centralized
page module (the module currently imported as '`@/pages/videoDetail`' which
exports VideoDetailPage and its metadata). Concretely, remove the local metadata
and Page implementation and export the default and metadata from the existing
src/pages videoDetail module so routing and metadata are managed from that
single source of truth.

In `@app/`(protected)/(channelLinked)/videos/page.tsx:
- Around line 1-12: The file currently defines and returns the VideosPage
component directly (imported as VideosPage and exported via default function
Page), but per routing rules it should be a re-export entry; remove the local
Page component and the VideosPage import and instead re-export the page module
from the canonical pages entry (e.g. export { default } from '`@/pages/videos`' or
export * from '`@/pages/videos`'), so Page becomes a simple re-export that
forwards the implementation in src/pages/videos/index.ts (or the module
referenced as '`@/pages/videos`').

In `@app/`(protected)/main/page.tsx:
- Around line 1-26: Replace the direct component and metadata definitions in
this file with a re-export per the routing rule: remove the local metadata, Page
component and the ChannelProfilePage import and instead re-export the page
module and its metadata from the canonical page module (the module currently
referenced as '`@/pages/main`' which exports metadata and the default component).
In other words, export the default and metadata from the src/pages main entry
(so consumers get exported metadata and the default Page via a single
re-export).

In `@app/`(public)/page.tsx:
- Around line 1-26: Replace the current in-file definitions with a re-export
from the page module: remove the local metadata, title/description constants,
and the Page component that returns HomePage, and instead re-export the default
page and metadata from the home page module (the module that currently defines
HomePage and its metadata, e.g. the src/pages/home index that exports metadata
and the default component). Ensure you re-export the same symbols (metadata and
the default export) so the app/(public)/page.tsx becomes a simple re-export of
the home page module rather than defining metadata or HomePage locally.

In `@src/pages/home/ui/HomeAuthGuard.tsx`:
- Around line 25-34: The effect in useEffect currently runs even for logged-in
users causing global snap classes to be added; update the guard to also skip
when the user is authenticated (e.g., add an auth flag such as isAuthenticated
or sessionUser to the dependency list) by changing the early-return to if
(isInitializing || isAuthenticated) return; so the
document.documentElement.classList.add('snap-landing') and
footer?.classList.add('snap-start') only run for unauthenticated users and
ensure the cleanup still removes classes when the effect was applied; reference
useEffect, isInitializing, isAuthenticated (or sessionUser),
document.documentElement.classList, and footer?.classList.

In `@src/pages/main/ui/ChannelProfileClient.tsx`:
- Line 16: The container div rendering in ChannelProfileClient uses a typo in
the className string ("felx h-fit w-full flex-col px-24 pt-40 pb-96") so the
flex layout isn't applied; update the className on that div to replace "felx"
with "flex" (ensure the JSX element that currently contains className='felx
h-fit w-full flex-col px-24 pt-40 pb-96' is changed to use "flex") to restore
the intended flex behavior.
- Around line 9-18: Remove the unsafe type assertion on channelId (do not use
"as string"); instead read it via useAuth
(user?.userChannelDetails?.youtubeChannelId) and guard rendering: if channelId
is undefined show a loading/fallback or return null before rendering
ChannelProfileSection, TrendingVideosSection, and TrendMagazineSection, or pass
channelId only when defined to those components (identify ChannelProfileSection,
TrendingVideosSection, TrendMagazineSection and the
useAuth/user.userChannelDetails access point to implement the conditional render
or fallback).

---

Nitpick comments:
In `@src/pages/home/ui/HomePage.tsx`:
- Line 2: Change the relative import in HomePage.tsx to use the project path
alias instead of a local relative path: replace "import HomeAuthGuard from
'./HomeAuthGuard'" with an alias import that points to the same module (e.g.
import HomeAuthGuard from '`@/pages/home/ui/HomeAuthGuard`'), ensuring the symbol
HomeAuthGuard is imported via the `@/` alias to conform to the src/**/*.{ts,tsx}
import rule.

In `@src/pages/main/ui/ChannelProfilePage.tsx`:
- Line 1: Update the import in ChannelProfilePage.tsx to use the project
path-alias instead of a relative path: replace the local
'./ChannelProfileClient' import with the alias import for the same module (use
'`@/pages/main/ui/ChannelProfileClient`') so the ChannelProfileClient import
follows the src/* -> `@/`* guideline.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4b69e339-34fa-4165-a7e1-cbdd8db3c335

📥 Commits

Reviewing files that changed from the base of the PR and between 1a08fb7 and 9aba8b6.

⛔ Files ignored due to path filters (7)
  • public/og-channel-analyze.png is excluded by !**/*.png
  • public/og-channel-score.png is excluded by !**/*.png
  • public/og-competitor.png is excluded by !**/*.png
  • public/og-influencer.png is excluded by !**/*.png
  • public/og-main.png is excluded by !**/*.png
  • public/og-me.png is excluded by !**/*.png
  • src/shared/assets/mock/mock-image.png is excluded by !**/*.png
📒 Files selected for processing (16)
  • app/(protected)/(channelLinked)/channel/page.ts
  • app/(protected)/(channelLinked)/channel/page.tsx
  • app/(protected)/(channelLinked)/videos/[videoId]/page.ts
  • app/(protected)/(channelLinked)/videos/[videoId]/page.tsx
  • app/(protected)/(channelLinked)/videos/layout.tsx
  • app/(protected)/(channelLinked)/videos/page.ts
  • app/(protected)/(channelLinked)/videos/page.tsx
  • app/(protected)/main/page.ts
  • app/(protected)/main/page.tsx
  • app/(public)/page.ts
  • app/(public)/page.tsx
  • src/entities/home/featureCard/FeatureCard.tsx
  • src/pages/home/ui/HomeAuthGuard.tsx
  • src/pages/home/ui/HomePage.tsx
  • src/pages/main/ui/ChannelProfileClient.tsx
  • src/pages/main/ui/ChannelProfilePage.tsx
💤 Files with no reviewable changes (5)
  • app/(protected)/(channelLinked)/videos/page.ts
  • app/(protected)/(channelLinked)/videos/[videoId]/page.ts
  • app/(protected)/(channelLinked)/channel/page.ts
  • app/(protected)/main/page.ts
  • app/(public)/page.ts

Comment thread app/(protected)/(channelLinked)/channel/page.tsx
Comment thread app/(protected)/(channelLinked)/videos/[videoId]/page.tsx
Comment thread app/(protected)/(channelLinked)/videos/page.tsx
Comment thread app/(protected)/main/page.tsx
Comment thread app/(public)/page.tsx
Comment thread src/pages/home/ui/HomeAuthGuard.tsx Outdated
Comment thread src/pages/main/ui/ChannelProfileClient.tsx Outdated
Comment thread src/pages/main/ui/ChannelProfileClient.tsx Outdated
SEO 적용은 app 폴더 안에서만 진행되므로 src/pages안의 페이지들은 use client 상태를 유지해도 상관이 없기에 파일을 복원함
타입 단언을 channelId가 undefined인 경우도 처리가능하도록 수정
@kimYunHyeong kimYunHyeong merged commit f607ea7 into develop May 31, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant