AI 코딩 도구인 Cursor, Windsurf, Copilot 같은 툴이 어떻게 작동하는지 이해하면, 특히 복잡하고 큰 코드베이스에서 이 도구들을 훨씬 더 효과적으로 활용할 수 있어요. 많은 사람들이 AI IDE를 사용할 때, 이를 단순한 전통적인 도구처럼 다루다가 한계를 느끼곤 합니다. 하지만 이 도구들의 내부 작동 방식과 제약 사항을 이해하면, 마치 '치트 코드'를 얻은 것처럼 작업 흐름을 크게 개선할 수 있답니다. 참고로, 글쓴이는 Cursor를 사용해 약 70%의 코드를 작성한다고 해요. 🖥️
AI IDE의 작동 원리: LLM의 기본 개념
AI 코딩 도구는 LLM(Large Language Model)을 기반으로 작동하며, 이 모델은 단순히 다음 단어를 예측하는 방식으로 작동합니다. 이 간단한 원리를 바탕으로 복잡한 애플리케이션이 만들어지죠.
LLM의 세 가지 주요 단계
- 기본 LLM: 초기에는 단순히 프롬프트(입력 텍스트)를 기반으로 결과를 예측하는 방식이었어요. 예를 들어, "고래에 대한 시를 써줘" 대신 "주제: 고래\n시: "와 같은 형식으로 입력해야 원하는 결과를 얻을 수 있었죠.
- 명령어 튜닝(Instruction Tuning): ChatGPT 같은 모델이 등장하면서, 이제는 "Foo 메서드를 리팩터링하는 PR을 작성해줘"처럼 자연어로 요청할 수 있게 되었어요. 내부적으로는 여전히 자동 완성 방식이지만, 프롬프트 형식이 더 직관적으로 바뀐 거죠.
- 도구 호출(Tool Calling): LLM이 단순히 텍스트를 생성하는 것을 넘어, 외부 시스템과 상호작용할 수 있도록 발전했어요. 예를 들어, "파일을 읽어야 한다면
read_file(path: str)을 호출해라"라는 식으로 프롬프트를 작성하면, LLM이 실제로 파일을 읽고 작업을 이어갈 수 있게 된 거죠.
"IDEs like Cursor are complex wrappers around this simple concept."
(Cursor 같은 IDE는 이 단순한 개념을 복잡하게 포장한 도구입니다.)
Cursor와 같은 AI IDE를 만드는 방법
Cursor 같은 AI IDE를 구축하려면 다음과 같은 단계를 거칩니다:
- VSCode 포크(Fork): VSCode를 기반으로 새로운 IDE를 만듭니다.
- 채팅 UI 추가: 사용자와 상호작용할 수 있는 채팅 인터페이스를 추가합니다.
- 코딩 에이전트를 위한 도구 구현:
read_file(full_path: str)write_file(full_path: str, content: str)run_command(command: str)
- 내부 프롬프트 최적화: "당신은 전문가입니다", "추측하지 말고 도구를 사용하세요" 같은 지침을 추가합니다.
하지만 이렇게만 만들면 문법 오류, 환각(hallucination), 일관성 부족 같은 문제가 발생할 수 있어요. 따라서 LLM의 강점과 약점을 이해하고, 이를 기반으로 프롬프트와 도구를 설계하는 것이 중요합니다.
Cursor의 내부 작동 방식
Cursor 같은 AI IDE는 사용자가 입력한 명령을 처리하기 위해 여러 단계를 거칩니다. 아래는 Cursor의 내부 작동 과정을 간단히 설명한 다이어그램입니다:

- 사용자가
@file같은 태그를 사용해 특정 파일이나 폴더를 지정합니다. - IDE는 해당 파일의 내용을 LLM에 전달합니다.
- LLM은 필요한 작업을 수행하고, 결과를 사용자에게 반환합니다.
최적화 및 사용자 팁
Cursor를 더 효과적으로 사용하려면 다음 팁을 참고하세요:
1. @file/@folder 태그 적극 활용하기
- 사용자가 이미 필요한 파일이나 컨텍스트를 알고 있다면,
@file태그를 사용해 명시적으로 지정하세요.Tip: 명확한 컨텍스트를 제공하면 더 빠르고 정확한 응답을 얻을 수 있어요.
2. 코드 검색 최적화
- 코드 검색은 복잡할 수 있지만, Cursor는 벡터 데이터베이스(Vectorstore)를 사용해 코드베이스를 인덱싱합니다. 이를 통해 더 정확한 검색 결과를 제공합니다.
Tip: 코드 주석과 문서화는 검색 정확도를 높이는 데 매우 중요합니다. 파일 상단에 파일의 역할과 업데이트 시점을 설명하는 문단을 추가하세요.
3. 파일 작성 도구 최적화
- LLM이 파일 전체를 작성하는 대신, "semantic diff"(변경된 부분만 표시)를 생성하도록 설계되어 있습니다.
Tip: 파일 크기가 너무 크면(500줄 이상) 오류가 발생할 수 있으니, 파일을 작게 나누세요.
Tip: 고품질 린터(linter)를 사용해 문법 오류를 줄이고, 에이전트가 스스로 수정할 수 있도록 돕습니다.
4. 적합한 모델 선택
- 모든 LLM이 AI IDE에 적합한 것은 아닙니다. Cursor는 Anthropic 모델(예: Claude 3.5 Sonnet)을 사용해 최적화된 결과를 제공합니다.
Tip: 일반적인 코딩 모델보다 에이전트 중심으로 최적화된 모델을 선택하세요.
Cursor의 프롬프트 설계
Cursor의 성공 비결 중 하나는 프롬프트 설계에 있습니다. Cursor는 다음과 같은 지침을 포함해 LLM의 행동을 세밀하게 조정합니다:
- "절대 사과하지 마세요."
(Sonnet 모델이 자주 사과하는 경향을 방지하기 위해 추가된 지침) - "도구 이름을 언급하지 마세요."
(사용자 경험을 개선하기 위한 지침) - "사용자의 요청을 완전히 만족시키지 못하면 더 많은 정보를 수집하세요."
(LLM이 과도하게 자신감을 가지는 것을 방지) - "API 키를 하드코딩하지 마세요."
(보안 문제를 방지하기 위한 지침)
Cursor 규칙 작성 팁
Cursor의 규칙은 LLM이 작업을 수행하는 데 중요한 역할을 합니다. 다음은 규칙 작성 시 유의할 점입니다:
- 하지 말아야 할 것:
- "당신은 TypeScript 전문가입니다" 같은 정체성을 부여하지 마세요.
- "이 코드를 삭제하지 마세요" 같은 부정적인 명령을 피하세요.
- 해야 할 것:
- 규칙 이름과 설명을 간결하고 직관적으로 작성하세요.
- 규칙을 백과사전처럼 작성하고, 모듈이나 코드 변경에 대한 정보를 링크로 연결하세요.
- Cursor 자체를 사용해 규칙 초안을 작성해보세요.
마무리
Cursor는 단순한 VSCode 포크에서 시작했지만, 현재는 10억 달러 이상의 가치를 가진 AI 코딩 도구로 성장했습니다. 이 글을 통해 Cursor와 같은 AI IDE의 작동 원리를 이해하고, 이를 더 효과적으로 활용할 수 있는 방법을 배웠기를 바랍니다.
"Cursor가 제대로 작동하지 않는다면, 당신이 잘못 사용하고 있는 겁니다."
(이 도구를 최대한 활용하려면, 내부 작동 방식을 이해하는 것이 중요합니다!) 😊