AI 코드 생성이 실패하는 이유: 소통 문제
Source: Dev.to
위에 제공된 소스 링크 외에 번역할 텍스트가 포함되어 있지 않습니다. 번역을 원하는 본문을 알려주시면 한국어로 번역해 드리겠습니다.
Introduction
“ChatGPT에게 로그인 기능을 만들어 달라고 요청했는데, 이상한 코드를 줬어요.”
요즘 이런 불만을 많이 듣습니다. AI 도구(GitHub Copilot, ChatGPT, Claude 등)가 어디에나 있지만, 출력물은 종종 프로덕션에 바로 쓰기엔 부족합니다.
AI가 문제인가요? 아니요.
문제는 우리가 AI와 소통하는 방식입니다.
Source: …
실제 예시
프롬프트
Make a login feature
AI의 응답
def login(username, password):
if username == "admin" and password == "password":
return {"status": "success"}
return {"status": "failed"}
“이게 뭐야? AI가 좋지 않아…”
누가 실수를 했나요?
만약 주니어 개발자(또는 AI)에게 “로그인 기능을 만들어라” 라고만 말한다면, 다음과 같은 추가 질문을 받게 됩니다:
- 어떤 프레임워크를 사용해야 하나요?
- 어떤 데이터베이스를 사용할까요?
- 세션 기반인가요, JWT인가요?
- 소셜 로그인이 필요할까요?
- 비밀번호 규칙은 어떻게 할까요?
AI는 그런 질문을 하지 않고, 가능한 가장 일반적인 답만 제공합니다.
“Garbage In, Garbage Out” → “불명확한 요청 입력, 불명확한 코드 출력”
| Request | Result | Practicality |
|---|---|---|
| “Make a user‑management feature” | 기본 CRUD 골격 (≈30 줄) | 10 % |
| “Make a user‑management API with Django REST Framework - Email authentication - JWT token - Permission groups (admin, user) - Profile image upload - Soft delete - Pagination” | 고품질 코드 (≈500 줄) | 85 % |
차이는 제공하는 컨텍스트의 양입니다.
AI가 사용 가능한 코드를 만들기 위해 필요한 것
1. 배경
- 프로젝트 유형 (예: 전자상거래, SaaS)
- 기술 스택 (프레임워크, 언어 버전)
- 제약 조건 (성능, 보안, 규정 준수)
2. 구체적인 요구 사항
- 기능 목록 (정확히 무엇을 구축해야 하는지)
- 비기능 요구 사항 (지연 시간, 확장성)
- 엣지 케이스 (실패 모드, 검증 규칙)
3. 예시 또는 참고 자료
- 유사 코드 스니펫
- API 문서 링크
- 원하는 출력 형식 (JSON 스키마, OpenAPI 사양)
나쁜 프롬프트 vs. 좋은 프롬프트
❌ 나쁜 요청
Make a payment feature
✅ 좋은 요청
Stripe를 사용하여 Node.js Express 서버에 결제 시스템을 구현하세요.
요구 사항
- 카드 결제 (일회성)
- 구독 결제 (월간/연간)
- 웹훅을 통한 결제 상태 업데이트
- 실패 시 재시도 로직 (최대 3회 시도)
- 결제 내역 조회 API
- 환불 처리
기술 스택
- Node.js 18+
- Express 4
- TypeScript
- Stripe API v2023
- PostgreSQL
오류 처리
- 카드 거부
- 잔액 부족
- 네트워크 타임아웃
- 중복 결제 방지
보안
- 환경 변수에 API 키 저장
- 웹훅 서명 검증
- 속도 제한
- SQL 인젝션 방지
이 정도 상세 정보를 제공하면 바로 레포지토리에 넣을 수 있는 코드를 얻을 수 있습니다.
일반적인 AI‑생성 아티팩트
| 카테고리 | 예시 |
|---|---|
| 보일러플레이트 | CRUD 스캐폴딩, 설정 파일, 테스트 템플릿 |
| 알고리즘 구현 | 정렬, 검색, 데이터 변환, 수학 계산 |
| 문서화 | 인라인 주석, README, API 문서 |
| 리팩터링 / 정리 | 명명 개선, 중복 제거, 아키텍처 결정 |
| 고급 주제 | 확장성, 성능 튜닝, 기술 부채 관리, 창의적 문제 해결 |
| 새로운 알고리즘 | 혁신적인 접근법, 특수 최적화 |
AI를 주니어 개발자로 생각하세요—당신이 안내해야 합니다.
협업 워크플로우 예시
프로젝트: 전자상거래 플랫폼
기술 스택: Next.js + NestJS + PostgreSQL
-
첫 번째 모듈 정의
First, we'll make the product‑management API. 1. Product CRUD 2. Category management 3. Inventory tracking 4. Image upload -
구체적인 작업으로 세분화
Let's start with the product‑creation API. POST /api/products Request body: { name, price, category_id, stock } Validation: price > 0, stock >= 0 Response: 201 Created with product object -
반복
- “여기에 트랜잭션 처리 추가.”
- “오류 처리를 개선.”
- “단위 테스트 작성.”
AI를 위한 작업 분류 구조 (WBS)
큰 범위의 모호한 요청을 하면 AI가 “??? ”라고 답합니다.
AI가 이해할 수 있도록 작업을 작고 명확하게 범위가 정해진 작업으로 나누세요.
Make an e‑commerce site
→ AI: ??? (useless code)
샘플 WBS
1. User Authentication
1.1 Signup API
1.1.1 Email duplicate check
1.1.2 Password encryption
1.1.3 Send verification email
1.2 Login API
1.2.1 Credential verification
1.2.2 JWT token issuance
1.2.3 Refresh token management
각 가장 하위 작업(예: 1.1.1)은 AI가 정확하게 구현할 수 있는 크기입니다.
내 프롬프트 템플릿 (실제로 사용하는 것)
[Project Overview]
- Brief description
- Business goals
[Technology Stack]
- Language / framework versions
- External services (e.g., Stripe, AWS)
[Feature Description]
- High‑level purpose
- Detailed functional requirements (list)
- Non‑functional requirements (performance, security, etc.)
[Edge Cases & Validation]
- Input constraints
- Failure scenarios
[References]
- Links to docs, similar code, OpenAPI specs
[Deliverables]
- Code files (list)
- Tests (unit/integration)
- Documentation (README, API docs)
복사하고 빈칸을 채운 뒤 프롬프트를 AI에 입력하세요. 결과는 프로덕션 준비 완료된 코드이며, 안심하고 병합할 수 있습니다.
옵션 1 – 굵은 라벨이 있는 글머리표 목록
We need to output Korean translation. Let’s translate:
Context => ## 컨텍스트 (or ## 상황) but likely ”## Context” keep as heading but translate word: ”## 컨텍스트”. Could also be ”## 상황”. Use ”## 컨텍스트”.
Bullet points:
- Project: [Project Name] => ”- 프로젝트: [Project Name]”
- Current Task: [WBS number and description] => ”- 현재 작업: [WBS number and description]”
- Technology Stack: [Language, Framework, DB] => ”- 기술 스택: [Language, Framework, DB]”
Then code block remains unchanged.
After code block, there is a line:
Option 2 – Table (compact and easy to scan) => ”### 옵션 2 – 테이블 (간결하고 한눈에 보기 쉬움)” maybe.
But that line is outside code block? Actually the snippet shows:
### Option 2 – Table (compact and easy to scan)
```markdown
So the heading is outside code block. So translate that heading.
Thus final output:
컨텍스트
- 프로젝트: [Project Name]
- 현재 작업: [WBS number and description]
- 기술 스택: [Language, Framework, DB]
### 옵션 2 – 테이블 (간결하고 한눈에 보기 쉬움)
```markdown
But need to preserve code fences exactly. The original had triple backticks before ”### Option 2”. Actually original:
## Context
- **Project:** [Project Name]
- **Current Task:** [WBS number and description]
- **Technology Stack:** [Language, Framework, DB]
Option 2 – Table (compact and easy to scan)
Thus we need to keep the code fences. The first code fence is after the bullet list? Actually there is a closing triple backticks after the bullet list. That indicates a code block started earlier? The snippet shows:
## Context
- **Project:** [Project Name]
- **Current Task:** [WBS number and description]
- **Technology Stack:** [Language, Framework, DB]
So there is a code block that started before? The snippet shows triple backticks before ”## Context”? Actually the snippet begins with ”## Context”. No opening backticks before. Then after bullet list, there is “". That is a closing code fence? That seems mismatched. Possibly the user copy-pasted incorrectly. But we should preserve as given: after bullet list, there is a line with triple backticks alone, then a blank line, then "### Option 2 – Table (compact and easy to scan)", then another code block opening with markdown.
Thus we keep those fences unchanged.
So final output should be:
컨텍스트
- 프로젝트: [Project Name]
- 현재 작업: [WBS number and description]
- 기술 스택: [Language, Framework, DB]
### 옵션 2 – 테이블 (간결하고 한눈에 보기 쉬움)
```markdown
Make sure formatting matches.## 컨텍스트
- 프로젝트: [Project Name]
- 현재 작업: [WBS number and description]
- 기술 스택: [Language, Framework, DB]
### 옵션 2 – 테이블 (간결하고 한눈에 보기 쉬움)
```markdown
Context
| 항목 | 세부 사항 |
|---|---|
| 프로젝트 | [Project Name] |
| 현재 작업 | [WBS number and description] |
| 기술 스택 | [Language, Framework, DB] |
두 버전 모두 원본 정보를 유지하면서 가독성과 시각적 일관성을 향상시킵니다. 문서에 가장 적합한 것을 사용하십시오.
요구 사항
기능 요구 사항
- 요구 사항 1
- 요구 사항 2
비기능 요구 사항
- 성능: 응답 시간, 처리량
- 보안: 인증, 권한 부여, 암호화
- 확장성: 동시 사용자, 데이터 성장
제약 조건
- 기존 코드와의 호환성
- 외부 API 제한 사항
- 라이브러리 버전
예상 입력/출력
입력
[Example data]
출력
[Expected result]
참고 코드
// Existing code or similar example
이 템플릿을 사용하면 AI 정확도가 3배 향상됩니다.
AI 도구별 특성
| AI Tool | 장점 | 단점 | 일반적인 사용 |
|---|---|---|---|
| ChatGPT | • 설명에 뛰어남 • 다양한 프로그래밍 언어 지원 | • 최신 정보 부족 | • 개념 설명 • 알고리즘 설계 |
| GitHub Copilot | • IDE와 원활한 통합 • 주변 코드 컨텍스트 이해 | • 짧은 코드 조각만 생성 | • 자동 완성 • 보일러플레이트 생성 |
| Claude | • 긴 코드 블록 처리 가능 • 높은 정확도 | • 제안이 보수적인 경향 | • 복잡한 로직 구현 • 리팩토링 |
| Cursor | • 전체 코드베이스 파악 • 대규모 변경에 적합 | • 유료 구독 필요 | • 대규모 리팩토링 • 프로젝트 전체 코드 개선 |
결론: AI는 단지 도구일 뿐
AI가 개발자를 대체할까요? 절대 아닙니다.
AI는 힘을 증폭시키는 도구입니다—망치가 목수를 대체할 수 없듯이, AI도 개발자를 대체할 수 없습니다.
AI를 효과적으로 활용하는 개발자는 활용하지 않는 개발자에 비해 10배 더 생산적일 수 있습니다.
핵심: 명확한 요구사항
- 작업 분류 구조(WBS)로 작업을 세분화합니다.
- 각 작업을 명확히 정의합니다.
요구사항이 명확하면 AI는 놀라운 생산성 도구가 됩니다.
“Garbage In, Garbage Out.”
명확한 입력 → 명확한 출력. 이것이 AI 시대의 개발 방법론입니다.
*AI와 함께 효율적인 프로젝트 관리를 원하신다면 **Plexo*를 확인해 보세요.