본문으로 건너뛰기

Cursor 코드베이스 인덱싱: 더 잘 작동하게 만드는 방법

Cursor의 코드베이스 인덱싱은 프로젝트에 대해 "똑똑하게" 느껴지게 만드는 핵심이에요. 잘 작동하면 관련성 높은 제안, 정확한 @-멘션, 그리고 실제로 아키텍처를 이해하는 답변을 얻을 수 있어요. 잘 작동하지 않으면 Cursor는 마치 눈먼 것처럼 느껴져요.

이 가이드에서는 인덱싱이 어떻게 작동하는지, 그리고 어떻게 최적화할 수 있는지 설명할게요.

Cursor가 코드베이스를 이해하는 방식

Cursor는 백그라운드에서 두 가지를 구축해요:

  1. 임베딩 — 코드 파일의 벡터 표현이에요. 질문을 하거나 @를 사용할 때, Cursor는 이 벡터를 검색해 의미적으로 가장 관련성 높은 파일을 찾아요.

  2. AST(추상 구문 트리) 분석 — Cursor는 코드를 파싱하여 가져오기(import), 함수 정의, 클래스 계층 구조, 파일 간 관계를 이해해요.

이 두 시스템은 함께 작동해요. 임베딩이 "관련해 보이는 것"을 찾고, AST 분석이 "실제로 연결된 것"을 파악하죠.

정보

인덱싱은 프로젝트를 열면 자동으로 시작돼요. 대규모 코드베이스의 경우 초기 스캔에 몇 분이 걸릴 수 있어요. 상태 표시줄에 진행률 표시기가 나타날 거예요.

@-심볼: 올바른 사용법

@ 심볼은 Cursor의 인덱싱에 직접 연결되는 통로예요. 채팅이나 인라인 편집에 특정 컨텍스트를 가져오는 데 사용하세요.

@file — 특정 파일 참조

@src/utils/auth.ts 토큰 검증은 어떻게 작동하나요?

이것이 Cursor가 원하는 정확한 파일을 보도록 보장하는 가장 확실한 방법이에요. 임베딩 검색을 우회하고 전체 파일 내용(컨텍스트 제한 내에서)을 첨부해요.

@folder — 전체 디렉토리 참조

@src/components 여기의 컴포넌트 계층 구조를 설명해줘

아키텍처 질문에 유용하지만, 주의하세요 — 큰 폴더는 컨텍스트 창을 빠르게 소모할 수 있어요.

@code — 특정 심볼 참조

@code:validateUser 이 함수는 어떤 엣지 케이스를 처리하나요?

AST 인덱스를 사용해 정확한 함수, 클래스, 또는 변수 정의를 찾아요. 정확하고 컨텍스트를 효율적으로 사용하죠.

한 함수만 필요할 때는 @file보다 @code:를 선호하세요. 컨텍스트 공간을 절약하고 노이즈를 줄여요.

대규모 프로젝트 최적화

프로젝트에 수천 개의 파일이 있다면 기본 인덱싱이 뭔가를 놓치거나 느리게 느껴질 수 있어요.

실제로 인덱싱된 것 확인하기

Cursor 설정 > General > Codebase Indexing을 열어보세요. 다음을 볼 수 있어요:

  • 인덱싱된 총 파일 수
  • 마지막 인덱싱 시간
  • 파싱에 실패한 파일

컨텍스트 관련성 높이기

모노레포의 경우 Cursor가 때때로 관련 없는 파일을 선택할 수 있어요. 프롬프트에서 명확하게 하세요:

이 질문에는 @packages/api/src만 봐줘. 프론트엔드 코드는 무시해.

거대한 파일 분할하기

몇 천 줄이 넘는 파일은 문제를 일으킬 수 있어요. Cursor가 처음 부분만 인덱싱하거나 임베딩에 어려움을 겪을 수 있어요. 5000줄짜리 유틸리티 파일이 있다면 분할을 고려하세요.

.cursorignore로 파일 무시하기

모든 것이 인덱싱되어야 하는 건 아니에요. 생성된 파일, 빌드 출력, 서드파티 코드는 컨텍스트 공간을 낭비하고 검색 결과를 오염시켜요.

프로젝트 루트에 .cursorignore 파일을 생성하세요:

# 빌드 출력
dist/
build/
.out/

# 의존성
node_modules/
vendor/

# 생성된 파일
*.generated.ts
*.min.js
coverage/

# 대용량 데이터 파일
*.csv
*.json
경고

.cursorignore.gitignore와 동일한 문법을 사용하지만 별도의 파일이에요. .gitignore만으로 충분하다고 가정하지 마세요 — Cursor가 이를 자동으로 존중하지는 않아요.

.cursorignore를 편집한 후에는 Cursor를 재시작하거나 재인덱싱이 될 때까지 1분 정도 기다리세요.

인덱싱이 망가졌을 때: 문제 해결

가끔 Cursor가 코드를 "보지" 못하는 것처럼 느껴질 때가 있어요. 체크리스트를 확인해보세요:

1. 파일이 인덱싱되었는지 확인

파일을 연 다음 다음과 같이 물어보세요:

지금 내가 보고 있는 파일이 뭐야?

Cursor가 대답할 수 없다면 해당 파일이 인덱스에 없을 수 있어요.

2. 강제 재인덱싱

명령 팔레트(Ctrl+Shift+P) → "Cursor: Reindex Codebase"

이렇게 하면 전체 인덱스를 처음부터 다시 구축해요. 시간이 걸리지만 대부분의 손상 문제를 해결해요.

3. 파싱 오류 찾기

설정 > General > Codebase Indexing에서 빨간색 오류 표시기가 있는 파일을 확인하세요. 이 파일들은 AST 관계 분석이 되지 않아요.

일반적인 원인:

  • 파일의 구문 오류
  • 지원되지 않는 언어(Cursor는 약 20개 언어를 잘 지원해요)
  • 바이너리나 미니파이된 파일이 소스 코드로 잘못 식별된 경우

4. .cursorignore가 너무 공격적이지 않은지 확인

*.config.*를 무시했는데 vite.config.ts에 중요한 경로 별칭이 포함되어 있다면, Cursor는 가져오기를 이해하지 못할 거예요.

컨텍스트 품질 향상

올바른 파일을 컨텍스트에 넣는 것은 절반의 성공이에요. 그 컨텍스트를 어떻게 사용하는지도 중요하죠.

질문에서 구체적이 되세요

나쁜 예:

인증은 어떻게 작동해?

좋은 예:

@src/auth/middleware.ts에서 JWT 검증은 만료된 토큰을 어떻게 처리해?

컨텍스트를 연결하세요

Cursor가 부분적인 답변을 주면, 전체 질문을 반복하기보다 더 구체적인 @ 참조로 후속 질문을 하세요.

레이트 리미팅을 언급했네. @src/middleware/rateLimit.ts — 리밋은 어떻게 계산돼?

최근 파일 사용하기

Cursor는 최근에 연 파일을 임베딩 검색에서 더 높게 가중치를 둬요. 방금 파일을 열었다면 관련 파일에 대한 @ 참조가 명시적인 멘션 없이도 더 잘 작동할 가능성이 높아요.

복잡한 리팩토링의 경우, 변경할 계획인 모든 파일을 먼저 열어두세요. 이렇게 하면 인덱스가 이 파일들을 관련성 높은 것으로 처리하도록 "준비"시킬 수 있어요.

요약

  • Cursor는 코드를 이해하기 위해 임베딩 + AST를 사용해요
  • 컨텍스트를 명시적으로 제어하려면 @file, @folder, @code:를 사용하세요
  • 노이즈를 제외하려면 .cursorignore를 생성하세요
  • 뭔가 이상하게 느껴지면 재인덱싱하세요
  • 프롬프트에서 구체적이 되세요 — 인덱스가 파일을 찾지만, 어떻게 사용할지는 사용자가 안내하는 거예요

Cursor 코드베이스 인덱싱 설정

코드베이스 인덱싱 설정 패널에는 프로젝트의 인덱싱 상태와 오류가 표시돼요.