나의 코딩 시간을 절반으로 줄여준 프롬프트 엔지니어링 (Prompt Engineering) 프레임워크
요약
코딩 효율을 극대화하기 위한 4단계 프롬프트 엔지니어링 프레임워크를 소개합니다. Context, Constraints, Format 등의 구조를 활용하여 AI의 환각을 줄이고 프로덕션 레디 코드를 생성하는 방법을 다룹니다.
핵심 포인트
- Context를 통해 기술 스택과 인프라 환경을 명확히 정의할 것
- Constraints를 설정하여 불필요한 의존성 추가와 잘못된 패턴을 방지할 것
- 모호한 요청 대신 구체적인 제약 사항을 제공하여 디버깅 시간을 단축할 것
나의 코딩 시간을 절반으로 줄여준 프롬프트 엔지니어링 (Prompt Engineering) 프레임워크
나는 예전에 프롬프트 엔지니어링 (Prompt Engineering)이 그저 "AI에게 친절하게 부탁하는 것"이라고 생각했습니다. 요청 사항을 입력하고, 코드를 받고, 붙여넣는 식이었죠. 만약 작동하지 않으면, 작동할 때까지 다시 시도했습니다.
그런 방식으로는 30분이면 끝날 일을 하는 데 4시간이 걸렸습니다. 나는 망가진 코드를 생성하고, AI의 환각 (Hallucinations) 현상을 디버깅하며, 직접 코드를 쓰는 것보다 더 많은 양을 다시 작성하고 있었습니다.
그러다 모든 것을 바꿔놓은 4단계 프레임워크 (Framework)를 개발했습니다. 이제 나는 아주 짧은 시간 안에 전체 기능을 구축하며, 코드는 대부분 첫 번째 시도에 컴파일됩니다.
내가 사용하는 정확한 시스템을 소개합니다.
4단계 프롬프트 프레임워크 (4-Part Prompt Framework)
내가 작성하는 모든 프롬프트는 다음 구조를 따릅니다:
CONTEXT (문맥) — 프로젝트가 무엇인지, 누구를 위한 것인지
CONSTRAINTS (제약 사항) — 코드가 반드시 해야 할 일과 하지 말아야 할 일
FORMAT (형식) — 출력 결과가 어떤 구조로 구성되기를 원하는지
...
실제 코드를 통해 각 요소를 보여드리겠습니다.
1. CONTEXT: 무대 설정하기
잘못된 프롬프트:
"내 Etsy API를 확인하고 판매 데이터를 이메일로 보내주는 cron job을 작성해줘."
이것은 너무 모호합니다. AI는 다음 사항을 알지 못합니다:
- 어떤 언어를 사용하고 있는지
- 어떤 Etsy API 엔드포인트 (Endpoints)가 존재하는지
- 로컬 메일 서버를 사용하는지 아니면 SendGrid를 사용하는지
- cron이 얼마나 자주 실행되어야 하는지
더 나은 프롬프트:
"나는 Linux VPS (Ubuntu 22.04, Node 20)에서 실행되는 Node.js 사이드 프로젝트를 가지고 있어.
로컬 데이터 저장을 위해 better-sqlite3를 통한 SQLite를 사용하고, 이메일에는 nodemailer를 사용해.
프로젝트에는 이미 ETSY_API_KEY와 ETSY_SHOP_ID가 설정된 config.json이 있어.
...
그러한 문맥 (Context)이 있으면, AI는 정확한 환경, 도구, 데이터 흐름을 알기 때문에 첫 번째 시도에 바로 프로덕션 레디 (Production-ready) 코드를 생성합니다. 추측할 필요도 없고, "아, Node를 사용한다고 말했어야 했는데"라고 후회할 일도 없습니다.
규칙: 모든 프롬프트에 당신의 스택 (Stack), 제약 사항 (Constraints), 그리고 기존 인프라 (Infrastructure)를 포함하세요. 30초의 추가 시간이 걸리지만, 30분의 디버깅 시간을 아껴줍니다.
2. CONSTRAINTS: 울타리 치기
AI 모델은 기본적으로 가장 일반적인 솔루션을 선택합니다. 무엇을 하지 말아야 할지(NOT to do) 말해주지 않으면, 모델은 당신이 원하지 않는 의존성(dependencies)을 선택하고, 당신의 아키텍처(architecture)에 맞지 않는 패턴을 사용하며, 개별적으로는 작동하지만 실제 운영 환경(production)에서는 깨지는 코드를 작성할 것입니다.
최근 프롬프트에 사용된 제약 조건(constraint) 블록의 예시:
CONSTRAINTS:
— 새로운 의존성 추가 금지. Node.js 내장 모듈(fs, path, https, crypto)만 사용할 것.
— 외부 API 래퍼(wrappers) 사용 금지 — https.get을 사용하여 REST API를 직접 호출할 것.
...
"새로운 의존성 추가 금지"라고 명시적으로 말함으로써, 저는 잘못된 출력의 범주 전체를 제거합니다. AI는 npm 패키지를 제안할 수 없습니다. express나 axios를 사용할 수도 없습니다. AI는 저의 '비대화(no-bloat)' 철학에 부합하는, 가공되지 않은 자립형(self-contained) 코드를 작성해야만 합니다.
규칙: 나쁜 결과가 발생하기 전에 차단하세요. 당신이 원하는 것(DO)만큼이나 원하지 않는 것(DON'T)을 명확하게 말하세요.
3. FORMAT: 출력 형태 잡기
만약 제가 "X를 수행하는 스크립트"를 요청한다면, 대부분의 AI 모델은 주석이 없는 200줄의 코드를 단일 마크다운(markdown) 블록에 쏟아냅니다. 이는 실제 프로젝트에서는 쓸모가 없습니다.
출력 형식을 사전에 지정하세요:
FORMAT:
— 코드를 3개의 파일로 반환: lib/api.js, lib/db.js, index.js
— 각 파일은 목적, 작성자, 최종 수정일을 포함하는 JSDoc 헤더를 가져야 함
...
이제 하나의 거대한 덩어리 대신, 제 코드베이스(codebase)에 즉시 투입할 수 있는 잘 구조화된 프로젝트를 얻게 됩니다. 제가 사용하는 AI 모델들(GPT-4, Claude, DeepSeek)은 모두 형식 지침을 준수합니다. 당신은 그저 지침을 제공하기만 하면 됩니다.
규칙: AI에게 정답이 무엇인지(WHAT)뿐만 아니라, 정답을 어떻게(HOW) 전달할지 알려주세요. 파일 구조, 명명 규칙(naming conventions), 문서화 스타일 등을 모두 상세히 설명하세요.
4. EXAMPLES: 말로만 하지 말고 보여주기
이것이 가장 강력한 부분입니다. 당신이 원하는 패턴의 예시 하나는 500단어의 설명보다 가치 있습니다.
저는 모든 프로젝트에 제가 원하는 코드 스타일을 보여주는 2~3개의 파일이 담긴 prompt-examples/ 디렉토리를 유지합니다:
// 예시 패턴: 내가 API 래퍼를 작성하는 방식
const https = require('https');
...
제가 프롬프트에 이 패턴을 포함하면, AI는 동일한 에러 처리(error handling), 동일한 https 패턴, 동일한 명명 규칙(naming conventions)을 가진 형제 함수들을 생성합니다. 이는 AI에게 무시할 수 없는 스타일 가이드(style guide)를 제공하는 것과 같습니다.
규칙: 프롬프트에 항상 1~2개의 참조 코드 블록(reference code blocks)을 포함하세요. AI는 스타일, 구조, 관례(conventions)를 자동으로 모방할 것입니다.
종합하기: 완성된 프롬프트
실제 프롬프트에서 이 프레임워크가 어떻게 적용되는지 보여드리겠습니다. 이것은 제가 지난주에 Gumroad 수익 추적기를 생성하기 위해 실제로 사용했던 프롬프트입니다:
문맥 (CONTEXT): Ubuntu 22.04 환경의 Node.js 20 프로젝트. SQLite (better-sqlite3) 및 nodemailer 사용. 기존 코드베이스에는 API 키가 포함된 config.json이 있음.
작업 (TASK): 다음 기능을 수행하는 일일 수익 동기화 스크립트 구축:
- Gumroad API에서 어제의 판매 데이터를 가져옴
daily_revenueSQLite 테이블에 레코드 삽입/업데이트- 수익이 7일 평균 대비 50% 이상 하락한 날을 플래그(flag) 처리
- 플래그가 발생하면 Telegram 알림 전송 (api.telegram.org로의 https.get을 통해)
제약 사항 (CONSTRAINTS):
— 새로운 npm 패키지 사용 금지. 내장된 https만 사용.
— 모든 함수는 30줄 미만으로 작성.
— 에러는 ISO 타임스탬프와 함께 error.log에 기록.
— async/await 사용, 생(raw) Promise 사용 금지.
— CommonJS 모듈만 사용.
형식 (FORMAT):
— 파일 1개: lib/gumroad-sync.js
— 모든 내보내기(exported) 함수에 JSDoc 적용
— --dry-run 플래그를 포함한 index.js의 CLI 엔트리 포인트(entry point)
— --dry-run 사용 시 console.table 출력
예시 (EXAMPLES):
// 이것은 기존의 etsyFetch 패턴입니다 — 이 스타일을 맞추세요
async function fetch(endpoint) {
return new Promise((resolve, reject) => {
...
결과: 저는 단 한 번의 시도(one shot)로 완벽하게 작동하는 동기화 스크립트를 얻었습니다. 수정도 필요 없었고, 추가 프롬프트도 필요 없었습니다. 코드는 기존 프로젝트의 스타일과 일치했고, 동일한 에러 처리 패턴을 사용했으며, 제가 요청한 dry-run 플래그까지 포함되어 있었습니다.
이 프레임워크를 알기 전이었다면, 최소 3~4번의 반복(iterations)이 필요했을 것입니다.
이것이 작동하는 이유
이 프레임워크가 효과적인 이유는 AI가 생성한 코드의 네 가지 실패 모드(failure modes)를 해결하기 때문입니다:
| 실패 모드 (Failure Mode) | 프레임워크 해결책 (Framework Fix) |
|---|---|
| AI가 사용자의 스택을 모름 | CONTEXT(문맥)가 이를 알려줌 |
| ... | ... |
각 요소는 단순합니다. 하지만 이들이 결합되면 AI를 추측하는 기계에서 신뢰할 수 있는 엔지니어링 파트너로 변화시킵니다.
당신을 위한 치트 시트 (Cheat Sheet)
이 템플릿을 저장하세요. 모든 AI 코딩 프롬프트에 사용하십시오:
CONTEXT: [스택, 환경, 기존 인프라]
TASK: [구축해야 할 내용, 상세히]
CONSTRAINTS:
...
저는 이제 모든 작업에 이것을 사용합니다 — API 래퍼 (API wrappers), SQL 쿼리 (SQL queries), 크론 잡 (cron jobs), 심지어 이 블로그 포스트까지 말이죠. 이것은 제가 AI와 협업하는 방식에 있어 단일 항목 중 가장 높은 레버리지(leverage)를 가진 변화입니다.
이와 같은 바로 사용 가능한 프롬프트 템플릿 50개를 원하시나요? 저는 API 통합, 데이터베이스 마이그레이션 (database migrations), 크론 잡 (cron jobs), 그리고 풀스택 기능 (full-stack features)을 위한 템플릿을 포함하여 저의 가장 뛰어난 프롬프트들을 다운로드 가능한 팩으로 구성했습니다. Gumroad에서 확인하기 →
더 많은 실용적인 AI 및 사이드 허슬 (side-hustle) 콘텐츠를 보려면 dev.to에서 저를 팔로우하세요. 실제로 사용할 수 있는 코드를 매주 게시합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기