9.2.5 들여쓰기(Indentation) 및 블록 구조 오류의 사전 차단
Python이나 YAML처럼 들여쓰기(Indentation)가 곧 문법의 뼈대이자 스코프(Scope)를 결정짓는 언어에서, 코드 생성 AI가 겪는 공간적 감각 상실은 코드의 논리를 완전히 비틀어버리는 치명적인 결과를 초래한다.
예를 들어, 보안 검사를 통과해야만 파일 접근을 허용하는 if 블록 로직을 LLM이 생성했다고 가정해 보자. AI가 실수로 파일 접근 코드 라인의 스페이스바를 4칸 덜 쳐서(Dedent) if 블록 밖으로 코드를 빼버린다면, 어떻게 될까? 문법적으로는 완벽하기 때문에 컴파일러나 일반적인 Syntax 파서는 이 코드를 패스(Pass)시킨다. 하지만 비즈니스 로직 상으로는 보안 검사가 완전히 무시되는 대재앙(Security Bypass)이 발생한다.
이처럼 눈에 보이지 않는 공백(Whitespace) 트러블은 단순히 코드의 형태가 일그러지는 것을 넘어 논리의 의미론적(Semantic) 타락을 유발한다. 오라클 시스템은 AST 파싱 단계에서 이러한 들여쓰기 붕괴와 블록 구조의 이탈을 수학적으로 계측하고 사전에 차단하기 위한 하드-파싱(Hard-parsing) 전략을 구비해야 한다.
1. Indentation Error의 즉각적 적발과 컨텍스트 재설정
가장 일차원적이고 흔한 형태는 아예 문법적으로 허용되지 않는 엉뚱한 깊이의 들여쓰기를 해버리는 경우다(예: 들여쓰기 4칸이 기본인데 5칸이나 3칸을 띄운 경우).
- 이는 파이썬 내장
ast.parse()함수를 통과하는 즉시 고유한 예외인IndentationError형식을 띠며 튕겨져 나온다. - 이 에러가 발생했을 때 오라클의 역할은 단순히 코드를 파기하는 게 아니다. 들여쓰기 에러는 LLM이 문맥(Context)의 중심을 잃었다는 명백한 증거이므로, 오라클은 문제가 발생한 해당 블록의 윗단 컨텍스트(예: “현재 당신은
class AuthHandler안에 있는def verify_user함수를 작성 중입니다”)를 프롬프트에 명시적으로 추가하여 LLM의 좌표계를 강제로 재건(Realignment)하여 재생성을 요청해야 한다.
2. 의도되지 않은 스코프 이탈(Scope Leak) 감지
문법적인 IndentationError는 나지 않았지만, 앞서 언급한 보안 검사 우회처럼 ‘들여쓰기가 부족하여’ 의도치 않게 상위 블록으로 로직이 탈출해 버린 경우(Scope Leak), 단순 구문 검사로는 이를 막을 수 없다. 이 경우 오라클은 텍스트 렌더링이 아닌 AST 트리의 상하 관계(Parent-Child Relationship)를 논리적으로 해부해야 한다.
- 오라클 엔지니어는 선언적인 테스팅 룰(Declarative Testing Rule)을 AST Validator에 주입한다. (예: “비밀번호 해시화(Hashing) 함수
hash_password()의 호출은 반드시if is_authenticated:블록 내부에 종속(Child Node)되어야 한다.”) - AST 순회기(Visitor)는 트리 모델 위에서
hash_password()를 호출하는CallExpression노드를 찾은 뒤, 이 노드의 조상(Ancestors) 노드들을 거슬러 올라가며IfStatement노드가 존재하는지 검사한다. - 들여쓰기 실수로 인해
hash_password()가If블록 밖으로 밀려났다면, AST 트리 상에서도 두 노드는 형제(Sibling) 관계로 재배치된다. 오라클은 부모-자식 관계가 단절되었음을 포착하고 곧바로 무결성 위반(Integrity Violation)을 선포한다.
3. 포매터(Formatter) 강제 적용을 통한 구조적 세탁
오라클의 최종 방어선은 빈 공간(Whitespace)에 대한 결정권을 AI에게서 완전히 박탈하여 시스템(Formatter)으로 이관하는 것이다.
블랙(Black), 프리티어(Prettier)와 같은 강력한 코드 포매터를 오라클 파이프라인 전단에 둔다. LLM이 들여쓰기가 난잡하거나 탭(Tab)과 스페이스 구분이 섞인 지저분한 코드를 뱉어냈을 때, 만약 이 코드가 간신히 AST 파싱의 단계를 넘어섰다면 그 즉시 포매터를 강제 가동하여 텍스트의 구조를 사내 컨벤션(예: 4 Spaces, 줄바꿈 위치)에 맞추어 완벽하게 기계적으로 세탁(Sanitize)해버린다.
정적 구조의 오라클 환경에서 들여쓰기는 단순한 미학(Aesthetics)의 영역이 아니다. 그것은 LLM의 확률적 생성물이 코드의 기계적 계약을 준수하는지 판정 짓는 권력이자, 눈에 보이지 않는 버그를 AST 트리의 논리 아래에서 색출해 내는 가장 기초적이며 강력한 통제 권한이다.