지난달, 한 AI 어시스턴트가 프로덕션 프로젝트를 위한 Python 스크립트를 생성했습니다. 결과물은 오류 없이 실행되었고 데이터도 견고해 보였습니다. 하지만 수동 검토 결과, 데이터베이스 호출 속에 N+1 쿼리 패턴이 숨겨져 있는 것이 발견되었습니다. 작은 데이터셋에서는 코드가 잘 작동했습니다. 하지만 이를 수천 개의 레코드로 확장하면, 애플리케이션은 부모 객체를 위한 쿼리를 한 번 실행한 뒤, 관련 데이터를 가져오기 위해 수천 번의 후속 쿼리를 실행하게 됩니다. 그 결과는 어떤 유닛 테스트로도 잡아낼 수 없는 치명적인 성능 급락으로 이어질 것입니다.
이것이 현대 소프트웨어 개발의 현실입니다. 이제 AI 도구는 인간이 따라갈 수 없는 속도로 코딩, 디버깅, 아키텍처 제안을 수행합니다. 그 속도는 분명한 사실입니다. 하지만 이는 여러분의 직무 성격을 근본적으로 변화시킵니다. 여러분은 이제 단순히 구문을 입력하기 위해 급여를 받는 것이 아닙니다. 여러분은 감사(audit)하고, 설계(architect)하며, 바로 이러한 종류의 보이지 않는 함정들을 잡아내기 위해 급여를 받는 것입니다.
"논리적이지만 틀린"의 조용한 위험
AI가 생성한 코드는 컴파일되고, 실행되며, 예상된 값을 반환하기 때문에 종종 올바르게 보입니다. 표면적으로는 논리가 완벽해 보입니다. 하지만 그 이면에서는 조용히 망가져 있을 수 있습니다.
정규 표현식을 예로 들어보겠습니다. AI는 영어 환경에서 이메일 주소나 식별자를 완벽하게 매칭하는 패턴을 제공할 수 있습니다. 하지만 동일한 표현식을 독일어 움라우트, 아랍어 스크립트 또는 유니코드 정규화 엣지 케이스에 적용하면 조용히 실패합니다. 코드가 예외를 던지는 방식으로 틀린 것은 아닙니다. 그저 실제 세계의 유효한 데이터를 누락시킬 뿐입니다.
데이터베이스 쿼리도 비슷한 위험을 안고 있습니다. AI는 테스트 중에는 올바른 행을 반환하는 PostgreSQL 쿼리를 작성할 수 있지만, 실제로는 데드 튜플(dead tuples)로 테이블을 부풀리거나, 인덱스 활용을 건너뛰거나, 운영 워크로드를 마비시키는 순차 스캔(sequential scans)을 강제할 수도 있습니다. 데모 데이터셋에서 작동하는 것과 실제 부하 상황에서 작동하는 것은 전혀 다른 문제입니다. 기계는 지연 시간을 느끼지 못하며, 클라우드 비용을 지불하지도 않습니다.
작성에서 검증으로
핵심적인 변화는 "이것을 어떻게 작성할 것인가?"에서 "이것을 어떻게 검증할 것인가?"로 이동하는 것입니다. AI가 초안을 작성한다면, 여러분의 인지 부하는 다음 단계로 이동해야 합니다. 여러분은 지친 저자가 자신의 작업물을 훑어보는 방식이 아니라, 보안 감사관이 코드를 읽는 방식으로 코드를 읽어야 합니다.
이는 다른 종류의 규율을 요구합니다. 자동화 편향(Automation bias)은 실재합니다. 도구가 유창하고 구문적으로 완벽한 결과물을 내놓으면 인간의 뇌는 긴장을 풉니다. 제시된 결과물이 깔끔하기 때문에 당연히 정확할 것이라고 가정해 버립니다. 이러한 충동을 억제하는 것이 이제 핵심 역량입니다. 여러분은 모든 제안이 반증되기 전까지는 하나의 가설이라고 가정해야 합니다.
기계와 협업하기
AI 코딩 어시스턴트로부터 유용한 결과물을 얻는 것은 더 빨리 타이핑하는 문제가 아닙니다. 기계의 학습 데이터와 여러분의 구체적인 현실 사이의 거리를 좁히는 문제입니다. 몇 가지 구체적인 실천 방안을 통해 그 거리를 줄일 수 있습니다.
프롬프트를 정확하게 작성하세요. 여기서 모호함은 시를 쓰는 것이 아니라 버그를 만듭니다. "이 함수를 최적화해줘"와 같은 프롬프트는 일반적인 조언만을 불러옵니다. 대신 "반복적인 저장 대신 단일 벌크 데이터베이스 업데이트를 사용하도록 이 Python 루프를 리팩터링해줘"라고 작성하세요. 구체성은 가능성의 범위를 좁혀줍니다.
실제 컨텍스트를 제공하세요. 여러분이 엄격한 30초 요청 타임아웃이 설정된 Kubernetes 클러스터 내 PostgreSQL 15 기반의 Django 4.2를 실행하고 있다는 사실을 말해주지 않으면 AI는 알 수 없습니다. 의존성 버전, 내부 라이브러리, 그리고 타협할 수 없는 제약 사항들을 알려주세요. 컨텍스트는 장식이 아니라 가드레일입니다.
자신의 문서를 활용해 답변의 근거를 확보하세요. 검색 증강 생성(RAG)은 챗봇을 위한 유행어가 아닙니다. 어시스턴트에게 실제 API 명세서, 아키텍처 결정 기록(ADR), 그리고 코드베이스 컨벤션을 참조하도록 하세요. 모델이 학습 데이터에서 추측하는 대신 여러분의 문서에서 사실을 검색할 때, 일반적인 조언과 사용 가능한 코드 사이의 간극은 극적으로 줄어듭니다.
복잡한 작업은 개별 작업으로 나누세요. 에이전트 패턴은 각 단계의 범위가 좁을 때 가장 잘 작동합니다. 한 번에 전체 마이크로서비스 리팩터링을 요구하지 마세요. 먼저 데이터 스키마를 요청하고 검증하세요. 그다음 마이그레이션 스크립트를 요청하고 검증하세요. 그런 다음 서비스 레이어로 넘어가세요.
