"ChatGPT한테 로그인 기능 만들어달라고 했는데, 이상한 코드를 줬어요."
최근 이런 불평을 자주 듣습니다. GitHub Copilot, ChatGPT, Claude... AI 도구들이 쏟아지고 있지만, 정작 프로덕션에 쓸 만한 코드는 나오지 않는다는 거죠.
AI가 문제일까요? 아닙니다.
문제는 우리가 AI와 대화하는 방식에 있습니다.
AI에게 부탁한 것 vs 실제로 받은 것
실제 사례를 보겠습니다.
개발자의 요청
"로그인 기능 만들어줘"
AI의 결과
def login(username, password):
if username == "admin" and password == "password":
return {"status": "success"}
return {"status": "failed"}
개발자의 반응
"이게 뭐야? AI 별로네..."
잠깐, 여기서 누가 잘못한 걸까요?
신입 개발자 vs AI: 똑같은 실수
신입 개발자에게 "로그인 기능 만들어"라고만 지시하면 어떻게 될까요?
아마 이런 질문들이 돌아올 겁니다:
- "어떤 프레임워크 쓰나요?"
- "DB는 뭐 쓰나요?"
- "세션? JWT?"
- "소셜 로그인도 되나요?"
- "비밀번호 규칙이 있나요?"
그런데 AI는 질문을 하지 않습니다. 그냥 가장 일반적인 답을 줄 뿐입니다.
Garbage In, Garbage Out
컴퓨터 공학의 오래된 격언이 있습니다:
"쓰레기를 넣으면 쓰레기가 나온다"
AI 시대에는 이렇게 바뀌었습니다:
"모호한 요청을 넣으면 모호한 코드가 나온다"
실제 테스트 결과를 보겠습니다:
테스트 1: 모호한 요청
요청: "사용자 관리 기능 만들어줘"
결과: 기본 CRUD 스켈레톤 (30줄)
실용성: 10%
테스트 2: 구체적인 요청
요청: "Django REST Framework로 사용자 관리 API 만들어줘.
- 이메일 인증
- JWT 토큰
- 권한 그룹 (admin, user)
- 프로필 이미지 업로드
- 소프트 삭제
- 페이지네이션"
결과: 완성도 높은 코드 (500줄)
실용성: 85%
차이가 보이시나요?
AI와 대화하는 기술
AI는 컨텍스트의 노예입니다. 우리가 제공한 정보만큼만 이해하고 구현합니다.
좋은 프롬프트의 구조
1. 배경 설명
- 프로젝트 종류
- 기술 스택
- 제약 사항
2. 구체적 요구사항
- 기능 목록
- 비기능 요구사항
- 엣지 케이스
3. 예시나 참고 자료
- 비슷한 코드
- API 문서 링크
- 원하는 출력 형식
실제 예시: 결제 시스템
❌ 나쁜 요청
"결제 기능 만들어줘"
✅ 좋은 요청
Node.js Express 서버에서 Stripe를 사용한 결제 시스템을 구현해줘.
요구사항:
1. 카드 결제 (일회성)
2. 구독 결제 (월간/연간)
3. 웹훅으로 결제 상태 업데이트
4. 실패 시 재시도 로직 (3회)
5. 결제 내역 조회 API
6. 환불 처리
기술 스택:
- Node.js 18+
- Express 4
- TypeScript
- Stripe API v2023
- PostgreSQL
에러 처리:
- 카드 거절
- 잔액 부족
- 네트워크 타임아웃
- 중복 결제 방지
보안:
- API 키 환경변수
- 웹훅 서명 검증
- Rate limiting
- SQL Injection 방어
이렇게 요청하면 실제로 사용 가능한 코드가 나옵니다.
AI가 잘하는 것 vs 못하는 것
AI가 잘하는 것 ✅
보일러플레이트 코드
- CRUD 기본 구조
- 설정 파일
- 테스트 템플릿
알고리즘 구현
- 정렬, 검색
- 데이터 변환
- 수학적 계산
문서화
- 주석 추가
- README 작성
- API 문서
리팩토링
- 코드 정리
- 네이밍 개선
- 중복 제거
AI가 못하는 것 ❌
비즈니스 로직 이해
- 도메인 특화 규칙
- 회사별 정책
- 암묵적 요구사항
아키텍처 결정
- 확장성 고려
- 성능 최적화
- 기술 부채 관리
창의적 문제 해결
- 새로운 알고리즘
- 혁신적 접근
- 특수한 최적화
실전: AI와 페어 프로그래밍하기
AI를 주니어 개발자로 생각하고 협업하세요.
Step 1: 큰 그림 설명
"우리는 이커머스 플랫폼을 만들고 있어.
주요 기능은 상품 관리, 주문, 결제야.
기술 스택은 Next.js + NestJS + PostgreSQL이고."
Step 2: 구체적 태스크 분할
"먼저 상품 관리 API를 만들 거야.
1. 상품 CRUD
2. 카테고리 관리
3. 재고 추적
4. 이미지 업로드"
Step 3: 하나씩 구현
"상품 생성 API부터 시작하자.
POST /api/products
요청 본문: {name, price, category_id, stock}
검증: 가격 > 0, 재고 >= 0
응답: 201 Created with product object"
Step 4: 점진적 개선
"좋아, 이제 여기에 트랜잭션 추가해줘"
"에러 핸들링 개선해줘"
"단위 테스트 작성해줘"
WBS와 AI의 시너지
여기서 **WBS(Work Breakdown Structure)**가 빛을 발합니다.
WBS로 작업을 잘게 나누면, 각 작업이 AI가 이해하기 쉬운 크기가 됩니다.
WBS 없이 AI 사용
"쇼핑몰 만들어줘"
→ AI: "???" (쓸모없는 코드)
WBS로 분해 후 AI 사용
1. 사용자 인증
1.1 회원가입 API
1.1.1 이메일 중복 체크
1.1.2 비밀번호 암호화
1.1.3 인증 메일 발송
1.2 로그인 API
1.2.1 자격증명 검증
1.2.2 JWT 토큰 발급
1.2.3 리프레시 토큰 관리
각 최하위 태스크(1.1.1, 1.1.2...)는 AI가 정확히 구현할 수 있는 크기입니다.
AI 프롬프트 템플릿
제가 실제로 사용하는 템플릿입니다:
## 컨텍스트
- 프로젝트: [프로젝트명]
- 현재 작업: [WBS 번호 및 설명]
- 기술 스택: [언어, 프레임워크, DB]
## 요구사항
### 기능 요구사항
- [ ] 요구사항 1
- [ ] 요구사항 2
### 비기능 요구사항
- 성능: [응답시간, 처리량]
- 보안: [인증, 권한, 암호화]
- 확장성: [동시 사용자, 데이터 증가]
## 제약사항
- [기존 코드와의 호환성]
- [외부 API 제한]
- [라이브러리 버전]
## 예상 입출력
입력: [예시 데이터]
출력: [예상 결과]
## 참고 코드
```[언어]
// 기존 코드나 비슷한 예시
``` {data-source-line="277"}
이 템플릿을 사용하면 AI의 정확도가 3배는 올라갑니다.
AI 도구별 특성
ChatGPT
- 장점: 설명 잘함, 다양한 언어
- 단점: 최신 정보 부족
- 용도: 개념 설명, 알고리즘
GitHub Copilot
- 장점: IDE 통합, 컨텍스트 이해
- 단점: 짧은 코드만
- 용도: 자동완성, 보일러플레이트
Claude
- 장점: 긴 코드, 정확도 높음
- 단점: 보수적
- 용도: 복잡한 로직, 리팩토링
Cursor
- 장점: 코드베이스 전체 이해
- 단점: 유료
- 용도: 대규모 리팩토링
마무리: AI는 도구일 뿐
AI가 개발자를 대체할까요? 절대 아닙니다.
AI는 힘을 증폭시키는 도구입니다. 망치가 목수를 대체하지 못하듯, AI도 개발자를 대체하지 못합니다.
다만, AI를 잘 쓰는 개발자가 못 쓰는 개발자보다 10배는 생산적일 겁니다.
핵심은 명확한 요구사항입니다.
WBS로 작업을 잘게 나누고, 각 작업을 명확히 정의하면, AI는 놀라운 생산성 도구가 됩니다.
"AI가 코드를 못 짠다"고 불평하기 전에, 우리가 요구사항을 제대로 전달했는지 돌아봐야 합니다.
Garbage In, Garbage Out.
명확한 입력, 명확한 출력. 이게 AI 시대의 개발 방법론입니다.
AI와 함께 효율적인 프로젝트 관리가 필요하신가요? Plexo를 확인해보세요.
댓글 없음:
댓글 쓰기