AI 리팩터가 파일 전반에 걸쳐 이름을 잘못 바꿀 때
Source: Dev.to
Overview
한 프로젝트에서 우리는 코드‑생성 어시스턴트를 활용해 파일 간 리팩터링을 수행했습니다: 도메인 객체의 이름을 바꾸고 그 변경을 서비스, 테스트, 몇몇 유틸리티 모듈에 전파하는 작업이었습니다. 어시스턴트는 겉보기엔 일관된 것처럼 보이는 패치 세트를 만들어냈지만, 앱을 실행했을 때 몇몇 엔드포인트가 500 오류를 반환하기 시작했습니다. 실패는 눈에 띄는 구문 오류가 아니라, 런타임에서 일부 경로에서는 허용되고 다른 경로에서는 깨지는 식별자 불일치였습니다.
처음에는 변경 사항이 별다른 문제가 없어 보였습니다: 비슷한 이름, 약간의 대소문자 혹은 복수형 차이, 혹은 코드베이스에 규칙이 있던 snake_case와 camelCase가 혼용된 경우 등. 어시스턴트가 각 파일에 대한 diff를 제공했고, CI가 일부 빠른 검사를 통과했기 때문에 명백한 차단이 이루어지지 않았습니다. 우리는 이 사건을 내부 사후 분석에 기록하고, 멀티‑턴 프롬프트와 자동화를 위해 사용한 일반 도구 페이지(crompt.ai)와 연결했습니다. 이를 통해 다른 팀이 트레이드‑오프를 이해하도록 돕고자 했습니다.
How it surfaced during development
증상은 점진적으로 나타났습니다. 개발자들이 무관한 기능 브랜치를 열었을 때 콘솔에 간헐적인 TypeError가 표시되었고, 이름이 바뀐 헬퍼들 사이를 오가며 호출 스택을 추적하는 데 몇 시간을 소비했습니다. 어시스턴트는 때때로 userProfile을 user_profile로, 또 다른 경우에는 profileUser로 바꾸었습니다. 모의 인터페이스를 참조한 단위 테스트는 어시스턴트가 제공한 이름을 선택적으로 사용했기 때문에 통과했지만, 직렬화를 수행하는 통합 테스트는 조용히 실패하거나 예상치 못한 페이로드를 생성했습니다.
우리는 멀티‑턴 chat 세션을 이용해 어시스턴트와 함께 리팩터링을 수정하려 시도했습니다. 파일 단위에서는 도움이 되었지만, 저장소 전체에서는 문제를 악화시켰습니다: 모델이 엄격한 심볼 테이블을 유지하지 못하고 각 파일을 독립적인 변환으로 처리했기 때문입니다. 눈에 보이는 실패를 빠르게 고치는 작은 수정은 테스트가 커버하지 않은 코드 경로에 남아 있는 잠재적 불일치를 남겨두었습니다.
Why the inconsistency was subtle
이 종류의 버그가 놓치기 쉬운 두 가지 요인이 있었습니다.
- 확률적 텍스트 변환 – 언어 모델은 원자적인 코드 의미보다는 그럴듯한 연속성을 최적화합니다. 복수형, 대소문자 변경, 단어 순서 재배열 같은 작은 스타일 변화는 모델에게는 그럴듯해 보이지만 런타임에서는 참조를 깨뜨립니다.
- 정규화된 심볼 맵의 부재 – 어시스턴트의 컨텍스트 윈도우와 파일당 프롬프트 방식 때문에 파일 간에 강제되는 기계가 읽을 수 있는 심볼 이름 맵이 존재하지 않았습니다.
이 두 행동이 결합되었습니다: 어시스턴트는 70–80 % 파일에서 올바르게 보이는 교체를 만들었고, 인간은 남은 20–30 %를 빠르게 스킵했습니다. diff가 구문적으로 유효했기 때문에 린터와 일부 정적 검사에서는 오류를 표시하지 않았습니다. 우리는 외부 검증, 특히 deep research를 통한 연구‑지향 검증 단계를 사용해 심볼을 교차 검증했으며, 그 과정에서 이전 검사들을 통과한 몇몇 오타가 드러났습니다.
Practical mitigations we adopted
- 먼저 심볼 테이블을 생성 – 의도된 이름 변경 목록을 작성하고 언어 서버‑인식 도구(예: 에디터의 rename 리팩터 또는 AST를 이용하는 codemod)를 사용해 적용합니다. 이는 텍스트 기반 휴리스틱이 아니라 컴파일러의 심볼 해석을 활용합니다.
- 머지 전에 전체 통합 테스트 실행을 요구 – 런타임 수준의 불일치를 잡아냅니다.
- 짧은 정적 분석 작업 추가 – 저장소 전체에서 예상치 못한 식별자 변형을 검사합니다.
- 어시스턴트가 만든 diff를 초안으로 취급 – 수락 전에 명시적인 검증 단계를 요구합니다.
이러한 작은 프로세스 변화는 사소하고 확률적인 이름 차이가 런타임 오류로 이어지는 가능성을 크게 줄여줍니다.