AI 생성 코드에서 자주 발견되는 오류 10가지와 확인 방법

AI가 만든 코드는 왜 오류가 발생할까?

AI 코딩 도구는 사용자의 요청과 현재 프로젝트 정보를 바탕으로 코드를 생성한다. 짧은 시간 안에 많은 코드를 작성할 수 있지만, 프로젝트의 모든 설정과 실행 환경을 완벽하게 이해하는 것은 아니다.

AI가 학습한 예제와 현재 사용 중인 라이브러리 버전이 다를 수도 있고, 사용자가 설명하지 않은 요구사항을 AI가 임의로 추측할 수도 있다. 이 때문에 코드 형태는 자연스러워 보여도 실행하면 오류가 발생하거나 특정 상황에서 잘못된 결과를 반환할 수 있다.

중요한 점은 AI 생성 코드 오류를 단순히 “AI가 실수했다”라고 생각하지 않는 것이다. 어떤 종류의 오류가 자주 발생하는지 알고 확인 절차를 만들어 두면 문제를 빠르게 찾을 수 있다.

1. 존재하지 않는 함수와 패키지를 사용하는 오류

AI는 실제로 존재하지 않는 함수나 패키지를 자연스러운 이름으로 만들어낼 수 있다. 과거 버전에서만 제공된 사용법을 현재 버전에 적용하는 경우도 있다.

이 문제는 패키지를 설치할 수 없거나 실행 중 “함수를 찾을 수 없다”는 오류가 발생할 때 의심할 수 있다. AI가 제안한 패키지는 공식 문서와 패키지 저장소에서 실제 존재 여부를 확인해야 한다.

함수 이름도 공식 API 문서에서 검색하고 현재 설치된 버전에서 지원되는지 확인한다. 비슷한 이름의 비공식 패키지를 무작정 설치하는 것은 피하는 것이 좋다.

2. 타입이 맞지 않거나 빈 값을 처리하지 않는 오류

TypeScript 프로젝트에서는 문자열이 필요한 위치에 숫자를 전달하거나, 객체가 존재한다고 가정한 코드가 자주 생성된다. 데이터가 아직 로딩되지 않았거나 검색 결과가 없으면 값이 null 또는 undefined가 될 수 있다.

개발 화면에서는 정상 데이터만 사용하기 때문에 문제가 보이지 않을 수 있다. 하지만 실제 사용자가 빈 검색 결과를 만들거나 데이터가 늦게 도착하면 화면이 중단될 수 있다.

TypeScript의 엄격한 타입 검사를 활성화하고 타입 검사 명령을 실행하면 이런 문제를 발견하는 데 도움이 된다. TypeScript 공식 문서도 새 프로젝트에서는 가능한 한 엄격한 검사를 사용할 것을 권장한다. TypeScript 엄격한 타입 검사

확인할 때는 데이터가 존재하는 상황뿐만 아니라 빈 배열, 빈 문자열, null, undefined도 직접 입력해야 한다.

3. 비동기 작업의 완료를 기다리지 않는 오류

데이터베이스 조회, 파일 업로드와 외부 API 호출은 결과가 즉시 반환되지 않는다. AI가 await를 누락하거나 여러 작업의 실행 순서를 잘못 구성하면 데이터가 도착하기 전에 다음 코드가 실행될 수 있다.

대표적인 증상은 새로 등록한 데이터가 바로 표시되지 않거나, 페이지를 새로고침해야 결과가 나타나는 것이다. 네트워크 속도가 느릴 때만 오류가 발생하기도 한다.

비동기 함수를 찾은 다음 결과를 기다려야 하는 위치에 await가 사용됐는지 확인한다. 실패한 Promise를 처리하는 trycatch도 점검해야 한다. MDN 문서에 따르면 처리되지 않은 예외가 발생한 비동기 함수는 거부된 Promise를 반환한다. MDN async 함수 설명

브라우저 개발자 도구에서 네트워크 속도를 낮게 설정한 뒤 같은 기능을 실행해 보면 비동기 처리 문제를 발견하기 쉽다.

4. 상태 변경으로 무한 렌더링이 발생하는 오류

React와 같은 프런트엔드 환경에서는 상태가 변경될 때 화면이 다시 렌더링된다. AI가 렌더링 과정에서 상태를 계속 변경하도록 코드를 작성하면 같은 작업이 반복될 수 있다.

화면이 깜빡이거나 브라우저가 느려지고 동일한 API 요청이 계속 발생한다면 무한 렌더링을 의심해야 한다. 개발자 도구의 네트워크 탭에서 같은 요청이 반복되는지 확인한다.

상태를 변경하는 코드가 렌더링될 때마다 실행되지 않는지 살펴보고, 효과를 실행하는 조건이 올바른지 확인해야 한다. AI에게 수정하도록 요청할 때는 단순히 오류를 숨기지 말고 반복 실행이 발생한 원인을 설명하도록 요구하는 것이 좋다.

5. 사용자 입력값을 신뢰하는 오류

AI는 정상적인 사용자 입력을 기준으로 기능을 구현하는 경우가 많다. 이름은 문자열이고 가격은 숫자이며 이메일은 올바른 형식이라고 가정할 수 있다.

실제 사용자는 빈 값, 매우 긴 문자열, 음수와 특수문자를 입력할 수 있다. 공격자는 브라우저 화면을 거치지 않고 서버 API에 직접 값을 전달할 수도 있다.

확인하려면 필수 입력값을 비우고, 지나치게 긴 값을 입력하고, 숫자 칸에 문자를 전달해 본다. 같은 이름의 매개변수를 중복으로 전달했을 때 서버가 예상하지 못한 방식으로 처리하지 않는지도 살펴볼 수 있다.

프런트엔드에서 입력값을 검사하더라도 서버에서 다시 검증해야 한다. OWASP 웹 보안 테스트 가이드도 입력값 검증을 별도의 주요 테스트 영역으로 다룬다. OWASP 웹 애플리케이션 보안 테스트

6. 로그인만 확인하고 권한을 검사하지 않는 오류

AI가 만든 코드에서 자주 발견되는 보안 문제 중 하나는 인증과 권한을 혼동하는 것이다. 로그인 여부는 확인하지만 해당 사용자가 특정 데이터에 접근할 권한이 있는지는 검사하지 않을 수 있다.

예를 들어 게시물 주소의 숫자만 다른 사용자의 번호로 바꿨을 때 내용을 볼 수 있다면 권한 검사가 부족한 것이다. 관리자 메뉴를 화면에서 숨겼더라도 주소를 직접 입력하거나 API를 호출하면 접근할 수 있을 수 있다.

일반 사용자, 관리자와 로그인하지 않은 사용자 계정을 각각 준비해 같은 기능을 테스트해야 한다. 조회뿐만 아니라 생성, 수정과 삭제 요청도 검사한다.

OWASP Top 10에서도 잘못된 접근 통제를 중요한 웹 애플리케이션 위험으로 다루며, URL이나 요청 값을 변경해 다른 사용자의 데이터에 접근하는 문제를 대표 사례로 설명한다. OWASP 접근 통제 취약점

7. API 키와 비밀번호를 코드에 직접 작성하는 오류

AI는 예제 코드를 완성하기 위해 API 키를 입력할 위치를 코드 안에 만들기도 한다. 사용자가 실제 키를 그 자리에 넣으면 GitHub 저장소나 브라우저에서 외부에 노출될 수 있다.

프로젝트 전체에서 key, secret, token, password와 같은 단어를 검색한다. 환경변수 파일이 Git 저장 대상에서 제외됐는지도 확인해야 한다.

특히 프런트엔드 환경변수는 이름만 환경변수일 뿐 최종적으로 브라우저에 전달될 수 있다. 외부에 공개되면 안 되는 키는 반드시 서버에서만 사용해야 한다.

이미 공개 저장소에 키를 올렸다면 문자열을 삭제하는 것으로 끝내지 말고 해당 키를 폐기한 뒤 새로 발급해야 한다.

8. API가 필요 이상의 데이터를 반환하는 오류

화면에는 사용자 이름만 표시되지만 API 응답에는 이메일, 내부 식별자, 권한 정보와 같은 값이 모두 포함될 수 있다. 화면에서 숨겨졌다고 해서 데이터가 보호되는 것은 아니다.

브라우저 개발자 도구의 네트워크 탭에서 API 응답을 직접 확인한다. 현재 화면에 필요하지 않은 개인정보와 내부 데이터가 포함돼 있는지 살펴봐야 한다.

서버에서 필요한 필드만 선택해 반환하도록 수정하고, 사용자의 권한에 따라 조회 가능한 데이터도 제한한다. 운영 환경에서 자세한 오류 내용과 소스맵이 공개되지 않는지도 함께 확인하는 것이 좋다.

9. 오류를 숨기고 빈 결과를 반환하는 문제

AI는 애플리케이션이 중단되지 않도록 모든 오류를 잡은 뒤 빈 배열이나 null을 반환하는 코드를 만들 수 있다. 화면은 멈추지 않지만 실제로 데이터베이스 연결이 실패했는지, 검색 결과가 없는지 구분할 수 없게 된다.

catch 영역이 비어 있거나 오류 발생 시 무조건 빈 데이터를 반환하는 코드를 검색한다. 서버 오류가 발생했을 때 사용자에게 적절한 안내가 표시되고 운영자가 원인을 확인할 수 있는 로그가 남는지 확인해야 한다.

오류 메시지에는 비밀번호, 토큰, 데이터베이스 구조와 서버 파일 경로가 포함되지 않도록 주의한다.

10. 테스트는 통과하지만 실제 기능은 검증하지 않는 오류

AI가 작성한 테스트 코드도 항상 정확한 것은 아니다. 실제 함수를 실행하지 않고 고정된 값을 비교하거나, 실패할 가능성이 없는 조건만 검사할 수 있다.

의도적으로 실제 코드에 작은 오류를 만들어 테스트가 실패하는지 확인하면 테스트의 유효성을 판단할 수 있다. 정상 입력뿐만 아니라 잘못된 입력, 권한이 없는 사용자, 서버 연결 실패와 빈 데이터도 테스트에 포함해야 한다.

화면 테스트와 API 테스트를 분리하고 회원가입부터 로그아웃까지 이어지는 전체 사용자 흐름도 점검하는 것이 좋다.

AI 생성 코드 오류를 효율적으로 확인하는 순서

AI 생성 코드에서 문제가 발생하면 전체 프로젝트를 한 번에 다시 작성하도록 요청하지 않는 것이 좋다. 변경 범위가 커지면 새로운 오류가 추가되고 원래 정상적으로 작동하던 기능까지 달라질 수 있다.

먼저 오류를 재현하고 브라우저 콘솔, 네트워크 응답과 서버 로그를 확인한다. 이후 문제가 발생한 파일과 조건을 좁힌 다음 최소한의 코드만 수정해야 한다.

AI에는 다음과 같이 요청할 수 있다.

“현재 오류의 원인을 먼저 설명해 줘. 타입 검사나 보안 검사를 끄지 말고 수정이 필요한 파일만 알려줘. 기존 기능을 유지하는 최소한의 수정안을 제시하고 같은 문제가 다시 발생하지 않도록 테스트도 작성해 줘.”

수정이 끝나면 처음 오류가 해결됐는지 확인하는 것만으로 끝내지 말고 관련 기능을 다시 실행해야 한다.

마무리

AI 생성 코드에서 자주 발견되는 오류는 존재하지 않는 API, 타입 불일치, 비동기 처리 누락, 무한 렌더링, 입력값 검증 부족, 권한 검사 누락, 비밀정보 노출, 과도한 데이터 반환, 잘못된 오류 처리와 불충분한 테스트로 정리할 수 있다.

이러한 오류는 코드가 처음부터 실행되지 않을 때도 있지만 특정 사용자나 특정 환경에서만 나타나기도 한다. 따라서 화면이 정상적으로 보인다는 이유만으로 코드가 완성됐다고 판단해서는 안 된다.

바이브 코딩을 안전하게 활용하려면 AI가 생성한 결과를 초안으로 보고 타입 검사, 네트워크 확인, 권한 테스트와 예외 상황 검증을 반복해야 한다. 이런 습관이 쌓이면 AI 코딩의 속도는 유지하면서 실제 서비스에서 발생할 수 있는 위험은 줄일 수 있다.

댓글 남기기