Cursor: AI 코드 에디터가 매일 수십억 건의 코드 자동완성(Completion)을 제공하는 방법

커서는 개발자들 사이에서 빠르게 입소문이 난 AI 기반 코드 에디터로, 2023년 출시 이후 빠르게 성장했다. 커서를 쓰다보면 문득 궁금해지는 지점이, ‘AI IDE는 어떻게 매일 이렇게 코드 자동완성을 제공할 수 있을까?‘이다. 본 글에서는 Cursor가 어떻게 대규모 AI 코드 자동완성 서비스를 제공하는지, 주요 기능과 인프라 구조는 무엇인지 정리한니다.


Cursor는

Cursor는 VSC를 포크(fork)하여 개발된 AI-first IDE입니다. 기존의 VS Code를 포크해왔기 때문에 거의 동일한 UI, 키 바인딩, 확장 생태계를 제공하면서, 내부적으로는 최신 LLM(대형 언어 모델)과 Cursor만의 AI 기능을 통합했습니다. 그렇기에 사용자는 익숙한 환경에서 곧바로 Cursor의 AI 기능을 활용할 수 있었다.


주요 기능들은 어떻게 동작할까?

프록시를 통해 cursor의 API 호출들을 검사해 봤을 때 많은 호출들이 일어나고 있음을 볼 수 있다. 여기선 자동완성에 대해서 횟수를 세기 위하거나 서비스 이용을 위한 권한 조회 등 많은 요청과 응답이 이루어지는 것을 볼 수 있었다.

그러면 주요한 기능 별로 어떻게 작동하는지 간단하게 알아보자.

AI 코드 자동완성

자동완성의 경우 아래와 같은 과정을 통해서 자동완성이 이루어진다.

  1. 사용자가 코드를 입력하면, Cursor 클라이언트가 현재 코드 스니펫을 로컬에서 암호화 후 Cursor 클라우드 서버로 전송한다.
  2. 서버에서 스니펫을 복호화하고, Cursor의 자체 LLM이 실시간으로 코드 자동완성 결과를 생성
  3. 이 결과는 다시 클라이언트로 전송되어 에디터에 표시되며, 사용자는 Tab 키 등으로 즉시 반영할 수 있다.

이 전체 과정은 1초 이내의 초저지연으로 동작하며, 프라이버시를 위해 서버에는 코드가 영구 저장되지 않는다.

AI 채팅 어시스턴트

AI 채팅으로 하나를 물어봤더니, 프록시에 와다다 뜬다. HTTP Connect 메서드만 있는 것으로 보아, 클라이언트와 서버의 TCP 핸드셰이크 이후 소켓을 통해 데이터를 주고받는 것으로 보인다. 그러므로 스트리밍 데이터에 따라 클라이언트에서 받아 이를 렌더링 시켜주는 역할을 하는 것으로 생각했다.

백그라운드 에이전트

테스트 실행이나 대규모 코드 리팩터링 등 코드의 양이 큰 작업의 경우 클라우드의 격리된 가상머신에서 실행해, 로컬 환경을 방해하지 않고 작업을 병렬 처리함으로써 로컬 환경의 부담을 줄일 수 있도록 했다.

프로젝트 규칙(Rules) & 메모리(Memories)

세션간 모든 컨텍스트를 기억할 수는 없기 때문에 이러한 한계를 보안하기 위해 커서는 Rules와 memories 기능을 통해 프로젝트에 대한 컨텍스트를 어느정도 가지고 있도록 하였다. .cursor/rules 디렉토리 또는 글로벌 설정에 규칙 파일을 저장하면, AI가 항상 해당 규칙을 참고해 일관된 코드 스타일·아키텍처를 유지한다.

메모리의 경우 커서 1.0에서 베타 출시한 기능으로, 이전 대화에서 중요한 맥락은 자동으로 메모리화되어, 세션이 달라져도 프로젝트의 맥락을 기억하고 반영합니다.

2-7. 코드베이스 인덱싱 & 시맨틱 검색

프로젝트에 여러 개의 파일이 생기다 보면 프로젝트는 계속해서 커지기 마련이다. 이렇게 커지는 프로젝트에서, AI가 전체적인 코드베이스를 보고 배경을 이해하기 위해서 다음과 같은 방법을 사용한다.

초기 색인 과정에서 처음에 프로젝트를 함수 단위 등의 작은 청크들로 분할해 로컬에서 암호화 후 서버로 전송하고 임베딩 벡터만 저장해 보안을 강화한다. 또한 이 임베딩한 데이터는 벡터DB(Turbopuffer)에 저장한다. 그리고 실제 파일의 내용과 이름을 지움으로써 서버는 사람이 읽을 수 있는 코드가 영구적으로 저장되지 않음을 의미한다.

질문의 경우, 개발자가 채팅을 통해 질문을 하면, Cursor는 해당 질문을 벡터로 변환한 뒤, 저장된 임베딩(embedding)들과 벡터 유사도 검색을 수행한다.
이 방식은 단순히 키워드 일치가 아니라 의미 기반으로 관련 코드 조각을 찾아주며, 서버가 처음부터 실제 코드를 직접 보지 않고도 동작한다.

실제 코드 내용이 질문에 답하는 데 필요할 경우, 서버는 Cursor 클라이언트에게 해당 코드 조각(난독화된 ID로 식별됨)을 요청한다. 클라이언트는 해당 소스 코드를(암호화된 상태로) 서버에 전송하고, 서버는 즉시 복호화하여 쿼리에만 사용한 뒤 곧바로 폐기한다.

이 설계는 프라이버시를 최우선으로 하며, 임베딩(embedding)은 일반적으로 일방향(one-way)이기 때문에 원본 코드를 복원할 수 없다. 또한 Cursor는 .gitignore와 별도의 .cursorignore 파일을 준수하여 민감한 파일이 인덱싱되지 않도록 하고, 코드 조각을 전송하기 전에 비밀 정보가 포함되어 있는지도 휴리스틱하게 검사하기도 한다.

인덱스에 대해서 동기화를 유지하는 방법은 머클 트리(Merkle tree) 동기화 메커니즘을 사용하는 것이다. 머클 트리는 해시 기반의 데이터 구조로, 대용량 데이터셋에서 변경 사항을 효율적으로 감지할 수 있다. 클라이언트는 프로젝트 파일들의 머클 트리를 계산하고, 서버도 자체적으로 머클 트리를 유지합니다. 이 트리들을 몇 분마다 비교함으로써 Cursor는 정확히 어떤 파일이 수정되었는지 파악하고, 변경된 부분만 다시 인덱싱하도록 전송하여 대역폭과 지연을 최소화한다.


3. 인프라 구조

커서는 많은 기능들을 클라우드 인프라 서비스 제공자에게 의존하고 있는 형태이다. 모델 호스트, 색인 엔진, 그리고 다양한 분석 툴들이 존재한다.

  • AWS: API 서버, 실시간 서비스, VM 등 대부분의 백엔드가 호스팅됨. 미국, 도쿄, 런던 등 글로벌 분산 배치로 저지연 실현.
  • Cloudflare: 네트워크 성능 향상, TLS 종료, DDoS 방어.
  • Fireworks, OpenAI, Anthropic, Google Vertex AI, xAI: 다양한 AI 모델을 요청에 따라 혼합 사용.
  • Turbopuffer: 코드 임베딩 벡터 전용 DB.
  • MongoDB, Datadog, Sentry: 사용 분석, 모니터링, 에러 트래킹.
  • Pinecone: 공용 문서 임베딩 벡터 저장소.
  • Vercel, Stripe, WorkOS 등: 웹사이트, 결제, 인증 등 기타 서비스.