02-reusable-code โ ๋ฒ์ฉ ์ฌ์ฌ์ฉ ์ฝ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํ๋ก์ ํธ์ ๋ณต์ฌํ์ฌ ์ฌ์ฉํ๋ ์์์ ์ฝ๋ ๋ถํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (TypeScript/React)
๊ฐ์
๋จ๋
์ผ๋ก ๋์ํ๋ ์ต์ ๋จ์์ ์ฝ๋ ๋ถํ โ UI ์ปดํฌ๋ํธ, ์ปค์คํ
ํ
, ์ ํธ๋ฆฌํฐ ํจ์, ์๋น์ค ํจํด ๋ฑ์ ๊ด๋ฆฌํฉ๋๋ค. ๋๋ฉ์ธ์ ๋ฌด๊ดํ๋ฉฐ ์กฐํฉํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
3๊ณ์ธต ๋ชจ๋ธ์์์ ์์น
02-reusable-design โ "์ฌ๋ฃ" (์์, ํฐํธ, ์ ๋๋ฉ์ด์
์ ์)
โ ์ฐธ์กฐ
02-reusable-code โ "๋ถํ" โ
(Button, hooks, utils)
โ ์กฐํฉ
02-reusable-page โ "์์ฑํ" (Footer, Header, Hero)
| ๊ณ์ธต | ํ๋จ ๊ธฐ์ค | ์์ |
|---|
| design | ๊ฐ/์ค์ ์ธ๊ฐ? | --color-primary: #6366f1, @keyframes fadeIn |
| code | ๋์ํ๋ ์ฝ๋์ธ๊ฐ? | useDebounce(), <Button>, formatDate() |
| page | ํ๋ฉด์ ํ ์์ญ์ธ๊ฐ? | <Footer>, <HeroSection>, <Sidebar> |
code์ ๋ฃ๋ ๊ฒ
- ๋จ๋
UI ์ปดํฌ๋ํธ (
<Button>, <Dialog>, <Card>)
- React ์ปค์คํ
ํ
(
useDebounce, useLocalStorage)
- ์ ํธ๋ฆฌํฐ ํจ์ (
formatDate, cn, deepClone)
- ์๋น์ค/๋ฏธ๋ค์จ์ด ํจํด (API Client, Rate Limiter)
- ๋๋ฉ์ธ๋ณ ํจํด (Supabase, Stripe, Next.js, ํ
์คํ
)
code์ ๋ฃ์ง ์๋ ๊ฒ
- ์์ ์คํ์ผ ์ ์ (CSS ๋ณ์, ํคํ๋ ์, Tailwind ์ค์ ) โ
02-reusable-design
- ํ์ด์ง ์น์
(Header, Footer, Hero ๋ฑ ์์ฑ๋ ์์ญ) โ
02-reusable-page
ํด๋ ๊ตฌ์กฐ
02-reusable-code/
โโโ 01-ui-components/ # UI ์ปดํฌ๋ํธ
โ โโโ _shared/ # ๊ณตํต ํ์
(Size, Status, ColorVariant), i18n ํ
์คํธ
โ โโโ feedback/ # ์ํ ํ์ (EmptyState, ErrorState, LoadingState, Toast)
โ โโโ lib/ # ์ ํธ๋ฆฌํฐ (cn ํจ์ - clsx + tailwind-merge)
โ โโโ shadcn-core/ # shadcn/ui ํต์ฌ (Button, Dialog, Tabs ๋ฑ)
โ โโโ shadcn-form/ # shadcn/ui ํผ (Input, Select, Checkbox ๋ฑ)
โ โโโ shadcn-overlay/ # shadcn/ui ์ค๋ฒ๋ ์ด (Sheet, Drawer, Popover ๋ฑ)
โ โโโ shadcn-nav/ # shadcn/ui ๋ค๋น๊ฒ์ด์
(Menu, Breadcrumb ๋ฑ)
โ โโโ shadcn-data/ # shadcn/ui ๋ฐ์ดํฐ (Table, Card, Badge ๋ฑ)
โ โโโ shadcn-misc/ # shadcn/ui ๊ธฐํ (Calendar, Carousel, Toggle ๋ฑ)
โ โโโ error-boundary/ # Error Boundary + ํด๋ฐฑ UI
โ โโโ web3/ # Web3 ๊ฒฐ์ ์ปดํฌ๋ํธ
โโโ 02-hooks/ # React ์ปค์คํ
ํ
(48๊ฐ)
โ โโโ web3/ # Web3 ์ง๊ฐ/๊ฒฐ์ ํ
โโโ 03-utils/ # ์ ํธ๋ฆฌํฐ ํจ์
โ โโโ types/ # TypeScript ํ์
์ ํธ (ํฌํผ, ๋ธ๋๋, ์ ๋์จ)
โ โโโ export/ # ๋ด๋ณด๋ด๊ธฐ (Excel, PDF, HWPX)
โ โโโ web3/ # Web3 ์์/ํ์
โ โโโ browser-stealth/ # ์คํ
์ค ๋ธ๋ผ์ฐ์ ์๋ํ ์ ํธ (Bezier ๋ง์ฐ์ค, Gaussian ๋๋ ์ด, ํ์ดํฌ)
โโโ 05-auth-rbac/ # ์ธ์ฆ/๊ถํ ํจํด
โ โโโ edge-jwt/ # Edge ํธํ JWT + ๋น๋ฐ๋ฒํธ ํด์ฑ
โโโ 06-api-middleware/ # API ๋ฏธ๋ค์จ์ด ๋ฐ ์๋ฌ ์ฒ๋ฆฌ
โ โโโ middleware-system/ # ๋ฒ์ฉ ๋ฏธ๋ค์จ์ด ์์คํ
(Rate Limit, Logger, Compose)
โโโ 08-services/ # ์๋น์ค ๋ ์ด์ด ํจํด
โ โโโ web3/ # Web3 ๊ฒฐ์ ๊ฒ์ฆ
โโโ 10-stripe-patterns/ # Stripe SaaS ๊ตฌ๋
๊ฒฐ์ ํจํด
โ โโโ config/ # Stripe ์๋ฒ/ํด๋ผ์ด์ธํธ ์ค์
โ โโโ api/ # ๊ฒฐ์ API ๋ผ์ฐํธ 7๊ฐ
โ โโโ components/ # Pricing UI, Plan Change Dialog
โ โโโ schema/ # Supabase DB ์คํค๋ง
โโโ 11-state-patterns/ # ์ํ๊ด๋ฆฌ ํจํด
โ โโโ zustand/ # ์ฌ๋ผ์ด์ค, Persist, Immer ํจํด
โ โโโ react-query/ # ์ฟผ๋ฆฌ ํค, ๋๊ด์ ์
๋ฐ์ดํธ, ๋ฌดํ์ฟผ๋ฆฌ
โ โโโ jotai/ # Atom ํจํด
โโโ 12-nextjs-patterns/ # Next.js App Router ํจํด
โ โโโ server-actions/ # Server Action (ํผ, ์ธ์ฆ, ๋๊ด์ )
โ โโโ route-handlers/ # API ์๋ต ํฌํผ
โ โโโ streaming/ # Suspense + Error Boundary
โ โโโ rsc/ # Server/Client ํฉ์ฑ ํจํด
โ โโโ middleware/ # ์ธ์ฆ ๋ฏธ๋ค์จ์ด
โโโ 13-testing-patterns/ # ํ
์คํ
ํจํด
โ โโโ vitest/ # Vitest ์ค์
โ โโโ testing-library/ # ์ปค์คํ
render
โ โโโ msw/ # ์์ฒญ ํธ๋ค๋ฌ + ์๋ฒ ์ค์
โ โโโ playwright/ # Page Object + Fixture
โโโ 16-algorithm-engines/ # ์๊ณ ๋ฆฌ์ฆ ์์ง + ์บ๋ฒ์ค ์๊ฐํ
โ โโโ physics/ # ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์
์์ง (Boids, N-Body)
โ โโโ canvas/ # React ์บ๋ฒ์ค ์ปดํฌ๋ํธ (6๊ฐ)
โโโ 17-verification-patterns/ # ์ํฐํฐ ์ ๋ขฐ๋ ๊ฒ์ฆ (Trust Score + URL ์์ ์ฑ)
ํธํ์ฑ
- TypeScript: 5.0+
- React: 18+
- Next.js: 14+ (App Router)
- Node.js: 18+
- ์ปจ๋ฒค์
:
docs/rules/reusable-code.md ์ฐธ์กฐ
์ฌ์ฉ ์ ์ค์
1. ์์กด์ฑ ์ค์น
# ๊ณตํต ์ ํธ๋ฆฌํฐ (ํ์)
pnpm add clsx tailwind-merge class-variance-authority lucide-react
# shadcn-core
pnpm add @radix-ui/react-slot @radix-ui/react-dialog @radix-ui/react-alert-dialog
pnpm add @radix-ui/react-tabs @radix-ui/react-avatar @radix-ui/react-tooltip
pnpm add @radix-ui/react-progress @radix-ui/react-accordion
# shadcn-form
pnpm add @radix-ui/react-checkbox @radix-ui/react-radio-group @radix-ui/react-slider
pnpm add @radix-ui/react-switch @radix-ui/react-select @radix-ui/react-label
pnpm add react-hook-form input-otp
# shadcn-overlay
pnpm add @radix-ui/react-popover @radix-ui/react-hover-card @radix-ui/react-context-menu
pnpm add vaul cmdk
# shadcn-nav
pnpm add @radix-ui/react-navigation-menu @radix-ui/react-menubar @radix-ui/react-dropdown-menu
# shadcn-data
pnpm add @radix-ui/react-scroll-area @radix-ui/react-separator @radix-ui/react-collapsible
pnpm add react-resizable-panels
# shadcn-misc
pnpm add @radix-ui/react-toggle @radix-ui/react-toggle-group @radix-ui/react-aspect-ratio
pnpm add react-day-picker embla-carousel-react sonner
2. ๊ฒฝ๋ก ๋ณ์นญ ์ค์ (tsconfig.json)
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
}
}
3. cn ์ ํธ๋ฆฌํฐ ๋ณต์ฌ
03-utils/cn.ts๋ฅผ src/lib/utils.ts๋ก ๋ณต์ฌ
์ถ์ฒ ๊ธฐ๋ก
| ๋ ์ง | ํ๋ก์ ํธ | ์ถ์ถ ํญ๋ชฉ |
|---|
| 2026-02-16 | GitHub-์ปค๋ฎค๋ํฐ | ํ
28๊ฐ, ์ ํธ 10๊ฐ, ์ํ๊ด๋ฆฌ 7๊ฐ, Next.js 7๊ฐ, ํ
์คํ
6๊ฐ, ํ์
3๊ฐ, Error Boundary 3๊ฐ |
| 2026-01-27 | shadcn/ui | UI ์ปดํฌ๋ํธ 44๊ฐ (v4 new-york style) |
| 2026-01-27 | (๋ ํผ๋ฐ์ค ์ฝ๋) | Web3 USDC/USDT ๊ฒฐ์ - ํ
2๊ฐ, UI 1๊ฐ, ์๋น์ค 1๊ฐ, ์ ํธ 2๊ฐ |
| 2026-01-27 | 260111-tiny-house | ์ ํธ 4๊ฐ (currency, slug, truncate, area), ํ
1๊ฐ (useFavorite) |
| 2025-01-27 | monet-registry-main | UI ์ปดํฌ๋ํธ 12๊ฐ, ํ
1๊ฐ, ์ ํธ 1๊ฐ, API ํจํด 3๊ฐ |
| 2026-02-15 | 260214 silvercare-master | UI 4๊ฐ, ํ
4๊ฐ, ์ ํธ 1๊ฐ, ์๋น์ค 1๊ฐ (Cloudinary) |
| 2026-02-15 | 260208 kcsi-smpa | ์ ํธ 6๊ฐ (export 3๊ฐ, text-analysis, chart-utils, anonymous-names) |
| 2026-02-16 | 260116 secure-vault-master + monet-registry-main | Stripe SaaS ํจํด - API 7๊ฐ, ์ปดํฌ๋ํธ 2๊ฐ, DB ์คํค๋ง, ์ค์ 2๊ฐ |
| 2026-02-16 | 260116 dokiwiki-main | Edge JWT ์ธ์ฆ ์ธํธ 3๊ฐ, ๋ฏธ๋ค์จ์ด ์์คํ
6๊ฐ |
| 2026-02-16 | 260105 legal-tech-app | ๋ฒ์ฉ ์๋ฌ ํธ๋ค๋ง, ํ
2๊ฐ (useAutoSave, useUnsavedChangesWarning) |
| 2026-02-16 | 260214 silvercare-master | API Client, Retry Policy, API Response ํฌํผ |
์นดํ
๊ณ ๋ฆฌ๋ณ ํ์ผ ๋ชฉ๋ก
01-ui-components/_shared (๊ณตํต ์ ํธ)
| ํ์ผ | ์ค๋ช
|
|---|
types.ts | ๊ณตํต ํ์
(Size, Status, ColorVariant, Orientation ๋ฑ) |
i18n.ts | UI ํ
์คํธ ์ ์ (์์ด ๊ธฐ๋ณธ, ํ๊ตญ์ด export) |
01-ui-components/feedback (์ํ ํ์ ์ปดํฌ๋ํธ)
์ถ์ฒ: silvercare-master | ์ถ์ถ์ผ: 2026-02-15
| ์ปดํฌ๋ํธ | ์ค๋ช
| ์์กด์ฑ |
|---|
empty-state.tsx | ๋น ๋ฐ์ดํฐ ํ๋ ์ด์คํ๋ | lucide-react |
error-state.tsx | ์๋ฌ + ์ฌ์๋ ๋ฒํผ (i18n labels prop) | lucide-react |
loading-state.tsx | ์คํผ๋ + ์ค์ผ๋ ํค ์ ํธ | lucide-react |
toast.tsx | ํ ์คํธ ์๋ฆผ ์์คํ
| lucide-react |
01-ui-components/lib (์ ํธ๋ฆฌํฐ)
| ํ์ผ | ์ค๋ช
| ์์กด์ฑ |
|---|
utils.ts | cn() ํจ์ (clsx + tailwind-merge) | clsx, tailwind-merge |
01-ui-components/shadcn-* (shadcn/ui ์ปดํฌ๋ํธ)
์ถ์ฒ: shadcn/ui (MIT License)
๋ฒ์ : v4 (new-york style) | ์ถ์ถ์ผ: 2026-01-27
shadcn-core (ํต์ฌ ์ปดํฌ๋ํธ)
| ์ปดํฌ๋ํธ | ์ค๋ช
| ์์กด์ฑ |
|---|
Button | ๋ฒํผ (variant: default, destructive, outline, secondary, ghost, link, warm) | @radix-ui/react-slot |
Dialog | ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ | @radix-ui/react-dialog |
Alert | ์๋ฆผ ๋ฉ์์ง | - |
AlertDialog | ํ์ธ ๋ค์ด์ผ๋ก๊ทธ | @radix-ui/react-alert-dialog |
Tabs | ํญ UI | @radix-ui/react-tabs |
Avatar | ์๋ฐํ/ํ๋กํ ์ด๋ฏธ์ง | @radix-ui/react-avatar |
Tooltip | ํดํ | @radix-ui/react-tooltip |
Progress | ์งํ๋ฅ ํ์ | @radix-ui/react-progress |
Accordion | ์์ฝ๋์ธ | @radix-ui/react-accordion |
shadcn-form (ํผ ์ปดํฌ๋ํธ)
| ์ปดํฌ๋ํธ | ์ค๋ช
| ์์กด์ฑ |
|---|
Input | ํ
์คํธ ์
๋ ฅ | - |
Textarea | ๋ค์ค ํ
์คํธ ์
๋ ฅ | - |
Checkbox | ์ฒดํฌ๋ฐ์ค | @radix-ui/react-checkbox |
RadioGroup | ๋ผ๋์ค ๋ฒํผ ๊ทธ๋ฃน | @radix-ui/react-radio-group |
Slider | ์ฌ๋ผ์ด๋ | @radix-ui/react-slider |
Switch | ํ ๊ธ ์ค์์น | @radix-ui/react-switch |
Select | ๋๋กญ๋ค์ด ์ ํ | @radix-ui/react-select |
Form | react-hook-form ํตํฉ | react-hook-form |
Label | ํผ ๋ ์ด๋ธ | @radix-ui/react-label |
InputOTP | OTP ์
๋ ฅ | input-otp |
shadcn-overlay (์ค๋ฒ๋ ์ด ์ปดํฌ๋ํธ)
| ์ปดํฌ๋ํธ | ์ค๋ช
| ์์กด์ฑ |
|---|
Sheet | ์ฌ๋ผ์ด๋ ํจ๋ | @radix-ui/react-dialog |
Drawer | ๋๋ก์ด | vaul |
Popover | ํ์ค๋ฒ | @radix-ui/react-popover |
HoverCard | ํธ๋ฒ ์นด๋ | @radix-ui/react-hover-card |
Command | ์ปค๋งจ๋ ํ๋ ํธ | cmdk |
ContextMenu | ์ปจํ
์คํธ ๋ฉ๋ด | @radix-ui/react-context-menu |
shadcn-nav (๋ค๋น๊ฒ์ด์
์ปดํฌ๋ํธ)
| ์ปดํฌ๋ํธ | ์ค๋ช
| ์์กด์ฑ |
|---|
NavigationMenu | ๋ค๋น๊ฒ์ด์
๋ฉ๋ด | @radix-ui/react-navigation-menu |
Menubar | ๋ฉ๋ด๋ฐ | @radix-ui/react-menubar |
Breadcrumb | ๋ธ๋ ๋ํฌ๋ผ | @radix-ui/react-slot |
Pagination | ํ์ด์ง๋ค์ด์
| - |
DropdownMenu | ๋๋กญ๋ค์ด ๋ฉ๋ด | @radix-ui/react-dropdown-menu |
shadcn-data (๋ฐ์ดํฐ ํ์ ์ปดํฌ๋ํธ)
| ์ปดํฌ๋ํธ | ์ค๋ช
| ์์กด์ฑ |
|---|
Table | ํ
์ด๋ธ | - |
Card | ์นด๋ | - |
Badge | ๋ฑ์ง | - |
Skeleton | ๋ก๋ฉ ์ค์ผ๋ ํค | - |
ScrollArea | ์คํฌ๋กค ์์ญ | @radix-ui/react-scroll-area |
Separator | ๊ตฌ๋ถ์ | @radix-ui/react-separator |
Resizable | ๋ฆฌ์ฌ์ด์ฆ ๊ฐ๋ฅ ํจ๋ | react-resizable-panels |
Collapsible | ์ ๊ธฐ/ํผ์น๊ธฐ | @radix-ui/react-collapsible |
shadcn-misc (๊ธฐํ ์ปดํฌ๋ํธ)
| ์ปดํฌ๋ํธ | ์ค๋ช
| ์์กด์ฑ |
|---|
Toggle | ํ ๊ธ ๋ฒํผ | @radix-ui/react-toggle |
ToggleGroup | ํ ๊ธ ๊ทธ๋ฃน | @radix-ui/react-toggle-group |
AspectRatio | ๋น์จ ์ ์ง ์ปจํ
์ด๋ | @radix-ui/react-aspect-ratio |
Calendar | ๋ฌ๋ ฅ | react-day-picker |
Carousel | ์บ๋ฌ์
| embla-carousel-react |
Sonner | ํ ์คํธ ์๋ฆผ | sonner |
interactive (์ธํฐ๋ํฐ๋ธ ์ปดํฌ๋ํธ)
์ถ์ฒ: silvercare-master | ์ถ์ถ์ผ: 2026-02-15
| ์ปดํฌ๋ํธ | ์ค๋ช
| ์์กด์ฑ |
|---|
ImageUpload | ๋๋๊ทธ์ค๋๋กญ ์ด๋ฏธ์ง ์
๋ก๋ (ํ๋ฆฌ๋ทฐ, ์งํ๋ฅ , ์
๋ก๋ ํจ์ ์ฃผ์
) | lucide-react |
ImageCropper | ์ด๋ฏธ์ง ํฌ๋กญ ๋ชจ๋ฌ (๋น์จ ์ค์ , ์ค, WebP ์ถ๋ ฅ) | react-easy-crop, lucide-react |
mobile (๋ชจ๋ฐ์ผ ์ ์ฉ ์ปดํฌ๋ํธ)
์ถ์ฒ: silvercare-master | ์ถ์ถ์ผ: 2026-02-15
| ์ปดํฌ๋ํธ | ์ค๋ช
| ์์กด์ฑ |
|---|
PullToRefresh | ํํฌ๋ฆฌํ๋ ์ (ํฐ์น ์ ์ค์ฒ, ๊ฐ์, ์ธ๋์ผ์ดํฐ) | lucide-react |
SwipeableListItem | ์ค์์ดํ ์ก์
๋ฆฌ์คํธ ์์ดํ
(ํฐ์น+๋ง์ฐ์ค, ํ๋ฆฌ์
์ก์
) | lucide-react |
02-hooks (React ์ปค์คํ
ํ
)
| ํ์ผ | ์ค๋ช
| ์ถ์ฒ |
|---|
useFavorite.ts | ์ฐํ๊ธฐ/์ฆ๊ฒจ์ฐพ๊ธฐ ํ ๊ธ ํ
(๋๊ด์ ์
๋ฐ์ดํธ ๋ฒ์ ํฌํจ) | 260111-tiny-house |
useDebounce.ts | ๋๋ฐ์ด์ค ํ
| silvercare-master |
useFocusTrap.ts | ํฌ์ปค์ค ํธ๋ฉ ํ
(๋ชจ๋ฌ/๋ค์ด์ผ๋ก๊ทธ์ฉ) | - |
useGeolocation.ts | ์์น ์ ๋ณด ํ
| silvercare-master |
useInfiniteScroll.ts | ๋ฌดํ ์คํฌ๋กค ํ
| silvercare-master |
useKeyboardShortcuts.ts | ํค๋ณด๋ ๋จ์ถํค ํ
| - |
useMobile.ts | ๋ชจ๋ฐ์ผ ๊ฐ์ง ํ
| kcsi-smpa |
useOnlineStatus.ts | ์จ๋ผ์ธ ์ํ ๊ฐ์ง ํ
| silvercare-master |
usePagination.ts | ํ์ด์ง๋ค์ด์
์ํ ํ
| kcsi-smpa |
usePasswordAttempt.ts | ๋น๋ฐ๋ฒํธ ์๋ ์ ํ ํ
| - |
useTheme.ts | ํ
๋ง ์ ํ ํ
| silvercare-master |
useToast.ts | ํ ์คํธ ์๋ฆผ ํ
| shadcn/ui |
useCountUp.ts | ์ซ์ ์นด์ดํธ์
์ ๋๋ฉ์ด์
(requestAnimationFrame) | silvercare-master |
useInView.ts | IntersectionObserver ๋ทฐํฌํธ ์ง์
๊ฐ์ง (1ํ) | silvercare-master |
useFileUpload.ts | ๋ฒ์ฉ ํ์ผ ์
๋ก๋ (์
๋ก๋ ํจ์ ์ฃผ์
, ๊ฒ์ฆ, ์งํ๋ฅ ) | silvercare-master |
useImageUpload.ts | ์ด๋ฏธ์ง ์
๋ก๋ (์
๋ก๋ ํจ์ ์ฃผ์
, ๊ฒ์ฆ, ์งํ๋ฅ ) | silvercare-master |
useAutoSave.ts | ์๋ ์ ์ฅ (๋ณ๊ฒฝ ๊ฐ์ง, ๊ฐ๊ฒฉ ์ค์ , ์๋ saveNow) | legal-tech-app |
useUnsavedChangesWarning.ts | ๋ฏธ์ ์ฅ ๋ณ๊ฒฝ์ฌํญ ์ดํ ๊ฒฝ๊ณ (beforeunload) | legal-tech-app |
03-utils (์ ํธ๋ฆฌํฐ ํจ์)
| ํ์ผ | ์ค๋ช
| ์ถ์ฒ |
|---|
a11y.ts | ์ ๊ทผ์ฑ ์ ํธ๋ฆฌํฐ | - |
cn.ts | Tailwind CSS ํด๋์ค ๋ณํฉ | monet-registry-main |
performance.ts | ์ฑ๋ฅ ์ธก์ ์ ํธ๋ฆฌํฐ | - |
slug.ts | URL slug ์์ฑ (generateSlug, isValidSlug) | 260111-tiny-house |
truncate.ts | ํ
์คํธ ์๋ฅด๊ธฐ (truncate, truncateWords, truncateMiddle) | 260111-tiny-house |
url.ts | URL ๊ด๋ จ ์ ํธ๋ฆฌํฐ | - |
converters/area.ts | ๋ฉด์ ๋จ์ ๋ณํ (sqFt, sqM, pyeong) | 260111-tiny-house |
crypto/file-encryption.ts | ํ์ผ ์ํธํ/๋ณตํธํ | - |
crypto/memo-encryption.ts | ๋ฉ๋ชจ ์ํธํ/๋ณตํธํ | - |
export/csv.ts | CSV ๋ด๋ณด๋ด๊ธฐ ์ ํธ๋ฆฌํฐ | - |
formatters/index.ts | ํฌ๋งทํ
์ ํธ (๊ฐ๊ฒฉ, ํ์ , ์๊ฐ, ์ด๋ฆ ๋ง์คํน, ์ ํ๋ฒํธ) | silvercare-master |
formatters/currency.ts | ๊ตญ์ ํ ํตํ ํฌ๋งทํ
(formatCurrency, formatCurrencyRange) | 260111-tiny-house |
geo/distance.ts | ๊ฑฐ๋ฆฌ ๊ณ์ฐ ์ ํธ๋ฆฌํฐ | - |
geo/validation.ts | ์์น ์ ๋ณด ๊ฒ์ฆ | - |
validators/password.ts | ๋น๋ฐ๋ฒํธ ๊ฒ์ฆ ์ ํธ๋ฆฌํฐ | - |
sanitize.ts | HTML ์ด๊ท (sanitizeHtml, sanitizeEmailHtml, escapeForTemplate) | silvercare-master |
text-analysis.ts | ํ๊ตญ์ด ํ
์คํธ ๋ถ์ (ํ ํฐํ, ๋ถ์ฉ์ด ํํฐ, ๋จ์ด ๋น๋) | kcsi-smpa |
chart-utils.ts | ์ฐจํธ/HTML ์์ โ PNG ์ด๋ฏธ์ง ๋ณํ/๋ค์ด๋ก๋ (html2canvas) | kcsi-smpa |
anonymous-names.ts | ์ต๋ช
ํ๊ตญ์ด ์ด๋ฆ ์์ฑ๊ธฐ (200๊ฐ, ๋๋ค/ํด์/์ธ๋ฑ์ค) | kcsi-smpa |
export/excel.ts | ๋ฒ์ฉ Excel ๋ด๋ณด๋ด๊ธฐ (๋ค์ค ์ํธ, ์๋ ์ปฌ๋ผ ๋๋น, xlsx) | kcsi-smpa |
export/pdf.ts | ๋ฒ์ฉ PDF ๋ฆฌํฌํธ ์์ฑ (jsPDF + autotable) | kcsi-smpa |
export/hwpx.ts | HWPX (ํ๊ธ) ๋ฌธ์ ์์ฑ ๋น๋ (JSZip ๊ธฐ๋ฐ) | kcsi-smpa |
errors.ts | ๋ฒ์ฉ ์๋ฌ ํธ๋ค๋ง (AppError, ValidationError, wrapError, ErrorHandlers) | legal-tech-app |
api-client.ts | Type-safe API Client (ํ ํฐ ์๋ ์ฒจ๋ถ, 401 ๊ฐฑ์ ์ฌ์๋, CRUD ํฌํผ) | silvercare-master |
retry-policy.ts | ์ฌ์๋ ์ ์ฑ
(์ง์ ๋ฐฑ์คํ, ์ปค์คํ
ํ๋ณ, ํ๋ฆฌ์
API/DB) | silvercare-master |
03-utils/browser-stealth (์คํ
์ค ๋ธ๋ผ์ฐ์ ์๋ํ)
์ถ์ฒ: PleasePrompto/notebooklm-mcp | ์ถ์ถ์ผ: 2026-03-18
์์กด์ฑ: ์์ (์์ TypeScript)
์ฌ๋์ฒ๋ผ ์์ฐ์ค๋ฌ์ด ๋ธ๋ผ์ฐ์ ์๋ํ๋ฅผ ์ํ ์ ํธ๋ฆฌํฐ.
| ํ์ผ | ์ค๋ช
|
|---|
types.ts | ๊ณต์ ํ์
(Point, BezierMouseOptions, GaussianDelayOptions ๋ฑ) |
bezier-mouse.ts | Bezier ์ปค๋ธ ๋ง์ฐ์ค ์ด๋ ๊ฒฝ๋ก ์์ฑ (์ ์ด์ ๋๋คํ, jitter) |
gaussian-delay.ts | Gaussian ๋ถํฌ ๋๋ ์ด (Box-Muller ๋ณํ, sleep) |
typo-simulator.ts | ํ์ดํฌ ์๋ฎฌ๋ ์ด์
AsyncGenerator (QWERTY ์ธ์ ํค, ์คํโ์์ ) |
dom-stability.ts | ํด์ ๊ธฐ๋ฐ DOM ์์ ์ฑ ๊ฐ์ง (djb2, ์ฐ์ ์ผ์น ํ์ ) |
index.ts | ๋ฐฐ๋ด export |
03-utils/web3 (Web3 ์์/ํ์
)
| ํ์ผ | ์ค๋ช
| ๋น๊ณ |
|---|
types.ts | Web3 ๊ฒฐ์ ๊ด๋ จ ํ์
์ ์ (ChainId, TokenSymbol, PaymentRequest ๋ฑ) | ๋ ํผ๋ฐ์ค ์ฝ๋ |
constants.ts | ์ฒด์ธ๋ณ RPC URL, USDC/USDT ํ ํฐ ์ฃผ์, ERC20 ABI | ๋ ํผ๋ฐ์ค ์ฝ๋ |
02-hooks/web3 (Web3 React ํ
)
| ํ์ผ | ์ค๋ช
| ๋น๊ณ |
|---|
useWallet.ts | MetaMask ์ง๊ฐ ์ฐ๊ฒฐ/ํด์ /์ฒด์ธ ์ ํ ํ
| ๋ ํผ๋ฐ์ค ์ฝ๋ |
useUSDCPayment.ts | USDC/USDT ์ ์ก ๋ฐ ์์ก ์กฐํ ํ
| ๋ ํผ๋ฐ์ค ์ฝ๋ |
01-ui-components/web3 (Web3 UI ์ปดํฌ๋ํธ)
| ํ์ผ | ์ค๋ช
| ๋น๊ณ |
|---|
CryptoPayment.tsx | ์คํ
์ด๋ธ์ฝ์ธ ๊ฒฐ์ ์์ UI ์ปดํฌ๋ํธ | ๋ ํผ๋ฐ์ค ์ฝ๋ |
08-services/web3 (Web3 ๋ฐฑ์๋ ์๋น์ค)
| ํ์ผ | ์ค๋ช
| ๋น๊ณ |
|---|
verify-payment.ts | ํธ๋์ญ์
ํด์๋ก ๊ฒฐ์ ๊ฒ์ฆ (๋ฐฑ์๋์ฉ) | ๋ ํผ๋ฐ์ค ์ฝ๋ |
Web3 ๊ฒฐ์ ์ฌ์ฉ ๊ฐ์ด๋
์์กด์ฑ
# ํด๋ผ์ด์ธํธ ํ
/์ปดํฌ๋ํธ๋ ๋ณ๋ ์์กด์ฑ ์์ (window.ethereum ์ง์ ์ฌ์ฉ)
# ์๋ฒ ๊ฒ์ฆ์ fetch๋ง ์ฌ์ฉ
์ง์ ์ฒด์ธ
| ์ฒด์ธ | ChainId | ๋น๊ณ |
|---|
| Ethereum | 1 | ๊ฐ์ค๋น ๋์ |
| Polygon | 137 | ๊ถ์ฅ (๋ฎ์ ๊ฐ์ค๋น) |
| Arbitrum | 42161 | L2 |
| Optimism | 10 | L2 |
| Base | 8453 | L2 |
์ฌ์ฉ ์์
// ํด๋ผ์ด์ธํธ
import { CryptoPayment } from '@/components/web3/CryptoPayment';
<CryptoPayment
amount="100.00"
recipientAddress="0x..."
supportedChains={[137, 42161]}
onSuccess={(result) => {
// ๋ฐฑ์๋์ txHash ์ ์กํ์ฌ ๊ฒ์ฆ
fetch('/api/verify-payment', {
method: 'POST',
body: JSON.stringify({ txHash: result.txHash }),
});
}}
/>
// ์๋ฒ (Next.js API Route)
import { verifyPayment } from '@/lib/web3/verify-payment';
const result = await verifyPayment({
txHash: body.txHash,
expectedAmount: '100.00',
expectedRecipient: process.env.PAYMENT_ADDRESS,
expectedToken: 'USDC',
chainId: 137,
});
์ถ๊ฐ ์นดํ
๊ณ ๋ฆฌ
04-supabase-patterns (Supabase ํจํด)
| ํ์ผ | ์ค๋ช
| ๋น๊ณ |
|---|
prisma.ts | Prisma + Supabase ํตํฉ ํจํด | - |
05-auth-rbac (์ธ์ฆ/๊ถํ ํจํด)
| ํ์ผ | ์ค๋ช
| ๋น๊ณ |
|---|
mfa.ts | MFA ๋ค์ค ์ธ์ฆ ํจํด | - |
rbac-permissions.ts | ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด | - |
user.ts | ์ฌ์ฉ์ ์ธ์ฆ ํจํด | - |
edge-jwt (Edge ํธํ JWT ์ธ์ฆ)
์ถ์ฒ: dokiwiki-main | ์ถ์ถ์ผ: 2026-02-16
์์กด์ฑ: ์์ (Web Crypto API๋ง ์ฌ์ฉ, Edge Runtime ํธํ)
| ํ์ผ | ์ค๋ช
|
|---|
auth-types.ts | PublicUser, JWTPayload, Session, TokenPair ์ธํฐํ์ด์ค |
jwt.ts | JWT ์์ฑ/๊ฒ์ฆ (HMAC-SHA256), ํ ํฐ ํ์ด, ์ฟ ํค ํฌํผ, Bearer ์ถ์ถ |
password.ts | PBKDF2-SHA256 ๋น๋ฐ๋ฒํธ ํด์ฑ, timing-safe ๋น๊ต, ์ด๋ฉ์ผ/๋น๋ฐ๋ฒํธ ๊ฒ์ฆ |
06-api-middleware (API ๋ฏธ๋ค์จ์ด)
| ํ์ผ | ์ค๋ช
| ๋น๊ณ |
|---|
cache-tags.ts | ์บ์ ํ๊ทธ ๊ด๋ฆฌ | - |
errors.ts | API ์๋ฌ ํธ๋ค๋ง | monet-registry-main |
rate-limit.ts | ๋ ์ดํธ ๋ฆฌ๋ฏธํ
| - |
upstash-rate-limit.ts | Upstash ๋ ์ดํธ ๋ฆฌ๋ฏธํ
| - |
api-keys/index.ts | API ํค ๊ด๋ฆฌ | - |
api-keys/middleware.ts | API ํค ๋ฏธ๋ค์จ์ด | - |
bff/backend-client.ts | BFF ๋ฐฑ์๋ ํด๋ผ์ด์ธํธ | - |
security/waf.ts | WAF ๋ณด์ ํจํด | - |
session/index.ts | ์ธ์
๊ด๋ฆฌ | - |
api-response.ts | ํต์ผ API ์๋ต ํฌํผ (apiSuccess, apiError, ApiErrors ๋จ์ถ) | silvercare-master |
middleware-system (๋ฒ์ฉ ๋ฏธ๋ค์จ์ด ์์คํ
)
์ถ์ฒ: dokiwiki-main | ์ถ์ถ์ผ: 2026-02-16
์์กด์ฑ: ์์ (api-rate-limit.ts๋ง next/server ํ์)
| ํ์ผ | ์ค๋ช
|
|---|
types.ts | GenericRequest/Response, MiddlewareFn ํ์
, extractClientIp (Vercel/CF/ํ๋ก์) |
kv-store.ts | KVStore ์ธํฐํ์ด์ค + MemoryKVStore (TTL ์๋ ๋ง๋ฃ, Redis ๊ต์ฒด ๊ฐ๋ฅ) |
rate-limit.ts | Rate Limiting + ์คํจ ์๋ ์ถ์ /์ฐจ๋จ (๋ก๊ทธ์ธ ๋ณดํธ) |
api-rate-limit.ts | Next.js API Route ์๋ผ์ธ ์ ์ฉ + ํ๋ฆฌ์
(AUTH_STRICT, STANDARD ๋ฑ) |
request-logger.ts | ์์ฒญ ๋ก๊น
(์์/์ข
๋ฃ ์ธก์ , ๊ฒฝ๋ก ์ ์ธ, ์ปค์คํ
transport) |
compose.ts | ๋ฏธ๋ค์จ์ด ํฉ์ฑ (composeMiddleware) + ์กฐ๊ฑด๋ถ ์คํ (when) |
07-contexts (React ์ปจํ
์คํธ)
| ํ์ผ | ์ค๋ช
| ๋น๊ณ |
|---|
DarkModeProvider.tsx | ๋คํฌ๋ชจ๋ ์ปจํ
์คํธ | - |
QueryProvider.tsx | React Query ํ๋ก๋ฐ์ด๋ | - |
08-services (์๋น์ค ๋ ์ด์ด)
| ํ์ผ | ์ค๋ช
| ๋น๊ณ |
|---|
singleton-service-pattern.ts | ์ฑ๊ธํค ์๋น์ค ํจํด | - |
audit-logger/index.ts | ๊ฐ์ฌ ๋ก๊น
์๋น์ค | - |
storage/index.ts | ํ์ผ ์คํ ๋ฆฌ์ง ์๋น์ค | - |
cloudinary/ | Cloudinary ์ด๋ฏธ์ง CDN (์
๋ก๋, ์์ถ, URL ์ต์ ํ) | silvercare-master |
10-stripe-patterns (Stripe SaaS ๊ตฌ๋
๊ฒฐ์ )
์ถ์ฒ: secure-vault-master + monet-registry-main | ์ถ์ถ์ผ: 2026-02-16
config (์ค์ )
| ํ์ผ | ์ค๋ช
| ์์กด์ฑ |
|---|
stripe-server.ts | ์๋ฒ ํด๋ผ์ด์ธํธ (์ง์ฐ ์ด๊ธฐํ), Price ID ๋งคํ, ํ๋ ์ ๋ณด | stripe |
stripe-client.ts | ๋ธ๋ผ์ฐ์ Stripe.js ๋ก๋ | @stripe/stripe-js |
api (API ๋ผ์ฐํธ - Next.js App Router)
| ํ์ผ | ์๋ํฌ์ธํธ | ์ค๋ช
|
|---|
checkout.ts | POST /api/billing/checkout | Checkout ์ธ์
์์ฑ (14์ผ ๋ฌด๋ฃ์ฒดํ, ํ๋ก๋ชจ์
์ฝ๋) |
webhook.ts | POST /api/webhooks/stripe | Webhook ํธ๋ค๋ฌ (๊ตฌ๋
์์ฑ/๋ณ๊ฒฝ/์ทจ์, ๊ฒฐ์ ์ฑ๊ณต/์คํจ) |
portal.ts | POST /api/billing/portal | Customer Portal ์ธ์
|
change-plan.ts | POST /api/billing/change-plan | ํ๋ ์
/๋ค์ด๊ทธ๋ ์ด๋ (๋น๋ก์ ์ฐ) |
preview-change.ts | POST /api/billing/preview-change | ๋น๋ก์ ์ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ |
payment-method.ts | GET /api/billing/payment-method | ๊ฒฐ์ ์๋จ ์กฐํ (์นด๋ ๋ธ๋๋/last4) |
invoices.ts | GET /api/billing/invoices | ์ธ๋ณด์ด์ค ์ด๋ ฅ (PDF URL ํฌํจ) |
components (UI ์ปดํฌ๋ํธ)
| ํ์ผ | ์ค๋ช
| ์์กด์ฑ |
|---|
pricing-cards.tsx | ๊ฐ๊ฒฉํ ์นด๋ (์/์ฐ ํ ๊ธ, ํ์ฌ ํ๋ ํ์, ์
/๋ค์ด ์๋ ํ๋ณ) | shadcn/ui, lucide-react |
plan-change-dialog.tsx | ํ๋ ๋ณ๊ฒฝ ๋ค์ด์ผ๋ก๊ทธ (๋น๋ก์ ์ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ํ์ธ/์ทจ์) | shadcn/ui, lucide-react |
schema (DB ์คํค๋ง)
| ํ์ผ | ์ค๋ช
| ๋น๊ณ |
|---|
supabase-saas.sql | plans + subscriptions + usage_metrics + audit_logs + ํธ๋ฆฌ๊ฑฐ/RPC | Supabase SQL Editor์์ ์คํ |
02-hooks ์ถ๊ฐ ํ
(GitHub ์ปค๋ฎค๋ํฐ)
์ถ์ฒ: usehooks-ts, @uidotdev/usehooks, ahooks, @mantine/hooks, react-use
์ถ์ถ์ผ: 2026-02-16
Tier 1 โ ํ์
| ํ์ผ | ์ค๋ช
|
|---|
useLocalStorage.ts | localStorage React state (SSR ์์ , ํญ ๊ฐ ๋๊ธฐํ) |
useSessionStorage.ts | sessionStorage React state |
useMediaQuery.ts | CSS ๋ฏธ๋์ด์ฟผ๋ฆฌ ๋ฐ์ํ ๊ฐ์ง |
useEventListener.ts | DOM ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์๋ ๋ฑ๋ก/ํด์ |
useClickOutside.ts | ์์ ๋ฐ๊นฅ ํด๋ฆญ ๊ฐ์ง |
useInterval.ts | setInterval ๋ํผ (์๋ cleanup) |
useTimeout.ts | setTimeout ๋ํผ (reset/clear ์ ์ด) |
useToggle.ts | boolean ์ํ ํ ๊ธ |
useCopyToClipboard.ts | ํด๋ฆฝ๋ณด๋ ๋ณต์ฌ + ์ํ ์ถ์ |
usePrevious.ts | ์ด์ ๋ ๋ ๊ฐ ์ถ์ |
Tier 2 โ ๋งค์ฐ ์ ์ฉ
| ํ์ผ | ์ค๋ช
|
|---|
useWindowSize.ts | ์๋์ฐ ํฌ๊ธฐ ์ถ์ (debounce ํฌํจ) |
useScrollLock.ts | body ์คํฌ๋กค ์ ๊ธ (๋ชจ๋ฌ์ฉ) |
useHover.ts | ์์ hover ์ํ ๊ฐ์ง |
useLongPress.ts | ๊ธธ๊ฒ ๋๋ฅด๊ธฐ ์ ์ค์ฒ ๊ฐ์ง |
useDocumentTitle.ts | ๋ฌธ์ ์ ๋ชฉ ๋์ ๋ณ๊ฒฝ |
useScript.ts | ์ธ๋ถ ์คํฌ๋ฆฝํธ ๋์ ๋ก๋ฉ |
useIdle.ts | ์ฌ์ฉ์ ๋นํ๋ ๊ฐ์ง |
useMouse.ts | ๋ง์ฐ์ค ์์น ์ถ์ (๊ธ๋ก๋ฒ + ์์ ๊ธฐ์ค) |
useWindowScroll.ts | ์๋์ฐ ์คํฌ๋กค ์์น ์ถ์ + ์ ์ด |
useCounter.ts | ์ซ์ ์ํ (increment/decrement/min/max) |
Tier 3 โ ๋ฐ์ดํฐ ๊ตฌ์กฐ
| ํ์ผ | ์ค๋ช
|
|---|
useMap.ts | Map ์๋ฃ๊ตฌ์กฐ ์ํ ๊ด๋ฆฌ |
useSet.ts | Set ์๋ฃ๊ตฌ์กฐ ์ํ ๊ด๋ฆฌ |
useQueue.ts | FIFO ํ ์ํ ๊ด๋ฆฌ |
useList.ts | ๋ฐฐ์ด ์ํ (push/remove/update/swap/move) |
useIsFirstRender.ts | ์ฒซ ๋ ๋ ์ฌ๋ถ ๊ฐ์ง |
useStep.ts | ์คํ
์งํ ๊ด๋ฆฌ (์์๋ UI) |
useCookie.ts | ์ฟ ํค read/write/delete |
useVisibilityChange.ts | ํ์ด์ง ๊ฐ์์ฑ ๋ณ๊ฒฝ ๊ฐ์ง (ํญ ์ ํ) |
03-utils ์ถ๊ฐ ์ ํธ (GitHub ์ปค๋ฎค๋ํฐ)
์ถ์ถ์ผ: 2026-02-16
| ํ์ผ | ์ค๋ช
| ์์กด์ฑ |
|---|
type-guards.ts | ํ์
๊ฐ๋ 15๊ฐ (isString, isObject, isEmpty ๋ฑ) | ์์ |
deep.ts | ๋ฅ ๊ฐ์ฒด ์ ํธ (deepClone, deepEqual, deepMerge, shake, crush, construct) | ์์ |
promise.ts | Promise ์ ํธ (pLimit, pMap, pRetry, tryit, defer, parallel) | ์์ |
functional.ts | ํจ์ํ ์ ํธ (pipe, compose, partial, once, negate) | ์์ |
id.ts | ID ์์ฑ (nanoid, cuid, uuid) | ์์ |
math.ts | ์ํ/ํต๊ณ (mean, median, mode, variance, percentile ๋ฑ) | ์์ |
color.ts | ์์ ์ ํธ (hexToRgb, lighten, darken, contrast ๋ฑ) | ์์ |
event-emitter.ts | ์ด๋ฒคํธ ์ด๋ฏธํฐ (~200B, ์์ผ๋์นด๋ ์ง์) | ์์ |
validation-schemas.ts | Zod ๊ณตํต ์คํค๋ง (email, url, phone, password, pagination) | zod |
array.ts (ํ์ฅ) | +7 ํจ์ (intersects, diff, fork, toggle, select, shift, zipToObject) | ์์ |
date.ts (ํ์ฅ) | +8 ํจ์ (addBusinessDays, startOf, endOf, isWeekend, isBefore ๋ฑ) | ์์ |
03-utils/types (TypeScript ํ์
์ ํธ)
| ํ์ผ | ์ค๋ช
|
|---|
type-helpers.ts | DeepPartial, Prettify, StrictOmit, RequireAtLeastOne ๋ฑ 12๊ฐ |
branded-types.ts | ๋ธ๋๋ ํ์
(UserId, Email ๋ฑ ๋ช
๋ชฉ์ ํ์
) |
discriminated-unions.ts | ํ๋ณ ์ ๋์จ + ํจํด ๋งค์นญ + Result ํ์
|
01-ui-components/error-boundary (Error Boundary)
์ถ์ฒ: GitHub-์ปค๋ฎค๋ํฐ | ์ถ์ถ์ผ: 2026-02-16
| ํ์ผ | ์ค๋ช
|
|---|
ErrorBoundary.tsx | ํด๋์ค ๊ธฐ๋ฐ Error Boundary (resetKeys ์๋ ๋ฆฌ์
) |
ErrorFallback.tsx | ์ฌ์ฌ์ฉ ๊ฐ๋ฅ ์๋ฌ ํด๋ฐฑ UI (์์ด์ฝ, ์์ธ ํ ๊ธ) |
useErrorBoundary.ts | ๋ช
๋ นํ ์๋ฌ ์ ๋ฌ ํ
(์ด๋ฒคํธ ํธ๋ค๋ฌ/๋น๋๊ธฐ ์ฝ๋์ฉ) |
11-state-patterns (์ํ๊ด๋ฆฌ ํจํด)
์ถ์ฒ: GitHub-์ปค๋ฎค๋ํฐ | ์ถ์ถ์ผ: 2026-02-16
zustand
| ํ์ผ | ์ค๋ช
| ์์กด์ฑ |
|---|
slice-pattern.ts | ๋ชจ๋๋ฌ ์ฌ๋ผ์ด์ค ํจํด + combineSlices ํฌํผ | zustand |
persist-middleware.ts | ์ ํ์ ์์ํ + ๋ง๋ฃ ์คํ ๋ฆฌ์ง | zustand |
immer-middleware.ts | Immer ๋ถ๋ณ ์
๋ฐ์ดํธ + deepUpdate ํฌํผ | zustand, immer |
react-query
| ํ์ผ | ์ค๋ช
| ์์กด์ฑ |
|---|
query-key-factory.ts | ์ฟผ๋ฆฌ ํค ํฉํ ๋ฆฌ + CRUD ํ๋ฆฌ์
| @tanstack/react-query |
optimistic-updates.ts | ๋๊ด์ ์
๋ฐ์ดํธ/๋กค๋ฐฑ ํฌํผ | @tanstack/react-query |
infinite-query.ts | ๋ฌดํ ์ฟผ๋ฆฌ + ํ์ด์ง๋ค์ด์
ํฌํผ | @tanstack/react-query |
jotai
| ํ์ผ | ์ค๋ช
| ์์กด์ฑ |
|---|
atom-patterns.ts | ๊ธฐ๋ณธ/ํ์/๋น๋๊ธฐ/์คํ ๋ฆฌ์ง atom ํจํด | jotai |
12-nextjs-patterns (Next.js App Router ํจํด)
์ถ์ฒ: GitHub-์ปค๋ฎค๋ํฐ | ์ถ์ถ์ผ: 2026-02-16
| ํ์ผ | ์ค๋ช
| ์์กด์ฑ |
|---|
server-actions/form-action.ts | Server Action + Zod ๊ฒ์ฆ + useActionState | next, zod |
server-actions/authenticated-action.ts | ์ธ์ฆ ํ์ Server Action ํฉํ ๋ฆฌ | next |
server-actions/optimistic-action.ts | ๋๊ด์ UI ์
๋ฐ์ดํธ + useOptimistic | react, next |
route-handlers/api-helpers.ts | ํ์ค API ์๋ต ํฌ๋งท + ์๋ฌ ํธ๋ค๋ง ๋ํผ | next, zod |
streaming/suspense-pattern.tsx | AsyncBoundary (Suspense + Error Boundary) | react |
rsc/server-client-composition.tsx | Server/Client ํฉ์ฑ ํจํด + ์ง๋ ฌํ ํฌํผ | react |
middleware/auth-middleware.ts | ๊ฒฝ๋ก ๊ธฐ๋ฐ ์ธ์ฆ ๋ฏธ๋ค์จ์ด | next |
13-testing-patterns (ํ
์คํ
ํจํด)
์ถ์ฒ: GitHub-์ปค๋ฎค๋ํฐ | ์ถ์ถ์ผ: 2026-02-16
| ํ์ผ | ์ค๋ช
| ์์กด์ฑ |
|---|
vitest/vitest.config.ts | Vitest ๊ธฐ๋ณธ ์ค์ (globals, happy-dom, ์ปค๋ฒ๋ฆฌ์ง) | vitest, @vitejs/plugin-react |
testing-library/custom-render.tsx | Provider ๋ํ ์ปค์คํ
render | @testing-library/react, @tanstack/react-query |
msw/handlers.ts | MSW ์์ฒญ ํธ๋ค๋ฌ + CRUD ํฉํ ๋ฆฌ | msw |
msw/server-setup.ts | MSW Node ์๋ฒ ์ค์ + ์๋ช
์ฃผ๊ธฐ ๊ด๋ฆฌ | msw |
playwright/base-page.ts | Page Object ๋ฒ ์ด์ค ํด๋์ค | @playwright/test |
playwright/page-fixtures.ts | ์ปค์คํ
Fixture ํจํด + ์ธ์ฆ ์ํ | @playwright/test |
14-mcp-catalog (MCP ์๋ฒ ์นดํ๋ก๊ทธ)
์ถ๊ฐ์ผ: 2026-03-07
Claude Code์์ ์ฌ์ฉ ๊ฐ๋ฅํ MCP ์๋ฒ ๋ฉํ๋ฐ์ดํฐ ๋ ์ง์คํธ๋ฆฌ. ๊ฐ ์๋ฒ์ ์ค์ ์ค๋ํซ, ์ ๊ณต ๋๊ตฌ, ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ์คํ๋ ํ์์ผ๋ก ๊ด๋ฆฌ.
| ์นดํ
๊ณ ๋ฆฌ | ์๋ฒ ์ | ์๋ฒ |
|---|
| browser | 2 | Playwright, Puppeteer |
| search | 2 | Tavily, Brave Search |
| database | 3 | PostgreSQL, Supabase, SQLite |
| filesystem | 1 | Filesystem |
| memory | 1 | Memory |
| devtools | 2 | GitHub, Sentry |
| communication | 2 | Slack, Gmail |
| cloud | 1 | Cloudflare |
์์ธ: 14-mcp-catalog/README.md
15-crawler-patterns (์น ํฌ๋กค๋ง ํ์ดํ๋ผ์ธ ํจํด)
์ถ์ฒ: galaxy-con | ์ถ์ถ์ผ: 2026-03-08
๋ฉํฐ์์ค ์น ํฌ๋กค๋ง 5๋จ๊ณ ํ์ดํ๋ผ์ธ: ์์ง โ ์ ๊ทํ โ ์ค๋ณต์ ๊ฑฐ โ ๊ฒ์ฆ โ ์ ์ฅ.
์์ค ์ด๋ํฐ ํจํด, ๊ต์ฐจ ์์ค ์ค๋ณต์ ๊ฑฐ(5๊ณ์ธต), ์์กด์ฑ ์ฃผ์
(์์คํฉํ ๋ฆฌ/DB Writer) ์ ๊ณต.
ํต์ฌ ํ์ผ
| ํ์ผ | ์ค๋ช
| ์์กด์ฑ |
|---|
types.ts | ๊ณตํต ํ์
(RawItem, NormalizedItem, CrawlResult, SourceAdapter) | ์์ |
config.ts | ํฌ๋กค๋ฌ ์ค์ + ์์ค๋ณ ์ค์ ์ธํฐํ์ด์ค | ์์ |
cli.ts | CLI ์ง์
์ (์ธ์ ํ์ฑ, ์ํ ์ถ๋ ฅ, ํ์ดํ๋ผ์ธ ์คํ) | run-pipeline, config |
sources/base-source.ts | HTML ํฌ๋กค๋ง์ฉ ์์ค ์ด๋ํฐ ์ถ์ ํด๋์ค | types, config |
sources/base-api-source.ts | REST API์ฉ ์์ค ์ด๋ํฐ (Rate Limit + Retry ๋ด์ฅ) | types, config |
pipeline/fetcher.ts | HTTP ํด๋ผ์ด์ธํธ (GET/POST, Rate Limit + Retry) | config |
pipeline/korean-text.ts | ํ๊ตญ์ด ํ
์คํธ ํ์ (๋ ์ง, ์๊ธ, ์ ๋ชฉ, HTML, ์ํ) | ์์ |
pipeline/global-text.ts | ์์ด ํ
์คํธ ํ์ (๋ ์ง, ์๊ธ, ํตํ ๊ฐ์ง) | ์์ |
pipeline/currency-converter.ts | ํ์จ ๋ณํ๊ธฐ (๊ณ ์ +API, ๋์ ํตํ ์ค์ ๊ฐ๋ฅ) | ์์ |
pipeline/normalizer.ts | RawโNormalized ๋ณํ (์ฌ๋ฌ๊ทธ/์นดํ
๊ณ ๋ฆฌ/์๊ฒฉ ํจ์ ์ฃผ์
) | korean-text, global-text, currency-converter |
pipeline/deduplicator.ts | ๋ฐฐ์น ๋ด ์ค๋ณต์ ๊ฑฐ + ์ ์ฌ ์ ๋ชฉ ๋น๊ต (Dice ๊ณ์) | korean-text |
pipeline/cross-source-dedup.ts | ๊ต์ฐจ ์์ค 5๊ณ์ธต ์ค๋ณต์ ๊ฑฐ + ์ถฉ๋ ๋ณํฉ | korean-text, deduplicator |
pipeline/completeness.ts | ๋ฐ์ดํฐ ์์ฑ๋ ์ ์ (ํ๋๋ณ ๊ฐ์ค์น) | types |
pipeline/validator.ts | Zod ์คํค๋ง ๊ฒ์ฆ (์นดํ
๊ณ ๋ฆฌ ๋ชฉ๋ก ์ฃผ์
๊ฐ๋ฅ) | zod, types |
pipeline/run-pipeline.ts | 5๋จ๊ณ ํ์ดํ๋ผ์ธ ์์ง (์์คํฉํ ๋ฆฌ/์ ์ฅํจ์ ์ฃผ์
) | normalizer, deduplicator, validator |
storage/db-writer.ts | DB ์ ์ฅ ์ถ์ ๋ ์ด์ด + InMemoryDbWriter | types |
์์ธ: 15-crawler-patterns/README.md
16-algorithm-engines (์๊ณ ๋ฆฌ์ฆ ์์ง + ์บ๋ฒ์ค ์๊ฐํ)
์ถ์ฒ: galaxy-con | ์ถ์ถ์ผ: 2026-03-08
๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์
์์ง(์์ TypeScript)๊ณผ Canvas/WebGL ๊ธฐ๋ฐ ์ธํฐ๋ํฐ๋ธ ์๊ฐํ React ์ปดํฌ๋ํธ.
physics (๋ฌผ๋ฆฌ ์์ง)
| ํ์ผ | ์ค๋ช
| ์์กด์ฑ |
|---|
boids.ts | Boids ๊ตฐ์ง ์๊ณ ๋ฆฌ์ฆ (๋ถ๋ฆฌยท์ ๋ ฌยท๊ฒฐํฉ + ๋ง์ฐ์ค ๋๋ฆผ) | ์์ |
n-body.ts | N-Body ์ํ๊ณ ์๋ฎฌ๋ ์ด์
(์ค๋ ฅยท๊ถค๋ยท์ค/ํฌยทํธ๋ฒ/ํด๋ฆญ) | ์์ |
canvas (React ์บ๋ฒ์ค ์ปดํฌ๋ํธ)
| ํ์ผ | ์ค๋ช
| ์์กด์ฑ |
|---|
BoidsCanvas.tsx | Boids ๊ตฐ์ง ์๊ฐํ (ํฌ์์ ํํผ, ๊ณผ๋ฐ์ง ๋น์ฐ, ๊ทธ๋ฃน ์์) | React |
BoidsBackground.tsx | ์ ์ฒด ํ๋ฉด Boids ๋ฐฐ๊ฒฝ ํจ๊ณผ | React, physics/boids |
GalaxyCanvas.tsx | ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ํ๊ณ ์ธํฐ๋ํฐ๋ธ ์๊ฐํ | React, physics/n-body |
MandelbrotCanvas.tsx | ๋ง๋ธ๋ธ๋ก ํ๋ํ ์๋ ์ค์ธ (WebGL) | React, WebGL |
FluidCanvas.tsx | ๋๋น์-์คํ ํฌ์ค ์ ์ฒด ์ญํ (WebGL 2) | React, WebGL 2 |
JuliaPreview.tsx | ์ค๋ฆฌ์ ์งํฉ ํ๋ฆฌ๋ทฐ/์์ด์ฝ (Canvas 2D, ๋ฉ๋ชจ์ด์ฆ) | React |
์์ธ: 16-algorithm-engines/README.md
17-verification-patterns (์ํฐํฐ ์ ๋ขฐ๋ ๊ฒ์ฆ)
์ถ์ฒ: galaxy-con | ์ถ์ถ์ผ: 2026-03-08
Trust Score(๊ฐ์ค์น ๊ธฐ๋ฐ 0~100 ์ ๋ขฐ๋ ์ ์) ์ฐ์ถ + URL ์์ ์ฑ ๊ฒ์ฆ(URLhaus + VirusTotal) ํตํฉ ํจํด.
| ํ์ผ | ์ค๋ช
| ์์กด์ฑ |
|---|
types.ts | ๊ณตํต ํ์
(TrustSignals, VerificationInput, VerificationResult ๋ฑ) | ์์ |
trust-score.ts | ๊ฐ์ค์น ๊ธฐ๋ฐ Trust Score ๊ณ์ฐ ์์ง (์ค์ ๊ฐ๋ฅํ ๊ฐ์ค์น/ํจ๋ํฐ) | ์์ |
url-verification.ts | URLhaus + VirusTotal ๊ธฐ๋ฐ URL ์์ ์ฑ ๊ฒ์ฆ | fetch API |
index.ts | ํตํฉ ๊ฒ์ฆ ์ค์ผ์คํธ๋ ์ดํฐ + re-exports | ์์ |
ํ๊ฒฝ๋ณ์: VIRUSTOTAL_API_KEY (์ ํ)
์์ธ: 17-verification-patterns/README.md
๊ด๋ จ ๋ฌธ์