Skip to content

feat: 이용약관, 개인정보처리방침 페이지 추가 - #58

Merged
evenif99 merged 28 commits into
devfrom
feature/common-component-jw
Jun 18, 2026
Merged

evenif99 merged 28 commits into
devfrom
feature/common-component-jw

Conversation

@evenif99

@evenif99 evenif99 commented Jun 18, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • /terms 이용약관 페이지 추가 (7개 조항)
  • /privacy 개인정보처리방침 페이지 추가 (7개 조항)
  • 텍스트 기반 페이지 구성, MUI ArrowBack 아이콘 뒤로가기 포함
  • 로그인 페이지의 이용약관/개인정보처리방침 링크와 연결
  • 미들웨어에서 /terms, /privacy 인증 예외 추가 (비로그인 접근 허용)

Test plan

  • /terms 페이지 접근 및 내용 표시 확인
  • /privacy 페이지 접근 및 내용 표시 확인
  • 비로그인 상태에서 이용약관/개인정보처리방침 페이지 접근 가능 확인
  • 뒤로가기 버튼 동작 확인
  • 로그인 페이지에서 이용약관/개인정보처리방침 링크 클릭 시 정상 이동 확인

🤖 Generated with Claude Code

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 개인정보 처리방침 페이지 추가(제1조~제13조 및 부칙, 정적 구성)
    • 이용약관 페이지 추가(제1조~제15조 및 부칙(2025년 6월 1일 시행), 정적 구성)
    • 두 페이지 모두 뒤로 가기 버튼 제공
    • 개인정보/약관 전용 스타일로 레이아웃·타이포그래피 통일
  • 개선 사항

    • 개인정보/약관 경로가 미들웨어 적용 대상에서 제외되어 페이지 전환이 더 원활해졌습니다.

evenif99 and others added 25 commits June 16, 2026 16:04
- Button: primary / outline / disabled variants, design token 기반
- Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용
- Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering
- BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘
- toastStore: Zustand UI 상태 (show/hide/message)
- GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리)
- Issues / Milestones / Project Board 미사용으로 관련 내용 제거
- GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거
- PR_RULES PR 본문에서 관련 Issue 항목 제거
…ea components

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Toast: MUI Snackbar (3s auto-dismiss)
- BottomNavigation, Header, Select: lucide-react → @mui/icons-material
- Install @mui/icons-material
- CLAUDE.md, CODING_CONVENTION.md: MUI usage policy updated

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 로그인 페이지 UI 및 카카오 signIn 버튼 연결
- @auth/prisma-adapter 설치 및 authOptions에 적용
- 최초 로그인 시 kakaoId, nickname, termsAgreedAt 자동 설정
- 닉네임 자동 생성 유틸 추가 (~하는부엉이 + 4자리 난수)
- middleware 추가: 비인증 사용자 /login 리다이렉트

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- SCSS import 절대경로(@/) 수정
- 캐릭터 이미지 Next/Image fill → img 태그로 변경
- 이용약관/개인정보처리방침 링크(/terms, /privacy) 추가 및 스타일 적용
- 닉네임 유니크 제약(@unique) 추가 및 충돌 재시도 로직 구현 (최대 10회)
- middleware matcher 패턴 보완 (/login-help 등 우회 경로 차단)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- .disclaimer에 @include m.text-caption mixin 적용
- 유실된 nickname.ts 복구
- fallback 닉네임 Date.now() → 랜덤 8자리 숫자로 변경

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
html, body 태그에 suppressHydrationWarning 추가하여 브라우저
확장 프로그램의 DOM 조작으로 인한 hydration 불일치 에러를 방지한다.

Co-Authored-By: Claude <noreply@anthropic.com>
Add /terms and /privacy pages with 7 articles each covering
AI mediation service usage, AI data processing, liability limits,
and personal information handling. Both pages use text-only layout
with MUI ArrowBack icon for navigation.

Co-Authored-By: Claude <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 18, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
talky-owl Ready Ready Preview, Comment Jun 18, 2026 6:58am

@coderabbitai

coderabbitai Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

개인정보 처리방침(PrivacyPage)과 이용약관(TermsPage) 두 클라이언트 컴포넌트를 각각 신규 추가합니다. 개인정보 처리방침은 제1조제13조와 부칙으로, 이용약관은 제1조제15조와 부칙으로 구성되며 각각 전용 SCSS 모듈로 스타일링됩니다. 모든 페이지는 useRouter().back()을 호출하는 뒤로 가기 버튼을 포함합니다. 미들웨어 라우팅 설정에서 두 경로를 인증 미들웨어 제외 대상에 추가합니다.

Changes

법적 고지 페이지 추가

Layer / File(s) Summary
미들웨어 라우팅 설정 업데이트
src/middleware.ts
NextAuth config.matcher의 부정 매칭 정규식에 termsprivacy 경로를 추가하여 두 페이지에 대해 인증 미들웨어 적용을 제외합니다.
개인정보 처리방침 페이지 구현
src/app/(page)/privacy/page.tsx, src/app/(page)/privacy/privacy.module.scss
PrivacyPage 클라이언트 컴포넌트를 신규 추가하여 뒤로 가기 버튼(router.back())과 제1조~제13조 및 부칙을 정적 JSX 섹션으로 렌더링합니다. privacy.module.scss@use 기반 변수/함수/믹스인으로 페이지 컨테이너, 헤더, 백버튼, 타이틀, 섹션 레이아웃·타이포그래피·색상을 정의합니다.
이용약관 페이지 구현
src/app/(page)/terms/page.tsx, src/app/(page)/terms/terms.module.scss
TermsPage 클라이언트 컴포넌트를 신규 추가하여 뒤로 가기 버튼과 제1조~제15조 및 부칙을 정적 JSX 섹션으로 렌더링합니다. terms.module.scss는 Privacy 페이지와 동일한 SCSS 패턴으로 컨테이너, 헤더, 버튼, 타이틀, 섹션 스타일을 정의합니다.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • I5-Project/TALKY-OWL#50: 로그인 페이지에서 /terms/privacy 경로로 연결하는 링크가 포함되어 있으며, 이번 PR에서 해당 경로에 실제 페이지 컴포넌트를 구현합니다.

Poem

🐇 토끼가 깡충깡충, 약관 페이지 열었네
개인정보도 이용약관도 이제 제자리~
뒤로 가기 버튼 하나, 조항은 여럿 개
SCSS 모듈 입고 단정히 줄 맞춰 섰지
✨ 법적 고지 완성, 오늘도 평화롭다 🥕

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning PR 설명은 변경사항의 주요 내용과 테스트 계획을 포함하고 있으나, 저장소의 표준 템플릿에서 요구하는 대부분의 필수 섹션(작업 내용, 담당 영역, Issue, 요구사항, 보안 확인 등)이 누락되어 있습니다. 저장소의 표준 PR 템플릿을 따라 작업 내용, 담당 영역, 관련 Issue, 테스트 결과 체크리스트, 작업 범위 확인 등 필수 섹션을 모두 작성하여 제출하시기 바랍니다.
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 (3 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 이용약관 및 개인정보처리방침 페이지 추가라는 주요 변경사항을 명확하고 간결하게 요약하고 있습니다.
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 docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/common-component-jw

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

Add /terms and /privacy to middleware matcher exclusion list so
users can view these pages without logging in first.

Co-Authored-By: Claude <noreply@anthropic.com>

@coderabbitai coderabbitai 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.

Actionable comments posted: 6

🧹 Nitpick comments (3)
src/app/(page)/privacy/privacy.module.scss (1)

1-50: ⚖️ Poor tradeoff

코드 중복: terms.module.scss와 동일한 스타일

이 파일은 src/app/(page)/terms/terms.module.scss와 완전히 동일합니다. 공통 스타일을 별도 모듈로 추출하여 재사용하는 것을 고려해보세요.

예시 구조:

// src/styles/components/_legal-page.module.scss
`@use` '`@/styles/abstracts/variables`' as v;
`@use` '`@/styles/abstracts/functions`' as fn;
`@use` '`@/styles/abstracts/mixins`' as m;

.page { /* 공통 스타일 */ }
.header { /* 공통 스타일 */ }
// ...

그런 다음 각 페이지에서:

`@forward` '`@/styles/components/legal-page.module.scss`';
🤖 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/`(page)/privacy/privacy.module.scss around lines 1 - 50, The
privacy.module.scss file contains duplicate styles that are identical to
terms.module.scss. Create a new shared SCSS module at
src/styles/components/_legal-page.module.scss that contains all the common style
classes (.page, .header, .backButton, .title, .content, .section, .sectionTitle,
.sectionBody) and their SCSS abstracts imports. Then update privacy.module.scss
to use `@forward` to reference this shared legal-page module instead of defining
all these styles locally, and apply the same approach to terms.module.scss to
eliminate the duplication across both files.
src/app/(page)/privacy/page.tsx (2)

7-105: ⚖️ Poor tradeoff

코드 중복: terms/page.tsx와 유사한 구조

이 컴포넌트는 src/app/(page)/terms/page.tsx와 구조가 거의 동일합니다. 컴포넌트 구조를 공유 컴포넌트로 추출하고 콘텐츠를 props나 별도 파일로 분리하는 것을 고려해보세요.

예시 구조:

// components/LegalPage.tsx
export function LegalPage({ 
  title, 
  sections 
}: { 
  title: string; 
  sections: Array<{title: string; body: string}> 
}) {
  const router = useRouter();
  return (
    <div className={styles.page}>
      <header className={styles.header}>
        <button onClick={() => router.back()}>...</button>
        <h1>{title}</h1>
      </header>
      <main>
        {sections.map(section => ...)}
      </main>
    </div>
  );
}
🤖 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/`(page)/privacy/page.tsx around lines 7 - 105, The PrivacyPage
component duplicates the structural pattern used in the terms page. Extract the
common header, main content, and section rendering logic into a reusable
LegalPage component that accepts title and sections data as props. Create a
shared component in the components directory that takes a title string and an
array of section objects (each with title and body properties), then refactor
PrivacyPage to pass the privacy policy content as data to this shared component
rather than hardcoding the JSX structure. Apply the same refactoring to the
terms page to eliminate duplication.

13-20: 프로젝트 전반의 router.back() 엣지 케이스 처리 재검토 권장

검증 결과, router.back()은 privacy/page.tsx뿐 아니라 terms/page.tsx, disputes/[id]/statement/page.tsx 등 프로젝트 전반에서 공통적으로 사용되고 있으며, 어느 페이지에서도 히스토리 미존재 시 대체 동작(홈 리다이렉트 등)이 구현되어 있지 않습니다.

사용자가 외부 링크나 직접 URL 입력으로 진입한 경우 브라우저 히스토리가 없어 router.back()이 동작하지 않는 현황입니다. Next.js에서는 이 경우 에러를 발생시키지 않고 현재 페이지에 머물지만, 사용자 경험 측면에서 일관된 폴백 전략(예: 홈으로 리다이렉트)의 도입을 검토할 가치가 있습니다.

🤖 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/`(page)/privacy/page.tsx around lines 13 - 20, The router.back() call
in the back button click handler lacks fallback behavior when browser history is
unavailable, which occurs when users enter via direct URLs or external links.
Replace the simple router.back() call with a conditional check that first
attempts to go back, and if that fails (no history), implements a fallback
redirect to the home page. Apply this same pattern consistently across all pages
using this pattern (privacy/page.tsx, terms/page.tsx,
disputes/[id]/statement/page.tsx) to provide a uniform user experience when
browser history is not available.
🤖 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/`(page)/privacy/privacy.module.scss:
- Around line 42-45: The sectionTitle class in the SCSS file violates stylelint
formatting rules by missing a blank line between the `@include` directive and the
regular property declaration. Add a blank line between the `@include`
m.text-body-m statement and the font-weight property declaration to separate
at-rules from regular properties and comply with the stylelint configuration.
- Around line 17-24: The stylelint rule requires a blank line before the
background property declaration in the .backButton class. Add an empty line
between the `@include` m.flex-center statement and the background property to
satisfy the stylelint declaration-empty-line-before rule.
- Around line 47-50: The stylelint rule requires a blank line before property
declarations that follow different types of statements. In the .sectionBody
class, add a blank line between the `@include` m.text-body-s statement and the
color property declaration to comply with stylelint formatting rules.

In `@src/app/`(page)/terms/terms.module.scss:
- Around line 47-50: The Stylelint rule requires a blank line between the mixin
inclusion and property declarations in the .sectionBody style block. Add a blank
line between the `@include` m.text-body-s; statement and the color:
v.$color-black-400; property to comply with the formatting rules.
- Around line 17-24: The `.backButton` class styling violates stylelint rules by
missing a blank line between the `@include m.flex-center;` mixin declaration and
the following property declarations. Add a blank line after the `@include
m.flex-center;` statement to separate the mixin inclusion from the CSS property
block that follows (background, border, padding, etc.).
- Around line 42-45: The sectionTitle class in the terms.module.scss file
violates stylelint formatting rules by missing a blank line before the
font-weight declaration. Add a blank line between the `@include` m.text-body-m
directive and the font-weight property to comply with stylelint spacing
requirements for the sectionTitle selector.

---

Nitpick comments:
In `@src/app/`(page)/privacy/page.tsx:
- Around line 7-105: The PrivacyPage component duplicates the structural pattern
used in the terms page. Extract the common header, main content, and section
rendering logic into a reusable LegalPage component that accepts title and
sections data as props. Create a shared component in the components directory
that takes a title string and an array of section objects (each with title and
body properties), then refactor PrivacyPage to pass the privacy policy content
as data to this shared component rather than hardcoding the JSX structure. Apply
the same refactoring to the terms page to eliminate duplication.
- Around line 13-20: The router.back() call in the back button click handler
lacks fallback behavior when browser history is unavailable, which occurs when
users enter via direct URLs or external links. Replace the simple router.back()
call with a conditional check that first attempts to go back, and if that fails
(no history), implements a fallback redirect to the home page. Apply this same
pattern consistently across all pages using this pattern (privacy/page.tsx,
terms/page.tsx, disputes/[id]/statement/page.tsx) to provide a uniform user
experience when browser history is not available.

In `@src/app/`(page)/privacy/privacy.module.scss:
- Around line 1-50: The privacy.module.scss file contains duplicate styles that
are identical to terms.module.scss. Create a new shared SCSS module at
src/styles/components/_legal-page.module.scss that contains all the common style
classes (.page, .header, .backButton, .title, .content, .section, .sectionTitle,
.sectionBody) and their SCSS abstracts imports. Then update privacy.module.scss
to use `@forward` to reference this shared legal-page module instead of defining
all these styles locally, and apply the same approach to terms.module.scss to
eliminate the duplication across both files.
🪄 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: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 138568ad-a761-4c27-9cb7-f5b25ce0e63d

📥 Commits

Reviewing files that changed from the base of the PR and between 0c033b3 and 190053d.

📒 Files selected for processing (4)
  • src/app/(page)/privacy/page.tsx
  • src/app/(page)/privacy/privacy.module.scss
  • src/app/(page)/terms/page.tsx
  • src/app/(page)/terms/terms.module.scss

Comment on lines +17 to +24
.backButton {
@include m.flex-center;
background: none;
border: none;
padding: 0;
cursor: pointer;
color: v.$color-black-500;
}

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.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Stylelint 규칙 위반: 선언문 앞 빈 줄 누락

Line 19의 background 선언문 앞에 빈 줄이 필요합니다.

✨ 제안된 수정
 .backButton {
   `@include` m.flex-center;
+
   background: none;
   border: none;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.backButton {
@include m.flex-center;
background: none;
border: none;
padding: 0;
cursor: pointer;
color: v.$color-black-500;
}
.backButton {
`@include` m.flex-center;
background: none;
border: none;
padding: 0;
cursor: pointer;
color: v.$color-black-500;
}
🧰 Tools
🪛 Stylelint (17.13.0)

[error] 19-19: Expected empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)

🤖 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/`(page)/privacy/privacy.module.scss around lines 17 - 24, The
stylelint rule requires a blank line before the background property declaration
in the .backButton class. Add an empty line between the `@include` m.flex-center
statement and the background property to satisfy the stylelint
declaration-empty-line-before rule.

Source: Linters/SAST tools

Comment on lines +42 to +45
.sectionTitle {
@include m.text-body-m;
font-weight: v.$font-weight-semibold;
}

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.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Stylelint 규칙 위반: 선언문 앞 빈 줄 누락

Line 44의 font-weight 선언문 앞에 빈 줄이 필요합니다.

✨ 제안된 수정
 .sectionTitle {
   `@include` m.text-body-m;
+
   font-weight: v.$font-weight-semibold;
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.sectionTitle {
@include m.text-body-m;
font-weight: v.$font-weight-semibold;
}
.sectionTitle {
`@include` m.text-body-m;
font-weight: v.$font-weight-semibold;
}
🧰 Tools
🪛 Stylelint (17.13.0)

[error] 44-44: Expected empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)

🤖 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/`(page)/privacy/privacy.module.scss around lines 42 - 45, The
sectionTitle class in the SCSS file violates stylelint formatting rules by
missing a blank line between the `@include` directive and the regular property
declaration. Add a blank line between the `@include` m.text-body-m statement and
the font-weight property declaration to separate at-rules from regular
properties and comply with the stylelint configuration.

Source: Linters/SAST tools

Comment on lines +47 to +50
.sectionBody {
@include m.text-body-s;
color: v.$color-black-400;
}

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.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Stylelint 규칙 위반: 선언문 앞 빈 줄 누락

Line 49의 color 선언문 앞에 빈 줄이 필요합니다.

✨ 제안된 수정
 .sectionBody {
   `@include` m.text-body-s;
+
   color: v.$color-black-400;
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.sectionBody {
@include m.text-body-s;
color: v.$color-black-400;
}
.sectionBody {
`@include` m.text-body-s;
color: v.$color-black-400;
}
🧰 Tools
🪛 Stylelint (17.13.0)

[error] 49-49: Expected empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)

🤖 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/`(page)/privacy/privacy.module.scss around lines 47 - 50, The
stylelint rule requires a blank line before property declarations that follow
different types of statements. In the .sectionBody class, add a blank line
between the `@include` m.text-body-s statement and the color property declaration
to comply with stylelint formatting rules.

Source: Linters/SAST tools

Comment on lines +17 to +24
.backButton {
@include m.flex-center;
background: none;
border: none;
padding: 0;
cursor: pointer;
color: v.$color-black-500;
}

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.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Stylelint 규칙 위반: 선언문 앞 빈 줄 누락

Line 19의 background 선언문 앞에 빈 줄이 필요합니다.

✨ 제안된 수정
 .backButton {
   `@include` m.flex-center;
+
   background: none;
   border: none;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.backButton {
@include m.flex-center;
background: none;
border: none;
padding: 0;
cursor: pointer;
color: v.$color-black-500;
}
.backButton {
`@include` m.flex-center;
background: none;
border: none;
padding: 0;
cursor: pointer;
color: v.$color-black-500;
}
🧰 Tools
🪛 Stylelint (17.13.0)

[error] 19-19: Expected empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)

🤖 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/`(page)/terms/terms.module.scss around lines 17 - 24, The
`.backButton` class styling violates stylelint rules by missing a blank line
between the `@include m.flex-center;` mixin declaration and the following
property declarations. Add a blank line after the `@include m.flex-center;`
statement to separate the mixin inclusion from the CSS property block that
follows (background, border, padding, etc.).

Source: Linters/SAST tools

Comment on lines +42 to +45
.sectionTitle {
@include m.text-body-m;
font-weight: v.$font-weight-semibold;
}

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.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Stylelint 규칙 위반: 선언문 앞 빈 줄 누락

Line 44의 font-weight 선언문 앞에 빈 줄이 필요합니다.

✨ 제안된 수정
 .sectionTitle {
   `@include` m.text-body-m;
+
   font-weight: v.$font-weight-semibold;
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.sectionTitle {
@include m.text-body-m;
font-weight: v.$font-weight-semibold;
}
.sectionTitle {
`@include` m.text-body-m;
font-weight: v.$font-weight-semibold;
}
🧰 Tools
🪛 Stylelint (17.13.0)

[error] 44-44: Expected empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)

🤖 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/`(page)/terms/terms.module.scss around lines 42 - 45, The
sectionTitle class in the terms.module.scss file violates stylelint formatting
rules by missing a blank line before the font-weight declaration. Add a blank
line between the `@include` m.text-body-m directive and the font-weight property
to comply with stylelint spacing requirements for the sectionTitle selector.

Source: Linters/SAST tools

Comment thread src/app/(page)/terms/terms.module.scss
@evenif99 evenif99 self-assigned this Jun 18, 2026
Expand terms of service to 15 articles and privacy policy to 13
articles with detailed service-specific content. Update header
layout to center-aligned title with ArrowBackIosNew icon and
bottom border matching existing Header component style.

Co-Authored-By: Claude <noreply@anthropic.com>

@coderabbitai coderabbitai 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.

Actionable comments posted: 3

♻️ Duplicate comments (2)
src/app/(page)/privacy/privacy.module.scss (1)

18-27: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Stylelint 규칙 위반: 이전에 보고된 문제 지속

다음 위치에서 @include 지시문 다음 빈 줄 누락 문제가 여전히 존재합니다:

  • Line 20: .backButtonwidth 선언문 앞
  • Line 54: .sectionTitlefont-weight 선언문 앞
  • Line 65: .sectionBodycolor 선언문 앞

이 문제들은 이전 리뷰에서 이미 지적되었으나 아직 수정되지 않았습니다.

✨ 제안된 수정
 .backButton {
   `@include` m.flex-center;
+
   width: fn.r(40);
 .sectionTitle {
   `@include` m.text-body-m;
+
   font-weight: v.$font-weight-semibold;
 }
 .sectionBody {
   `@include` m.text-body-s;
+
   color: v.$color-black-400;

Also applies to: 52-55, 63-70

🤖 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/`(page)/privacy/privacy.module.scss around lines 18 - 27, Add a blank
line after each `@include` directive in the SCSS file to comply with stylelint
rules. Specifically, in the `.backButton` rule, insert a blank line between the
`@include m.flex-center;` directive and the `width` property declaration. Also
apply the same fix to the `.sectionTitle` rule (between `@include` and
`font-weight`) and the `.sectionBody` rule (between `@include` and `color`) as
noted in the comment. This ensures consistent formatting where `@include`
directives are always followed by a blank line before other property
declarations.

Source: Linters/SAST tools

src/app/(page)/terms/terms.module.scss (1)

18-27: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Stylelint 규칙 위반: 이전에 보고된 문제 지속

다음 위치에서 @include 지시문 다음 빈 줄 누락 문제가 여전히 존재합니다:

  • Line 20: .backButtonwidth 선언문 앞
  • Line 54: .sectionTitlefont-weight 선언문 앞
  • Line 59: .sectionBodycolor 선언문 앞

이 문제들은 이전 리뷰에서 이미 지적되었으나 아직 수정되지 않았습니다.

✨ 제안된 수정
 .backButton {
   `@include` m.flex-center;
+
   width: fn.r(40);
 .sectionTitle {
   `@include` m.text-body-m;
+
   font-weight: v.$font-weight-semibold;
 }
 .sectionBody {
   `@include` m.text-body-s;
+
   color: v.$color-black-400;

Also applies to: 52-55, 57-64

🤖 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/`(page)/terms/terms.module.scss around lines 18 - 27, The SCSS file
violates stylelint rules requiring a blank line after `@include` directives. In
the .backButton selector, add a blank line between the `@include` m.flex-center
directive and the width property. Similarly, add blank lines after `@include`
directives in the .sectionTitle selector (before the font-weight property) and
in the .sectionBody selector (before the color property). Ensure all property
declarations that follow `@include` statements have a blank line separating them
to comply with stylelint formatting requirements.

Source: Linters/SAST tools

🤖 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/`(page)/privacy/page.tsx:
- Line 16: The onClick handler for the back button in the privacy page component
uses only router.back() without a fallback, which will fail or cause unexpected
behavior when users access the page directly through bookmarks or external links
with no browser history. Modify the onClick handler on the back button to
implement a fallback navigation strategy: first attempt to go back using
router.back(), and if no history exists, navigate to a default route (such as
the home page) using router.push(). This ensures the button works reliably
regardless of how users arrive at the privacy page.

In `@src/app/`(page)/privacy/privacy.module.scss:
- Around line 57-61: In the `.intro` class in the privacy.module.scss file, add
a blank line after the `@include` m.text-body-s; directive and before the color
property declaration. The blank line is required by stylelint rules to separate
`@include` directives from regular property declarations that follow them.

In `@src/app/`(page)/terms/page.tsx:
- Line 16: The onClick handler using router.back() may fail when users access
the page directly via bookmarks or external links since there is no browser
history. Modify the onClick handler to include a fallback behavior: check if
there is browser history available using the useRouter hook, and if not,
navigate to a default route (such as "/" or a parent page) instead of calling
router.back() unconditionally. This ensures the back button always provides a
functional navigation experience regardless of how the user accessed the page.

---

Duplicate comments:
In `@src/app/`(page)/privacy/privacy.module.scss:
- Around line 18-27: Add a blank line after each `@include` directive in the
SCSS file to comply with stylelint rules. Specifically, in the `.backButton`
rule, insert a blank line between the `@include m.flex-center;` directive and
the `width` property declaration. Also apply the same fix to the `.sectionTitle`
rule (between `@include` and `font-weight`) and the `.sectionBody` rule (between
`@include` and `color`) as noted in the comment. This ensures consistent
formatting where `@include` directives are always followed by a blank line
before other property declarations.

In `@src/app/`(page)/terms/terms.module.scss:
- Around line 18-27: The SCSS file violates stylelint rules requiring a blank
line after `@include` directives. In the .backButton selector, add a blank line
between the `@include` m.flex-center directive and the width property. Similarly,
add blank lines after `@include` directives in the .sectionTitle selector (before
the font-weight property) and in the .sectionBody selector (before the color
property). Ensure all property declarations that follow `@include` statements have
a blank line separating them to comply with stylelint formatting requirements.
🪄 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: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: dda3c622-8595-4505-95f3-7049d4b202e9

📥 Commits

Reviewing files that changed from the base of the PR and between 6bcc20c and 8e97c5b.

📒 Files selected for processing (5)
  • src/app/(page)/privacy/page.tsx
  • src/app/(page)/privacy/privacy.module.scss
  • src/app/(page)/terms/page.tsx
  • src/app/(page)/terms/terms.module.scss
  • src/middleware.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/middleware.ts

<button
type="button"
className={styles.backButton}
onClick={() => router.back()}

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.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

뒤로 가기 버튼에 대체 동작 추가를 권장합니다.

사용자가 북마크나 외부 링크를 통해 이 페이지에 직접 접근한 경우, 브라우저 히스토리가 없어 router.back()이 작동하지 않거나 예상치 못한 동작을 할 수 있습니다.

개선된 구현 제안
-        onClick={() => router.back()}
+        onClick={() => {
+          if (window.history.length > 1) {
+            router.back();
+          } else {
+            router.push('/');
+          }
+        }}

또는 더 간단하게:

-        onClick={() => router.back()}
+        onClick={() => router.push('/')}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
onClick={() => router.back()}
onClick={() => router.push('/')}
🤖 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/`(page)/privacy/page.tsx at line 16, The onClick handler for the back
button in the privacy page component uses only router.back() without a fallback,
which will fail or cause unexpected behavior when users access the page directly
through bookmarks or external links with no browser history. Modify the onClick
handler on the back button to implement a fallback navigation strategy: first
attempt to go back using router.back(), and if no history exists, navigate to a
default route (such as the home page) using router.push(). This ensures the
button works reliably regardless of how users arrive at the privacy page.

Comment on lines +57 to +61
.intro {
@include m.text-body-s;
color: v.$color-black-400;
margin-bottom: fn.r(8);
}

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.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Stylelint 규칙 위반: @include 후 빈 줄 누락

.intro 클래스의 line 59 color 선언문 앞에 빈 줄이 필요합니다. @include 지시문 다음에 일반 속성 선언이 올 때는 빈 줄로 구분해야 합니다.

✨ 제안된 수정
 .intro {
   `@include` m.text-body-s;
+
   color: v.$color-black-400;
   margin-bottom: fn.r(8);
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.intro {
@include m.text-body-s;
color: v.$color-black-400;
margin-bottom: fn.r(8);
}
.intro {
`@include` m.text-body-s;
color: v.$color-black-400;
margin-bottom: fn.r(8);
}
🧰 Tools
🪛 Stylelint (17.13.0)

[error] 59-59: Expected empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)

🤖 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/`(page)/privacy/privacy.module.scss around lines 57 - 61, In the
`.intro` class in the privacy.module.scss file, add a blank line after the
`@include` m.text-body-s; directive and before the color property declaration. The
blank line is required by stylelint rules to separate `@include` directives from
regular property declarations that follow them.

Source: Linters/SAST tools

<button
type="button"
className={styles.backButton}
onClick={() => router.back()}

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.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

뒤로 가기 버튼에 대체 동작 추가를 권장합니다.

사용자가 북마크나 외부 링크를 통해 이 페이지에 직접 접근한 경우, 브라우저 히스토리가 없어 router.back()이 작동하지 않거나 예상치 못한 동작을 할 수 있습니다.

개선된 구현 제안
-        onClick={() => router.back()}
+        onClick={() => {
+          if (window.history.length > 1) {
+            router.back();
+          } else {
+            router.push('/');
+          }
+        }}

또는 더 간단하게:

-        onClick={() => router.back()}
+        onClick={() => router.push('/')}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
onClick={() => router.back()}
onClick={() => {
if (window.history.length > 1) {
router.back();
} else {
router.push('/');
}
}}
Suggested change
onClick={() => router.back()}
onClick={() => router.push('/')}
🤖 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/`(page)/terms/page.tsx at line 16, The onClick handler using
router.back() may fail when users access the page directly via bookmarks or
external links since there is no browser history. Modify the onClick handler to
include a fallback behavior: check if there is browser history available using
the useRouter hook, and if not, navigate to a default route (such as "/" or a
parent page) instead of calling router.back() unconditionally. This ensures the
back button always provides a functional navigation experience regardless of how
the user accessed the page.

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