JK
>로딩 중 // 로딩 중
뷰 초기화 중
마이크로서비스, 분산 시스템, 최신 프론트엔드 역량을 집약한 풀스택 엔지니어 포트폴리오 웹사이트.
역동적인 인터랙션, 완벽한 다국어 현지화 및 최상위 Core Web Vitals 점수를 동시에 달성하는 것.
| 기술 | 버전 | 목적 | 선택 이유 |
|---|---|---|---|
| Next.js | ^16.1.6 | App Router framework | Server Components, file-based routing, API routes, image optimization |
| React | ^19.2.4 | UI library | Server Components and concurrent rendering |
| TypeScript | ^5 | Type safety | Typed project content catches slug/data mismatches at compile time |
| Tailwind CSS | ^4 | Utility-first styling | CSS-first config with @theme/oklch tokens, no JS config file |
| Framer Motion | ^12 | Animations | Stagger/fade/hover primitives with useInView and useReducedMotion |
| @xyflow/react + dagre | ^12.11.5 / ^0.8.5 | Architecture diagrams | Data-driven interactive graphs with automatic layout |
| Nodemailer | ^7.0.11 | Contact email delivery | Simple Gmail SMTP transport from a single API route |
| @upstash/ratelimit + @vercel/kv | ^2.1.0 / ^3.0.0 | Distributed rate limiting | Shared sliding-window counter across serverless instances |
| Radix UI + shadcn/ui | primitives + copied source | Accessible UI primitives | Accessible tooltips/labels with full style control via copied components |
| Vercel | — | Hosting & analytics | Zero-config Next.js deploys, CDN, Web Analytics |
| 메서드 | 경로 | 목적 |
|---|---|---|
| POST | /api/contact | Validate contact form input, rate-limit by IP, send email via Gmail SMTP |
결정: Store all project content as typed constants in lib/projects/*.ts joined by slug
이유: Type safety, zero runtime fetch cost, no database or CMS dependency
이점: Compile-time checks, ships with bundle, server-renderable, free hosting footprint
트레이드오프: Content changes require code changes and redeployment
결정: Detail pages and layout are server components; lists, diagrams, and forms are client components
이유: Minimize client JS while keeping interactive features
이점: Smaller bundle, faster first paint, SEO-friendly detail pages
트레이드오프: Mental overhead of the serialization boundary
결정: Configure theme via @theme directives in globals.css instead of tailwind.config.js
이유: Tailwind v4 removes the JS config in favor of CSS-native tokens
이점: One file for design tokens, oklch dark/light variables, simpler setup
트레이드오프: Different from v3 muscle memory
결정: Derive architecture diagrams from data (nodes/edges) with Dagre auto-layout
이유: Diagrams stay consistent with content and render interactively
이점: No hand-drawn images, zoom/pan, themable, ER table nodes supported
트레이드오프: Client bundle cost on pages that render diagrams
결정: Validate + HTML-escape inputs, then rate-limit via Upstash sliding window with in-memory fallback
이유: Serverless instances don't share memory; shared KV store gives consistent limits
이점: XSS-safe output, 5 req/min/IP abuse protection, graceful degradation
트레이드오프: Requires KV env vars for full protection; no CSRF token yet
결정: Send contact emails through an existing Gmail account
이유: Simplest delivery path for a personal portfolio with no backend infra
이점: One route handler, no third-party email SaaS
트레이드오프: App password rotation, self-email only, SMTP rate limits