개념
환각 API란
모듈 18b(레슨 2)에서 배운 환각(Hallucination)이, 코드 영역에서는 **"실제로 존재하지 않는 함수·메서드·라이브러리를 마치 존재하는 것처럼 자연스럽게 호출하는 코드"**로 나타난다.
// AI가 생성한 코드
import { validateEmailStrict } from "@company/validators"
test("이메일 형식 검증", () => {
expect(validateEmailStrict("test@example.com")).toBe(true)
})validateEmailStrict라는 함수가 실제 @company/validators
라이브러리에 없는데도, AI는 "이런 이름의 함수가 있을 법하다"는
그럴듯함만으로 만들어낼 수 있다.
왜 이런 일이 생기는가
모듈 18b(레슨 2)에서 배운 것처럼, AI는 사실을 조회하는 게 아니라
가장 그럴듯한 패턴을 생성한다. 많은 라이브러리들이 비슷한
네이밍 관습(validateX, isX, parseX)을 따르기 때문에, AI는
실제로 존재하지 않아도 "있을 법한" 함수 이름을 매우 자연스럽게
만들어낼 수 있다.
환각 API가 위험한 이유 — 조용히 실패한다
- 실행하면 즉시 "함수를 찾을 수 없음" 에러로 바로 드러나는 경우: 그나마 안전
- 비슷한 이름의 실제 함수가 있어서, 다른 동작을 하는 함수가
대신 실행되는 경우: 훨씬 위험함(모듈 9 레슨 1에서 배운 코드
읽기가 없으면 알아채기 어려움)찾아내는 방법 1 — 실제로 실행해보기
가장 기본적인 검증이다. 모듈 10에서 배운 테스트 실행 자체가 1차 검증이 된다 — 환각 API는 실행하면 대부분 즉시 에러로 드러난다. 다만 "실행이 된다"는 것과 "제대로 된다"는 것은 다르다는 점(레슨 3에서 이어진다)을 주의해야 한다.
찾아내는 방법 2 — 공식 문서와 대조하기
호출된 함수·메서드가 실제로 그 라이브러리의 공식 문서나 타입 정의에 있는지 확인한다.
확인 절차:
1. import된 라이브러리 이름을 확인한다
2. 그 라이브러리의 공식 문서(또는 타입 정의 파일)를 연다
3. 코드에서 호출한 함수·메서드·파라미터가 실제로 존재하는지 대조한다모듈 9(레슨 1)에서 배운 "모르는 문법을 만났을 때 검색해서 확인한다"는 습관이, 여기서는 "AI가 만든 코드의 모든 외부 호출을 확인한다"는 구체적인 절차로 이어진다.
찾아내는 방법 3 — 낯선 파라미터·옵션 의심하기
함수 자체는 실제로 존재하지만, AI가 존재하지 않는 파라미터나 옵션을 지어내는 경우도 있다 — 이건 더 찾기 어렵다.
// fetchOrders 함수는 실제로 있지만, strictMode 옵션은 존재하지 않을 수 있다
fetchOrders({ userId: 123, strictMode: true })낯선 옵션이나 평소 안 쓰던 파라미터가 보이면, "이게 정말 이 함수의 실제 옵션인가?"를 한 번 더 의심하는 습관이 필요하다.
타입 검사 도구의 도움
TypeScript 같은 정적 타입 언어를 쓰는 프로젝트라면, 존재하지 않는 함수나 잘못된 파라미터 타입을 컴파일 시점에 자동으로 잡아낼 수 있다 — 모듈 14(레슨 6)에서 배운 CI 파이프라인에 타입 검사 단계를 포함시켜두면, 환각 API의 상당수를 사람이 일일이 찾지 않아도 기계적으로 걸러낼 수 있다.
실무에서 왜 필요한가
"AI가 짜준 테스트 코드가 실행은 되는데 왠지 이상하게 느리다"고 느꼈던 상황이, 알고 보면 존재하지 않는 함수 대신 우연히 이름이 비슷한 다른 함수가 호출되고 있었던 경우가 실무에서 보고된다. 공식 문서와 대조하는 습관을 가진 QA는, 이런 조용한 오류를 코드 리뷰 단계에서 미리 잡아낼 수 있다.