기술 검토에서 가장 좋은 질문을 꼽으라면 이것입니다. "정적분석이 못 보는 건 뭐죠?" 이 질문에 "다 봅니다"라고 답하는 벤더가 있다면 의심하셔야 합니다. 저희의 답은 목록입니다.
정적분석이 확정하는 것
코드 구조에서 증명되는 연결은 실행 없이 확정할 수 있습니다. 함수 호출, 타입 참조, 상속과 구현, 라우트와 핸들러, SQL의 대상 테이블(정적으로 고정된 경우), 스케줄과 이벤트 선언. 이 연결들은 같은 코드에서 항상 같은 결과가 나옵니다. 플래티 그래프의 뼈대입니다.
정적분석이 멈추는 곳. 동적 패턴 다섯 유형
- 런타임에 정해지는 SQL. 테이블 이름이 변수로 조립되면, 실행 전에는 어느 테이블인지 알 수 없습니다.
- 리플렉션. 문자열로 클래스와 메서드를 호출하면, 그 문자열이 어디서 오느냐에 따라 대상이 달라집니다.
- 컨테이너의 동적 조회. 의존성 주입 컨테이너에서 이름으로 구현체를 꺼내는 코드는, 설정과 프로파일에 따라 다른 대상을 가리킵니다.
- 설정 문자열 연결. 서비스와 서비스가 임포트가 아니라 설정 파일 속 URL·토픽 이름으로 이어지는 경우입니다.
- 프록시와 동적 디스패치. 호출 대상이 런타임에 감싸지거나 바뀌는 패턴입니다.
이 다섯 유형은 플래티만 못 보는 게 아닙니다. 실행하지 않는 모든 도구가 못 봅니다. 차이는 그다음에 무엇을 하느냐에서 갈립니다.
원칙 1. 임의로 확정하지 않는다
경로 문자열이 비슷하다고 화면과 API를 잇지 않습니다. 그럴듯한 후보를 하나 골라 확정하지도 않습니다. 대신 원문 표현, 후보 목록, 확정하지 못한 사유를 그대로 보존합니다. 지도에 없는 길을 그려 넣는 순간, 지도 전체를 믿을 수 없게 되기 때문입니다.
원칙 2. 유한하면 잇는다
동적 패턴이라고 다 포기하지 않습니다. 문자열이 고정 상수인 리플렉션, 분기가 유한해서 후보를 전부 셀 수 있는 조회. 이렇게 정적으로 후보를 한정할 수 있는 패턴은 분석 규칙을 보강해 커버합니다. 고객마다 반복되는 공통 래퍼 패턴은 도입 과정에서 대표 사례를 받아 규칙과 회귀 테스트를 추가합니다.
원칙 3. 추론은 표시하고, 컨펌으로 승격한다
그래도 남는 구간이 있습니다. 여기부터는 출처를 밝히고 잇습니다. 정적분석이 증명한 연결은 확정으로, LLM이 추론으로 이은 연결은 추론으로 별도 표시합니다. 추론 연결은 사람이 손으로 잇거나 컨펌하면 확정 레벨로 올라갑니다. 답을 줄 때 근거가 확정인지 추론인지 함께 보입니다.
결과는 커버리지를 아는 지도입니다
이 세 원칙의 결과물은 "전부 아는 지도"가 아니라 어디까지 아는지 아는 지도입니다. 어느 연결이 증명됐고, 어느 연결이 후보이고, 어디에 공백이 있는지가 지도 위에 드러납니다. 시스템을 걸고 일하는 조직에게 필요한 것은 전지전능한 지도가 아니라, 정직한 지도입니다.