12.6.4 재귀 쿼리 및 무한 루프 가능성 탐지
SQL-99 표준을 기점으로 도입된 WITH RECURSIVE 공통 테이블 표현식(CTE: Common Table Expression)은 튜링 불완전(Turing-incomplete)했던 고전적 관계형 언어에 절차적 프로그래밍의 가장 위대한 패러다임인 ‘자기 참조 반복(Self-referencing Loop)’ 능력을 하사한 끔찍하게 강력한 기능이다. 그러나 이 무소불위의 칼날은, 반복문을 탈출하는 논리 제어 조건(Base Case & Termination Condition)을 완벽하게 세팅하지 못하는 순간, 그 즉시 데이터베이스 엔진을 영원히 끝나지 않는 **무한 루프(Infinite Loop)**의 나락으로 끌고 들어가는 가장 위험한 자폭 버튼으로 돌변한다.
1. 재귀의 런타임 재앙: 탈출 조건(Base Case)의 누락과 순환 참조
AI 모델 에이전트가 “사내 10만 명 직원의 계층적 결재 조직도(Tree Structure) 트리 트래버설을 바닥까지 모두 전개하라“는 난도 높은 문제를 풀기 위해 의욕적으로 WITH RECURSIVE 쿼리 설계를 시도했다고 가정해 보자.
만약 이때 모델이 순간적인 어텐션(Attention) 환각 오류를 일으켜 조인(JOIN) 조건의 자식-부모 방향을 반대로 잡거나, 인간 개발자들이 생명줄처럼 달아두는 WHERE depth < 10 같은 안전장치(Guardrail)를 누락해 버린다면 어떤 일이 발생할까? 데이터베이스의 워커 스레드(Worker Thread)는 부모 노드와 자식 노드 사이를 영원히 핑퐁처럼 오가는 지독한 인피니트로 풀 풀(Infinite Pool)에 갇히게 된다. 이 과정에서 동일한 임시 튜플 데이터를 수십억 배로 무한하게 복제해 내며 시스템의 힙(Heap) 메모리를 찢어발기게 된다.
결국 앞선 절에서 다룬 타임아웃 킬러가 작동하기 그 찰나의 순간까지, 샌드박스 노드의 하드웨어 리소스를 악의 없이 초당 기가바이트 단위로 모조리 갉아먹는 패닉 상태(Panic State)를 유발한다.
2. AST 의미론 파서를 이용한 재귀 댑스(Depth) 강제 검열
이러한 논리적 무한 루프 파탄을 애플리케이션 프레임워크 수준에서 선제적으로 구조적 차단하기 위해, 오라클의 정적 분석 파이프라인(Static Analysis Pipeline)은 단순히 DML/DDL 키워드를 차단하는 수준에서 안주해서는 안 된다. 미지의 쿼리 AST(추상 구문 트리) 정점을 순회 파싱(Parsing)할 때, 트리 내에 RECURSIVE 키워드 클래스가 감지되는 그 즉시 오라클의 검열 엔진은 최고 수준의 비상 분석 모드로 전환하여 다음 사항을 가혹하게 검열해야 한다.
- 재귀 호출 노드(Recursive Call Node)의 추적: 파서는 CTE 선언부 블록 내부에서 자기 자신의 테이블 식별자(Self-reference Identifier)를 다시 참조하는 재귀 체인 부분을 정확히 발라낸다.
- 안전 방어벽(Guardrail) 검사: 이 반복 참조 블록 내의 파생 노드에, 쿼리 엔진의 루프를 물리적으로 강제 커팅할 수 있는
LIMIT절이나WHERE ... <= Max_Depth와 같은 명시적이고 절대적인 유한 중단 조건 노드가 존재하는지 정밀 검사한다. - 무자비한 글로벌 캡(Cap) 강제 주입(Injection): 만약 AI가 작성한 순진한 쿼리에 어떠한 탈출 조건 트리도 존재하지 않는 것을 적발했다면, 오라클 시스템은 쿼리를 에러로 기각시키는 대신 가차 없이 가상 트리에
LIMIT 100(최대 100행까지만 반환)과 같은 글로벌 하드 캡(Hard Cap) 구문 노드를 인위적으로 삽입(Inject)해 버린다. 이후 변개된 AST를 다시 텍스트 SQL로 컴파일(Compile)하여 안전한 상태로 데이터베이스에 내려보낸다.
3. 엔진 런타임의 재귀 추적 스위치(Tracker Switch) 패시브 가동
애플리케이션 계층(AST)의 검열에만 의존하지 않고, 데이터베이스 물리 엔진 단에서부터 네이티브(Native) 기능으로 지원하는 트랜잭션 단위의 재귀 제어 옵션을 항상 켜두는 것은 가장 완벽한 인프라 백업 방어선이다.
예를 들어, PostgreSQL 기반의 평가 샌드박스 환경에 드라이버 커넥션을 연결할 때, 오라클 파이썬 커넥터는 세션이 맺어지자마자 패시브로 다음과 같은 옵션을 타격해 시스템의 운명을 스스로 통제한다.
SET max_recursion_depth = 50;
이 세션 강제 명령을 통해, 아무리 지능이 박살 난 AI 모델이 무한히 꼬리를 무는 순환 계층 쿼리를 작성하여 탈출 조건을 모조리 빼먹었다 한들, 우직한 데이터베이스 엔진은 정확히 50번째 루프 연산을 수행하는 순간 즉각 트랜잭션의 반복을 하드 단절시키고 시스템 콘솔에 ERROR: Recursion depth exceeded 예외를 던져버리며 작동을 멈춘다.
이로써 위대한 오라클은 무한 루프의 폭발적인 악몽으로부터 샌드박스와 호스트 인프라를 철벽 방어하고, 불완전한 재귀 쿼리 추론 설계를 내놓은 AI 에이전트에 대해 우아하고 냉혹하게 논리적 오답(False, EX=0)을 선고할 수 있는 절대 통제권(Absolute Control)을 되찾게 되는 것이다.