코드 검색 어시스턴트
대규모 모노레포에서 의미 기반 코드 검색을 구현한 사례. AST 청킹, 코드 Embedding, Hybrid Search 적용
문제 정의
10만 개 이상의 파일, 500만 라인 이상의 코드를 가진 모노레포에서 개발자가 원하는 코드를 빠르게 찾는 것은 큰 도전이다. 기존 텍스트 검색(grep, IDE 검색)은 정확한 키워드를 알아야 하며, "인증 처리하는 미들웨어"처럼 의도 기반 검색은 불가능했다.
왜 기존 방법으로 부족했는가
| 기존 방법 | 한계 |
|---|---|
| grep / ripgrep | 정확한 함수명이나 변수명을 알아야 함 |
| IDE 심볼 검색 | 파일 단위 검색, 의미적 연결 불가 |
| GitHub Code Search | 조직 내부 코드 미지원, 지연 시간 |
| Wiki / 문서 검색 | 코드와 문서의 동기화가 안 됨 |
개발자들은 "이런 기능을 하는 코드가 어디 있지?"라는 질문에 Slack으로 동료에게 물어보는 비효율적인 패턴에 의존하고 있었다.
시스템 구조
[개발자 쿼리] → [쿼리 분석기] → [Hybrid 검색]
├── Dense: 코드 Embedding 검색
└── Sparse: 심볼/AST 키워드 검색
↓
[Reranker]
↓
[코드 스니펫 추출]
↓
[LLM 요약 + 설명]
↓
[결과 반환]
인덱싱 파이프라인
[Git Repository] → [AST Parser] → [코드 청킹]
↓
[코드 Embedding]
↓
[Vector DB + 메타데이터 DB]
핵심 기술 선택 이유
코드 전용 Embedding 모델
범용 텍스트 Embedding 대신 CodeBERT 기반 모델을 선택했다:
- 코드의 구조적 특성(들여쓰기, 괄호, 키워드)을 이해
- 자연어 쿼리와 코드 간의 Cross-modal 검색 지원
- 파인튜닝으로 사내 코딩 컨벤션에 적응
AST 기반 청킹
코드를 단순히 줄 수로 나누는 대신, AST(Abstract Syntax Tree)를 파싱하여 함수/클래스 단위로 청킹했다:
- 함수의 시작과 끝이 보존됨
- import 문, 타입 정의 등 컨텍스트 포함
- 주석과 docstring을 메타데이터로 별도 저장
Hybrid Search
Dense Retrieval만으로는 정확한 함수명/클래스명 검색이 약했다. BM25를 결합하여:
- 의미 검색: "에러 처리하는 미들웨어" → 관련 코드 검색
- 키워드 검색: "AuthMiddleware" → 정확한 심볼 매칭
- α=0.6 (Dense 60%, BM25 40%)으로 설정
운영 시 발생한 이슈
인덱싱 지연
초기에는 전체 코드베이스를 매일 재인덱싱했으나, 8시간이 소요되어 사실상 하루 1회만 가능했다.
해결: Git diff 기반 증분 인덱싱으로 변경. commit hook으로 변경된 파일만 재인덱싱하여 평균 5분으로 단축.
다국어 코드/주석 혼재
한국어 주석이 포함된 코드에서 영어 쿼리로 검색하면 결과가 누락되었다.
해결: 다국어 Embedding 모델(BGE-M3)로 교체하고, 쿼리를 한국어/영어 양방향으로 확장하는 Query Expansion 적용.
권한 관리
특정 팀의 비공개 코드가 다른 팀에게 노출되는 보안 이슈가 발생했다.
해결: 검색 시 사용자의 Git 접근 권한을 실시간으로 확인하여 결과를 필터링하는 Post-retrieval ACL 계층 추가.
개선 포인트
- 코드 변경 이력(git blame)을 활용한 "이 코드의 전문가는 누구인가" 기능 추가
- IDE 플러그인(VS Code Extension)으로 검색 경험 통합
- 코드 리뷰 데이터를 피드백 루프로 활용하여 검색 품질 지속 개선
확장 가능성
- 코드 생성: 검색 결과를 컨텍스트로 활용한 사내 코드 생성 AI
- 온보딩 자동화: 신규 개발자를 위한 "이 서비스의 구조를 설명해줘" 기능
- 기술 부채 탐지: 유사한 기능의 중복 구현을 자동 탐지
핵심 교훈
- 코드는 텍스트와 다르다: 범용 NLP 도구 대신 코드 전용 도구(AST 파서, 코드 Embedding)를 사용해야 한다
- 증분 인덱싱은 필수: 대규모 코드베이스에서 전체 재인덱싱은 비현실적이다
- Hybrid Search가 답이다: 의미 검색과 키워드 검색 모두 필요하다
- 권한 관리를 처음부터 설계하라: 나중에 추가하면 아키텍처 변경이 크다
- 개발자 경험(DX)이 핵심: 최고의 검색 엔진도 사용이 불편하면 채택되지 않는다