바이브코딩을 위한 효과적인 프롬프트 패턴과 대화 전략
바이브 코딩에서 프롬프트는 **코드 대신 작성하는 "지시서"**입니다. 좋은 지시서는 다음 3가지를 포함합니다:
무엇을 만들지 명확하게 말합니다.
Bad: "로그인 기능 만들어줘"
Good: "이메일/비밀번호로 로그인하는 기능을 만들어줘.
Supabase Auth를 사용하고, 로그인 성공 시 /dashboard로 리다이렉트해줘."
현재 상황과 기존 코드를 알려줍니다.
Bad: "버그 고쳐줘"
Good: "로그인 버튼을 클릭하면 'TypeError: Cannot read property email of null'
에러가 발생해. app/login/page.tsx의 handleSubmit 함수에서 나는 것 같아."
원하는 결과물의 형태를 알려줍니다.
Bad: "API 만들어줘"
Good: "사용자 목록을 반환하는 GET /api/users 엔드포인트를 만들어줘.
응답 형식은 { users: [{ id, name, email }], total: number } 로."
| # | Bad 프롬프트 | Good 프롬프트 | 개선 포인트 |
|---|---|---|---|
| 1 | "버튼 만들어줘" | "파란색 라운드 버튼을 만들어줘. 호버하면 진한 파란색으로 변하고, 로딩 중엔 스피너가 표시돼" | 스타일 + 상태 명시 |
| 2 | "DB 연결해줘" | "Supabase 클라이언트를 lib/supabase.ts에 설정해줘. 환경변수는 .env.local에서 읽어" | 도구 + 파일 위치 |
| 3 | "에러 처리해줘" | "이 API 라우트에서 Supabase 에러 시 적절한 HTTP 상태 코드와 한국어 메시지를 반환해줘" | 구체적 행동 |
| 4 | "테스트 만들어줘" | "calculatePrice 함수의 유닛 테스트를 작성해줘. 정상 케이스 2개, 에러 케이스 2개" | 범위 + 수량 |
| 5 | "페이지 만들어줘" | "가격표 페이지를 만들어줘. Free/Pro/Enterprise 3개 플랜, 토글로 월간/연간 전환" | 상세 구조 |
| 6 | "성능 개선해줘" | "이 컴포넌트가 매 렌더링마다 API를 호출하는데, useSWR로 캐싱 처리해줘" | 원인 + 해결법 |
| 7 | "반응형 만들어줘" | "모바일(640px 이하)에서는 1열, 태블릿에서는 2열, 데스크톱에서는 3열 그리드로" | 브레이크포인트 |
| 8 | "배포해줘" | "Vercel에 배포할 수 있게 next.config.ts 설정하고, 환경변수 목록 알려줘" | 플랫폼 + 산출물 |
| 9 | "코드 정리해줘" | "이 파일에서 미사용 import 제거하고, 함수를 기능별로 분리해서 별도 파일로 추출해줘" | 구체적 작업 목록 |
| 10 | "다크 모드 추가해줘" | "next-themes로 다크 모드를 구현해줘. 시스템 설정 자동 감지, 헤더에 토글 버튼" | 라이브러리 + 위치 |
"[기능 이름]을 추가해줘.
요구사항:
- [구체적 요구사항 1]
- [구체적 요구사항 2]
- [구체적 요구사항 3]
기술 스택: [사용할 라이브러리/도구]
파일 위치: [생성할 파일 경로]"
실전 예시:
"사용자 프로필 편집 기능을 추가해줘.
요구사항:
- 이름, 이메일, 프로필 이미지 변경 가능
- 이미지는 Supabase Storage에 업로드
- 변경 사항은 실시간으로 헤더에 반영
기술 스택: Supabase Storage, react-hook-form
파일 위치: app/(main)/profile/page.tsx"
"[어디서] [무엇을 하면] [어떤 문제가] 발생해.
에러 메시지:
[에러 메시지 전문]
기대 동작: [원래 이렇게 되어야 한다]
실제 동작: [이렇게 되고 있다]"
실전 예시:
"로그인 페이지에서 이메일을 입력하고 로그인 버튼을 누르면 페이지가 새로고침되면서 입력값이 사라져.
에러 메시지: 없음 (콘솔에도 에러 없음)
기대 동작: 로그인 처리 후 대시보드로 이동
실제 동작: 페이지가 새로고침됨"
"[파일/함수]를 리팩토링해줘.
현재 문제:
- [문제점 1]
- [문제점 2]
원하는 방향:
- [개선 방향 1]
- [개선 방향 2]
주의: [변경하면 안 되는 것]"
"[컴포넌트]의 디자인을 변경해줘.
현재: [현재 모습 설명]
원하는 모습: [원하는 모습 설명]
참고: [참고 사이트/이미지가 있으면]
반응형:
- 모바일: [모바일 레이아웃]
- 데스크톱: [데스크톱 레이아웃]"
"[파일/폴더]의 코드를 리뷰해줘.
다음 관점에서 검토:
- 보안 취약점
- 성능 문제
- 코드 중복
- 베스트 프랙티스 위반
문제가 있으면 수정 코드도 함께 제안해줘."
# 전체 에러 메시지를 그대로 복사해서 전달
> "이 에러가 발생했어:
TypeError: Cannot destructure property 'user' of '(0 , _supabase__WEBPACK_IMPORTED_MODULE_2__.createClient)(...)' as it is undefined.
at LoginPage (app/login/page.tsx:15:9)
고쳐줘.""에러가 나" 대신 에러 메시지 전문을 복사 붙여넣기하세요. AI는 에러 메시지의 세부 정보(파일명, 줄 번호, 스택 트레이스)로 정확한 원인을 찾습니다.
Claude Code는 이미지를 이해합니다. UI 문제라면 스크린샷을 보여주세요:
> "이 스크린샷을 봐줘 (이미지 드래그 앤 드롭)
모바일에서 헤더가 이렇게 겹치는데 고쳐줘"# 특정 파일을 읽게 하기
> "lib/auth.ts를 읽고, 이 인증 로직에 세션 갱신 기능을 추가해줘"
# 여러 파일의 관계를 알려주기
> "app/api/users/route.ts가 lib/db.ts의 getUsers()를 호출하는데,
페이지네이션을 추가하고 싶어"| 상황 | 전략 | 이유 |
|---|---|---|
| 새 프로젝트 초기 설정 | 한번에 크게 | 전체 구조를 일관성 있게 |
| 기능 추가 | 나눠서 작게 | 단계별 확인 가능 |
| 버그 수정 | 한번에 하나씩 | 원인 추적 용이 |
| UI 개선 | 한번에 크게 | 디자인 일관성 |
복잡한 작업은 구현 전에 계획을 먼저 보여달라고 하세요:
> "이 기능을 구현하기 전에, 어떤 파일을 만들고 수정할지 계획을 먼저 보여줘"> "마지막 변경을 되돌려줘"
> "방금 수정한 3개 파일을 원래대로 복원해줘"> "이 방식 말고, 다른 접근법으로 해보자. [새로운 방향 설명]"
> "지금까지 한 것 유지하고, [이 부분]만 다시 해줘"AI와의 대화가 원하는 방향으로 가지 않을 때는, 새 세션을 시작하는 것이 가장 빠릅니다. /clear로 대화를 초기화하거나, 터미널을 닫고 claude를 다시 실행하세요.
프롬프트 작성법을 익혔다면: