SQL 감사 도구(SQL Audit Tool) PoC 프로젝트가 실제 운영 환경에서 예상보다 완료까지 상당한 거리(Significant Distance)가 있음을 발견함
4개의 AI 코드 리뷰 모델(DeepSeek, Big Pickle, GLM, Qwen) 모두 실행 환경 부재(Lack of Execution Environment)로 인해 실제 DB 동작을 검증하지 못하는 한계 노출
PostgreSQL의 `pg_stat_statements` 누락, MySQL의 `DATABASE()` 함수 반환값 문제, 부정확한 지표(Incorrect Metrics) 등 실제 DB 테스트를 통해 치명적인 버그(Critical Bugs) 다수 발견 및 수정
최종적으로 10개에서 16개로 메트릭(Metrics) 확장 및 결정론적 점수화(Deterministic Scoring)를 통해 신뢰도 높은 감사 보고서 생성 완료
본문에서는 4개의 독립적인 AI 모델이 코드의 구문적 정확성(Syntactic Correctness)만 검증하고 실제 데이터베이스 환경에서의 동작(Behavior in Real Database Environment)을 테스트하지 못하는 공통적인 한계를 보였다고 지적함.
실행 환경 부재(Lack of Execution Environment): 모델들은 SQL 쿼리를 읽기만 할 뿐, PostgreSQL이나 MySQL 같은 실제 DB 엔진에 실행해보지 않아 실행 시점 오류(Runtime Errors)를 발견하지 못함.
SQL 확장 기능(SQL Extension) 및 권한 문제(Privilege Issues): `pg_stat_statements`와 같은 누락된 확장 기능이나 부적절한 DB 권한 설정은 코드 리뷰만으로는 탐지하기 어려움.
결과적으로, AI 리뷰는 초기 개발 단계의 '작동하는 코드' 검증에는 유용하나, 실제 운영 환경에서의 안정성(Stability) 및 호환성(Compatibility) 검증에는 한계가 명확함.
실제 PostgreSQL 16 및 MariaDB 환경에서 스크립트를 실행했을 때, 예상치 못한 다양한 버그들이 발견되었으며 이는 코드 리뷰만으로는 탐지 불가능했음.
CASE 문법의 함정(CASE Statement Trap): PostgreSQL은 `CASE` 문의 조건식을 파싱 시점에 평가하여, `pg_extension` 존재 여부를 동적으로 확인하는 로직이 무력화됨. 이는 정적 분석(Static Analysis)의 한계를 보여줌.
문자열 포맷 불일치(String Format Mismatch): `information_schema`의 `GRANTEE` 포맷과 `CONCAT(USER())` 함수의 결과 포맷 불일치로 인해 권한 검증 로직이 실패함. 이는 데이터베이스 스키마(Database Schema) 및 함수 동작 방식에 대한 깊은 이해가 필요함을 시사함.
NULL 반환으로 인한 측정 실패(Measurement Failure due to NULL Return): MySQL에서 데이터베이스 이름이 명시되지 않아 `DATABASE()` 함수가 NULL을 반환, `TABLE_SCHEMA = DATABASE()` 조건이 항상 거짓이 되어 실제 테이블 블로트(Bloat)를 측정하지 못함. 이는 측정 로직의 견고성(Robustness of Measurement Logic) 확보의 중요성을 강조함.
초기 SQL 감사 도구의 일부 메트릭은 실제 데이터베이스 환경에서 의미론적으로 잘못된 값을 반환하여 신뢰도를 떨어뜨렸음.
`buffer_pool_ratio`의 비논리적 계산: `innodb_buffer_pool_size`를 `max_connections`로 나누는 계산은 1보다 훨씬 큰 값을 반환하며, 이는 비율(Ratio)의 정의에 부합하지 않고 실제 성능 지표로 해석될 수 없음.
`bloated_tables`의 0 반환: 앞서 언급한 `DATABASE()` 함수 반환값 문제로 인해 실제 23%의 블로트가 있는 테이블에서도 0이라는 잘못된 결과가 나옴. 이는 측정값의 정확성(Accuracy of Measurement) 확보가 필수적임을 보여줌.
개선된 지표 도입: `buffer_pool_hit_rate` (메모리 캐시 적중률)와 같이 실제 성능을 반영하는 지표로 교체하고, `ssl_enforced`와 같이 보안 노출 표면(Security Exposure Surface)을 측정하는 메트릭을 추가하여 감사 범위 확장.
최종 감사 보고서의 신뢰도를 높이기 위해 LLM의 자유로운 서술(Free Narration) 대신 결정론적 점수화(Deterministic Scoring) 방식을 채택하고, 다국어 지원을 강화했음.
점수와 서술 분리: 점수 계산은 LLM과 분리하여 일관성을 유지하고, LLM은 기술적 근거에 기반한 설명만 생성하도록 함. 이는 AI 환각(Hallucination)을 방지하고 보고서의 정확성을 높임.
규제 준수(Compliance) 맥락 강화: `--jurisdiction` 플래그를 도입하여 클라이언트의 지역에 맞는 규제 프레임워크(예: GDPR, SOC 2)를 명시하고, LLM이 관련 없는 규제 프레임워크를 언급하는 것을 금지함.
다국어 지원 및 안정적 식별자: 보고서의 섹션 제목은 내부적으로 안정적인 식별자를 유지하면서 사용자에게는 번역된 레이블을 표시하여 다국어 환경에서의 일관성을 보장함.
이 프로젝트의 핵심 교훈은 실제 환경에서 실행하고 검증하기 전까지는 어떤 결과도 맹신해서는 안 된다는 것임. 이는 코드 리뷰, 메트릭 계산, 심지어 프로젝트의 완료 예상 시점까지 포함됨.
코드 검증 방식: 문제 해결 시 추측에 기반한 수정 시도 대신, 실제 생성된 코드를 검토하고 동작을 확인하는 방식이 효과적이었음. Copilot의 실패 사례는 이를 방증함.
메트릭의 유효성 검증: `buffer_pool_ratio`처럼 문법적으로는 맞지만 의미가 없는 메트릭은 외부 측정값과의 비교를 통해 그 허점을 드러냄.
프로젝트 완료 시점 재평가: 초기 추정치('가장 가까운 프로젝트')는 실제 검증을 거치기 전까지는 신뢰할 수 없는 추정치(Unverified Estimate)에 불과했음. 버그 발견 시마다 재평가가 이루어졌음.