지난 1월 말, 우리 팀에 새로운 주니어 개발자가 합류했다. 온보딩 첫날 “어떤 AI 도구 써요?”라는 질문이 나왔는데 — 솔직히 그 순간 나도 명확한 답을 못 했다. Claude Code, GitHub Copilot, Cursor를 그때그때 기분에 따라 뒤죽박죽 섞어 쓰고 있었고, 어떤 상황에 뭐가 더 나은지 제대로 정리한 적이 없었다.
그래서 2월 한 달을 잡고 제대로 비교해보기로 했다. 우리 팀은 5명 규모이고, 주 스택은 TypeScript + Next.js + PostgreSQL이다. 사이드로 Python FastAPI 서버도 운영하고 있어서 여러 언어와 컨텍스트에서 테스트할 수 있었다. 이 글은 그 과정에서 배운 것들을 정리한 거다.
공개 벤치마크 말고 실제 시나리오로 테스트한 이유
처음엔 HumanEval이나 SWE-bench 결과를 정리해볼까 했는데, 그건 각 회사 공식 페이지에 이미 다 나와 있다. 내가 더 궁금한 건 “내 코드베이스에서, 내 방식으로 작업할 때 뭐가 더 나은가”였다.
그래서 세 가지 실제 시나리오로 테스트를 설계했다:
- 레거시 코드 리팩토링 — 2년 묵은 JavaScript 파일을 TypeScript로 마이그레이션
- 기능 추가 — 기존 인증 모듈에 OAuth2 소셜 로그인 추가
- 버그 추적 — 간헐적으로 발생하는 race condition 찾기
각 도구에 동일한 컨텍스트를 주고, 결과물을 코드 품질, 컨텍스트 유지력, 작업 흐름 방해 최소화 기준으로 평가했다. 완전히 정량적이진 않다 — 이런 걸 숫자로만 표현하는 건 거짓말에 가깝다.
비교 대상은 세 가지다:
– Claude Code (claude-sonnet-4-6, 2월 기준)
– GitHub Copilot (Chat + 자동완성, Business 플랜)
– Cursor (GPT-4o 백엔드, Pro 플랜)
코드 완성의 질: 얼마나 내 의도를 읽는가
자동완성 품질을 평가할 때 내가 가장 중요하게 보는 건 단순히 코드를 완성하는 게 아니라, 현재 파일과 주변 컨텍스트를 보고 의도를 추론하는 능력이다.
GitHub Copilot의 자동완성은 여전히 빠르고 안정적이다. 특히 반복적인 패턴 — CRUD 작업, 비슷한 구조의 API 엔드포인트 작성 — 에선 진짜 빠르게 따라온다. 키 몇 번 누르면 원하는 코드가 나온다. 이건 인정해야 한다.
근데 문제는 조금만 복잡해지면 무너진다는 거다. 우리 코드베이스 특유의 에러 핸들링 패턴 — 팀이 직접 만든 Result<T, AppError> 타입을 쓰는 방식 — 을 Copilot은 제대로 잡아내질 못했다. 계속 일반적인 try-catch 패턴으로 돌아갔다.
Cursor는 여기서 확실히 다르다. 인덱싱된 코드베이스 컨텍스트를 활용하는 게 체감으로 느껴진다. 비슷한 패턴의 다른 파일을 참고해서 제안을 만들어준다. 첫 주에 “오, 이건 진짜 낫네”라고 생각했다.
Claude Code는 자동완성 도구가 아니라 에이전트 방식으로 작동하기 때문에 직접 비교하긴 어렵다. 하지만 리팩토링 작업에서 성능이 두드러졌다. 아래가 실제 테스트 케이스 중 하나다:
// 기존 코드 (JavaScript, 레거시) — SQL injection 취약점 있음
async function getUserOrders(userId) {
try {
const user = await db.query(`SELECT * FROM users WHERE id = ${userId}`);
if (!user.rows.length) return null;
const orders = await db.query(
`SELECT * FROM orders WHERE user_id = ${user.rows[0].id}`
);
return orders.rows;
} catch (e) {
console.log(e);
return null;
}
}
// Claude Code가 리팩토링한 결과 (TypeScript)
// SQL injection 수정 + 타입 안전성 + 팀 Result 패턴 적용을 한 번에
async function getUserOrders(userId: string): Promise<Result<Order[], AppError>> {
const user = await db.query<User>(
'SELECT id FROM users WHERE id = $1',
[userId]
);
if (!user.rows.length) {
return err(new AppError('USER_NOT_FOUND', `User ${userId} not found`));
}
const orders = await db.query<Order>(
'SELECT * FROM orders WHERE user_id = $1',
[user.rows[0].id]
);
return ok(orders.rows);
}
SQL injection 취약점을 잡아내고, 코드베이스의 에러 패턴을 참고해서 Result 타입으로 변환까지 한 번에 해줬다. CLAUDE.md에 팀 컨벤션을 미리 적어뒀던 게 여기서 효과를 발휘했다. Copilot과 Cursor도 같은 작업을 시켜봤는데, 둘 다 TypeScript 변환 자체는 잘 했지만 취약점 수정과 팀 패턴 적용을 동시에 하진 못했다. 별도 지시가 필요했다.
실무 적용 기준: 반복 작업이 많고 타이핑 속도를 줄이고 싶다면 Copilot, 코드베이스 전체를 이해해야 하는 복잡한 작업은 Claude Code가 낫다.
긴 컨텍스트에서 어떻게 버티는가
이게 가장 중요한 테스트였다. 실무에서 AI 도구가 진짜 필요한 순간은 파일 하나가 아니라 여러 파일에 걸쳐 있는 변경사항을 이해해야 할 때다.
우리 FastAPI 서버의 인증 모듈 작업이 딱 그런 경우였다. auth/, users/, permissions/ 세 디렉터리에 걸쳐 있는 코드였고, 총 2,000줄 정도 됐다. 여기에 OAuth2 소셜 로그인을 추가해야 했다.
Cursor로 먼저 시도했다. 처음 몇 가지 제안은 꽤 좋았다. 근데 대화가 길어지고 파일을 여러 개 수정하다 보니 — 대략 5번 왔다 갔다 하고 나서 — 앞에서 수정했던 내용을 까먹기 시작했다. AuthService의 메서드 시그니처를 바꿨는데, 나중에 그걸 참조하는 다른 파일에서 이전 시그니처로 코드를 다시 생성했다. 이런 컨텍스트 단절이 두 번 발생했다.
Claude Code는 이 부분에서 체감 차이가 있었다. 에이전트가 직접 파일들을 읽고 수정하면서 전체 변경사항을 추적한다. 도중에 “아 근데 permissions 체크는 미들웨어에서 해야 할 것 같은데”라고 방향을 바꿨을 때도, 이미 만들어둔 코드와 충돌 없이 조정해줬다.
물론 100% 완벽하진 않다. 한 번은 기존 테스트 파일을 참고하지 않고 새 테스트를 작성해서, 결과적으로 팀 컨벤션과 다른 구조가 나온 적이 있다. 손봐야 했다.
GitHub Copilot Chat은 이 시나리오에선 솔직히 많이 부족했다. 멀티 파일 컨텍스트를 다루기 어렵고, 내가 파일을 하나씩 열어서 직접 지시해야 했다. 그건 혼자 하는 거랑 큰 차이가 없다.
내가 한 실수 — 에이전트를 너무 믿었을 때
Claude Code를 처음 적극적으로 쓰기 시작했을 때, 자동 승인 모드를 켜놓고 큰 리팩토링 작업을 맡겼다. 아침에 시작해서 코드 리뷰 미팅을 다녀왔더니 파일 34개가 수정되어 있었다.
대부분은 잘 됐다. 근데 utils/date.ts 파일에서 문제가 생겼다. Claude Code가 “사용하지 않는 함수”라고 판단한 formatRelativeDate를 삭제했는데, 실제로는 다른 마이크로서비스에서 API를 통해 호출하는 함수였다. 코드베이스만 봐선 사용처를 알 수 없었던 거다.
다행히 git이 있어서 복구는 됐다. 하지만 그날 이후로 에이전트 작업 전에 항상 /compact로 컨텍스트를 정리하고, 삭제 작업은 반드시 직접 승인하도록 설정을 바꿨다.
교훈은 단순하다. 에이전트는 코드베이스 밖을 볼 수 없다. 외부 의존성, API 계약, 문서화 안 된 사이드 이펙트는 에이전트가 모른다. Cursor나 Copilot도 마찬가지지만, Claude Code처럼 자율적으로 많은 파일을 수정할 수 있을 때 리스크가 더 크다. 능력이 클수록 감독도 더 필요하다.
비용 현실과 내 실제 추천
비용 얘기를 안 하면 불완전하다.
- GitHub Copilot Business: 사용자당 월 $19. 예측 가능한 비용.
- Cursor Pro: 월 $20. 빠른 요청 제한이 있고 초과 시 느려진다.
- Claude Code: 토큰 기반 과금. 헤비하게 쓴 주는 주당 $40–60 정도 나왔다. 일반적인 사용량이면 $20–30 선.
Claude Code의 가변 비용이 팀 예산 관리 입장에선 까다롭다. 에이전트가 큰 파일들을 많이 읽고 수정하면 토큰이 빠르게 소진된다. 나는 월말에 예상보다 많은 청구서를 받고 나서야 /compact를 습관처럼 쓰기 시작했다. 미리 알았더라면 좋았을 텐데.
그래서 내 실제 추천은 이렇다. “상황마다 다르다”는 식으로 발뺌하지 않겠다.
5인 이하 스타트업: Claude Code를 메인으로 쓰되 CLAUDE.md를 잘 작성해라. 초기에 팀 컨벤션 문서화에 투자하면 나중에 훨씬 좋은 결과를 얻는다. 비용은 코드 리뷰 시간 절감으로 상쇄된다.
5–20인 팀: Copilot Business로 팀 전체 자동완성을 커버하고, Claude Code는 복잡한 리팩토링이나 마이그레이션 작업 전용으로 쓰는 게 가성비가 좋다. 두 도구를 병행하는 게 어색하지만 익숙해지면 괜찮다.
개인 개발자 / 사이드 프로젝트: Cursor를 강력히 추천한다. UI가 제일 매끄럽고, 코드베이스 인덱싱이 자연스럽게 작동한다. 단, 팀 단위로 확장할 때 컨벤션 강제가 약하다는 느낌이 든다.
20인 이상 규모는 솔직히 내가 직접 경험이 없어서 확신하기 어렵다. 그 규모에선 코드 거버넌스와 보안 정책이 더 중요해지고, Copilot Enterprise의 관리 기능이 의미 있어질 수 있다.
한 가지만 더 짚자면 — 이 모든 도구의 성능은 당신이 얼마나 명확하게 지시하느냐에 달려 있다. AI가 부족한 게 아니라 내 지시가 불명확한 경우가 훨씬 많았다. 팀 컨벤션을 CLAUDE.md에 문서화하고, 명확한 요청을 작성하는 연습이 도구 선택보다 더 중요하다.