spinny:~/writing $ less create-demo-claude-code-vibecoding.md
12**바이브코딩**은 프로그래머가 자연어 지시를 통해 AI 에이전트를 안내하여 인공지능이 실제 코드를 작성하도록 하는 새로운 소프트웨어 개발 패러다임입니다. 이 용어는 Andrej Karpathy(OpenAI 공동 창립자이자 Tesla의 전 AI 디렉터)가 2025년 2월의 유명한 트윗에서 만들었습니다: _"바이브코딩이라고 부르는 새로운 종류의 코딩이 있습니다. 완전히 바이브에 몸을 맡기고, 기하급수적 성장을 받아들이며, 코드가 존재한다는 것조차 잊어버리는 것입니다."_34이 글에서는 **Claude Code**를 AI 에이전트로, **Supabase**를 백엔드(데이터베이스, 인증, API)로, **Vercel**을 배포에 사용하여 완전한 작동 데모를 만드는 방법을 살펴봅니다 - 모두 이 서비스들의 **무료 티어**만 활용합니다.56## 1. 바이브코딩이란 무엇이며 왜 혁명적인가78바이브코딩은 소프트웨어 개발에서 근본적인 패러다임 전환을 나타냅니다. 한 줄씩 코드를 작성하는 대신 개발자는:9101. 원하는 것을 자연어로 **설명합니다**.112. **AI 에이전트**가 완전한 코드를 생성합니다.123. **개발자**가 검토, 테스트, 반복합니다.1314### 왜 효과적인가1516- **속도**: 며칠이 걸릴 프로젝트를 몇 시간 만에 만들 수 있습니다.17- **접근성**: 전문가가 아닌 개발자도 작동하는 제품을 만들 수 있습니다.18- **빠른 반복**: 아이디어를 테스트하고 훨씬 빠르게 방향을 전환할 수 있습니다.19- **제품 중심**: _어떻게_ 대신 _무엇_에 집중합니다.2021```mermaid22flowchart LR23 A[Idea] --> B[Natural language prompt]24 B --> C[Claude Code generates code]25 C --> D[Review and test]26 D --> E[Iteration]27 E --> B28 D --> F[Deploy to Vercel]29```3031### 바이브코딩을 사용할 때3233바이브코딩은 다음에 완벽합니다:3435- **데모와 MVP**: 아이디어를 검증하기 위한 프로토타입을 빠르게 구축.36- **해커톤**: 단 몇 시간 만에 작동하는 제품 생성.37- **사이드 프로젝트**: 몇 주를 투자하지 않고 새로운 기술 탐색.38- **개념 증명**: 이해관계자나 투자자에게 기술적 실현 가능성 시연.3940> **주의:** 바이브코딩은 데모와 프로토타입에 탁월합니다. 높은 보안 및 확장성 요구 사항이 있는 프로덕션급 애플리케이션의 경우 생성된 코드에 대한 철저한 검토가 여전히 필수적입니다.4142## 2. 기술 스택: Claude Code + Supabase + Vercel4344### Claude Code4546Claude Code는 Anthropic의 AI 코딩 에이전트입니다. 터미널에서 직접 작동하며 다음을 할 수 있습니다:4748- 전체 코드베이스를 읽고 이해.49- 파일 생성, 수정, 삭제.50- 터미널 명령 실행.51- API 및 외부 서비스와 상호작용.52- Git으로 버전 관리.53- 오류와 버그에 대해 자율적으로 반복.5455```bash56# Install Claude Code57npm install -g @anthropic-ai/claude-code5859# Start in a project directory60cd my-project61claude62```6364### Supabase (무료 티어)6566Supabase는 다음을 제공하는 오픈소스 Firebase 대안입니다:6768- **PostgreSQL 데이터베이스**: 완전한 관계형 데이터베이스.69- **인증**: 이메일, Google, GitHub 등으로 로그인.70- **REST 및 Realtime API**: 스키마에서 자동 생성.71- **스토리지**: 파일과 이미지용.72- **Edge Functions**: 서버리스 함수.7374무료 티어에 포함:7576| 리소스 | 무료 한도 |77|----------|-----------|78| 데이터베이스 | 500 MB |79| 스토리지 | 1 GB |80| 대역폭 | 5 GB |81| Edge Function 호출 | 월 500K |82| 인증된 사용자 | 무제한 |83| 프로젝트 | 활성 프로젝트 2개 |8485### Vercel (무료 티어)8687Vercel은 Next.js 애플리케이션을 위한 완벽한 배포 플랫폼입니다:8889- GitHub에서 **자동 배포**.90- 모든 브랜치와 PR에 대한 **프리뷰 배포**.91- 최적의 성능을 위한 **글로벌 CDN**.92- **Serverless Functions** 포함.93- 무료 **기본 분석**.9495무료 티어에 포함:9697| 리소스 | 무료 한도 |98|----------|-----------|99| 대역폭 | 월 100 GB |100| Serverless Function 실행 | 월 100 GB-시간 |101| 빌드 | 월 6,000분 |102| 프로젝트 | 무제한 |103| 배포 | 무제한 |104105## 3. 초기 설정: 환경 준비106107### 사전 요구 사항108109시작하기 전에 다음을 확인하세요:110111- **Node.js 18+** 설치.112- **Git** 구성.113- **GitHub** 계정.114- **Supabase** 계정 ([supabase.com](https://supabase.com)에서 무료).115- **Vercel** 계정 ([vercel.com](https://vercel.com)에서 무료).116- **Claude Code** 설치 (`npm install -g @anthropic-ai/claude-code`).117118### 단계 1: 프로젝트 생성119120터미널을 열고 Claude Code를 시작합니다:121122```bash123mkdir my-demo-app && cd my-demo-app124claude125```126127이제 자연어로 Claude Code에 지시를 시작할 수 있습니다:128129```130You: Create a Next.js 15 project with App Router, TypeScript, Tailwind CSS,131and shadcn/ui. Also initialize a Git repository.132```133134Claude Code가 자동으로 실행합니다:135136```bash137npx create-next-app@latest . --typescript --tailwind --eslint --app --src-dir138npx shadcn@latest init139git init && git add . && git commit -m "Initial commit"140```141142### 단계 2: Supabase 구성1431441. [supabase.com](https://supabase.com)에 가서 새 프로젝트를 생성합니다.1452. Settings > API에서 **Project URL**과 **anon key**를 메모합니다.1463. Claude Code가 있는 터미널로 돌아갑니다:147148```149You: Add Supabase to the project. Create a .env.local file with the variables150NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY. Configure the151Supabase client with SSR support for Next.js App Router.152```153154Claude Code가 완전한 구성을 생성합니다:155156```typescript157// src/lib/supabase/client.ts158import { createBrowserClient } from '@supabase/ssr';159160export function createClient() {161 return createBrowserClient(162 process.env.NEXT_PUBLIC_SUPABASE_URL!,163 process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!164 );165}166```167168```typescript169// src/lib/supabase/server.ts170import { createServerClient } from '@supabase/ssr';171import { cookies } from 'next/headers';172173export async function createClient() {174 const cookieStore = await cookies();175176 return createServerClient(177 process.env.NEXT_PUBLIC_SUPABASE_URL!,178 process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,179 {180 cookies: {181 getAll() {182 return cookieStore.getAll();183 },184 setAll(cookiesToSet) {185 cookiesToSet.forEach(({ name, value, options }) =>186 cookieStore.set(name, value, options)187 );188 },189 },190 }191 );192}193```194195## 4. 데모 만들기: 작업 관리 앱196197구체적인 데모를 만들어 봅시다: 인증, 전체 CRUD, 현대적 인터페이스를 갖춘 **작업 관리 앱**.198199### 데이터베이스 스키마 정의200201스키마를 생성하도록 Claude Code에 지시합니다:202203```204You: Create a SQL migration for Supabase with the following tables:2052061. profiles: id (uuid, FK to auth.users), username (text), avatar_url (text),207 created_at2082. projects: id (uuid), name (text), description (text), owner_id (uuid, FK209 to profiles), created_at2103. tasks: id (uuid), title (text), description (text), status (enum:211 todo/in_progress/done), priority (enum: low/medium/high), project_id (uuid,212 FK to projects), assigned_to (uuid, FK to profiles), due_date (timestamp),213 created_at, updated_at214215Enable Row Level Security on all tables and create appropriate policies.216```217218Claude Code가 완전한 마이그레이션을 생성합니다:219220```sql221-- Create enum types222CREATE TYPE task_status AS ENUM ('todo', 'in_progress', 'done');223CREATE TYPE task_priority AS ENUM ('low', 'medium', 'high');224225-- Profiles table226CREATE TABLE profiles (227 id UUID REFERENCES auth.users ON DELETE CASCADE PRIMARY KEY,228 username TEXT UNIQUE,229 avatar_url TEXT,230 created_at TIMESTAMPTZ DEFAULT NOW()231);232233-- Projects table234CREATE TABLE projects (235 id UUID DEFAULT gen_random_uuid() PRIMARY KEY,236 name TEXT NOT NULL,237 description TEXT,238 owner_id UUID REFERENCES profiles(id) ON DELETE CASCADE NOT NULL,239 created_at TIMESTAMPTZ DEFAULT NOW()240);241242-- Tasks table243CREATE TABLE tasks (244 id UUID DEFAULT gen_random_uuid() PRIMARY KEY,245 title TEXT NOT NULL,246 description TEXT,247 status task_status DEFAULT 'todo',248 priority task_priority DEFAULT 'medium',249 project_id UUID REFERENCES projects(id) ON DELETE CASCADE NOT NULL,250 assigned_to UUID REFERENCES profiles(id),251 due_date TIMESTAMPTZ,252 created_at TIMESTAMPTZ DEFAULT NOW(),253 updated_at TIMESTAMPTZ DEFAULT NOW()254);255256-- Enable RLS257ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;258ALTER TABLE projects ENABLE ROW LEVEL SECURITY;259ALTER TABLE tasks ENABLE ROW LEVEL SECURITY;260261-- Profiles policies262CREATE POLICY "Users can view own profile"263 ON profiles FOR SELECT USING (auth.uid() = id);264CREATE POLICY "Users can update own profile"265 ON profiles FOR UPDATE USING (auth.uid() = id);266267-- Projects policies268CREATE POLICY "Users can view own projects"269 ON projects FOR SELECT USING (auth.uid() = owner_id);270CREATE POLICY "Users can create projects"271 ON projects FOR INSERT WITH CHECK (auth.uid() = owner_id);272CREATE POLICY "Users can update own projects"273 ON projects FOR UPDATE USING (auth.uid() = owner_id);274CREATE POLICY "Users can delete own projects"275 ON projects FOR DELETE USING (auth.uid() = owner_id);276277-- Tasks policies278CREATE POLICY "Users can view tasks in their projects"279 ON tasks FOR SELECT USING (280 project_id IN (SELECT id FROM projects WHERE owner_id = auth.uid())281 );282CREATE POLICY "Users can create tasks in their projects"283 ON tasks FOR INSERT WITH CHECK (284 project_id IN (SELECT id FROM projects WHERE owner_id = auth.uid())285 );286CREATE POLICY "Users can update tasks in their projects"287 ON tasks FOR UPDATE USING (288 project_id IN (SELECT id FROM projects WHERE owner_id = auth.uid())289 );290CREATE POLICY "Users can delete tasks in their projects"291 ON tasks FOR DELETE USING (292 project_id IN (SELECT id FROM projects WHERE owner_id = auth.uid())293 );294```295296이 마이그레이션은 Supabase 대시보드(SQL Editor)에서 직접 또는 CLI를 통해 실행할 수 있습니다.297298### TypeScript 타입 생성299300```301You: Generate TypeScript types from the Supabase database and save them to src/types/database.ts302```303304```bash305npx supabase gen types typescript --project-id YOUR_PROJECT_ID > src/types/database.ts306```307308### 사용자 인터페이스 구축309310이제 바이브코딩의 가장 강력한 부분이 옵니다. Claude Code에 높은 수준의 지시를 내립니다:311312```313You: Create a dashboard page for the task management app with:3143151. Sidebar with navigation between projects3162. Kanban view with 3 columns (Todo, In Progress, Done) with drag & drop3173. Modal to create/edit tasks3184. Header with user avatar and logout3195. Modern design with shadcn/ui and Tailwind320321Use data from Supabase with React Server Components where possible322and Client Components only where interactivity is needed.323```324325Claude Code가 컴포넌트별로 전체 인터페이스를 구축합니다.326327### 인증 추가328329```330You: Add a complete authentication system with:3313321. Login page with email/password and GitHub login3332. Registration page3343. Middleware to protect authenticated routes3354. Automatic redirect for unauthenticated users3365. Automatic profile creation after registration337```338339Claude Code가 Next.js 미들웨어와 인증 페이지를 구성합니다:340341```typescript342// src/middleware.ts343import { createServerClient } from '@supabase/ssr';344import { NextResponse, type NextRequest } from 'next/server';345346export async function middleware(request: NextRequest) {347 let supabaseResponse = NextResponse.next({ request });348349 const supabase = createServerClient(350 process.env.NEXT_PUBLIC_SUPABASE_URL!,351 process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,352 {353 cookies: {354 getAll() {355 return request.cookies.getAll();356 },357 setAll(cookiesToSet) {358 cookiesToSet.forEach(({ name, value }) =>359 request.cookies.set(name, value)360 );361 supabaseResponse = NextResponse.next({ request });362 cookiesToSet.forEach(({ name, value, options }) =>363 supabaseResponse.cookies.set(name, value, options)364 );365 },366 },367 }368 );369370 const { data: { user } } = await supabase.auth.getUser();371372 if (!user && !request.nextUrl.pathname.startsWith('/auth')) {373 const url = request.nextUrl.clone();374 url.pathname = '/auth/login';375 return NextResponse.redirect(url);376 }377378 return supabaseResponse;379}380381export const config = {382 matcher: ['/((?!_next/static|_next/image|favicon.ico|auth).*)'],383};384```385386## 5. 고급 바이브코딩 패턴387388### 반복적 프롬프팅389390효과적인 바이브코딩의 비결은 **반복**입니다. 하나의 프롬프트에 모든 것을 설명하려 하지 마세요. 단계별로 진행하세요:391392```393Step 1: "Create the base layout with header and sidebar"394Step 2: "Add the project list in the sidebar with a button to create new ones"395Step 3: "Create the Kanban view in the main area"396Step 4: "Add drag & drop between columns"397Step 5: "Implement the modal to create new tasks"398Step 6: "Add toast notifications for user feedback"399```400401> **팁:** 프롬프트가 구체적이고 맥락이 풍부할수록 결과가 좋습니다. Claude Code는 전체 코드베이스에 접근할 수 있으므로 새로운 기능을 일관되게 통합할 수 있습니다.402403### 오류 처리404405무언가 작동하지 않을 때 (그리고 그럴 것입니다), 간단히 말할 수 있습니다:406407```408You: I'm getting this error in the console: "TypeError: Cannot read property409'map' of undefined" in the TaskList component. Fix it.410```411412Claude Code가 코드를 분석하고, 문제를 식별하고, 수정합니다.413414### AI로 리팩토링415416```417You: The Dashboard component has become too large. Split it into smaller,418reusable components while maintaining the same functionality.419```420421### 테스트422423```424You: Add tests with Vitest for utility functions and Playwright tests for425the authentication and task creation flow.426```427428## 6. Vercel에 배포: 코드에서 세계로429430### 단계 1: GitHub에 푸시431432```433You: Create an appropriate .gitignore, commit everything, and push to a new434GitHub repository called "my-demo-app".435```436437```bash438git add .439git commit -m "feat: complete task management demo"440gh repo create my-demo-app --public --push --source=.441```442443### 단계 2: Vercel 연결4444451. [vercel.com](https://vercel.com)에 가서 "Add New Project"를 클릭합니다.4462. 방금 만든 GitHub 저장소를 가져옵니다.4473. 환경 변수를 추가합니다:448 - `NEXT_PUBLIC_SUPABASE_URL`449 - `NEXT_PUBLIC_SUPABASE_ANON_KEY`4504. "Deploy"를 클릭합니다.451452```mermaid453flowchart LR454 A[GitHub Push] --> B[Vercel Build]455 B --> C[Automatic Deploy]456 C --> D[Public URL]457 D --> E[Global CDN]458```459460### 단계 3: 커스텀 도메인 구성 (선택사항)461462Vercel은 `my-demo-app.vercel.app`과 같은 무료 URL을 제공합니다. 커스텀 도메인의 경우:463464```465You: Add the configuration for a custom domain in vercel.json466```467468### 프리뷰 배포469470GitHub에서 Pull Request를 열 때마다 Vercel은 고유한 URL로 **프리뷰 배포**를 자동 생성합니다. 병합 전에 변경사항을 보여주기에 완벽합니다.471472## 7. 데모 최적화473474### 성능475476```477You: Optimize the app's performance:4781. Add loading states with Suspense and skeletons4792. Implement caching with Next.js unstable_cache4803. Optimize images with next/image4814. Add SEO metadata for each page482```483484### Supabase로 실시간485486데모에서 항상 인상적인 기능은 **실시간**입니다:487488```489You: Add realtime synchronization for tasks using Supabase Realtime.490When a user updates a task, all other users should see the change491in real time without refreshing.492```493494```typescript495'use client';496497import { useEffect, useState } from 'react';498import { createClient } from '@/lib/supabase/client';499import type { Task } from '@/types/database';500501export function useRealtimeTasks(projectId: string) {502 const [tasks, setTasks] = useState<Task[]>([]);503 const supabase = createClient();504505 useEffect(() => {506 const channel = supabase507 .channel('tasks-changes')508 .on(509 'postgres_changes',510 {511 event: '*',512 schema: 'public',513 table: 'tasks',514 filter: `project_id=eq.${projectId}`,515 },516 (payload) => {517 if (payload.eventType === 'INSERT') {518 setTasks((prev) => [...prev, payload.new as Task]);519 } else if (payload.eventType === 'UPDATE') {520 setTasks((prev) =>521 prev.map((t) =>522 t.id === payload.new.id ? (payload.new as Task) : t523 )524 );525 } else if (payload.eventType === 'DELETE') {526 setTasks((prev) =>527 prev.filter((t) => t.id !== payload.old.id)528 );529 }530 }531 )532 .subscribe();533534 return () => {535 supabase.removeChannel(channel);536 };537 }, [projectId, supabase]);538539 return tasks;540}541```542543### 다크 모드544545```546You: Add dark mode support with a toggle in the header.547Use Tailwind dark classes and save the preference in localStorage.548```549550## 8. 효과적인 바이브코딩을 위한 모범 사례551552### 1. 프롬프트에서 구체적으로553554```555❌ "Make a nice page"556✅ "Create a landing page with a hero section with a purple-blue gradient,557 a features section with 3 cards with icons, and an orange CTA button"558```559560### 2. 컨텍스트 제공561562```563❌ "Add authentication"564✅ "Add authentication with Supabase Auth. The project uses Next.js 15 App565 Router with TypeScript. I want email/password login and OAuth with GitHub.566 Use the SSR pattern with @supabase/ssr"567```568569### 3. 작은 단계로 반복570571하나의 프롬프트에 모든 것을 구축하려 하지 마세요. 점진적으로 진행하세요:5725731. 기본 레이아웃5742. 한 번에 하나의 기능5753. 스타일링과 다듬기5764. 오류 처리5775. 테스트578579### 4. 생성된 코드 검토580581바이브코딩은 코드를 읽지 않는다는 의미가 아닙니다. 항상 검토하세요:582583- **보안**: RLS 정책, 입력 유효성 검사, 데이터 살균.584- **성능**: N+1 쿼리, 불필요한 클라이언트 사이드 컴포넌트.585- **모범 사례**: 프로젝트 구조, 명명 규칙.586587### 5. Git을 전략적으로 사용588589```590You: Commit the changes with a descriptive message after each completed feature.591```592593문제가 발생하면 되돌릴 수 있습니다.594595## 9. 비용: 정말 전부 무료인가?596597각 서비스의 비용 분석:598599| 서비스 | 무료 플랜 | 지불 시점 |600|---------|-----------|-------------|601| **Claude Code** | Anthropic 플랜 필요 (월 $20부터) 또는 API 키 | 즉시, 하지만 가치는 막대함 |602| **Supabase** | 넉넉한 무료 티어 (2 프로젝트, 500MB DB) | 무료 티어 한도 초과 시 |603| **Vercel** | 개인 프로젝트용 무료 티어 | 팀 또는 상업적 사용 시 |604| **GitHub** | 공개 및 비공개 저장소 무료 | 엔터프라이즈 기능 |605606> **참고:** Claude Code는 구독 또는 API 크레딧이 필요하지만, 개발 속도 측면에서 투자 대비 수익은 매우 큽니다. 데모나 MVP의 경우 총 비용은 약 $20 수준입니다.607608### 무료 AI 대안609610비용을 완전히 제로로 유지하려면:611612- **Cursor** (제한이 있는 무료 티어).613- **GitHub Copilot** (학생 및 오픈소스 무료).614- **Codeium/Windsurf** (넉넉한 무료 티어).615616## 10. 데모에서 제품으로: 다음 단계617618데모가 라이브된 후 진행 방법:619620```mermaid621flowchart TD622 A[Live Demo] --> B{User Feedback}623 B --> C[Product Iteration]624 C --> D[Product-Market Fit]625 D --> E[Scaling]626 E --> F[Supabase Pro Plan]627 E --> G[Vercel Pro Plan]628 E --> H[Custom Domain]629```6306311. **피드백 수집**: 잠재 사용자와 데모를 공유하고 의견을 모읍니다.6322. **빠르게 반복**: 요청된 변경사항 구현에 바이브코딩을 사용합니다.6333. **지표 모니터링**: Vercel Analytics와 Supabase Dashboard가 필수 데이터를 제공합니다.6344. **필요시 확장**: 수요가 검증된 후에만 유료 플랜으로 업그레이드합니다.635636637## 결론638639Claude Code, Supabase, Vercel을 이용한 바이브코딩은 기록적인 시간 내에 데모와 MVP를 만들기 위한 강력한 조합입니다. 이전에는 몇 주의 개발이 걸렸던 것이 이제 놀라울 정도로 높은 품질로 단 몇 시간 만에 달성할 수 있습니다.640641핵심은 올바른 마인드셋으로 바이브코딩에 접근하는 것입니다: "코딩을 모른다"는 것이 아니라 AI 도구로 **능력을 증폭**시키는 것입니다. 기반 기술(React, SQL, 인증, 배포)에 대해 더 많이 알수록 AI 에이전트를 원하는 결과로 안내하는 데 더 효과적입니다.642643소프트웨어 개발의 미래가 여기에 있으며, 시작 비용은 이전보다 낮은 적이 없습니다. 데모를 만들고, 실제 사용자와 검증하고, 다음 위대한 제품을 구축하세요.644645> **첫 번째 데모를 위한 체크리스트:**646>647> - [x] Claude Code 설치 및 구성 완료648> - [x] 데이터베이스 스키마로 Supabase 프로젝트 생성649> - [x] shadcn/ui로 Next.js 프로젝트 초기화650> - [x] 인증 구성 완료651> - [x] 전체 CRUD 구현 완료652> - [x] 현대적이고 반응형 UI653> - [x] Vercel에 배포 완료654> - [x] 피드백을 위한 공유 가능한 URL 준비 완료655
:Claude Code로 데모를 만드는 방법: Supabase와 Vercel로 바이브코딩lines 1-655 (END) — press q to close