바이브코딩 효과 2배 올리는
AI 코딩 프롬프트 작성법
같은 Cursor, 같은 Claude — 어떻게 요청하느냐가 코드 품질을 결정합니다
📋 이 글에서 알 수 있는 것
- AI 코딩 프롬프트가 일반 프롬프트와 다른 이유
- 코딩 프롬프트에 반드시 들어가야 하는 4가지 요소
- 나쁜 코딩 프롬프트 vs 좋은 코딩 프롬프트 Before/After 실전 예시
- 상황별(기능 추가 · 버그 수정 · 리팩토링) 프롬프트 패턴
- Cursor · Claude Code에 바로 복붙해서 쓸 수 있는 프롬프트 템플릿
AI 코딩 프롬프트는 왜 따로 배워야 하는가
Cursor나 Claude Code를 처음 쓸 때 가장 많이 하는 실수는 "일반 질문하듯 요청하는 것"입니다. "로그인 기능 만들어줘"라고 치면 AI는 뭔가를 만들어주긴 합니다. 그런데 그게 내 프로젝트 구조와 맞지 않거나, 쓰고 있는 프레임워크가 아닌 다른 방식으로 짜여 있거나, 에러가 나는 코드일 때가 많습니다.
이유는 단순합니다. AI는 내 프로젝트를 모릅니다. 어떤 언어를 쓰는지, 어떤 라이브러리가 설치되어 있는지, 어떤 스타일로 코드를 짜고 있는지 — 알려주지 않으면 AI는 가장 일반적인 방식으로 답합니다. 그 "가장 일반적인 방식"이 내 상황과 맞지 않을 때 수정이 반복됩니다.
⚡ AI 코딩 프롬프트가 일반 프롬프트와 다른 3가지 이유
- 기술 스택이 결과를 결정한다 — "버튼 컴포넌트 만들어줘"의 결과는 React인지 Vue인지 Svelte인지에 따라 완전히 달라집니다. AI는 알려주지 않으면 임의로 선택합니다.
- 기존 코드와의 맥락이 중요하다 — 새 기능은 기존 구조에 맞게 짜여야 합니다. AI가 기존 코드를 모르면 동떨어진 스타일로 만들 가능성이 높습니다.
- 에러 메시지가 핵심 단서다 — 버그 수정을 요청할 때 에러 메시지를 함께 붙이지 않으면 AI는 추측으로 답합니다. 정확한 에러 텍스트가 정확한 수정을 만듭니다.
Cursor, Claude Code, Replit 같은 툴을 어떻게 설치하고 기본 인터페이스를 쓰는지는 다루지 않습니다. 툴 사용법이 궁금하다면 Cursor 사용법 초보 가이드를 먼저 읽어보세요. 이 글은 "어떤 툴"이 아니라 "어떻게 요청하는가"에 집중합니다.
코딩 프롬프트에 반드시 넣어야 할 4가지 요소
일반 프롬프트의 5요소(역할·맥락·명령·형식·예시)를 코딩 상황에 맞게 적용하면 4가지 핵심 요소로 압축됩니다. 이 4가지만 갖추면 AI가 엉뚱한 방향으로 가는 일이 크게 줄어듭니다.
기술 스택 명시 — 언어 · 프레임워크 · 주요 라이브러리
AI가 가장 먼저 알아야 하는 정보입니다. React 18 + TypeScript + Tailwind CSS, Python 3.11 + FastAPI처럼 구체적으로 적습니다. 버전까지 명시하면 구형 문법을 쓰는 오류를 줄일 수 있습니다.
기존 코드 또는 구조 제공 — 맥락 연결
새 기능을 추가하거나 버그를 수정할 때는 관련 기존 코드를 붙여넣습니다. AI는 그 코드의 스타일, 변수명 규칙, 구조를 읽고 동일한 패턴으로 작성합니다. 코드가 길면 관련 함수나 컴포넌트만 발췌해도 됩니다.
원하는 동작을 구체적으로 — 입력과 출력 기술
"검색 기능 만들어줘"보다 "사용자가 검색창에 입력하면 debounce 300ms 후 API를 호출하고, 결과를 리스트로 표시해줘"처럼 입력 조건과 기대 출력을 명확히 씁니다. 예외 케이스도 미리 언급하면 좋습니다.
제약 조건 명시 — 하지 말아야 할 것
"외부 라이브러리 추가 없이", "기존 컴포넌트 구조 유지하면서", "CSS 변경 없이 JS만 수정해줘"처럼 AI가 넘어서면 안 되는 경계를 정합니다. 이 조건 없이는 AI가 아무 라이브러리나 추가하거나 파일을 통째로 재작성할 수 있습니다.
실제 코딩 프롬프트 구조
[기술 스택] React 18 + TypeScript + Tailwind CSS 프로젝트입니다. [기존 코드] 아래는 현재 SearchBar 컴포넌트입니다: // SearchBar.tsx 내용 붙여넣기 [원하는 동작] 입력 후 300ms debounce를 적용해서 onChange 시 onSearch 콜백을 호출해주세요. 로딩 중에는 입력창 오른쪽에 스피너 아이콘을 표시합니다. [제약 조건] lodash 없이 직접 debounce를 구현해주세요. 기존 Tailwind 클래스 구조는 유지합니다.
Before/After — 나쁜 프롬프트와 좋은 프롬프트 비교
실제로 가장 많이 쓰는 상황 3가지를 골랐습니다. 좌우를 비교하면서 어떤 요소가 추가됐는지 확인해보세요.
사례 1 — 새 기능 추가
로그인 기능 만들어줘.
Next.js 14 App Router + TypeScript 프로젝트입니다. 아래 기존 AuthContext를 활용해서 이메일/비밀번호 로그인 폼 컴포넌트를 만들어주세요. 외부 UI 라이브러리 없이 Tailwind만 사용하고, 유효성 검사는 클라이언트 사이드에서 처리합니다.
[AuthContext 코드 붙여넣기]
사례 2 — 버그 수정
이 코드가 왜 안 되는지 모르겠어. 고쳐줘.
아래 코드를 실행하면 다음 에러가 발생합니다:TypeError: Cannot read properties of undefined (reading 'map')
에러는 ProductList 컴포넌트에서 발생하고, products prop이 API 응답 전에 렌더링될 때만 나타납니다. 코드와 에러를 보고 수정해주세요.
[ProductList.tsx 코드 붙여넣기]
사례 3 — 코드 개선 요청
이 코드 더 좋게 만들어줘.
아래 fetchUserData 함수를 리팩토링해주세요. 목표는 두 가지입니다: ① 반복되는 try-catch 구조를 제거하고, ② TypeScript 타입을 명시적으로 추가합니다. 함수의 외부 동작(입력·출력)은 그대로 유지하고, 의존하는 다른 함수는 수정하지 마세요.
[fetchUserData 코드 붙여넣기]
⚡ Before/After에서 반복되는 패턴
- 에러 메시지를 그대로 붙인다 — 요약하거나 설명하지 말고 에러 텍스트 전체를 복붙합니다. AI는 에러 메시지를 읽고 정확한 원인을 찾습니다.
- 어디서 문제가 발생하는지 알려준다 — "이 코드가 안 돼"가 아니라 "이 컴포넌트의 이 함수에서 발생한다"처럼 위치를 특정합니다.
- 원하는 변경의 범위를 명시한다 — AI는 주어진 코드 전체를 바꾸려는 경향이 있습니다. "이 부분만", "외부 동작 유지하면서"처럼 범위를 제한합니다.
- 목표를 번호로 나눈다 — "① ○○, ② ○○"처럼 목표를 구분하면 AI가 누락 없이 처리할 가능성이 높아집니다.
AI를 제대로 쓰는 법: 프롬프트 작성 완전 입문 가이드를 함께 읽어보세요.
상황별 코딩 프롬프트 패턴
코딩 작업은 크게 세 가지 상황으로 나뉩니다. 각 상황마다 강조해야 할 요소가 다릅니다.
패턴 A — 새 기능 추가할 때
새 기능은 기존 코드와의 호환성이 핵심입니다. AI에게 현재 구조를 충분히 보여주는 것이 우선입니다.
새 기능 추가 프롬프트 체크리스트
- 기술 스택 명시 — 언어, 프레임워크, 사용 중인 주요 라이브러리
- 관련 기존 파일 또는 컴포넌트 붙여넣기
- 기능의 입력 조건과 기대 출력 설명
- 예외 케이스 처리 방법 명시 (로딩 중, 에러 시 등)
- 추가하면 안 되는 외부 의존성 제한
패턴 B — 버그 수정할 때
버그 수정은 에러 메시지와 재현 조건이 핵심입니다. 에러 없이 "안 된다"고만 하면 AI는 추측으로 답합니다.
버그 수정 프롬프트 체크리스트
- 에러 메시지 전체 복붙 (요약하지 않음)
- 에러가 발생하는 파일명 · 함수명 · 라인 특정
- 에러가 언제 발생하는지 — 특정 조건, 특정 입력값, 특정 환경
- 버그가 있는 코드 전체 붙여넣기
- 수정 범위 제한 — "이 함수만 수정", "다른 파일 건드리지 말 것"
패턴 C — 리팩토링 · 코드 개선할 때
리팩토링은 목표가 모호하면 AI가 과도하게 수정합니다. 원하는 변경과 유지해야 할 것을 명확히 구분합니다.
리팩토링 프롬프트 체크리스트
- 리팩토링 목표 번호로 분리 (가독성 / 성능 / 타입 안전성 등)
- 외부 동작(입력·출력)은 유지한다고 명시
- 수정하면 안 되는 파일 · 함수 범위 제한
- 수정 후 원하는 코드 스타일 언급 (함수형 vs 클래스형, 주석 포함 여부 등)
"이 파일 전체를 다시 써줘"처럼 범위를 열어두면 AI는 기회를 삼아 파일 전체를 바꿉니다. 원하지 않는다면 "이 함수 내부만", "이 부분만 수정하고 나머지는 그대로 유지해줘"처럼 명확히 제한하세요. 이미 재작성이 일어났다면 "이전 버전으로 되돌리고 이 부분만 다시 수정해줘"라고 후속 요청하세요.
바로 쓸 수 있는 코딩 프롬프트 템플릿 모음
아래 템플릿의 [대괄호] 부분을 채워서 Cursor, Claude Code, ChatGPT 어디서나 사용하세요. 기술 스택과 코드만 바꾸면 됩니다.
🔧 템플릿 1 — 새 기능 추가
[기술 스택] [언어] + [프레임워크] + [주요 라이브러리] 프로젝트입니다. [기존 코드] 아래는 현재 [파일명 또는 컴포넌트명]입니다: [코드 붙여넣기] [요청] 위 코드에 [기능 설명]을 추가해주세요. - 입력: [어떤 입력을 받는지] - 출력: [어떤 결과가 나와야 하는지] - 예외 처리: [로딩 중 / 에러 시 어떻게 처리하는지] [제약 조건] - 외부 라이브러리 추가 없이 구현해주세요. - 기존 파일 구조와 변수명 규칙을 유지해주세요.
🐛 템플릿 2 — 버그 수정
[에러 메시지] [에러 텍스트 전체 붙여넣기] [발생 위치] [파일명]의 [함수명 또는 라인 번호]에서 발생합니다. [발생 조건] [어떤 상황에서 에러가 나타나는지] [코드] [에러 발생 코드 붙여넣기] [요청] 위 에러를 수정해주세요. 이 함수 내부만 수정하고, 다른 파일은 변경하지 마세요.
♻️ 템플릿 3 — 리팩토링
[코드] [리팩토링할 코드 붙여넣기] [리팩토링 목표] ① [첫 번째 목표 — 예: 반복 코드 제거] ② [두 번째 목표 — 예: TypeScript 타입 명시] [유지 조건] - 함수의 외부 동작(입력과 출력)은 그대로 유지합니다. - [수정하면 안 되는 파일이나 함수 이름]은 건드리지 마세요. - 주석은 [포함 / 제거] 해주세요.
❓ 템플릿 4 — 코드 이해 / 설명 요청
[코드] [설명이 필요한 코드 붙여넣기] [요청] 위 코드를 [초보자가 이해할 수 있도록 / 개발 경험 3년 수준으로] 설명해주세요. - 각 함수가 하는 역할을 순서대로 설명해주세요. - 이해하기 어려운 부분이 있다면 비유를 들어서 설명해주세요. - 전문 용어는 괄호 안에 간단한 한국어 설명을 추가해주세요.
Cursor의 Chat 모드에서는
@파일명으로 파일을 직접 참조할 수 있습니다. 코드를 직접 붙여넣는 대신 @SearchBar.tsx처럼 파일을 언급하면 Cursor가 해당 파일 전체를 컨텍스트로 읽습니다. 코드가 길 때 특히 유용합니다.
자주 묻는 질문
코드를 얼마나 붙여넣어야 하나요? 전체 파일을 다 줘야 하나요?
반드시 전체 파일을 줄 필요는 없습니다. 요청과 직접 관련된 함수나 컴포넌트만 발췌해도 됩니다. 단, 발췌할 때는 해당 코드가 사용하는 타입 정의나 import 구문도 함께 붙이는 게 좋습니다. AI가 타입을 모르면 any 타입을 남발하거나 없는 함수를 임의로 만들 수 있습니다.
AI가 만든 코드에 에러가 나면 어떻게 하나요?
에러 메시지를 그대로 복붙해서 후속 요청하면 됩니다. "위 코드를 실행하니 다음 에러가 발생했습니다: [에러 텍스트]"라고 주면 AI가 자신이 만든 코드의 문제를 분석해서 수정해줍니다. 한 번에 완벽한 코드가 나오길 기대하기보다 이 과정을 반복하는 것이 바이브코딩의 정상적인 흐름입니다.
프롬프트를 길게 쓰면 AI 응답이 느려지거나 토큰이 낭비되지 않나요?
어느 정도 맞습니다. 불필요하게 긴 프롬프트는 피하는 게 좋습니다. 다만 기술 스택, 기존 코드, 요청 범위처럼 필수 정보는 생략하면 오히려 수정 반복이 늘어서 총 토큰 사용량이 더 많아집니다. "필요한 것만 명확하게"가 원칙입니다.
한국어로 프롬프트를 써도 영어 코드가 잘 나오나요?
네, 잘 나옵니다. 코드 자체는 언어에 종속되지 않기 때문에 한국어 프롬프트를 줘도 Python, JavaScript, TypeScript 코드를 정확하게 생성합니다. 다만 변수명이나 주석을 한국어로 원할 경우에만 별도로 "변수명은 영어, 주석은 한국어로 작성해줘"처럼 명시하면 됩니다.
Cursor, Claude Code, ChatGPT 중 어디서 쓰는 코딩 프롬프트가 제일 효과적인가요?
프롬프트 자체는 어느 툴에서도 동일하게 쓸 수 있습니다. 차이는 툴의 특성에 있습니다. Cursor는 코드베이스 전체를 컨텍스트로 읽을 수 있어서 대규모 프로젝트에 유리하고, Claude Code는 터미널에서 파일을 직접 다루는 작업에 강합니다. 처음 시작하는 분이라면 Cursor가 인터페이스가 친숙합니다.
코딩 프롬프트에서 가장 중요한 건 "AI에게 내 상황을 알려주는 것"입니다.
기술 스택, 기존 코드, 원하는 동작, 제약 조건 — 이 4가지를 갖추면 AI가 엉뚱한 방향으로 가는 일이 크게 줄어듭니다. 오늘 당장 Cursor나 Claude Code에서 진행 중인 작업에 이 방식을 적용해보세요.
VibeLab이었습니다.