Skip to content

feat: 책모 서비스 소개 페이지 추가 - #506

Merged
yhi9839 merged 2 commits into
mainfrom
feat-505-service
Jul 20, 2026
Merged

yhi9839 merged 2 commits into
mainfrom
feat-505-service

Conversation

@yhi9839

@yhi9839 yhi9839 commented Jul 20, 2026 •

Copy link
Copy Markdown
Contributor

📌 개요 (Summary)

  • 변경 사항에 대한 간략한 요약을 적어주세요.
  • 관련 이슈가 있다면 링크를 걸어주세요 (예: [fix] cicd / build 문제 #123).

🛠️ 변경 사항 (Changes)

  • 새로운 기능 추가
  • 버그 수정
  • 코드 리팩토링
  • 문서 업데이트
  • 기타 (설명: )

📸 스크린샷 (Screenshots)

(UI 변경 사항이 있다면 첨부해주세요)

✅ 체크리스트 (Checklist)

  • 빌드가 성공적으로 수행되었나요? (pnpm build)
  • 린트 에러가 없나요? (pnpm lint)
  • 불필요한 콘솔 로그나 주석을 제거했나요?

Summary by CodeRabbit

  • New Features
    • Added a dedicated “책모 서비스 소개” page with an interactive slide-based overview.
    • Added navigation controls, keyboard shortcuts, responsive viewing, and print-friendly layouts.
    • Added links to service introduction content from the Support page.
  • Improvements
    • Made the service introduction page accessible through a clean, shareable address.
    • Added the page to the site map to improve discoverability.

@yhi9839 yhi9839 linked an issue Jul 20, 2026 that may be closed by this pull request
4 tasks
@vercel

vercel Bot commented Jul 20, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
checkmo Ready Ready Preview, Comment Jul 20, 2026 10:02am

@coderabbitai

coderabbitai Bot commented Jul 20, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a standalone Korean service introduction deck with interactive navigation, exposes it at /service-introduction, includes the route in the sitemap, and adds a support-page CTA.

Changes

Service introduction

Layer / File(s) Summary
Service introduction deck content
public/service-introduction/index.html
Adds the themed, responsive HTML deck with service overview, journey, comparisons, app examples, adoption guidance, FAQ content, and closing contact links.
Deck navigation behavior
public/service-introduction/index.html
Adds slide controls, keyboard and wheel navigation, slide counters, reduced-motion handling, and resize behavior.
Route exposure and entry point
next.config.ts, src/app/sitemap.ts, src/app/support/page.tsx
Rewrites /service-introduction to the static HTML page, adds the route to the sitemap, and adds a support-page CTA.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Suggested labels: ✨ feat

Suggested reviewers: shinwokkang

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: adding the 책모 service introduction page.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat-505-service

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.

@gemini-code-assist gemini-code-assist Bot 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.

Code Review

This pull request introduces a standalone service introduction slide deck page (/service-introduction) along with its associated SVG assets and icons. It configures Next.js rewrites to serve this HTML page, adds the new route to the sitemap, and includes a promotional banner on the support page linking to it. The review feedback highlights two performance and stability improvements in the slide deck's client-side JavaScript: checking event.cancelable before calling event.preventDefault() on wheel events to prevent runtime errors, and throttling the window resize event handler using requestAnimationFrame to avoid layout thrashing.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

deck.addEventListener('wheel', (event) => {
const delta = Math.abs(event.deltaX) > Math.abs(event.deltaY) ? event.deltaX : event.deltaY;
if (Math.abs(delta) < 12) return;
event.preventDefault();

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.

medium

이벤트가 취소 가능(cancelable)한지 확인하지 않고 event.preventDefault()를 호출하면, 특정 브라우저나 환경에서 에러가 발생할 수 있습니다. 호출 전에 event.cancelable 여부를 확인하는 것이 안전합니다.

Suggested change
event.preventDefault();
if (event.cancelable) event.preventDefault();

Comment on lines +2137 to +2138
window.addEventListener('resize', fitSlides);
fitSlides();

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.

medium

window의 resize 이벤트는 크기 조절 시 매우 빈번하게 발생합니다. fitSlides 함수 내부에서 CSS Custom Property를 변경하고 deck.scrollTo를 호출하므로, requestAnimationFrame을 활용하여 레이아웃 스래싱(Layout Thrashing)과 화면 버벅임(Jank)을 방지하는 것이 좋습니다.

      let resizeFrame = 0;
      const handleResize = () => {
        if (resizeFrame) return;
        resizeFrame = window.requestAnimationFrame(() => {
          fitSlides();
          resizeFrame = 0;
        });
      };
      window.addEventListener('resize', handleResize);
      fitSlides();

@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: 1

🧹 Nitpick comments (3)
public/service-introduction/index.html (3)

31-32: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider importing the Pretendard web font.

The CSS variables prioritize Pretendard, but the font is not imported via <link> or @font-face. Consequently, it will only render if the user has the font locally installed, otherwise defaulting to the system fallbacks (Apple SD Gothic Neo, Noto Sans KR). For consistent typography across all devices, consider importing it.

If you decide to import it, add this <link> to the <head>:

  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
🤖 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 `@public/service-introduction/index.html` around lines 31 - 32, Add the
provided Pretendard stylesheet link within the HTML head so the existing
--pretendard and --sans font variables load the web font consistently across
devices.

1695-1697: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Open external store links in a new tab.

Navigating directly to external store links will interrupt the user's flow and close the promotional deck. Add target="_blank" and rel="noopener noreferrer" to keep the landing page open.

  • public/service-introduction/index.html#L1695-L1697: add target="_blank" rel="noopener noreferrer" to the store-logo-link and cover-domain anchor tags.
  • public/service-introduction/index.html#L2011-L2013: add target="_blank" rel="noopener noreferrer" to these duplicated store-logo-link and cover-domain anchor tags.
  • public/service-introduction/index.html#L2025-L2032: add target="_blank" rel="noopener noreferrer" to both the iOS and Google Play closing-qr anchor tags.
🤖 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 `@public/service-introduction/index.html` around lines 1695 - 1697, Update the
external anchors in public/service-introduction/index.html at lines 1695-1697,
2011-2013, and 2025-2032: add target="_blank" and rel="noopener noreferrer" to
every store-logo-link, cover-domain, and closing-qr iOS/Google Play anchor so
each external store or domain link opens in a new tab without disrupting the
landing page.

4-8: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add Open Graph metadata for social sharing.

Since this is a standalone promotional landing page, it bypasses the Next.js application's global metadata. Adding Open Graph (OG) tags will ensure that when the link is shared on KakaoTalk or social media, a rich preview with an image, title, and description is displayed.

💡 Proposed additions
   <meta charset="UTF-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   <meta name="description" content="독서동아리 운영진을 위한 책모 서비스 소개서" />
+  <meta property="og:title" content="모임은 책에 집중하고, 운영은 책모가 정리합니다" />
+  <meta property="og:description" content="독서동아리 운영진을 위한 책모 서비스 소개서" />
+  <meta property="og:type" content="website" />
+  <meta property="og:url" content="https://checkmo.co.kr/service-introduction" />
+  <meta property="og:image" content="https://checkmo.co.kr/service-introduction/assets/home.png" />
   <base href="/service-introduction/" />
   <title>모임은 책에 집중하고, 운영은 책모가 정리합니다</title>
🤖 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 `@public/service-introduction/index.html` around lines 4 - 8, Add Open Graph
metadata to the head of the standalone service-introduction page, including
og:title, og:description, and og:image with the landing page’s promotional
content and an appropriate publicly accessible preview image URL. Keep the
existing charset, viewport, description, base, and title metadata unchanged.
🤖 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 `@src/app/sitemap.ts`:
- Around line 78-83: Update the static service-introduction sitemap entry in the
sitemap generation flow to replace the dynamic new Date() lastModified value
with the established document/deploy date, or omit lastModified when no stable
date is available. Keep the existing URL, changeFrequency, and priority
unchanged.

---

Nitpick comments:
In `@public/service-introduction/index.html`:
- Around line 31-32: Add the provided Pretendard stylesheet link within the HTML
head so the existing --pretendard and --sans font variables load the web font
consistently across devices.
- Around line 1695-1697: Update the external anchors in
public/service-introduction/index.html at lines 1695-1697, 2011-2013, and
2025-2032: add target="_blank" and rel="noopener noreferrer" to every
store-logo-link, cover-domain, and closing-qr iOS/Google Play anchor so each
external store or domain link opens in a new tab without disrupting the landing
page.
- Around line 4-8: Add Open Graph metadata to the head of the standalone
service-introduction page, including og:title, og:description, and og:image with
the landing page’s promotional content and an appropriate publicly accessible
preview image URL. Keep the existing charset, viewport, description, base, and
title metadata unchanged.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1039daeb-9a51-4d95-a771-2f77963f31b2

📥 Commits

Reviewing files that changed from the base of the PR and between 1b6e051 and 9a43211.

⛔ Files ignored due to path filters (22)
  • public/service-introduction/assets/book.png is excluded by !**/*.png
  • public/service-introduction/assets/checkmo-app-icon-ios.png is excluded by !**/*.png
  • public/service-introduction/assets/club-management.png is excluded by !**/*.png
  • public/service-introduction/assets/google-play-qr.svg is excluded by !**/*.svg
  • public/service-introduction/assets/home.png is excluded by !**/*.png
  • public/service-introduction/assets/icons/Chat.svg is excluded by !**/*.svg
  • public/service-introduction/assets/icons/admin.svg is excluded by !**/*.svg
  • public/service-introduction/assets/icons/bookshelf.svg is excluded by !**/*.svg
  • public/service-introduction/assets/icons/groups_3User.svg is excluded by !**/*.svg
  • public/service-introduction/assets/icons/notification.svg is excluded by !**/*.svg
  • public/service-introduction/assets/icons/quill_pin.svg is excluded by !**/*.svg
  • public/service-introduction/assets/icons/vote.svg is excluded by !**/*.svg
  • public/service-introduction/assets/ios-app-store-qr.png is excluded by !**/*.png
  • public/service-introduction/assets/kakao.png is excluded by !**/*.png
  • public/service-introduction/assets/member-experience.png is excluded by !**/*.png
  • public/service-introduction/assets/notion.png is excluded by !**/*.png
  • public/service-introduction/assets/onboarding/club-comment.png is excluded by !**/*.png
  • public/service-introduction/assets/onboarding/club-meeting.png is excluded by !**/*.png
  • public/service-introduction/assets/onboarding/club-notice.png is excluded by !**/*.png
  • public/service-introduction/assets/onboarding/club-topic.png is excluded by !**/*.png
  • public/service-introduction/assets/person.png is excluded by !**/*.png
  • public/service-introduction/assets/regular-meeting.png is excluded by !**/*.png
📒 Files selected for processing (4)
  • next.config.ts
  • public/service-introduction/index.html
  • src/app/sitemap.ts
  • src/app/support/page.tsx

Comment thread src/app/sitemap.ts
Comment on lines +78 to +83
{
url: `${baseUrl}/service-introduction`,
lastModified: new Date(),
changeFrequency: "monthly",
priority: 0.7,
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use a stable lastModified value for this static page.

new Date() makes the sitemap report that the introduction changed every time it is generated, even when the HTML is unchanged. Use the document/deploy date or omit lastModified to avoid sending misleading freshness signals.

🤖 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/app/sitemap.ts` around lines 78 - 83, Update the static
service-introduction sitemap entry in the sitemap generation flow to replace the
dynamic new Date() lastModified value with the established document/deploy date,
or omit lastModified when no stable date is available. Keep the existing URL,
changeFrequency, and priority unchanged.

@yhi9839
yhi9839 merged commit 757a61f into main Jul 20, 2026
3 checks passed

This branch was successfully deployed

1 active deployment
Preview — 9a432110 Deployed Jul 20, 2026 by vercel[bot]
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.

feat: 서비스 소개서

1 participant