AI 코딩 어시스턴트 비교 테스트: 2주간 실무에 직접 투입하고 알게 된 것들

지난 1월 말, 팀에 새 주니어가 합류했다. 온보딩 첫날 “어떤 AI 도구 쓰세요?”라는 질문이 나왔는데 — 솔직히 그 순간 나도 명확한 답을 못 했다. Claude Code, GitHub Copilot, Cursor를 그때그때 기분에 따라 섞어 쓰고 있었고, 어떤 상황에 뭐가 더 나은지 정리한 적이 한 번도 없었다.

창피한 마음에 2월 한 달을 잡고 제대로 비교해보기로 했다. 팀은 5명 규모, 주 스택은 TypeScript + Next.js + PostgreSQL이고 사이드로 Python FastAPI 서버도 운영한다. 여러 언어와 컨텍스트에서 테스트할 수 있는 환경이었다.

공개 벤치마크 말고 실제 시나리오로 테스트한 이유

HumanEval이나 SWE-bench 결과는 각 회사 공식 페이지에 이미 다 나와 있다. 내가 궁금한 건 “내 코드베이스에서, 내 방식으로 작업할 때 뭐가 더 나은가”였다.

세 가지 실제 시나리오로 설계했다:

  1. 레거시 코드 리팩토링 — 2년 묵은 JavaScript 파일을 TypeScript로 마이그레이션
  2. 기능 추가 — 기존 인증 모듈에 OAuth2 소셜 로그인 추가
  3. 버그 추적 — 간헐적으로 발생하는 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로 갈아탔다.

Claude Code는 에이전트가 직접 파일들을 읽고 수정하면서 전체 변경사항을 추적한다. 도중에 “permissions 체크는 미들웨어에서 해야 할 것 같은데”라고 방향을 바꿨을 때도, 이미 만들어둔 코드와 충돌 없이 조정해줬다. 100% 완벽하진 않았다 — 한 번은 기존 테스트 파일을 참고하지 않고 새 테스트를 작성해서 팀 컨벤션과 다른 구조가 나왔다. 손봐야 했다.

GitHub Copilot Chat은 이 시나리오에선 많이 부족했다. 멀티파일 컨텍스트를 다루기 어렵고, 내가 파일을 하나씩 열어서 직접 지시해야 했다. 그 정도면 혼자 하는 거랑 큰 차이가 없다.

내가 한 실수 — 에이전트를 너무 믿었을 때

이 부분은 솔직하게 써야 할 것 같다.

Claude Code를 본격적으로 쓰기 시작했을 때, 자동 승인 모드를 켜놓고 큰 리팩토링 작업을 맡겼다. 아침에 시작해서 코드 리뷰 미팅을 다녀왔더니 파일 34개가 수정되어 있었다.

대부분은 잘 됐다. 근데 utils/date.ts에서 문제가 생겼다. “사용하지 않는 함수”라고 판단한 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의 관리 기능이 의미 있어질 수 있다.


한 가지만 더 — 2주 동안 가장 많이 든 생각은 “이 도구가 별로네”가 아니라 “내 요청이 너무 모호했네”였다. 어떤 도구를 쓰든 작업 의도를 명확히 쓰는 습관, 팀 컨벤션을 CLAUDE.md에 정리해두는 것, 이 두 가지가 도구 선택 자체보다 더 큰 차이를 만들었다. 솔직히 이게 제일 중요한 결론이다.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top