들어가며
지난 글에서 주말 이틀 만에 마이크로 SaaS 7개를 만든 이야기를 했다. 반응이 좋았는데, 정작 못 쓴 이야기가 있다.
AI 코딩 에이전트가 완전히 망친 작업들이다.
2025년부터 Claude, Cursor, Copilot 등 AI 코딩 도구를 매일 쓰면서 약 100시간 이상의 삽질을 했다. 그 과정에서 배운 건 단순하다:
AI는 만능이 아니다. 맡기면 안 되는 영역이 명확하다.
오늘은 그 5가지 영역을 구체적 사례와 함께 공유한다.
1. 🔐 인증/보안 로직
실제 사례
AI에게 JWT 인증 미들웨어를 만들어달라고 했다. 코드는 깔끔했다. 문제는:
-
algorithm파라미터를 하드코딩하지 않아 Algorithm Confusion 공격에 취약 - refresh token rotation이 없어 토큰 탈취 시 무한 사용 가능
- CSRF 토큰을 쿠키에만 저장해서 의미 없는 보호
왜 위험한가
AI는 "동작하는 코드"를 만든다. "안전한 코드"를 만드는 게 아니다. 보안은 "무엇이 빠져있는지"가 핵심인데, AI는 빠진 것을 모른다.
해결법
// ❌ AI가 만든 코드
jwt.verify(token, secret)
// ✅ 직접 검증해야 할 부분
jwt.verify(token, secret, {
algorithms: ["HS256"], // 알고리즘 고정
issuer: "your-app", // 발급자 확인
maxAge: "1h" // 만료 강제
})
원칙: 보안 코드는 AI가 초안을 쓰되, 사람이 반드시 리뷰한다.
2. 💾 데이터베이스 마이그레이션
실제 사례
PostgreSQL에서 컬럼 타입을 변경하는 마이그레이션을 AI에게 맡겼다.
AI가 만든 코드:
ALTER TABLE users ALTER COLUMN age TYPE integer;
문제: 100만 행 테이블에서 이걸 실행하면 테이블 전체 락이 걸린다. 프로덕션에서 실행했다면 서비스가 몇 분간 멈춘다.
안전한 방법
-- 1. 새 컬럼 추가 (락 없음)
ALTER TABLE users ADD COLUMN age_new integer;
-- 2. 배치로 데이터 복사
UPDATE users SET age_new = age::integer
WHERE id BETWEEN 1 AND 10000;
-- ... 반복
-- 3. 컬럼 교체
ALTER TABLE users RENAME COLUMN age TO age_old;
ALTER TABLE users RENAME COLUMN age_new TO age;
원칙: 마이그레이션은 항상 프로덕션 데이터 규모를 기준으로 생각한다. AI는 로컬 DB만 안다.
3. 🏗️ 아키텍처 결정
실제 사례
"채팅 기능 만들어줘"라고 했더니 AI가 바로 WebSocket + Redis Pub/Sub + 마이크로서비스 구조를 제안했다.
사용자: 5명.
왜 문제인가
AI는 "가장 보편적인 답"을 준다. Stack Overflow에서 가장 많이 추천받은 아키텍처. 하지만 내 상황(사용자 5명, 1인 개발, 사이드 프로젝트)에는 과도하다.
실제로 필요했던 건:
// SSE (Server-Sent Events) + SQLite
// 파일 하나, 서버 하나, 끝.
app.get("/events", (req, res) => {
res.setHeader("Content-Type", "text/event-stream");
// 10줄이면 충분한 채팅 백엔드
});
원칙: AI에게 구현을 맡기기 전에, 아키텍처는 사람이 결정한다. "왜 이 구조인가"를 AI는 모른다.
4. 🧪 엣지 케이스 테스트
실제 사례
AI에게 이메일 유효성 검사 함수의 테스트를 만들어달라고 했다.
// AI가 만든 테스트
test("valid email", () => expect(validate("user@example.com")).toBe(true));
test("invalid email", () => expect(validate("not-email")).toBe(false));
빠진 것들:
-
user@localhost— 유효한가? -
user+tag@gmail.com— 플러스 어드레싱 -
user@emoji🎉.com— 유니코드 도메인 -
"user name"@example.com— 따옴표 안 공백 - 256자 초과 이메일
- SQL injection이 포함된 이메일
AI 테스트는 해피 패스만 커버한다. 실제 버그는 항상 엣지 케이스에서 터진다.
해결법
엣지 케이스 목록은 사람이 만들고, AI에게 "이 케이스들로 테스트 코드 만들어줘"라고 한다.
원칙: AI는 테스트 코드 작성자로는 훌륭하지만, 테스트 설계자로는 부족하다.
5. 🔄 레거시 코드 리팩토링
실제 사례
5년 된 Express.js 서버를 리팩토링하려고 AI에게 맡겼다.
AI가 한 일:
- 콜백을 async/await로 전부 변환 ✅
- 에러 핸들링 패턴 통일 ✅
- 기존 미들웨어의 실행 순서를 바꿈 ❌
- 특정 라우트에만 적용되던 rate limiter를 전역으로 이동 ❌
결과: 테스트는 통과했지만 프로덕션에서 특정 API의 rate limit이 10배 빡빡해져서 사용자 불만 폭주.
왜 이런 일이 생기는가
AI는 코드의 "의도"를 모른다. "이 rate limiter가 여기에 있는 이유"는 코드에 안 적혀있다. 5년간의 히스토리와 맥락이 필요한 건데, AI는 현재 코드만 본다.
원칙: 리팩토링은 "동작은 동일하게, 구조만 변경"이 핵심이다. AI는 동작 보존을 보장하지 않는다.
그래서 AI 코딩을 어떻게 쓰나?
| 맡겨도 되는 것 | 직접 해야 하는 것 |
|---|---|
| 보일러플레이트 코드 | 보안 로직 설계 |
| CSS/UI 구현 | DB 마이그레이션 계획 |
| 유틸 함수 작성 | 아키텍처 결정 |
| 테스트 코드 작성 | 테스트 케이스 설계 |
| 문서화 | 레거시 맥락 파악 |
내 워크플로우는 이렇다:
- 설계는 내가 한다 — 무엇을, 왜, 어떤 구조로
- 구현은 AI가 한다 — 코드 작성, 반복 작업
- 검증은 내가 한다 — 보안, 엣지 케이스, 맥락
AI를 주니어 개발자처럼 쓴다. 코드를 잘 치지만, 아직 판단은 못 하는 주니어. 코드 리뷰 없이 머지하면 안 되는 주니어.
마무리
AI 코딩 도구는 생산성을 3-5배 높여준다. 하지만 그건 올바르게 쓸 때만이다.
"AI가 다 해줄 거야"라는 생각으로 접근하면, 나처럼 100시간을 삽질하게 된다.
핵심은 간단하다:
AI는 "어떻게"를 잘한다. "무엇을"과 "왜"는 여전히 사람의 몫이다.
이전 글: 주말 이틀 만에 마이크로 SaaS 7개 만들고 배운 것
질문이나 여러분만의 AI 코딩 삽질 경험이 있다면 댓글로 공유해주세요! 🙌
🚀 Want More?
I'm building an AI-powered revenue machine that runs 24/7 — from micro-SaaS tools to games to digital products, all automated with AI agents.
Follow me here on Dev.to to get weekly insights on:
- 🤖 AI automation that actually makes money
- 🎮 Game dev with AI agents (Godot + TDD)
- 🛠️ Building micro-SaaS tools from scratch
- 📈 Indie hacker growth strategies
👉 Check out my free dev tools | Play my games on itch.io
📘 Free Resource
If you are building with a $0 budget, I wrote a playbook about what works, what doesn't, and how to think about the $0 phase.
📥 The $0 Developer Playbook — Free (PWYW)
Want the deep dive? The Extended Edition ($7) includes a 30-day launch calendar, 5 copy templates, platform comparison matrix, and revenue math calculator.
Top comments (0)