AI로 디버깅하기 — Claude는 버그를 얼마나 잘 잡을까?
AI가 코드를 작성하는 시대가 왔지만, 디버깅은 어떨까? Nadia Makarevich가 실제 프로덕션 버그 3가지를 AI에게 던져본 실험 결과를 정리했다. 각 버그마다 3번의 시도를 진행해 일관성도 함께 확인했다.
버그 1: Zod 검증이 통과하는데 타입이 안 맞는다
섹션 제목: “버그 1: Zod 검증이 통과하는데 타입이 안 맞는다”API 응답을 Zod로 검증하는 코드에서, 검증은 성공하는데 TypeScript 타입과 실제 데이터 구조가 달랐다.
const UserSchema = z.object({ id: z.string(), name: z.string(), settings: z.object({ theme: z.enum(['light', 'dark']), notifications: z.boolean(), }),});
// 검증은 통과하지만...const result = UserSchema.safeParse(apiResponse);if (result.success) { // result.data.settings가 undefined일 수 있음 console.log(result.data.settings.theme); // 💥 런타임 에러}결과: ✅ / ✅ / 🥑
섹션 제목: “결과: ✅ / ✅ / 🥑”3번 중 2번은 정확히 문제를 짚어냈다. 스키마 정의와 실제 API 응답 구조의 불일치, .optional() 누락 등을 정확하게 식별했다. 세 번째 시도에서는 근본 원인은 맞췄지만 해결책이 다소 과했다.
AI가 잘하는 영역: 타입 시스템과 검증 로직의 불일치처럼 패턴이 명확한 버그는 AI가 강하다.
버그 2: 로딩 스켈레톤이 두 번 나타난다
섹션 제목: “버그 2: 로딩 스켈레톤이 두 번 나타난다”데이터를 페칭할 때 로딩 스켈레톤이 한 번 보여야 하는데, 잠깐 사라졌다가 다시 나타나는 현상이 발생했다.
function UserProfile({ userId }: { userId: string }) { const { data, isLoading } = useQuery({ queryKey: ['user', userId], queryFn: () => fetchUser(userId), });
if (isLoading) return <Skeleton />; if (!data) return null;
return <Profile data={data} />;}결과: ✅ / ❌ / ❌
섹션 제목: “결과: ✅ / ❌ / ❌”첫 번째 시도에서만 React의 Strict Mode에서 Effect가 두 번 실행되는 것과 연관된 원인을 정확히 짚었다. 나머지 두 번은 엉뚱한 방향으로 갔다 — 하나는 CSS 애니메이션 문제로 진단했고, 다른 하나는 불필요한 상태 관리 리팩토링을 제안했다.
AI의 약점: 타이밍과 라이프사이클이 얽힌 버그는 일관성이 떨어진다. 같은 버그를 3번 물어보면 3개의 다른 답이 나올 수 있다.
버그 3: 이상한 리다이렉트
섹션 제목: “버그 3: 이상한 리다이렉트”로그인 후 원래 페이지로 리다이렉트해야 하는데, 간헐적으로 엉뚱한 페이지로 이동하는 버그.
function useAuthRedirect() { const router = useRouter(); const { isAuthenticated } = useAuth(); const returnUrl = useSearchParams().get('returnUrl');
useEffect(() => { if (isAuthenticated && returnUrl) { router.push(returnUrl); } }, [isAuthenticated, returnUrl, router]);}결과: ❌ / ❌ / ❌
섹션 제목: “결과: ❌ / ❌ / ❌”3번 모두 실패했다. 각 시도마다 다른 원인을 제시했지만, 어느 것도 실제 버그의 근본 원인에 도달하지 못했다.
실제 원인은 returnUrl이 인코딩/디코딩 과정에서 변형되는 edge case였다. 여러 미들웨어를 거치면서 URL이 이중 인코딩되는 문제로, 코드만 봐서는 발견하기 어렵고 실행 컨텍스트를 이해해야 하는 버그였다.
AI의 한계: 시스템 전체의 실행 흐름을 추적해야 하는 버그는 현재 AI가 가장 힘들어하는 영역이다. AI는 코드를 보지만, 코드가 실행되는 환경은 보지 못한다.
AI 디버깅 스코어카드
섹션 제목: “AI 디버깅 스코어카드”| 버그 유형 | 시도 1 | 시도 2 | 시도 3 | AI 강점 |
|---|---|---|---|---|
| 타입/스키마 불일치 | ✅ | ✅ | 🥑 | 패턴 매칭에 강함 |
| 라이프사이클 타이밍 | ✅ | ❌ | ❌ | 일관성 부족 |
| 시스템 흐름 추적 | ❌ | ❌ | ❌ | 실행 컨텍스트 부재 |
AI 디버깅을 잘 활용하는 법
섹션 제목: “AI 디버깅을 잘 활용하는 법”1. 컨텍스트를 최대한 제공하라
섹션 제목: “1. 컨텍스트를 최대한 제공하라”❌ "이 코드에서 버그를 찾아줘"
✅ "로그인 후 returnUrl로 리다이렉트하는 코드인데, 간헐적으로 엉뚱한 페이지로 이동합니다. Next.js 미들웨어에서 인증 체크 후 리다이렉트하고, Nginx 프록시 뒤에 있습니다. 재현 조건: returnUrl에 쿼리 파라미터가 2개 이상일 때"2. 여러 번 물어보라
섹션 제목: “2. 여러 번 물어보라”한 번의 답변을 그대로 믿지 말고, 같은 질문을 2-3번 반복해서 일관된 답변이 나오는지 확인한다. 매번 다른 답이 나온다면, AI도 확신이 없는 것이다.
3. AI의 강점 영역을 파악하라
섹션 제목: “3. AI의 강점 영역을 파악하라”AI가 잘하는 디버깅:
- 타입 에러, 스키마 불일치
- 잘 알려진 라이브러리의 일반적인 실수
- 코드에서 바로 보이는 논리 오류
AI가 못하는 디버깅:
- 타이밍 관련 간헐적 버그
- 여러 시스템이 상호작용하는 버그
- 특정 환경에서만 재현되는 버그
- AI는 패턴이 명확한 버그(타입 에러, 스키마 불일치)에 강하다
- 타이밍, 라이프사이클 관련 버그는 일관성이 떨어진다
- 시스템 전체 흐름 추적이 필요한 버그는 아직 AI의 한계다
- AI 디버깅의 핵심은 컨텍스트 제공과 반복 검증이다
- AI를 “답을 주는 도구”가 아닌 “같이 생각하는 동료”로 활용하면 가장 효과적이다