Skip to content
Merged
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -173,11 +173,11 @@ App Router์˜ ์ผ๋ฐ˜ ์ƒ์„ธ ํŽ˜์ด์ง€์™€ ๋ชจ๋‹ฌ ์ƒ์„ธ ํŽ˜์ด์ง€๊ฐ€ ๊ฐ™์€ ๋ฐ
In-App ์•Œ๋ฆผ, PWA Web Push, ํ‚ค์›Œ๋“œ/์ง€์—ญ ์•Œ๋ฆผ, ์ฑ„ํŒ…/๊ฑฐ๋ž˜/๋ฐฉ์†ก/์‹œ์Šคํ…œ ์•Œ๋ฆผ ์„ค์ •

- **Admin**
์‹ ๊ณ  ์ฒ˜๋ฆฌ, ์ฝ˜ํ…์ธ  ์กฐ์น˜, ์œ ์ € ์ œ์žฌ, ๊ฐ์‚ฌ ๋กœ๊ทธ, ๊ด€๋ฆฌ์ž ์ธ์‚ฌ์ดํŠธ
์‹ ๊ณ  ์ฒ˜๋ฆฌ, ์ฝ˜ํ…์ธ  ์กฐ์น˜, ์œ ์ € ์ œ์žฌ, ๊ฐ์‚ฌ ๋กœ๊ทธ, ECharts ๊ธฐ๋ฐ˜ ๊ด€๋ฆฌ์ž ์ธ์‚ฌ์ดํŠธ

## Tech Stack

- **Frontend:** Next.js 14 App Router, React 18, TypeScript, Tailwind CSS, Framer Motion, Floating UI
- **Frontend:** Next.js 14 App Router, React 18, TypeScript, Tailwind CSS, Framer Motion, Floating UI, Apache ECharts
- **State:** TanStack Query v5, Zustand
- **Backend/Data:** Prisma, PostgreSQL, iron-session
- **Realtime/Infra:** Supabase Realtime, Cloudflare Stream/Images, Web Push API, next-pwa, Vercel
Expand Down
134 changes: 134 additions & 0 deletions app/(public)/privacy/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
/**
* File Name : app/(public)/privacy/page.tsx
* Description : BoardPort ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ํŽ˜์ด์ง€
* Author : ์ž„๋„ํ—Œ
*
* History
* Date Author Status Description
* 2026.07.06 ์ž„๋„ํ—Œ Created ๊ณต๊ฐœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ํŽ˜์ด์ง€ ์ถ”๊ฐ€
*/
import type { Metadata } from "next";
import Link from "next/link";
import BackButton from "@/components/global/BackButton";

export const metadata: Metadata = {
title: "๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ",
description: "BoardPort ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ์ž…๋‹ˆ๋‹ค.",
};

const sections = [
{
title: "1. ์ˆ˜์ง‘ํ•˜๋Š” ๊ฐœ์ธ์ •๋ณด",
body: [
"BoardPort๋Š” ํšŒ์› ๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ํ”„๋กœํ•„ ์„ค์ •, ๊ฑฐ๋ž˜/์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ ์ œ๊ณต์„ ์œ„ํ•ด ์ด๋ฉ”์ผ, ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ, ๋‹‰๋„ค์ž„, ํ”„๋กœํ•„ ์ด๋ฏธ์ง€, ์„ ํƒํ•œ ํ™œ๋™ ์ง€์—ญ ๋ฐ ๊ฑฐ๋ž˜ ์ง€์—ญ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์ƒํ’ˆ, ๊ฒŒ์‹œ๊ธ€, ๋Œ“๊ธ€, ์ฑ„ํŒ…, ๋ฐฉ์†ก/VOD, ์ด๋ฏธ์ง€, ์˜์ƒ, ์‹ ๊ณ , ๋ฆฌ๋ทฐ ๋“ฑ ์ด์šฉ์ž๊ฐ€ ์„œ๋น„์Šค์— ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜ ์ฃผ๊ณ ๋ฐ›์€ ์ฝ˜ํ…์ธ ์™€ ํ™œ๋™ ๊ธฐ๋ก์ด ์ €์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์„œ๋น„์Šค ์•ˆ์ •์„ฑ, ๋ณด์•ˆ, ๋ถ€์ • ์ด์šฉ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด IP ์ฃผ์†Œ, ์ ‘์† ๋กœ๊ทธ, ๊ธฐ๊ธฐ/๋ธŒ๋ผ์šฐ์ € ์ •๋ณด, ์ฟ ํ‚ค, ์•Œ๋ฆผ ๊ตฌ๋… ์ •๋ณด, rate limit ๊ธฐ๋ก์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
],
},
{
title: "2. ๊ฐœ์ธ์ •๋ณด ์ด์šฉ ๋ชฉ์ ",
body: [
"๊ณ„์ • ์ƒ์„ฑ๊ณผ ๋กœ๊ทธ์ธ, ๋ณธ์ธ ํ™•์ธ, SMS/์ด๋ฉ”์ผ ์ธ์ฆ, ํ”„๋กœํ•„ ๊ด€๋ฆฌ ๋“ฑ ํšŒ์› ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.",
"์ƒํ’ˆ ๊ฑฐ๋ž˜, ์ฑ„ํŒ… ์•ฝ์†, ๊ฒŒ์‹œ๊ธ€, ๋ฐฉ์†ก/VOD, ์•Œ๋ฆผ, ์‹ ๊ณ  ์ฒ˜๋ฆฌ, ๊ด€๋ฆฌ์ž ์šด์˜ ๋“ฑ ์„œ๋น„์Šค ๊ธฐ๋Šฅ ์ œ๊ณต์„ ์œ„ํ•ด ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.",
"์„œ๋น„์Šค ๋ณด์•ˆ, ์ŠคํŒธ ๋ฐ ์ž๋™ํ™” ์š”์ฒญ ๋ฐฉ์ง€, ์žฅ์•  ๋Œ€์‘, ์ด์šฉ ์ œํ•œ ๋ฐ ์šด์˜ ์ •์ฑ… ์ง‘ํ–‰์„ ์œ„ํ•ด ์ ‘์† ๊ธฐ๋ก๊ณผ ์š”์ฒญ ์ •๋ณด๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
],
},
{
title: "3. ์ง€์—ญ ์ •๋ณด ์ฒ˜๋ฆฌ",
body: [
"BoardPort๋Š” ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ž๋™์œผ๋กœ ์ถ”์ ํ•˜๋Š” ์œ„์น˜๊ธฐ๋ฐ˜์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
"์ด์šฉ์ž๊ฐ€ ์ง์ ‘ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ž…๋ ฅํ•œ ํ™œ๋™ ์ง€์—ญ๊ณผ ๊ฑฐ๋ž˜ ์ง€์—ญ์€ ์ƒํ’ˆ ๋ชฉ๋ก, ๊ฒŒ์‹œ๊ธ€ ํ”ผ๋“œ, ์•Œ๋ฆผ, ์ง๊ฑฐ๋ž˜ ์•ฝ์† ๋“ฑ ์ง€์—ญ ๊ธฐ๋ฐ˜ ํ™”๋ฉด์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.",
],
},
{
title: "4. ์™ธ๋ถ€ ์„œ๋น„์Šค์™€ ์ฒ˜๋ฆฌ ์œ„ํƒ",
body: [
"์„œ๋น„์Šค ์šด์˜์„ ์œ„ํ•ด Vercel, Supabase/PostgreSQL, Cloudflare Images/Stream, CoolSMS, Resend, ๋ธŒ๋ผ์šฐ์ €/์šด์˜์ฒด์ œ์˜ Web Push ์ธํ”„๋ผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์ด๋ฏธ์ง€์™€ ์˜์ƒ ์—…๋กœ๋“œ, ๋ผ์ด๋ธŒ/VOD ์ฒ˜๋ฆฌ, SMS ์ธ์ฆ, ์ด๋ฉ”์ผ ์ธ์ฆ, ์•Œ๋ฆผ ์ „์†ก, ์„œ๋น„์Šค ๋ฐฐํฌ์™€ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ •๋ณด๊ฐ€ ๊ฐ ์™ธ๋ถ€ ์„œ๋น„์Šค๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์™ธ๋ถ€ ์„œ๋น„์Šค๋Š” ๊ฐ์ž์˜ ๋ณด์•ˆ ๋ฐ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ ๊ธฐ์ค€์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.",
],
},
{
title: "5. ๋ณด์œ  ๋ฐ ํŒŒ๊ธฐ",
body: [
"๊ฐœ์ธ์ •๋ณด๋Š” ์„œ๋น„์Šค ์ œ๊ณต๊ณผ ์šด์˜ ๋ชฉ์ ์ด ๋‹ฌ์„ฑ๋  ๋•Œ๊นŒ์ง€ ๋ณด๊ด€ํ•˜๋ฉฐ, ํšŒ์› ํƒˆํ‡ด ๋˜๋Š” ์‚ญ์ œ ์š”์ฒญ ์‹œ ๊ด€๋ จ ๋ฒ•๋ น๊ณผ ์šด์˜์ƒ ํ•„์š”ํ•œ ๋ฒ”์œ„๋ฅผ ์ œ์™ธํ•˜๊ณ  ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๋น„์‹๋ณ„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.",
"์‹ ๊ณ , ์ œ์žฌ, ๊ฐ์‚ฌ ๋กœ๊ทธ, ๋ณด์•ˆ ๊ธฐ๋ก ๋“ฑ ๋ถ„์Ÿ ๋Œ€์‘๊ณผ ์„œ๋น„์Šค ์•ˆ์ „์„ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •๋ณด๋Š” ์ผ์ • ๊ธฐ๊ฐ„ ๋ณด๊ด€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"SMS ์ธ์ฆ๋ฒˆํ˜ธ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ํ† ํฐ ๋“ฑ ์ผํšŒ์„ฑ ์ธ์ฆ ์ •๋ณด๋Š” ์ •ํ•ด์ง„ ์œ ํšจ ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์„œ๋น„์Šค ์š”์ฒญ ์‹œ ์ง€์—ฐ ์ •๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
],
},
{
title: "6. ์ด์šฉ์ž์˜ ๊ถŒ๋ฆฌ",
body: [
"์ด์šฉ์ž๋Š” ์ž์‹ ์˜ ๊ฐœ์ธ์ •๋ณด์— ๋Œ€ํ•ด ์—ด๋žŒ, ์ •์ •, ์‚ญ์ œ, ํƒˆํ‡ด๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์„œ๋น„์Šค ํ™”๋ฉด์—์„œ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” ์ •๋ณด๋‚˜ ์ถ”๊ฐ€ ์š”์ฒญ์€ ์šด์˜์ž ๋ฌธ์˜๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"๋ฒ•๋ น์ƒ ๋ณด๊ด€์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋ถ€์ • ์ด์šฉ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •๋ณด๋Š” ์š”์ฒญ ์ฆ‰์‹œ ์‚ญ์ œ๊ฐ€ ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
],
},
{
title: "7. ์ฟ ํ‚ค, ๋กœ๊ทธ, ์•Œ๋ฆผ",
body: [
"์„œ๋น„์Šค๋Š” ๋กœ๊ทธ์ธ ์„ธ์…˜ ์œ ์ง€, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ , ๋ณด์•ˆ ํ™•์ธ์„ ์œ„ํ•ด ์ฟ ํ‚ค์™€ ๋ธŒ๋ผ์šฐ์ € ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"Web Push ์•Œ๋ฆผ์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” ๊ธฐ๊ธฐ์—์„œ ๋ฐœ๊ธ‰ํ•œ ํ‘ธ์‹œ ๊ตฌ๋… ์ •๋ณด๊ฐ€ ์ €์žฅ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด์šฉ์ž๋Š” ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” ์„œ๋น„์Šค ์„ค์ •์—์„œ ์•Œ๋ฆผ์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
],
},
{
title: "8. ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฌธ์˜",
body: [
"๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จํ•œ ๋ฌธ์˜๋Š” ์„œ๋น„์Šค ์šด์˜์ž ์ด๋ฉ”์ผ๋กœ ์ ‘์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"๋ฌธ์˜์ฒ˜: ldh2233@gmail.com",
],
},
{
title: "9. ๋ฐฉ์นจ ๋ณ€๊ฒฝ",
body: [
"๋ณธ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ์€ ์„œ๋น„์Šค ๊ธฐ๋Šฅ, ์šด์˜ ํ™˜๊ฒฝ, ๋ฒ•๋ น ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ ์ˆ˜์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์ค‘์š”ํ•œ ๋ณ€๊ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋น„์Šค ํ™”๋ฉด ๋˜๋Š” ๊ณต์ง€์‚ฌํ•ญ์„ ํ†ตํ•ด ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.",
],
},
];

export default function PrivacyPage() {
return (
<main className="min-h-screen bg-background px-page-x pt-4 pb-10 text-primary">
<article className="mx-auto w-full max-w-2xl space-y-8">
<header className="space-y-3 border-b border-border-subtle pb-6">
<BackButton fallbackHref="/" variant="inline" label="์ด์ „ ํ™”๋ฉด์œผ๋กœ ์ด๋™" />
<div className="space-y-2">
<h1 className="text-2xl font-bold tracking-tight">
๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ
</h1>
<p className="text-sm leading-relaxed text-muted">
์‹œํ–‰์ผ: 2026๋…„ 7์›” 6์ผ
</p>
</div>
</header>

<div className="space-y-7">
{sections.map((section) => (
<section key={section.title} className="space-y-3">
<h2 className="text-base font-bold text-primary">
{section.title}
</h2>
<div className="space-y-2 text-sm leading-7 text-muted">
{section.body.map((paragraph) => (
<p key={paragraph}>{paragraph}</p>
))}
</div>
</section>
))}
</div>

<footer className="border-t border-border-subtle pt-6 text-sm text-muted">
์„œ๋น„์Šค ์ด์šฉ ์กฐ๊ฑด์€{" "}
<Link
href="/terms"
className="focus-ring-soft rounded-md font-medium text-brand transition-colors hover:underline dark:text-brand-light"
>
์ด์šฉ์•ฝ๊ด€
</Link>
์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
</footer>
</article>
</main>
);
}
135 changes: 135 additions & 0 deletions app/(public)/terms/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
/**
* File Name : app/(public)/terms/page.tsx
* Description : BoardPort ์„œ๋น„์Šค ์ด์šฉ์•ฝ๊ด€ ํŽ˜์ด์ง€
* Author : ์ž„๋„ํ—Œ
*
* History
* Date Author Status Description
* 2026.07.06 ์ž„๋„ํ—Œ Created ๊ณต๊ฐœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค ์ด์šฉ์•ฝ๊ด€ ํŽ˜์ด์ง€ ์ถ”๊ฐ€
*/
import type { Metadata } from "next";
import Link from "next/link";
import BackButton from "@/components/global/BackButton";

export const metadata: Metadata = {
title: "์ด์šฉ์•ฝ๊ด€",
description: "BoardPort ์„œ๋น„์Šค ์ด์šฉ์•ฝ๊ด€์ž…๋‹ˆ๋‹ค.",
};

const sections = [
{
title: "1. ๋ชฉ์ ",
body: [
"๋ณธ ์•ฝ๊ด€์€ BoardPort๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ณด๋“œ๊ฒŒ์ž„ ๊ฑฐ๋ž˜, ์ปค๋ฎค๋‹ˆํ‹ฐ, ์ฑ„ํŒ…, ๋ฐฉ์†ก/VOD, ์•Œ๋ฆผ ๋ฐ ๊ด€๋ จ ์„œ๋น„์Šค์˜ ์ด์šฉ ์กฐ๊ฑด๊ณผ ์ ˆ์ฐจ, ์ด์šฉ์ž์™€ ์„œ๋น„์Šค์˜ ๊ถŒ๋ฆฌ์™€ ์˜๋ฌด๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค.",
"BoardPort๋Š” ์šด์˜ ๊ณผ์ •์—์„œ ์„œ๋น„์Šค ๋ฒ”์œ„์™€ ์ •์ฑ…์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์„œ๋น„์Šค ํ™”๋ฉด ๋˜๋Š” ๊ณต์ง€์‚ฌํ•ญ์„ ํ†ตํ•ด ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.",
],
},
{
title: "2. ๊ณ„์ •๊ณผ ์ด์šฉ ์ž๊ฒฉ",
body: [
"์ด์šฉ์ž๋Š” ์ด๋ฉ”์ผ, ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ, ์†Œ์…œ ๋กœ๊ทธ์ธ ๋“ฑ ์„œ๋น„์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ณ„์ •์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์ด์šฉ์ž๋Š” ๊ฐ€์ž… ๋ฐ ์„œ๋น„์Šค ์ด์šฉ ๊ณผ์ •์—์„œ ์ •ํ™•ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋ฉฐ, ํƒ€์ธ์˜ ๊ณ„์ • ๋˜๋Š” ์ธ์ฆ ์ˆ˜๋‹จ์„ ๋ฌด๋‹จ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.",
"์„œ๋น„์Šค๋Š” ๋ณด์•ˆ, ์ŠคํŒธ ๋ฐฉ์ง€, ์šด์˜ ์ •์ฑ… ์œ„๋ฐ˜ ๋Œ€์‘์„ ์œ„ํ•ด ๊ณ„์ • ์ƒ์„ฑ, ๋กœ๊ทธ์ธ, SMS ์ธ์ฆ ๋“ฑ ์ผ๋ถ€ ์š”์ฒญ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
],
},
{
title: "3. ๊ฒŒ์‹œ๋ฌผ๊ณผ ๊ฑฐ๋ž˜ ํ™œ๋™",
body: [
"์ด์šฉ์ž๋Š” ์ƒํ’ˆ, ๊ฒŒ์‹œ๊ธ€, ๋Œ“๊ธ€, ์ฑ„ํŒ…, ๋ฐฉ์†ก, ์ด๋ฏธ์ง€, ์˜์ƒ ๋“ฑ ์ž์‹ ์ด ๋“ฑ๋กํ•œ ์ฝ˜ํ…์ธ ์™€ ๊ฑฐ๋ž˜ ํ™œ๋™์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ์ง‘๋‹ˆ๋‹ค.",
"BoardPort๋Š” ์ด์šฉ์ž ๊ฐ„ ๊ฑฐ๋ž˜์˜ ์ค‘๊ฐœ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฐœ๋ณ„ ๊ฑฐ๋ž˜์˜ ๋‹น์‚ฌ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.",
"ํ—ˆ์œ„ ์ •๋ณด, ํƒ€์ธ์˜ ๊ถŒ๋ฆฌ ์นจํ•ด, ๋ถˆ๋ฒ• ๋ฌผํ’ˆ ๊ฑฐ๋ž˜, ์š•์„ค ๋˜๋Š” ๊ดด๋กญํž˜, ์„œ๋น„์Šค ์šด์˜์„ ๋ฐฉํ•ดํ•˜๋Š” ํ–‰์œ„๋Š” ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
],
},
{
title: "4. ์ฑ„ํŒ…๊ณผ ์•ฝ์†",
body: [
"์ด์šฉ์ž๋Š” ์ƒํ’ˆ ๊ฑฐ๋ž˜๋ฅผ ์œ„ํ•ด ์ฑ„ํŒ…๊ณผ ์•ฝ์† ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์•ฝ์† ์ˆ˜๋ฝ, ์ทจ์†Œ, ๊ฑฐ์ ˆ ๋“ฑ ๊ฑฐ๋ž˜ ์ƒํƒœ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ํ–‰์œ„๋Š” ์„œ๋น„์Šค ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ์ƒํƒœ์™€ ์•Œ๋ฆผ์— ๋ฐ˜์˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์ด์šฉ์ž๋Š” ์‹ค์ œ ๊ฑฐ๋ž˜ ๊ณผ์ •์—์„œ ์ƒ๋Œ€๋ฐฉ๊ณผ ์ถฉ๋ถ„ํžˆ ํ™•์ธํ•˜๊ณ , ์•ˆ์ „ํ•œ ์žฅ์†Œ์™€ ๋ฐฉ์‹์œผ๋กœ ๊ฑฐ๋ž˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
],
},
{
title: "5. ์‹ ๊ณ , ์ œ์žฌ, ์ฝ˜ํ…์ธ  ์กฐ์น˜",
body: [
"์ด์šฉ์ž๋Š” ๋ถ€์ ์ ˆํ•œ ์ƒํ’ˆ, ๊ฒŒ์‹œ๊ธ€, ๋ฐฉ์†ก, ํ”„๋กœํ•„, ์‚ฌ์šฉ์ž ํ–‰์œ„๋ฅผ ์‹ ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์„œ๋น„์Šค๋Š” ์‹ ๊ณ  ๋‚ด์šฉ, ์šด์˜ ์ •์ฑ… ์œ„๋ฐ˜ ์—ฌ๋ถ€, ์„œ๋น„์Šค ์•ˆ์ •์„ฑ ๋“ฑ์„ ๊ฒ€ํ† ํ•ด ์ฝ˜ํ…์ธ  ์ˆจ๊น€, ์‚ญ์ œ, ๊ณ„์ • ์ œํ•œ, ์ •์ง€ ๋“ฑ์˜ ์กฐ์น˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"๋ช…๋ฐฑํ•œ ์œ„๋ฐ˜ ๋˜๋Š” ๊ธด๊ธ‰ํ•œ ํ”ผํ•ด ๋ฐฉ์ง€๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์ „ ์•ˆ๋‚ด ์—†์ด ์ž„์‹œ ์กฐ์น˜๊ฐ€ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
],
},
{
title: "6. ์„œ๋น„์Šค ๋ณ€๊ฒฝ๊ณผ ์ค‘๋‹จ",
body: [
"์„œ๋น„์Šค๋Š” ๊ธฐ๋Šฅ ๊ฐœ์„ , ๋ณด์•ˆ ์กฐ์น˜, ์žฅ์•  ๋Œ€์‘, ์™ธ๋ถ€ ์„œ๋น„์Šค ์—ฐ๋™ ์ƒํƒœ ๋“ฑ์— ๋”ฐ๋ผ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"Cloudflare, Supabase, Vercel, SMS/์ด๋ฉ”์ผ ๋ฐœ์†ก ์„œ๋น„์Šค ๋“ฑ ์™ธ๋ถ€ ์„œ๋น„์Šค ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ผ๋ถ€ ๊ธฐ๋Šฅ ์ด์šฉ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
],
},
{
title: "7. ๋ฉด์ฑ…",
body: [
"BoardPort๋Š” ์ด์šฉ์ž ๊ฐ„ ๊ฑฐ๋ž˜, ๊ฒŒ์‹œ๋ฌผ, ์ฑ„ํŒ… ๋‚ด์šฉ, ์™ธ๋ถ€ ๋งํฌ ๋˜๋Š” ์ด์šฉ์ž๊ฐ€ ๋“ฑ๋กํ•œ ์ฝ˜ํ…์ธ ์˜ ์ •ํ™•์„ฑ๊ณผ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์ฆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
"์ด์šฉ์ž์˜ ๊ท€์ฑ… ์‚ฌ์œ , ์™ธ๋ถ€ ์„œ๋น„์Šค ์žฅ์• , ์ฒœ์žฌ์ง€๋ณ€ ๋˜๋Š” ์ด์— ์ค€ํ•˜๋Š” ์‚ฌ์œ ๋กœ ๋ฐœ์ƒํ•œ ์†ํ•ด์— ๋Œ€ํ•ด์„œ๋Š” ์ฑ…์ž„์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
],
},
{
title: "8. ์•ฝ๊ด€ ๋ณ€๊ฒฝ",
body: [
"์„œ๋น„์Šค๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ณธ ์•ฝ๊ด€์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋น„์Šค ํ™”๋ฉด ๋˜๋Š” ๊ณต์ง€์‚ฌํ•ญ์„ ํ†ตํ•ด ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.",
"๋ณ€๊ฒฝ๋œ ์•ฝ๊ด€์€ ๋ณ„๋„ ์‹œํ–‰์ผ์„ ์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ฒŒ์‹œ๋œ ๋‚ ๋ถ€ํ„ฐ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.",
],
},
{
title: "9. ๋ฌธ์˜",
body: [
"์„œ๋น„์Šค ์ด์šฉ, ์•ฝ๊ด€, ์šด์˜ ์ •์ฑ…๊ณผ ๊ด€๋ จํ•œ ๋ฌธ์˜๋Š” ์šด์˜์ž ์ด๋ฉ”์ผ๋กœ ์ ‘์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"๋ฌธ์˜์ฒ˜: ldh2233@gmail.com",
],
},
];

export default function TermsPage() {
return (
<main className="min-h-screen bg-background px-page-x pt-4 pb-10 text-primary">
<article className="mx-auto w-full max-w-2xl space-y-8">
<header className="space-y-3 border-b border-border-subtle pb-6">
<BackButton
fallbackHref="/"
variant="inline"
label="์ด์ „ ํ™”๋ฉด์œผ๋กœ ์ด๋™"
/>
<div className="space-y-2">
<h1 className="text-2xl font-bold tracking-tight">์ด์šฉ์•ฝ๊ด€</h1>
<p className="text-sm leading-relaxed text-muted">
์‹œํ–‰์ผ: 2026๋…„ 7์›” 6์ผ
</p>
</div>
</header>

<div className="space-y-7">
{sections.map((section) => (
<section key={section.title} className="space-y-3">
<h2 className="text-base font-bold text-primary">
{section.title}
</h2>
<div className="space-y-2 text-sm leading-7 text-muted">
{section.body.map((paragraph) => (
<p key={paragraph}>{paragraph}</p>
))}
</div>
</section>
))}
</div>

<footer className="border-t border-border-subtle pt-6 text-sm text-muted">
๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ ๊ธฐ์ค€์€{" "}
<Link
href="/privacy"
className="focus-ring-soft rounded-md font-medium text-brand transition-colors hover:underline dark:text-brand-light"
>
๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ
</Link>
์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
</footer>
</article>
</main>
);
}
3 changes: 3 additions & 0 deletions features/auth/components/AccountBox.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,13 @@
* 2026.04.12 ์ž„๋„ํ—Œ Modified ๋กœ๊ทธ์ธ ์ „ ๋ฉ”์ธ CTA ์นด๋“œ์˜ ํ‘œ๋ฉด๊ฐ๊ณผ ๋Œ€๋น„๋ฅผ ์ •๋ฆฌํ•ด ์ „ํ™˜์„ฑ๊ณผ ํŒ๋…์„ฑ์„ ๋ณด๊ฐ•
* 2026.04.13 ์ž„๋„ํ—Œ Modified ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ ํ…Œ๋‘๋ฆฌ ํ†ค์„ ์นด๋“œ ์ฃผ๋ณ€ ์ƒ‰๊ฐ์— ๋งž๊ฒŒ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์กฐ์ •
* 2026.04.20 ์ž„๋„ํ—Œ Modified ๋กœ๊ทธ์ธ ์ „ ๋ฉ”์ธ CTA ์ „์šฉ ๋น„์ฃผ์–ผ ๊ทœ์น™์„ CSS Module๋กœ ์ •๋ฆฌํ•ด className ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถค
* 2026.07.06 ์ž„๋„ํ—Œ Modified ๋กœ๊ทธ์ธ ์ „ ๋ฉ”์ธ CTA ํ•˜๋‹จ์— ์•ฝ๊ด€/๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ๋งํฌ ์ถ”๊ฐ€
*/

import Link from "next/link";
import { ArrowRightIcon } from "@heroicons/react/24/solid";
import mainPageStyles from "@/features/auth/components/mainPage.module.css";
import LegalLinks from "@/features/legal/components/LegalLinks";

export default function AccountBox() {
return (
Expand All @@ -42,6 +44,7 @@ export default function AccountBox() {
<span>์ƒˆ๋กœ์šด ์„ ์›์œผ๋กœ ๋“ฑ๋ก</span>
</Link>
</div>
<LegalLinks className="mt-4 text-white/75" compact inverse />
</div>
);
}
4 changes: 4 additions & 0 deletions features/auth/components/AuthPageShell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
* History
* Date Author Status Description
* 2026.04.13 ์ž„๋„ํ—Œ Created ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…/SMS/๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๊ณ„์—ด ํŽ˜์ด์ง€์˜ ๊ณตํ†ต ํ—ค๋”์™€ ๋ณธ๋ฌธ ํญ์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ์…ธ ์ถ”๊ฐ€
* 2026.07.06 ์ž„๋„ํ—Œ Modified ์ธ์ฆ ํ™”๋ฉด ํ•˜๋‹จ์— ์ด์šฉ์•ฝ๊ด€/๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ๋งํฌ ์ถ”๊ฐ€
*/
import type { ReactNode } from "react";
import Logo from "@/components/ui/Logo";
import LegalLinks from "@/features/legal/components/LegalLinks";
import { cn } from "@/lib/utils";

interface AuthPageShellProps {
Expand Down Expand Up @@ -47,6 +49,8 @@ export default function AuthPageShell({
<div className={cn("mx-auto w-full max-w-sm", contentClassName)}>
{children}
</div>

<LegalLinks className="mx-auto mt-8 w-full max-w-sm" compact />
</main>
);
}
63 changes: 63 additions & 0 deletions features/legal/components/LegalLinks.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/**
* File Name : features/legal/components/LegalLinks.tsx
* Description : ์•ฝ๊ด€/๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ๋งํฌ ๋ฌถ์Œ
* Author : ์ž„๋„ํ—Œ
*
* History
* Date Author Status Description
* 2026.07.06 ์ž„๋„ํ—Œ Created ๊ณต๊ฐœ/์ธ์ฆ ํ™”๋ฉด์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ •์ฑ… ๋งํฌ ๋ฌถ์Œ ์ถ”๊ฐ€
*/
import Link from "next/link";
import { cn } from "@/lib/utils";

interface LegalLinksProps {
className?: string;
compact?: boolean;
inverse?: boolean;
}

/**
* ์„œ๋น„์Šค ์ •์ฑ… ๋ฌธ์„œ๋กœ ์ด๋™ํ•˜๋Š” ๊ณตํ†ต ๋งํฌ ๋ฌถ์Œ
* - ๊ณต๊ฐœ ๋ฉ”์ธ, ์ธ์ฆ ํ™”๋ฉด, ์„ค์ • ๋ฉ”๋‰ด ๋“ฑ์—์„œ ๋™์ผํ•œ ๋งํฌ ์ˆœ์„œ๋ฅผ ์œ ์ง€
* - ์ž‘์€ ๋ณด์กฐ ๋งํฌ๋กœ ๋…ธ์ถœํ•ด ํ•ต์‹ฌ CTA ํ๋ฆ„์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋„๋ก ๊ตฌ์„ฑ
*/
export default function LegalLinks({
className,
compact,
inverse,
}: LegalLinksProps) {
const linkClassName = cn(
"focus-ring-soft rounded-md px-1 py-0.5 font-medium transition-colors hover:underline",
inverse ? "hover:text-white" : "hover:text-primary",
compact && "px-0.5"
);

return (
<nav
aria-label="์„œ๋น„์Šค ์•ฝ๊ด€ ๋ฐ ์ •์ฑ…"
className={cn(
"flex flex-wrap items-center justify-center gap-x-2 gap-y-1 text-center text-xs text-muted",
className
)}
>
<Link
href="/terms"
className={linkClassName}
>
์ด์šฉ์•ฝ๊ด€
</Link>
<span
aria-hidden="true"
className={cn(inverse ? "text-white/45" : "text-muted/60")}
>
ยท
</span>
<Link
href="/privacy"
className={linkClassName}
>
๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ
</Link>
</nav>
);
}
Loading