์ ํต ๋์ ์์์ ์๋ฆ๋ค์์ ํ๋์ ์ธ ์น ๊ธฐ์ ๋ก ๊ตฌํํ ์ข ํฉ ๋ฌธํ ํ๋ซํผ
- ๐๏ธ ์ํฐํ๋ผ์ด์ฆ ๋ฐ์ดํฐ ์ํคํ ์ฒ - Drizzle ORM + PostgreSQL(Supabase) ๊ธฐ๋ฐ์ ๊ณ ์ฑ๋ฅ ๋ฐ์ดํฐ ๋ ์ด์ด
- ๐ก๏ธ ๋ณด์ ๋ฐ ๊ฐ์ฌ(Audit) - ํ์ ๊ธฐ๋ฐ ๊ฐ์ฌ ๋ก๊ทธ, ๋ฆฌ์คํฌ ํ๊ฐ, ๊ณ์ธต์ ๊ถํ ์ ์ด
- ๐ CQRS & ์ด๋ฒคํธ ์ํคํ ์ฒ - ํ์ฅ์ฑ ์๋ ์๋น์ค ๋ก์ง ์ฒ๋ฆฌ๋ฅผ ์ํ Command/Query ๋ถ๋ฆฌ
- ๐จ ์ ๋ฌธ์ ๋ธ๋๋ ๊ฐ์ด๋๋ผ์ธ - ๋์์ธ ์์คํ ๊ณผ ํตํฉ๋ ๋ธ๋๋ ์์ด๋ดํฐํฐ
- ๐ธ ์ง๋ฅํ ๊ฐค๋ฌ๋ฆฌ ์์คํ - ์ฐ๋๋ณ/์นดํ ๊ณ ๋ฆฌ๋ณ ๋ถ๋ฅ, ๊ณ ๊ธ ํ๊ทธ ๊ธฐ๋ฅ
- ๐ ํ๊ตญ์ด ํนํ UI - ์์ ํ ํ๊ตญ์ด ํ์งํ ๋ฐ ๋ฌธํ์ ์ ์
- ๐ฑ ๋ฐ์ํ ๋์์ธ - ๋ชจ๋ ๋๋ฐ์ด์ค์์ ์ต์ ํ๋ ๊ฒฝํ
- โฟ ์น ์ ๊ทผ์ฑ - WCAG 2.1 AA ๊ฐ์ด๋๋ผ์ธ ์ค์
- ๐ ๋คํฌ๋ชจ๋ ์์คํ - ์ต์ ํ๋ ๋ผ์ดํธ/๋คํฌ ํ ๋ง ์ง์
- ๐ผ๏ธ ๊ณ ๊ธ ๊ฐค๋ฌ๋ฆฌ - AI ๊ธฐ๋ฐ ๋ถ๋ฅ, ์ฐ๋๋ณ ํํฐ๋ง, ๊ณ์ ํ๊ทธ
- ๐ ์ง๋ฅํ ๊ฒ์ - ์นดํ ๊ณ ๋ฆฌ, ํ๊ทธ, ์ฐ๋ ๊ธฐ๋ฐ ๋ค์ฐจ์ ๊ฒ์
- ๐ฏ ์ง๊ด์ ๋ค๋น๊ฒ์ด์ - ํ๊ตญ์ด ํ์งํ๋ ๋ฉ๋ด ๊ตฌ์กฐ
- ๐จโ๐จ ์๊ฐ ๊ด๋ฆฌ - ์์ธ ํ๋กํ, ๊ฒฝ๋ ฅ, ์ ์ ์ด๋ ฅ ๊ด๋ฆฌ
- ๐ผ๏ธ ์ํ ๊ด๋ฆฌ - ์นดํ ๊ณ ๋ฆฌ๋ณ ๋ถ๋ฅ, ๋ฉํ๋ฐ์ดํฐ ๊ด๋ฆฌ
- ๐๏ธ ์ ์ํ ๊ด๋ฆฌ - ์ผ์ , ์ฅ์, ์ฐธ์ฌ ์๊ฐ/์ํ ๊ด๋ฆฌ
- ๐ ์์์ ๊ด๋ฆฌ - ๋ํ๋ฏผ๊ตญ ๋์์์๋์ ์์์ ๋ช ๋จ, ๋ฑ๊ธ๋ณ ๋ถ๋ฅ
- ๐ฐ ๋ด์ค & ์ด๋ฒคํธ - ๊ณต์ง์ฌํญ, ์ํฌ์, ๊ฐ์ฐํ ๊ด๋ฆฌ
- ๐ ์ํฐํ๋ผ์ด์ฆ ๊ด์ - ์์คํ ํฌ์ค ๋ชจ๋ํฐ๋ง, ์์ด์ ํธ ์ํ ์ถ์ , ๊ฐ์ฌ ๋ก๊ทธ ๋ถ์
- ์ด ์ด๋ฏธ์ง: 265์ฅ
- ์นดํ ๊ณ ๋ฆฌ: 9๊ฐ (์ฌ์ฌ์์ํ, ํํธ๋ํ, ์ ์ํ, ์์์ ๋ฑ)
- ์๋ ํ๊ทธ: ๊ณ์ , ์ฐ๋, ์นดํ ๊ณ ๋ฆฌ๋ณ ํนํ ํ๊ทธ
- ์ฐ๋ ์ง์: 2026๋ (ํฅํ ์ง์ ํ์ฌ ๊ด๋ฆฌ)
- ์ง๋ฅํ ๋ถ๋ฅ: ํด๋ ๊ตฌ์กฐ ๊ธฐ๋ฐ ์๋ ์นดํ ๊ณ ๋ฆฌ ๊ฐ์ง
- ์ฐ๋๋ณ ํํฐ๋ง: ๋ ๋ ๊ธฐ๋ฐ ์ฝํ ์ธ ์กฐ์งํ
- ๊ณ ๊ธ ํ๊ทธ ์์คํ : ์นดํ ๊ณ ๋ฆฌ๋ณ ํนํ ํ๊ทธ (์ฌ์ฌ์์ํ, ํํธ๋ํ, ์์๊ธฐ๋ ๋ฑ)
- ๊ณ์ ํ๊ทธ: ๋ ์ง ๊ธฐ๋ฐ ๊ณ์ ์ ๋ณด ์๋ ์ถ์ถ
- ๋คํฌ๋ชจ๋ ์ต์ ํ: ์์ธ์ฑ๊ณผ ๊ฐ์์ฑ์ ๊ณ ๋ คํ ์์ ์์คํ
- ๋ฐ์ํ ๋ง์ฌ์ดํฌ ๋ ์ด์์: ๋์ ๊ฒฉ์ ๋ฐฐ์น
- Framework: Next.js 16.0.10 (App Router)
- Language: TypeScript 5
- Styling: Tailwind CSS 3.4.17
- UI Components: Radix UI + Shadcn/ui
- Animations: Framer Motion
- State Management: React Context API + Zustand
- Form Handling: React Hook Form + Zod
- Image Optimization: Next.js Image + ๊ณ ํ์ง ์ต์ ํ
- ORM: Drizzle ORM 0.43.1
- Database: PostgreSQL (Supabase / Neon)
- Architecture: CQRS, Event-Driven, Agent Pattern
- Migration: Drizzle Kit
- Type Safety: ์์ ํ TypeScript ์ง์
- Package Manager: npm
- Linting: ESLint + TypeScript ESLint
- Formatting: Prettier
- Testing: Jest + React Testing Library
- Pre-commit: Husky + lint-staged
- Hosting: Vercel (Production)
- Domain: asca-gallery.vercel.app
- CI/CD: GitHub Actions + Vercel ์๋ ๋ฐฐํฌ
- Performance: Edge Runtime + ISR (Incremental Static Regeneration)
- Authentication: Clerk + Custom Admin System
- Chat Support: ChannelIO
- Meeting Scheduler: Cal.com
- PDF Generation: jsPDF + html2canvas
- Gallery Analytics: ๋ฐฉ๋ฌธ์ ์ถ์ ๋ฐ ์ด๋ฏธ์ง ์กฐํ ํต๊ณ
- Node.js 18+
- npm 8+
# ์ ์ฅ์ ํด๋ก
git clone https://github.com/jlinsights/ASCA
cd ASCA
# ์์กด์ฑ ์ค์น
npm install --legacy-peer-deps
# ๊ฐค๋ฌ๋ฆฌ ๋ฐ์ดํฐ ์์ฑ
npm run gallery:generate
# ๊ฐ๋ฐ ์๋ฒ ์์
npm run dev.env.local ํ์ผ์ ์์ฑํ๊ณ ๋ค์ ํ๊ฒฝ ๋ณ์๋ค์ ์ค์ ํ์ธ์:
# Database (ํ์)
DATABASE_URL="file:./sqlite.db"
# Next.js (ํ์)
NEXT_PUBLIC_APP_URL="http://localhost:3000"
# Clerk Authentication (์ ํ์ )
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_your_publishable_key_here
CLERK_SECRET_KEY=sk_test_your_secret_key_here
# ๊ธฐํ ์ ํ์ ํ๊ฒฝ ๋ณ์๋ค
NEXT_PUBLIC_GOOGLE_ANALYTICS_ID=your_ga_id# ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์์ฑ
npm run db:generate
# ์คํค๋ง๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉ
npm run db:push
# ์๋ ๋ฐ์ดํฐ ์์ฑ (๊ฐ๋ฐ์ฉ)
npm run db:seed
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์คํธ
npx tsx lib/db/test.ts
# ๋ฐ์ดํฐ๋ฒ ์ด์ค GUI ๋๊ตฌ ์คํ
npm run db:studioโโโ app/ # Next.js App Router
โ โโโ admin/ # ๊ด๋ฆฌ์ ํ์ด์ง
โ โ โโโ login/ # ๊ด๋ฆฌ์ ๋ก๊ทธ์ธ
โ โ โโโ page.tsx # ๊ด๋ฆฌ์ ๋์๋ณด๋
โ โโโ artworks/ # ์ํ ํ์ด์ง
โ โโโ artists/ # ์๊ฐ ํ์ด์ง
โ โโโ awards/ # ์์์ ํ์ด์ง
โ โโโ brand/ # ๋ธ๋๋ ๊ฐ์ด๋๋ผ์ธ
โ โโโ exhibitions/ # ์ ์ํ ํ์ด์ง
โ โโโ gallery/ # ๐ธ ๊ฐค๋ฌ๋ฆฌ ๋ฉ์ธ ํ์ด์ง
โ โโโ news/ # ๋ด์ค ํ์ด์ง
โ โโโ events/ # ์ด๋ฒคํธ ํ์ด์ง
โ โโโ ...
โโโ components/ # ์ฌ์ฌ์ฉ ์ปดํฌ๋ํธ
โ โโโ gallery/ # ๐ธ ๊ฐค๋ฌ๋ฆฌ ์ ์ฉ ์ปดํฌ๋ํธ
โ โ โโโ GalleryGrid.tsx # ๋ฉ์ธ ๊ฐค๋ฌ๋ฆฌ ๊ทธ๋ฆฌ๋
โ โ โโโ SocialShare.tsx # ์์
๊ณต์ ๊ธฐ๋ฅ
โ โ โโโ ...
โ โโโ ui/ # Shadcn/ui + ๋ธ๋๋ ํนํ ์ปดํฌ๋ํธ
โ โ โโโ button.tsx # ๋ธ๋๋ variants ํฌํจ
โ โ โโโ badge.tsx # ์ ํต/ํ์ /ํน๋ณ variants
โ โ โโโ card.tsx # ๊ธ๋์ค๋ชจํผ์ฆ ํจ๊ณผ
โ โโโ header.tsx # ๐ฐ๐ท ํ๊ตญ์ด ํ์งํ ํค๋
โ โโโ ...
โโโ lib/ # ์ ํธ๋ฆฌํฐ & ์ค์
โ โโโ data/ # ๐ ๋ฐ์ดํฐ ํ์ผ
โ โ โโโ gallery-data.json # ๊ฐค๋ฌ๋ฆฌ ๋ฉํ๋ฐ์ดํฐ (265๊ฐ ์ด๋ฏธ์ง)
โ โโโ db/ # ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ
โ โ โโโ schema.ts # ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง (12๊ฐ ํ
์ด๋ธ)
โ โ โโโ queries.ts # ํ์
์์ ์ฟผ๋ฆฌ ํจ์๋ค
โ โ โโโ ...
โ โโโ ...
โโโ public/images/gallery/ # ๐ธ ๊ฐค๋ฌ๋ฆฌ ์ด๋ฏธ์ง ์ ์ฅ์
โ โโโ committee_2025/ # ์ฌ์ฌ์์ํ (73์ฅ)
โ โโโ contest_2025/ # ํํธ๋ํ (69์ฅ)
โ โโโ group_2025/ # ๋จ์ฒด์ฌ์ง (16์ฅ)
โ โโโ award_2025/ # ์์๊ธฐ๋
(33์ฅ)
โ โโโ ceremony_2025/ # ์์์ (35์ฅ)
โ โโโ exhibition_2025/ # ์ ์ํ (33์ฅ)
โ โโโ ...
โโโ scripts/ # ๐ค ์๋ํ ์คํฌ๋ฆฝํธ
โ โโโ generate-gallery-data.js # ๊ฐค๋ฌ๋ฆฌ ๋ฐ์ดํฐ ์๋ ์์ฑ
โโโ types/ # TypeScript ํ์
์ ์
โ โโโ gallery.ts # ๊ฐค๋ฌ๋ฆฌ ๊ด๋ จ ํ์
โโโ ...
- Ink Black (#1a1a1a) - ์ ํต ๋จน์, ์ฃผ์ ํ ์คํธ
- Rice Paper White (#f5f5f0) - ํ์ง ์์, ๋ฐฐ๊ฒฝ
- Celadon Green (#88A891) - ์ฒญ์ ๋ น์, ์ฃผ์ ์ก์
- Sage Green (#B7C4B7) - ์ฐํ ๋ น์, ๋ณด์กฐ ์ก์
- Terra Red (#9B4444) - ๋ถ์ ํ์, ๊ฒฝ๊ณ /์ญ์
- Stone Gray (#6B7280) - ํ์, ์ค์ฑ ์์
- Button Variants: celadon, sage, terra, traditional, rice, touch
- Badge Variants: traditional, innovation, special, neutral
- Card Variants: traditional, artwork, glass, elevated
- Hover Effects: lift, scale, glow
- Primary Font: Inter (Google Fonts)
- Traditional Class: font-traditional (๋ธ๋๋ ์ผ๊ด์ฑ)
- Font Weights: 400 (normal), 500 (medium), 600 (semibold)
- users - ์ฌ์ฉ์ ์ ๋ณด ๋ฐ ์ญํ ๊ด๋ฆฌ
- artists - ์๊ฐ ์์ธ ์ ๋ณด (๋ค๊ตญ์ด ์ง์)
- artworks - ์ํ ์ ๋ณด (๋ค๊ตญ์ด ์ง์)
- exhibitions - ์ ์ํ ์ ๋ณด
- news - ๋ด์ค ๋ฐ ๊ณต์ง์ฌํญ
- events - ์ด๋ฒคํธ ๋ฐ ์ํฌ์
- galleries - ์จ๋ผ์ธ ๊ฐค๋ฌ๋ฆฌ
- exhibition_artworks - ์ ์ํ-์ํ ๊ด๊ณ
- exhibition_artists - ์ ์ํ-์๊ฐ ๊ด๊ณ
- gallery_artworks - ๊ฐค๋ฌ๋ฆฌ-์ํ ๊ด๊ณ
- event_participants - ์ด๋ฒคํธ ์ฐธ๊ฐ์
- admin_permissions - ๊ด๋ฆฌ์ ๊ถํ
# ๋ง์ด๊ทธ๋ ์ด์
์์ฑ
npm run db:generate
# ์คํค๋ง ์ ์ฉ
npm run db:push
# ์๋ ๋ฐ์ดํฐ ์์ฑ
npm run db:seed
# ์์ ๋ฆฌ์
(์ด๊ธฐํ + ์คํค๋ง + ์๋)
npm run db:reset
# GUI ๋๊ตฌ ์คํ
npm run db:studio
# ์ฐ๊ฒฐ ํ
์คํธ
npx tsx lib/db/test.ts- ์ด๋ฉ์ผ:
info@orientalcalligraphy.org - ํน์ง: ๋น๋ฐ๋ฒํธ ์์ด ์๋ ๋ก๊ทธ์ธ
- ๊ถํ: ๋ชจ๋ CMS ๊ธฐ๋ฅ ์ ๊ทผ ๊ฐ๋ฅ
- ์ ๊ทผ:
/adminํ์ด์ง ์๋ ๋ฆฌ๋ค์ด๋ ํธ
- CMS ๊ด๋ฆฌ (์ฝ๊ธฐ/์ฐ๊ธฐ/์ญ์ )
- ์๊ฐ ๊ด๋ฆฌ
- ์ํ ๊ด๋ฆฌ
- ์ ์ํ ๊ด๋ฆฌ
- ๋ด์ค ๊ด๋ฆฌ
- ์ด๋ฒคํธ ๊ด๋ฆฌ
- ์ฌ์ฉ์ ๊ด๋ฆฌ
# ๋ชจ๋ ํ
์คํธ ์คํ
npm test
# ํ
์คํธ ๊ฐ์ ๋ชจ๋
npm run test:watch
# ์ปค๋ฒ๋ฆฌ์ง ๋ฆฌํฌํธ ์์ฑ
npm run test:coverage
# CI ํ๊ฒฝ์์ ํ
์คํธ ์คํ
npm run test:ci
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์คํธ
npx tsx lib/db/test.ts# ๊ฐ๋ฐ ์๋ฒ ์์
npm run dev
# ํ๋ก๋์
๋น๋
npm run build
# ํ๋ก๋์
์๋ฒ ์์
npm start
# ๊ฐค๋ฌ๋ฆฌ ๋ฐ์ดํฐ ์์ฑ ๐
npm run gallery:generate
# ํ์
๊ฒ์ฌ
npm run type-check
# ๋ฆฐํ
npm run lint
npm run lint:fix# ๋ง์ด๊ทธ๋ ์ด์
์์ฑ
npm run db:generate
# ์คํค๋ง ์ ์ฉ
npm run db:push
# ๋ง์ด๊ทธ๋ ์ด์
์คํ
npm run db:migrate
# ์๋ ๋ฐ์ดํฐ ์์ฑ
npm run db:seed
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฆฌ์
npm run db:reset
# GUI ๋๊ตฌ ์คํ
npm run db:studio
# ์คํค๋ง ๊ฒ์ฆ
npm run db:check
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๊ธฐํ
npm run db:dropํ์ฌ ์ํ: ์์ ํ ํ๊ตญ์ด ํ์งํ ์๋ฃ
- โ ํค๋ ๋ฉ๋ด: ์ ์ํ, ์ํ, ์๊ฐ, ํ์ฌ, ๊ฐค๋ฌ๋ฆฌ, ๊ฒ์
- โ ๋ค๊ตญ์ด ๋ฒํผ ์ ๊ฑฐ: ๊น๋ํ ํ๊ตญ์ด ์ ์ฉ ์ธํฐํ์ด์ค
- โ ๊ฐค๋ฌ๋ฆฌ ์นดํ ๊ณ ๋ฆฌ: ์ฌ์ฌ์์ํ, ํํธ๋ํ, ์์๊ธฐ๋ ๋ฑ ํ๊ตญ์ด ๋ช ์นญ
- โ ๋ฌธํ์ ์ ์: ๋์์์ ๋ฌธํ์ ๋ง๋ UI/UX
์ง์ ๊ฐ๋ฅ ์ธ์ด:
- ๐ฐ๐ท ํ๊ตญ์ด (ko) - ๊ธฐ๋ณธ ์ธ์ด (ํ์ฌ ํ์ฑํ)
- ๐บ๐ธ ์์ด (en) - ์ธํ๋ผ ์ค๋น๋จ
- ๐ฏ๐ต ์ผ๋ณธ์ด (ja) - ์ธํ๋ผ ์ค๋น๋จ
- ๐จ๐ณ ์ค๊ตญ์ด (zh) - ์ธํ๋ผ ์ค๋น๋จ
๋ชจ๋ ์ฃผ์ ์ฝํ ์ธ ํ ์ด๋ธ์์ ๋ค๊ตญ์ด ํ๋ ์ง์:
title,titleKo,titleEn,titleCn,titleJpdescription,descriptionKo,descriptionEn,descriptionCn,descriptionJpname,nameKo,nameEn,nameCn,nameJp
๊ฐค๋ฌ๋ฆฌ ๋ค๊ตญ์ด ์ง์:
- ์นดํ ๊ณ ๋ฆฌ๋ช ํ๊ตญ์ด ํนํ (์ฌ์ฌ์์ํ, ํํธ๋ํ ๋ฑ)
- ์ด๋ฏธ์ง ์ ๋ชฉ ์๋ ํ๊ตญ์ด ์์ฑ
- ํ๊ทธ ์์คํ ํ๊ตญ์ด ์ต์ ํ
ํ์ฌ ๋ฐฐํฌ ์ํ: โ Live at https://asca-gallery.vercel.app
# ์๋ ๋ฐฐํฌ (GitHub push ์)
git push origin main # Vercel์ด ์๋์ผ๋ก ๋น๋ ๋ฐ ๋ฐฐํฌ
# ์๋ ๋ฐฐํฌ (Vercel CLI)
vercel --prod- GitHub Push โ
main๋ธ๋์น - Vercel ์๋ ๊ฐ์ง โ ๋น๋ ์์
- Next.js ๋น๋ โ ์ต์ ํ ๋ฐ ์ ์ ์์ฑ
- ๊ฐค๋ฌ๋ฆฌ ์ด๋ฏธ์ง ์ต์ ํ โ Next.js Image ์ฒ๋ฆฌ
- Edge ๋ฐฐํฌ โ ์ ์ธ๊ณ CDN ๋ฐฐํฌ
- ์๋ ๋๋ฉ์ธ ์ ๋ฐ์ดํธ โ asca-gallery.vercel.app
# ๊ฐค๋ฌ๋ฆฌ ๋ฐ์ดํฐ ์์ฑ
npm run gallery:generate
# ํ๋ก๋์
๋น๋
npm run build
# ๋ก์ปฌ์์ ํ๋ก๋์
ํ
์คํธ
npm start- ๊ฐ๋ฐ:
npm run dev(localhost:3000) - ํ๋ก๋์ : ์๋ ๋ฐฐํฌ โ Vercel
- ํ
์คํธ:
npm run test:ci
- ๋ชจ๋ ์ปดํฌ๋ํธ๋ TypeScript๋ก ์์ฑ
- Prettier์ ESLint ๊ท์น ์ค์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ ์ ๋ง์ด๊ทธ๋ ์ด์ ์์ฑ
- ๋ธ๋๋ ๊ฐ์ด๋๋ผ์ธ ์ค์
- ํ ์คํธ ์ฝ๋ ์์ฑ ๊ถ์ฅ
- ์ปค๋ฐ ์
npm run pre-commit์คํ - ๊ฐค๋ฌ๋ฆฌ ์ด๋ฏธ์ง ์ถ๊ฐ ์
npm run gallery:generate์คํ
์๋ก์ด ์ด๋ฏธ์ง ์ถ๊ฐ ํ๋ก์ธ์ค:
-
์ด๋ฏธ์ง ์ ๋ก๋:
/public/images/gallery/ํ์ ํด๋์ ์ด๋ฏธ์ง ์ถ๊ฐ# ์์: 2026๋ ์ฌ์ฌ์์ํ ์ฌ์ง ์ถ๊ฐ /public/images/gallery/committee_2026/ -
ํด๋ ๊ตฌ์กฐ ๊ท์น:
{category}_{year}/ํ์ ์ฌ์ฉ- ์ง์ ์นดํ
๊ณ ๋ฆฌ:
committee,contest,group,award,ceremony,exhibition
-
๋ฉํ๋ฐ์ดํฐ ์๋ ์์ฑ:
npm run gallery:generate
-
์๋ ์์ฑ๋๋ ์ ๋ณด:
- ์ฐ๋๋ณ ์๋ ๋ถ๋ฅ
- ์นดํ ๊ณ ๋ฆฌ๋ณ ํ๊ตญ์ด ์ ๋ชฉ
- ๊ณ์ ํ๊ทธ ์๋ ์ถ๊ฐ
- ๊ณ ํ์ง ์ต์ ํ ์ค์
-
๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ณ๊ฒฝ:
lib/db/schema.ts์์ npm run db:generate์คํlib/db/queries.ts์ ์ฟผ๋ฆฌ ํจ์ ์ถ๊ฐ
-
๊ฐค๋ฌ๋ฆฌ ๊ธฐ๋ฅ ํ์ฅ:
types/gallery.ts์ ํ์ ์ ์ ์ถ๊ฐscripts/generate-gallery-data.js์ ๋ก์ง ์ถ๊ฐcomponents/gallery/์ UI ์ปดํฌ๋ํธ ์ถ๊ฐ
-
UI ์ปดํฌ๋ํธ ์ถ๊ฐ:
- ๋ธ๋๋ variants ๊ณ ๋ ค
- ๋คํฌ๋ชจ๋ ์์ ์ต์ ํ
- ๋ฐ์ํ ๋์์ธ ๊ตฌํ
feat: ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ
fix: ๋ฒ๊ทธ ์์
docs: ๋ฌธ์ ๋ณ๊ฒฝ
style: ์ฝ๋ ํฌ๋งทํ
, ์ธ๋ฏธ์ฝ๋ก ๋๋ฝ ๋ฑ
refactor: ์ฝ๋ ๋ฆฌํฉํ ๋ง
test: ํ
์คํธ ์ฝ๋ ์ถ๊ฐ/์์
chore: ๋น๋ ํ๋ก์ธ์ค ๋๋ ๋ณด์กฐ ๋๊ตฌ ๋ณ๊ฒฝ
db: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ณ๊ฒฝ
gallery: ๊ฐค๋ฌ๋ฆฌ ๊ธฐ๋ฅ ์ถ๊ฐ/์์ ๐ผ๏ธ
i18n: ๋ค๊ตญ์ด/ํ์งํ ๊ด๋ จ ๋ณ๊ฒฝ ๐
ui: UI/UX ๊ฐ์ ๋ฐ ๋์์ธ ๋ณ๊ฒฝ ๐จ
# ๊ฐค๋ฌ๋ฆฌ ์ด๋ฏธ์ง ์ถ๊ฐ
git commit -m "gallery: 2025๋
์์์ ์ฌ์ง 35์ฅ ์ถ๊ฐ"
# ๊ฐค๋ฌ๋ฆฌ ๊ธฐ๋ฅ ๊ฐ์
git commit -m "feat: ์ฐ๋๋ณ ํํฐ๋ง ๊ธฐ๋ฅ ์ถ๊ฐ"
# ๋คํฌ๋ชจ๋ ์ต์ ํ
git commit -m "ui: ๊ฐค๋ฌ๋ฆฌ ๋คํฌ๋ชจ๋ ์์ ์ต์ ํ"
# ํ์งํ ์์
git commit -m "i18n: ํค๋ ๋ฉ๋ด ํ๊ตญ์ด ํ์งํ ์๋ฃ"- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ด๋ - Drizzle ORM ์ฌ์ฉ๋ฒ
- ๋ธ๋๋ ๊ฐ์ด๋๋ผ์ธ - ๋์์ธ ์์คํ
- ์ปดํฌ๋ํธ ๋ฌธ์ - UI ์ปดํฌ๋ํธ ์ฌ์ฉ๋ฒ
- ๊ฐค๋ฌ๋ฆฌ ์์คํ - ์ด๋ฏธ์ง ์๋ ์ฒ๋ฆฌ ๋ก์ง
- ์ฟผ๋ฆฌ ํจ์ - ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ
- ์คํค๋ง ์ ์ - ํ ์ด๋ธ ๊ตฌ์กฐ
- ๊ฐค๋ฌ๋ฆฌ ํ์ - ๊ฐค๋ฌ๋ฆฌ TypeScript ํ์
- ๊ฐค๋ฌ๋ฆฌ ๋ฐ์ดํฐ - 265๊ฐ ์ด๋ฏธ์ง ๋ฉํ๋ฐ์ดํฐ
โ ์๋ฃ๋ ๊ธฐ๋ฅ๋ค:
- ๐ธ ๊ฐค๋ฌ๋ฆฌ ์์คํ : 265๊ฐ ์ด๋ฏธ์ง, 9๊ฐ ์นดํ ๊ณ ๋ฆฌ ์๋ ๋ถ๋ฅ
- ๐ท๏ธ ํ๊ทธ ์์คํ : ์ฐ๋, ๊ณ์ , ์นดํ ๊ณ ๋ฆฌ๋ณ ํนํ ํ๊ทธ
- ๐ ๋คํฌ๋ชจ๋: ์ต์ ํ๋ ๊ฐค๋ฌ๋ฆฌ ์์ ์์คํ
- ๐ฐ๐ท ํ๊ตญ์ด ํ์งํ: ์์ ํ ํ๊ตญ์ด UI ๋ฐ ๋ฉ๋ด ์์คํ
- ๐ฑ ๋ฐ์ํ ๋์์ธ: ๋ชจ๋ ๋๋ฐ์ด์ค ์ต์ ํ
- ๐ ํ๋ก๋์ ๋ฐฐํฌ: Vercel ์๋ ๋ฐฐํฌ ์์คํ
๐ ์งํ ์ค์ธ ์์ :
- ์ฐ๋๋ณ ํํฐ๋ง UI ๊ตฌํ
- ๊ฐค๋ฌ๋ฆฌ ๊ฒ์ ๊ธฐ๋ฅ ๊ณ ๋ํ
- ์ฑ๋ฅ ์ต์ ํ ๋ฐ ์บ์ฑ
- Drizzle Studio - ๋ฐ์ดํฐ๋ฒ ์ด์ค GUI
- SQLite Browser - SQLite ๊ด๋ฆฌ ๋๊ตฌ
๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์ง๋ฌธ์ด ์์ผ์๋ฉด ๋ค์ ๋ฐฉ๋ฒ์ผ๋ก ์ฐ๋ฝํด์ฃผ์ธ์:
- ๐ ๋ฒ๊ทธ ๋ฆฌํฌํธ: GitHub Issues ์์ฑ
- ๐ฌ ์ค์๊ฐ ์ง์: ์น์ฌ์ดํธ ๋ด ChannelIO ์ฑํ
- ๐ง ์ด๋ฉ์ผ: info@orientalcalligraphy.org
- ๐ ๋ฌธ์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ด๋
- ๐ผ๏ธ ๊ฐค๋ฌ๋ฆฌ ์ง์: ๊ฐค๋ฌ๋ฆฌ ์์คํ ๊ฐ์ด๋
- โ ํ๋ก๋์ ๋ฐฐํฌ: https://asca-gallery.vercel.app
- ๐ธ ๊ฐค๋ฌ๋ฆฌ ์ด๋ฏธ์ง: 265์ฅ (9๊ฐ ์นดํ ๊ณ ๋ฆฌ)
- ๐จ UI ๊ตฌ์ฑ์์: ๋ธ๋๋ ๊ฐ์ด๋๋ผ์ธ ์ ์ฉ ์ต์ ํ๋ ์ปดํฌ๋ํธ
- ๐๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค: Supabase ๊ธฐ๋ฐ Drizzle ORM ์์ ํ ํ์ ์์ ์ฑ
- ๐ ์ธ์ฆ ์์คํ : Clerk ๊ธฐ๋ฐ ๊ฐํ๋ ๊ด๋ฆฌ์ ์์คํ ํตํฉ
- ๐ ๋คํฌ๋ชจ๋: ์์ ์ต์ ํ ์๋ฃ
- ๐ฐ๐ท ํ์งํ: 100% ํ๊ตญ์ด UI ์์ฑ
- ๐ฑ ๋ฐ์ํ: ๋ชจ๋ ๋๋ฐ์ด์ค ์ง์
2026.05:
- โ ์ํฐํ๋ผ์ด์ฆ ์ํคํ ์ฒ(CQRS, Event Bus) ๋์ ๋ฐ ๊ธฐ์ ๋ฌธ์ํ ์๋ฃ
- โ ๊ฐ์ฌ ๋ก๊ทธ(Audit Trail) ๋ฐ ๋ฆฌ์คํฌ ๊ธฐ๋ฐ ๋ณด์ ์์คํ ๊ตฌ์ถ
- โ ์์คํ ํฌ์ค ๋ชจ๋ํฐ๋ง ๋ฐ AI ์์ด์ ํธ ๊ด์ ๋์๋ณด๋ ๊ตฌํ
2026.04:
- โ Clerk ์ธ์ฆ ์์คํ ํตํฉ ์๋ฃ ๋ฐ Supabase Auth ์ ๋ฉด ์ ๊ฑฐ
- โ Webflow ์ปจํ ์ธ ๋ง์ด๊ทธ๋ ์ด์ ์๋ฃ ๋ฐ ์คํค๋ง ํ์ฅ
- โ ๋ธ๋๋ ๊ฐ์ด๋๋ผ์ธ ๊ธฐ๋ฐ ๋์์ธ ์์คํ ์ ๋ฉด ๊ฐํธ
- โ Turbopack ESM ์ถฉ๋ ํํผ๋ฅผ ์ํ Webpack ๋ชจ๋ dev ์๋ฒ ์์ ์ฑ ๊ฐํ
- โ API ์๋ต ํต์ผ์ฑ ๋ฐ ๋ณด์ ๊ฐํ (Server Actions ์ผ๋ถ ๋์ฒด)
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค ํ์ ๋ฐฐํฌ๋ฉ๋๋ค.
๐จ ์ ๋ฒ์ ๊ณ์น๊ณผ ์ฐฝ์ ์ ์กฐํ
์ ํต ๋์ ์์์ ์๋ฆ๋ค์์ ํ๋ ๊ธฐ์ ๋ก ๊ตฌํํ ์ข ํฉ ๋ฌธํ ํ๋ซํผ
Made with โค๏ธ by ๋์์์ํํ ๊ฐ๋ฐํ