📋 목차
AI한테 코딩을 시켰는데 원하는 기능이 정확히 안 나와서 답답했던 적 있지 않나요? 프롬프트 하나만 바꿔도 결과물의 품질이 완전히 달라지거든요.
솔직히 말하면 저도 처음엔 “로그인 기능 만들어줘” 이런 식으로 던졌어요. 결과? 쓸 수 없는 코드 덩어리. 에러 잡느라 직접 짜는 것보다 시간이 더 걸렸거든요. 한번은 간단한 투두리스트 앱을 만들어 달라고 했는데, 데이터베이스 연결도 없고 삭제 기능도 빠진 껍데기가 나왔어요. 그때 깨달았죠. AI는 만능이 아니라, 내가 얼마나 정확하게 요청하느냐에 따라 결과가 갈린다는 걸요.
그 뒤로 프롬프트 작성법을 파기 시작했고, 지금은 웬만한 기능은 한두 번 만에 원하는 코드를 뽑아내요. 오늘은 제가 삽질하면서 정리한 AI 코딩 프롬프트 작성 기술을 전부 풀어볼게요.
AI 코딩, 왜 프롬프트가 전부인가
AI 코딩 도구들이 폭발적으로 늘었잖아요. GitHub Copilot, Cursor, Claude Code, ChatGPT까지. 근데 같은 도구를 써도 사람마다 결과가 천차만별이에요. 이유는 단 하나, 프롬프트 품질이에요.
LLM(대규모 언어 모델)은 입력받은 텍스트의 맥락을 기반으로 다음에 올 내용을 예측하는 방식으로 작동하거든요. 그래서 맥락이 부족하면 AI가 알아서 빈칸을 채우는데, 이게 대부분 내가 원하는 방향이 아니에요. “알아서 잘 해줘”가 통하는 구조가 아닌 거예요.
구글 클라우드의 프롬프트 엔지니어링 가이드에서도 강조하는 포인트가 있어요. 프롬프트 설계는 AI 모델을 재훈련하지 않고도 입력 방식만 바꿔서 원하는 결과를 얻는 기술이라는 것. 특히 코딩처럼 정확성이 생명인 작업에서는 이 차이가 극적이에요.
제가 체감한 건 이거예요. 프롬프트를 잘 쓰면 AI가 시니어 개발자처럼 행동하고, 못 쓰면 코딩 첫 주차 인턴처럼 행동해요. 같은 AI인데도요.
실패하는 프롬프트 vs 성공하는 프롬프트
이론보다 실제 비교가 빠르니까, 제가 겪은 사례 하나를 볼게요. 파이썬으로 웹 크롤러를 만들고 싶었어요.
처음에 이렇게 썼거든요. “파이썬 웹 크롤링 코드 작성해줘.” 나온 결과는 requests와 BeautifulSoup을 쓴 기본 예제였는데, URL도 하드코딩이고 에러 처리도 없고, 실제 사이트에 돌리면 바로 막히는 수준이었어요. 당연하죠. AI 입장에서는 어떤 사이트인지, 뭘 수집하는지, 어디에 저장하는지 아무 정보가 없었으니까요.
두 번째로 이렇게 바꿨어요. “파이썬 3.11 기준으로, requests와 BeautifulSoup4를 사용해서 특정 뉴스 사이트의 헤드라인 제목과 링크를 수집하는 크롤러를 만들어줘. User-Agent 헤더 설정 포함, 요청 실패 시 3회 재시도 로직 추가, 결과는 CSV 파일로 저장. 함수 단위로 분리해서 작성해줘.” 결과물이 완전히 달랐어요. 재시도 로직, CSV 저장, 함수 분리까지 한 번에 나왔거든요.
📊 실제 데이터
dev.to에서 정리한 15가지 프롬프팅 기법 분석에 따르면, 직접 지시(Direct Instruction) 방식은 단순 작업에만 유효하고, 복잡한 기능일수록 분해(Decomposition) 기반 프롬프트의 코드 정확도가 눈에 띄게 높았어요. 특히 함수 단위로 나눠서 요청했을 때 AI가 만드는 코드의 모듈성과 유지보수성이 크게 개선됐다는 거예요.
차이를 만드는 핵심은 세 가지였어요. 첫째, 기술 스택을 명시하는 것. 파이썬이라고만 하면 버전도, 라이브러리도 AI 마음대로예요. 둘째, 결과물의 형태를 지정하는 것. CSV로 저장할지, JSON으로 반환할지, 콘솔에 출력할지. 셋째, 에지 케이스(예외 상황)를 미리 알려주는 것. 요청 실패, 빈 데이터, 타임아웃 같은 상황을 프롬프트에 넣으면 AI가 방어 코드를 알아서 넣어줘요.
원하는 코드를 뽑아내는 5가지 핵심 기법
여러 프롬프트 엔지니어링 기법을 테스트해 봤는데, 코딩에서 특히 효과가 큰 다섯 가지가 있었어요. 하나씩 뜯어볼게요.
1. 역할 부여(Role Prompting) — “너는 지금 10년차 백엔드 개발자야. 보안에 민감한 코드를 작성해.” 이런 식으로 역할을 먼저 지정하면 AI의 응답 톤과 코드 품질이 확 달라져요. 제가 Flask 로그인 기능을 만들 때 역할 부여 없이 요청하니까 비밀번호를 평문으로 저장하는 코드가 나왔거든요. 근데 “보안 전문 시니어 개발자” 역할을 주니까 bcrypt 해싱을 기본으로 적용하더라고요. 소름이었어요.
2. 분해 요청(Decomposition) — 큰 기능을 한 번에 요청하면 십중팔구 빈 구멍이 생겨요. “회원가입 기능 만들어줘” 대신 이렇게 쪼개는 거예요. “먼저 데이터베이스 초기화 함수를 작성해줘 → 다음으로 사용자 정보를 저장하는 함수를 만들어줘 → 마지막으로 이 함수들을 연결하는 라우터를 만들어줘.” 단계별로 나누면 AI가 각 단계에 집중하니까 빠진 부분이 확 줄어들어요.
3. 예시 기반 요청(Few-Shot) — 원하는 코드 스타일이 있으면 예시를 같이 주는 거예요. “여기 Node.js Express로 작성한 Hello World 서버 코드가 있어. 이 구조를 참고해서 Flask로 동일한 서버를 만들어줘.” 이렇게 하면 네이밍 컨벤션이나 코드 구조가 예시를 따라가거든요. 팀 프로젝트에서 코드 일관성 맞출 때 특히 유용했어요.
4. 사고 사슬(Chain-of-Thought) — “이 문제를 어떻게 풀 건지 단계별로 설명하고, 그 다음에 코드를 작성해줘.” 이 한 줄을 추가하면 AI가 로직을 먼저 정리한 뒤에 코드를 짜요. 복잡한 알고리즘이나 디버깅할 때 효과가 극적이에요. AI가 자기 추론 과정을 보여주니까 어디서 논리가 틀어졌는지 바로 잡을 수 있거든요.
5. 스켈레톤 제공(Template Priming) — 코드의 뼈대를 먼저 작성하고 빈칸을 채워달라고 하는 방식이에요. “아래 Flask 앱 템플릿에서 TODO 부분을 채워줘”처럼요. 기존 프로젝트에 기능을 추가할 때 이게 최고였어요. AI가 전체 구조를 새로 만드는 게 아니라, 내 코드에 맞춰서 빈 부분만 정확히 채우니까요.
💡 꿀팁
이 다섯 가지를 조합해서 쓰면 효과가 배로 올라가요. 예를 들어 역할 부여 + 분해 요청을 합치면 “너는 시니어 백엔드 개발자야. 이 기능을 세 단계로 나눠서 작성해줘”가 되거든요. 한 가지 기법만 고집하지 말고, 상황에 따라 섞어 쓰는 게 핵심이에요.
AI 코딩 도구별 프롬프트 전략이 다르다
같은 프롬프트를 넣어도 도구마다 반응이 달라요. 이걸 모르고 한 가지 방식만 고수하면 특정 도구에서 계속 답답한 결과가 나오거든요. 제가 주력으로 써본 세 가지 도구의 특성을 정리할게요.
| 구분 | GitHub Copilot | Cursor |
|---|---|---|
| 강점 | 자동완성 속도, VS Code 통합 | 멀티파일 수정, 에이전트 모드 |
| 프롬프트 스타일 | 짧고 간결한 주석형 | 대화형, 상세 맥락 제공 |
| 월 요금 기준 | Pro $10 | Pro $20 |
| 적합한 작업 | 단일 파일 빠른 코딩 | 프로젝트 단위 대규모 작업 |
GitHub Copilot은 에디터 안에서 주석을 쓰면 바로 아래에 코드를 제안하는 방식이라, 프롬프트가 길면 오히려 역효과가 나요. “// 사용자 인증 미들웨어: JWT 검증 + 만료 체크” 정도의 한 줄 주석이 가장 효율적이었어요. 반면 Cursor는 채팅창에서 대화하듯 맥락을 주는 게 훨씬 잘 먹히더라고요. “이 프로젝트는 Next.js 14 + Prisma를 쓰고 있어. 사용자 프로필 페이지를 만들건데, 기존 schema.prisma 파일을 참고해서 API 라우트와 컴포넌트를 같이 만들어줘”처럼요.
ChatGPT나 Claude 같은 범용 AI를 코딩에 쓸 때는 또 다른 전략이 필요해요. 이 도구들은 에디터와 연결되어 있지 않으니까, 코드 전체를 복붙해서 맥락을 직접 줘야 하거든요. 불편하지만 장점도 있어요. “이 코드의 문제점을 찾아서 설명하고 수정해줘”처럼 디버깅 + 설명을 동시에 요청할 수 있으니까요. 저는 복잡한 로직 설계는 Claude한테 먼저 물어보고, 실제 구현은 Cursor에서 하는 식으로 역할을 나눠 쓰고 있어요.
그리고 최근에는 바이브 코딩(Vibe Coding)이라는 개념이 뜨고 있는데요. 구글 클라우드 설명에 따르면 자연어로 목표만 설명하고 AI가 코드를 전부 생성하는 방식이에요. 이때는 프롬프트가 코드 명세서 역할을 해야 하기 때문에, 오히려 더 상세하고 구조화된 프롬프트가 필요해요. “대충 만들어줘”는 바이브 코딩에서 가장 위험한 프롬프트예요.
실전 시나리오별 프롬프트 작성 예시
이론만 봐서는 감이 안 잡히잖아요. 제가 실제로 써먹은 시나리오 세 가지를 프롬프트 원문 그대로 공유할게요.
시나리오 1: REST API 만들기 — “Python FastAPI를 사용해서 할 일 관리 REST API를 만들어줘. SQLite 데이터베이스 사용. 기능은 할 일 추가(POST), 전체 조회(GET), 단건 조회(GET), 수정(PUT), 삭제(DELETE). 각 할 일은 id, title, description, is_completed, created_at 필드를 가져. Pydantic 모델로 요청/응답 스키마 정의하고, 에러 발생 시 적절한 HTTP 상태 코드 반환해줘.” 이 프롬프트 하나로 약 120줄짜리 완성된 API 코드가 나왔어요. 핵심은 필드명과 HTTP 메서드를 구체적으로 지정한 거예요.
시나리오 2: 버그 디버깅 — 기존 코드를 붙여넣고 이렇게 요청했어요. “아래 코드에서 /users 엔드포인트가 빈 리스트만 반환하는 문제가 있어. 문제 원인을 단계별로 분석하고, 수정된 코드를 제공해줘. 수정한 부분에 주석으로 표시해줘.” AI가 데이터베이스 커넥션이 함수 호출 전에 닫히는 타이밍 이슈를 정확히 짚어냈어요. 혼자 찾았으면 한 시간은 더 걸렸을 거예요.
시나리오 3: 리팩토링 — “아래 Flask 앱 코드를 리팩토링해줘. PEP 8 스타일 준수, 함수당 20줄 이하, 반복 코드 제거, 타입 힌트 추가. 리팩토링 전후 차이를 설명해줘.” 이게 생각보다 잘 먹히더라고요. 특히 “리팩토링 전후 차이를 설명해줘”를 넣으면 AI가 뭘 왜 바꿨는지 알려주기 때문에 학습 효과까지 있었어요.
세 시나리오의 공통점이 보이나요? 전부 기술 스택, 구체적 요구사항, 출력 형태를 명시했어요. 그리고 하나 더, “설명해줘”를 넣은 거예요. 코드만 달라고 하면 코드만 오는데, 설명을 같이 요청하면 AI가 더 신중하게 코드를 생성하더라고요. 마치 코드 리뷰를 받는 느낌이었어요.
자꾸 엉뚱한 코드가 나올 때 체크리스트
기법을 다 알아도 여전히 결과가 이상할 때가 있어요. 저도 겪었고, 주변 개발자들도 비슷한 고민을 하더라고요. 대부분 아래 네 가지 중 하나에 걸려요.
첫 번째, 맥락 부족이에요. 프로젝트에서 어떤 프레임워크를 쓰는지, 기존 코드 구조가 어떤지 정보를 안 줬을 확률이 높아요. Cursor 같은 도구는 프로젝트 파일을 자동으로 읽지만, ChatGPT나 Claude에게는 직접 알려줘야 해요. 저도 한번 React 프로젝트인데 프레임워크를 안 말했더니 바닐라 JavaScript로 코드가 나온 적 있거든요.
두 번째, 한 번에 너무 많이 요청는 거예요. “회원가입, 로그인, 비밀번호 찾기, 프로필 수정 전부 만들어줘.” 이러면 AI가 각 기능을 대충 처리해요. 하나씩 나눠서 요청하면 각 기능의 완성도가 훨씬 올라가요.
⚠️ 주의
AI가 생성한 코드를 검증 없이 프로덕션에 배포하는 건 정말 위험해요. 저도 한번 AI가 만든 SQL 쿼리를 그대로 썼다가 인젝션 취약점이 있었던 적이 있거든요. 특히 인증, 결제, 데이터베이스 관련 코드는 반드시 직접 리뷰하고, 가능하면 보안 테스트까지 돌려보세요.
세 번째, 버전 미지정이에요. “React로 만들어줘”만 하면 AI가 어떤 버전 기준으로 코드를 생성할지 모르거든요. React 18과 19는 문법 차이가 있고, Python 3.8과 3.12도 지원하는 기능이 달라요. 버전을 명시하는 습관만 들여도 “왜 안 돌아가지?”를 반으로 줄일 수 있어요.
네 번째가 의외인데, 너무 친절한 프롬프트예요. “가능하면 해주세요”, “할 수 있다면 추가해주세요” 같은 표현은 AI가 선택적으로 처리할 여지를 줘요. 확실히 원하는 건 단정적으로 써야 해요. “에러 핸들링을 추가해줘”와 “에러 핸들링을 추가하면 좋을 것 같아”는 결과가 다르거든요.
❓ 자주 묻는 질문
Q. 프로그래밍을 전혀 모르는데 AI 코딩 프롬프트를 쓸 수 있나요?
가능하긴 하지만, 생성된 코드가 맞는지 검증하기 어렵다는 문제가 있어요. 기본적인 프로그래밍 개념(변수, 함수, 조건문)은 이해하고 있어야 AI가 만든 코드를 제대로 활용할 수 있거든요. 바이브 코딩이 주목받고 있지만, 완전 비전공자가 복잡한 서비스를 만들기에는 아직 한계가 있어요.
Q. 영어로 프롬프트를 써야 결과가 더 좋은가요?
코딩 프롬프트는 영어가 약간 유리한 편이에요. AI의 학습 데이터에 영어 코드 문서가 압도적으로 많기 때문이에요. 다만 한국어로 써도 충분히 좋은 결과를 얻을 수 있고, 복잡한 요구사항은 한국어로 정확히 쓰는 게 영어로 대충 쓰는 것보다 나아요.
Q. 하나의 AI 도구만 써도 충분한가요?
상황에 따라 다르지만, 하나만 깊게 파는 것도 전략이에요. 다만 각 도구의 강점이 다르기 때문에, 여유가 된다면 코드 에디터 통합형(Copilot, Cursor)과 범용 대화형(ChatGPT, Claude)을 하나씩 조합하는 게 효율적이에요.
Q. AI가 생성한 코드의 저작권은 어떻게 되나요?
아직 법적으로 완전히 정리되지 않은 영역이에요. 대부분의 AI 코딩 도구 약관에서는 생성된 코드의 사용 권한을 사용자에게 부여하지만, 오픈소스 라이선스 코드와 유사한 결과물이 나올 가능성이 있어요. 상용 프로젝트에서는 라이선스 검증 도구를 함께 쓰는 걸 권장해요.
Q. 프롬프트를 잘 써도 AI가 계속 틀린 코드를 주면 어떻게 하나요?
대화를 이어가면서 수정 요청을 하세요. “이 부분이 틀렸어. 원인을 분석하고 수정해줘”처럼 구체적 피드백을 주는 게 핵심이에요. 같은 프롬프트로 3회 이상 실패하면, 요청을 더 작은 단위로 쪼개거나 다른 AI 도구에서 시도해 보는 것도 방법이에요.
본 포스팅은 개인 경험과 공개 자료를 바탕으로 작성되었으며, 전문적인 의료·법률·재무 조언을 대체하지 않습니다. 정확한 정보는 해당 분야 전문가 또는 공식 기관에 확인하시기 바랍니다.
AI 코딩의 핵심은 도구가 아니라 프롬프트예요. 역할 부여, 분해 요청, 예시 제공, 사고 사슬, 스켈레톤 제공 — 이 다섯 가지 기법을 상황에 맞게 조합하면 AI가 내 의도를 정확히 이해하고 쓸 수 있는 코드를 만들어줘요. 처음부터 완벽한 프롬프트를 쓸 필요는 없어요. 대화를 이어가면서 점진적으로 다듬어 가는 것도 훌륭한 전략이거든요.
혹시 본인만의 AI 코딩 프롬프트 노하우가 있다면 댓글로 공유해 주세요. 서로 다른 경험을 나누면 더 빠르게 실력이 늘거든요. 유용했다면 주변 개발자 동료에게도 공유 부탁드려요!