오늘날 소프트웨어 기능이 지속적으로 확장되고 기술 복잡성이 증가하면서, 개발자들이 관리해야 할 코드베이스는 점점 방대해지고 있습니다. 특히 AI가 복잡한 기능 구현을 가속화하면서 코드베이스 확장 속도는 더 빨라지고 있죠.

이에 개발자가 파악해야 할 코드 정보도 크게 늘었는데요. 그러나 대규모 코드베이스에서 특정 함수나 패턴을 한 번에 정확히 찾기란 어렵습니다. 단순 텍스트 기반 검색 도구를 사용하면 맥락과 무관한 검색 결과가 나오고요. 코드베이스가 커질수록 검색 속도는 느려지죠. 그 결과, 필요한 코드를 찾는 과정은 ‘건초더미에서 바늘 찾기’만큼 비효율적으로 돼 개발 생산성을 떨어뜨립니다.

GitLab의 ’Exact Code Search’ 기능을 사용하면 이러한 문제를 해결할 수 있습니다. 이 기능은 정확한 일치(Exact Match) 모드, 정규 표현식(Regular Expression) 모드, 멀티 라인 일치(Multiple-Line Matches)로 GitLab 전체 또는 특정 프로젝트에서 코드를 검색하는 기능인데요. 검색어와 완전히 일치하는 코드를 빠르게 찾아내고, 복잡한 패턴까지 정밀하게 탐색합니다. 이로써 코드 검색 시간을 단축하고, 개발 생산성까지 높여주죠.

이 글에서는 Exact Code Search의 개요와 코드 검색 방식, 기존 검색 기능과의 차이점, 활용 기준을 살펴보겠습니다.

Exact Code Search 개요

Exact Code Search는 정확한 일치(Exact Match) 모드, 정규 표현식(Regular Expression) 모드, 멀티 라인 일치(Multiple-Line Matches)로 GitLab 전체 또는 특정 프로젝트에서 코드를 검색하는 기능입니다. 규모가 큰 리포지터리에서도 필요한 코드를 빠르고 정밀하게 찾아내죠.

이 기능은 오픈 소스 코드 검색 엔진인 Zoekt를 기반으로 동작하는데요. Zoekt는 대규모로 코드를 신속하고 정확하게 검색하도록 설계됐죠. 이 엔진은 원래 구글에서 개발했고, 현재 Sourcegraph에서 유지 관리합니다. GitLab은 전용 통합, 엔터프라이즈급 성능 개선, 권한 시스템 연동으로 Zoekt를 GitLab 환경에 최적화했습니다.

그동안 GitLab의 코드 검색 기능은 Elasticsearch 또는 OpenSearch에 기반했습니다. Advanced Search가 대표적인 예죠. 이러한 도구는 이슈, Merge request(MR), 댓글, 자연어를 포함한 데이터 검색에 뛰어난데요. 그러나 코드 검색에 특화되지 않아 한계가 있었습니다. 이에 GitLab은 보완책으로, Zoekt에 기반한 Exact Code Search를 개발했습니다.

이 기능은 현재 베타 버전으로, GitLab.com과 Self-Managed 환경 모두 지원합니다. 단, GitLab Premium과 Ultimate 라이선스를 구독해야 이용할 수 있습니다. GitLab.com에서는 ‘유료 구독’에 이 기능이 기본 활성화됐고요. Self-Managed 환경에서는 관리자가 Zoekt를 설치하고, Exact Code Search를 활성화해야 합니다.

코드 검색 방식

Exact Code Search는 단순 텍스트 검색을 넘어, 코드 특성과 개발 컨텍스트에 맞는 다양한 검색 방식을 지원합니다. 각 방식은 상황에 따라 원하는 코드를 빠르고 정확하게 찾는 데 도움이 되죠. 검색 방식별 특징과 예시를 살펴보겠습니다.

정확한 일치 모드

입력한 쿼리와 완전히 일치하는 결과만 반환하는 모드입니다. 예를 들어, getUserById(123)를 검색하면 이 문자열이 그대로 포함된 코드를 찾아내죠. 이는 특정 오류 메시지, 함수 시그니처, 변수명의 인스턴스를 찾을 때 유용하고요. 입력한 쿼리와 부분적으로 일치하되, 관련 없는 검색 결과를 방지할 수 있습니다.

// 쿼리: getUserById(123)
// 아래 코드에서 정확히 일치하는 라인만 반환됨

function getUserById(id) { return users.find(u => u.id === id); }
const user = getUserById(123); // 정확히 일치 - 이 라인만 검색됨
GitLab에서 정확한 일치 모드로 검색한 결과 화면 | 인포그랩 GitLab
GitLab에서 정확한 일치 모드로 검색한 결과 화면

정규 표현식 모드

복잡한 패턴으로 코드를 검색하는 모드입니다. 이는 정규 표현식과 부울(Boolean) 표현식을 지원해 함수 시그니처, 변수 선언, API 호출 등을 정밀하게 찾죠. 아울러 공백, 줄 바꿈, 선택적 인자, 네이밍 규칙 차이를 고려해 한 번에 검색합니다. 정규 표현식 모드는 특정 네이밍 패턴을 따르는 함수나 특정 제약 조건과 일치하는 변수를 찾을 때 유용하고요. 패턴 일치를 활용해 잠재적 보안 취약점을 확인할 때도 사용할 수 있습니다. 특히 프로젝트 전반의 코드 분석과 리팩토링에 실용적으로 활용할 수 있습니다.

// 예시 1: API 엔드포인트 패턴 찾기
// 패턴: app\.(get|post|put|delete)\(['"]/api/.*['"]\)

// 예시 2: 특정 타입의 함수 선언 찾기
// 패턴: function\s+\w+\s*\([^)]*\):\s*Promise<\w+>
GitLab에서 정규 표현식 모드로 검색한 결과 화면 | 인포그랩 GitLab
GitLab에서 정규 표현식 모드로 검색한 결과 화면

멀티 라인 일치

코드를 검색할 때 해당 코드의 주변 컨텍스트까지 보여주는 방식입니다. 입력한 쿼리가 포함된 한 줄만 보는 게 아니라 코드의 구조적 패턴, 주변 코드와의 관계도 파악할 수 있죠. 멀티 라인 일치 방식을 사용하면, 코드를 기본적으로 이해하기 위해 파일을 클릭하지 않아도 됩니다. 이는 함수나 클래스처럼 덩어리로 된 코드를 다뤄야 할 때, 유용하고요. 실제 작업해야 하는 코드를 빠르게 찾을 수 있습니다.

GitLab에서 멀티 라인 일치 방식으로 검색한 결과 화면 | 인포그랩 GitLab
GitLab에서 멀티 라인 일치 방식으로 검색한 결과 화면

Advanced Search와 Exact Code Search 비교

그동안 GitLab에는 ’Advanced Search’라는 검색 기능이 있었습니다. 이는 전체 GitLab 인스턴스에서 필요한 정보를 찾아주는 기능인데요. Advanced Search로도 코드를 검색할 수 있죠. 이 기능으로 모든 프로젝트에서 코드 패턴을 확인해 공유 컴포넌트를 효율적으로 리팩토링할 수 있고요. 또 조직 전체의 코드베이스와 의존성에서 보안 취약점을 찾을 수 있습니다. 모든 리포지터리에서 사용이 중단된 함수나 라이브러리의 사용 현황을 추적할 수도 있고요.

이에 Advanced Search와 Exact Code Search의 차이점을 궁금해하는 사용자가 많은데요. ‘두 기능을 언제 각각 사용할지’ 알고 싶어하는 이들도 상당수죠. 두 기능의 주요 차이점과 검색 결과 비교, 활용 기준을 소개하겠습니다.

차이점

Advanced Search는 Elasticsearch를 기반으로 동작하며, 텍스트 데이터를 단어 단위로 토큰화해 인덱싱합니다. 이 방식은 퍼지 일치(Fuzzy Match)와 정확한 일치(Exact Match)를 모두 지원하고요. GitLab 내 이슈, MR, 위키, 댓글 등 다양한 데이터를 유연하게 검색합니다.

반면에 Exact Code Search는 Zoekt를 기반으로 동작하며, 위치 기반 트라이그램(Positional Trigrams) 인덱싱 방식을 적용합니다. 이로써 코드 내에서 정확한 문자열 일치와 정규 표현식을 토대로 고급 검색을 지원하죠. 이 방식은 코드 패턴 탐색, 리팩토링 작업에 최적화됐습니다.

구분Advanced SearchExact Code Search
검색 엔진ElasticsearchZoekt
인덱싱 방식단어 토큰화위치 기반 트라이그램
검색 특징퍼지 일치 + 정확한 일치정확한 일치 + 정규 표현식
주요 용도전체 GitLab 데이터 검색코드 전용 정밀 검색

검색 결과 비교

다음은 Advanced Search와 Exact Code Search로 authenticate(token) 함수를 각각 검색할 때, 결과입니다. [X]는 불필요한 결과, [O]는 원하는 정확한 결과를 의미합니다.

Advanced Search 결과

Advanced Search에서는 입력한 쿼리와 부분적으로 일치하되, 관련 없는 코드가 검색 결과에 여러 건 포함됐습니다. 쿼리의 전체 문자열(authenticate(token))을 단어 단위(authenticate, token)로 각각 분리해, 각 단어와 일치하는 코드를 주로 반환했습니다. 쿼리 전체와 정확히 일치한 검색 결과는 단 1건뿐입니다.

[X] class AuthService { /* token 관련 주석 */ }              // 부분 일치
[X] const token = getToken(); // 부분 일치
[X] function authenticate() {} // 부분 일치
[X] // authenticate user with token validation // 단어 단위 일치
[O] function authenticate(token) { return verify(token); } // 쿼리 전체와 일치

Exact Code Search 결과

Exact Code Search에서는 입력한 쿼리의 전체 문자열(authenticate(token))이 그대로 포함된 코드만 검색 결과에 나타났습니다. 함수 선언, 화살표 함수, 타입이 포함된 함수 시그니처에서도 동일하게 결과를 반환했죠. 이로써 불필요한 결과 없이 원하는 코드를 정확히 찾을 수 있습니다.

[O] function authenticate(token) { return verify(token); } // 쿼리 전체와 일치
[O] const authenticate = (token) => jwt.verify(token); // 쿼리 전체와 일치 (화살표 함수)
[O] public authenticate(token: string): boolean { ... } // 쿼리 전체와 일치 (TypeScript)

활용 기준

Advanced Search와 Exact Code Search는 다음과 같은 상황에서 효과적입니다.

  • Advanced Search: GitLab 전체 데이터(이슈, MR, 위키, 댓글 포함)를 검색하거나, 키워드 중심 검색과 퍼지 일치가 필요할 때 적합합니다.
  • Exact Code Search: 특정 함수나 클래스를 정확히 찾거나, 리팩토링·코드 분석·취약점 탐지처럼 정밀한 검색이 필요할 때 최적입니다.

맺음말

Exact Code Search는 코드 검색의 정확도와 성능을 한 단계 끌어올린 도구입니다. 대규모 코드베이스에서 정밀한 검색이 필요한 리팩토링이나 코드 분석 작업에서 기존 Advanced Search의 한계를 효과적으로 보완하죠. 아직 베타 단계이지만, 이미 탁월한 검색 성능을 보여줘 앞으로의 발전이 기대됩니다. 😊

참고 자료

  1. Dmitry Gruzd, “Exact Code Search: Find code faster across repositories”, GitLab, 2025-06-25, https://about.gitlab.com/blog/exact-code-search-find-code-faster-across-repositories/
  2. “Exact code search”, GitLab, https://docs.gitlab.com/user/search/exact_code_search/
  3. “Advanced search”, GitLab, https://docs.gitlab.com/user/search/advanced_search/
  4. Zoekt GitHub 리포지터리, https://github.com/sourcegraph/zoekt

완벽한 GitLab 구축부터 성공적인 DevOps 도입까지! 인포그랩과 DevOps 라이프사이클을 함께하세요.