Skip to content

[FEAT] robots.txt·sitemap.xml SEO 라우트 설정#251

Merged
kimminna merged 1 commit into
developfrom
feat/web/250-seo-robots-sitemap
Jul 16, 2026
Merged

[FEAT] robots.txt·sitemap.xml SEO 라우트 설정#251
kimminna merged 1 commit into
developfrom
feat/web/250-seo-robots-sitemap

Conversation

@kimminna

Copy link
Copy Markdown
Member

ISSUE 🔗

close #250



What is this PR? 🔍

timo.kr 배포 도메인 기준으로 검색 엔진이 참조할 robots.txt·sitemap.xml 라우트를 추가하고, 관련 메타데이터가 참조하는 배포 도메인을 공유 상수로 정리했습니다.

배경

  • 기존 구조: metadataBase에 쓰이는 배포 도메인(https://timo.kr)이 layout.tsx 안에 로컬 상수로만 존재했고, robots.txt·sitemap.xml 라우트 자체가 없었습니다.
  • 발생 문제: 검색 엔진이 참조할 크롤링 규칙과 sitemap이 없어 인증이 필요한 비공개 페이지까지 무분별하게 크롤링될 수 있는 상태였습니다.
  • 해결 방향: 배포 도메인을 constants/site.ts로 분리해 공유하고, Next.js App Router의 robots.ts/sitemap.ts 컨벤션을 이용해 공개·비공개 라우트를 명시적으로 구분했습니다.

SEO 라우트

  • 변경 요약: app/robots.ts, app/sitemap.ts를 추가하고 SITE_URLconstants/site.ts로 분리했습니다.
  • 이유: 홈/투데이/포커스/통계/설정/온보딩/oauth 콜백 등은 로그인 없이 의미 있는 콘텐츠를 제공하지 않는 비공개 라우트라, 검색 결과에 노출되면 안 됩니다. 반대로 로그인·약관 페이지는 공개 진입점이라 색인이 되어야 합니다.
  • 구현 방식: robots.tsrouting.locales(en/ko) 각각에 대해 비공개 라우트(ROUTES.ONBOARDING/HOME/TODAY/FOCUS/STATISTICS/SETTINGS, /oauth)를 disallow 목록으로 생성하고, sitemap: ${SITE_URL}/sitemap.xml을 함께 반환합니다. sitemap.ts는 공개 라우트("", /login, /policy)만 각 로케일의 절대 URL로 나열하고, alternates.languages에 로케일별 URL을 채워 hreflang을 함께 제공합니다. layout.tsxmetadataBase도 동일한 SITE_URL 상수를 참조하도록 정리했습니다.
  • 경계 · 제약: robots.ts/sitemap.ts는 Next.js가 자동으로 /robots.txt, /sitemap.xml로 서빙하는 규약 파일이라 다른 코드에서 import되지 않습니다.



To Reviewers

ROUTES 상수 기준으로 비공개 라우트 목록을 하드코딩했는데, 이후 새 비공개 페이지가 추가되면 robots.tsPRIVATE_ROUTES 목록도 함께 갱신해야 합니다. sitemap에 넣을 공개 페이지 범위("", /login, /policy)가 맞는지 확인 부탁드립니다.

Screenshot 📷

Test Checklist ✔

  • pnpm check-types 통과
  • pnpm lint 통과
  • /robots.txt, /sitemap.xml 실제 배포 환경 렌더링 확인 — 후속 확인 필요 (로컬 dev 서버 중단으로 미실행)

- 배포 도메인을 SITE_URL 공유 상수로 분리했습니다
- 인증이 필요한 비공개 라우트를 크롤링에서 제외하는 robots.txt를 추가했습니다
- 공개 라우트와 로케일별 hreflang alternates를 포함한 sitemap.xml을 추가했습니다
@vercel

vercel Bot commented Jul 16, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
timo Ready Ready Preview, Comment Jul 16, 2026 5:17am

Request Review

@github-actions github-actions Bot added the ⏰ Timo-web Timo 웹 서비스 label Jul 16, 2026
@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 33e23c78-0c46-4b82-81ed-fd3f8779864c

📥 Commits

Reviewing files that changed from the base of the PR and between fbe3502 and 51ccdf1.

📒 Files selected for processing (4)
  • apps/timo-web/app/[locale]/layout.tsx
  • apps/timo-web/app/robots.ts
  • apps/timo-web/app/sitemap.ts
  • apps/timo-web/constants/site.ts

Walkthrough

공유 SITE_URL 상수를 추가하고 레이아웃 메타데이터에서 사용하도록 변경했습니다. 또한 로케일별 비공개 경로를 차단하는 robots.txt와 공개 경로 및 다국어 대체 URL을 포함하는 sitemap.xml 생성을 추가했습니다.

Changes

SEO 라우트 설정

Layer / File(s) Summary
공유 사이트 URL 및 메타데이터 연결
apps/timo-web/constants/site.ts, apps/timo-web/app/[locale]/layout.tsx
사이트 기준 URL을 공통 상수로 정의하고 generateMetadatametadataBase가 이를 사용하도록 변경했습니다.
robots.txt 및 sitemap.xml 생성
apps/timo-web/app/robots.ts, apps/timo-web/app/sitemap.ts
비공개 및 OAuth 경로를 disallow에 포함하고, 공개 경로에 기본 로케일 URL과 다국어 대체 URL을 생성합니다.

Estimated code review effort: 2 (Simple) | ~10 minutes

Sequence Diagram(s)

sequenceDiagram
  participant NextMetadata as Next.js Metadata
  participant RobotsRoute as robots()
  participant SitemapRoute as sitemap()
  participant SiteConstants as SITE_URL
  NextMetadata->>RobotsRoute: robots.txt 생성 요청
  RobotsRoute->>SiteConstants: SITE_URL 조회
  SiteConstants-->>RobotsRoute: 사이트 기준 URL 반환
  NextMetadata->>SitemapRoute: sitemap.xml 생성 요청
  SitemapRoute->>SiteConstants: SITE_URL 조회
  SiteConstants-->>SitemapRoute: 사이트 기준 URL 반환
Loading

Possibly related PRs

Suggested labels: 🛠️ Setup

Suggested reviewers: yumin-kim2

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 robots.txt·sitemap.xml SEO 라우트 추가와 SITE_URL 분리를 정확히 요약합니다.
Description check ✅ Passed 설명이 변경 내용과 목적을 잘 맞추고 있어 PR과 충분히 관련 있습니다.
Linked Issues check ✅ Passed 연결된 이슈의 요구사항인 SITE_URL 분리, robots.txt 차단, sitemap.hreflang 추가가 모두 반영되었습니다.
Out of Scope Changes check ✅ Passed 요구사항과 무관한 변경은 보이지 않고, layout 정리도 공유 상수 적용 범위 안입니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/web/250-seo-robots-sitemap

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.

@github-actions

Copy link
Copy Markdown

Timo Performance Report

Bundle Size — timo-web
라우트 크기 First Load JS
/[locale]/home 211.88 kB 🔴 417.74 kB
/[locale]/today 196.07 kB 🔴 401.93 kB
/[locale]/focus 160.92 kB 🔴 366.78 kB
/[locale]/settings 167.19 kB 🔴 373.06 kB
/[locale]/statistics 154.84 kB 🔴 360.71 kB
/[locale]/[...rest] 0 B 🟡 205.87 kB
/[locale]/login 212.96 kB 🔴 418.83 kB
/[locale]/oauth/callback 119.66 kB 🟡 325.52 kB
/[locale]/onboarding 233.44 kB 🔴 439.30 kB
/[locale] 118.97 kB 🟡 324.84 kB
/[locale]/policy 125.09 kB 🟡 330.96 kB
/robots.txt/route 0 B 🟡 205.87 kB
/sitemap.xml/route 0 B 🟡 205.87 kB

공유 번들: 205.87 kB
🟢 < 200kB  |  🟡 < 350kB  |  🔴 ≥ 350kB (First Load JS · gzip)

Lighthouse — timo-web
URL Perf A11y LCP CLS TBT
/en/home 🔴 59 🟢 95 🔴 15.8s 🟢 0.000 🟡 597ms
/en/today 🔴 60 🟢 95 🔴 15.6s 🟢 0.000 🟡 585ms
/en/focus 🔴 60 🟢 95 🔴 15.3s 🟢 0.000 🟡 559ms
/en/statistics 🔴 59 🟢 95 🔴 15.3s 🟢 0.000 🔴 602ms

Perf ≥ 70 / A11y ≥ 85 목표
LCP 🟢 < 2.5s 🟡 < 4s 🔴 ≥ 4s  |  CLS 🟢 < 0.1 🟡 < 0.25 🔴 ≥ 0.25  |  TBT 🟢 < 200ms 🟡 < 600ms 🔴 ≥ 600ms

Image Optimization — timo-web
파일 크기 포맷 상태
favicon.png 27.84 kB PNG ⚠️ 🟢
images/google-calendar.png 36.20 kB PNG ⚠️ 🟢
images/google-logo.png 26.79 kB PNG ⚠️ 🟢
og.png 437.44 kB PNG ⚠️ 🟡

총 4개 · 528.28 kB  |  🟢 < 200KB  |  🟡 < 500KB  |  🔴 ≥ 500KB
⚠️ 4개 파일 WebP/AVIF 변환 권장

측정 커밋: db8d831

@jjangminii jjangminii left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

이런것도 있네요~ 고생하셨습니다 👍 👍

@kimminna
kimminna merged commit 3cc33b4 into develop Jul 16, 2026
13 checks passed
@kimminna
kimminna deleted the feat/web/250-seo-robots-sitemap branch July 16, 2026 06:36
@kimminna kimminna mentioned this pull request Jul 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 새로운 기능(기능성) 구현 ⏰ Timo-web Timo 웹 서비스 ♦️ 민아 민아상

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] robots.txt·sitemap.xml SEO 라우트 설정

2 participants