# AI로 코드 리뷰하는 법 — Cursor & GitHub Copilot 실전 가이드
코드를 빨리 쓰는 게 실력이라면, 코드를 빨리 **고치는** 건 진짜 실력입니다. 개발자 업무 시간의 70~80%는 새 코드를 작성하는 게 아니라 기존 코드를 읽고, 버그를 잡고, 성능을 개선하는 데 쓰입니다. 그런데 정작 코드 리뷰는 늘 시간 부족으로 미뤄지기 마련입니다. 시니어에게 물어보면 “나중에”라는 답이 돌아오죠.
AI 코딩 도구가 이 간극을 메워줄 수 있습니다. 코드를 “작성”하는 용도로만 쓰던 Cursor와 GitHub Copilot을 **코드 리뷰, 보안 분석, 성능 최적화, 리팩토링**에 활용하는 방법을 실제 FastAPI 프로젝트 사례와 함께 단계별로 정리했습니다.
## AI 코드 리뷰란 무엇인가?
전통적인 정적 분석 도구(SonarQube, ESLint)는 “규칙 위반”을 찾습니다. 사용하지 않는 변수, 너무 긴 함수, 코딩 컨벤션 위반 같은 패턴이죠. AI 코드 리뷰는 여기에 더해 **맥락 이해**가 들어갑니다. “이 로직은 특정 상황에서 경쟁 상태를 일으킬 수 있습니다” 같은 분석이 가능하다는 뜻입니다.
정적 분석과 AI 리뷰는 대체재가 아닙니다. 보완재입니다. 정적 분석으로 규칙 기반 문제를 잡고, AI로 맥락 기반 문제를 잡으면 리뷰어는 **진짜 중요한 설계 결정**에 집중할 수 있습니다. 무엇보다 AI는 24시간 즉시 응답합니다. 새벽 3시에 코드를 고쳤을 때 “이거 괜찮아?” 하고 물어보면 바로 답이 옵니다.
## Cursor로 보안 취약점 찾기 (실전)
실제 북마크 관리 앱(FastAPI + SQLite)을 Cursor로 리뷰해 봤습니다. `Cmd+Shift+L`(Mac) 또는 `Ctrl+Shift+L`(Windows)로 Codebase Chat을 열고 프로젝트 전체를 컨텍스트로 인식시킨 뒤 질문합니다.
“`
이 프로젝트의 코드를 보안 관점에서 리뷰해줘.
특히 SQL Injection, XSS, 인증 관련 취약점이 있는지 확인해줘.
“`
5분 만에 세 가지 문제가 발견됐습니다.
**1. SQL Injection** — 검색 기능에서 raw SQL 문자열 포맷팅을 하고 있었습니다. `f”SELECT * FROM bookmarks WHERE title LIKE ‘%{query}%'”` 형태라 사용자 입력이 직접 SQL에 들어갑니다. Cursor가 parameterized query로 수정을 제안했습니다.
“`python
# 수정 전 (위험)
results = db.execute(f”SELECT * FROM bookmarks WHERE title LIKE ‘%{query}%'”).fetchall()
# 수정 후 (안전)
results = db.execute(“SELECT * FROM bookmarks WHERE title LIKE :query”, {“query”: f”%{query}%”}).fetchall()
“`
**2. XSS 취약점** — Jinja2 템플릿에서 사용자 입력을 `|safe` 필터로 출력하고 있었습니다. 북마크 제목에 악성 스크립트를 넣으면 다른 사용자의 페이지에서 실행됩니다. `|safe`를 제거하거나 escape 처리로 해결합니다.
**3. 인증 누락** — 북마크 삭제 API에 권한 확인이 없었습니다. 누구나 URL만 알면 다른 사람의 북마크를 지울 수 있는 상태였습니다. DELETE 엔드포인트에 인증 미들웨어를 추가했습니다.
## GitHub Copilot Chat으로 성능 병목 분석
보안 다음은 성능입니다. VS Code에서 Copilot Chat 패널을 열고 이렇게 물어봤습니다.
“`
이 FastAPI 프로젝트에서 응답 속도를 느리게 만드는
잠재적 성능 병목을 찾아줘. 특히 N+1 문제가 있는지 확인해줘.
“`
가장 중요한 발견은 **N+1 쿼리 문제**였습니다. 북마크 목록을 불러올 때 각 북마크마다 태그를 별도로 조회하고 있었습니다. 100개의 북마크 = 101번의 쿼리. `selectinload`를 적용하면 2번으로 줄어듭니다.
“`python
# 수정 전 (N+1 문제)
bookmarks = db.query(Bookmark).all()
for b in bookmarks:
tags = b.tags # 각 북마크마다 별도 쿼리 실행
# 수정 후 (단일 쿼리)
from sqlalchemy.orm import selectinload
bookmarks = db.query(Bookmark).options(selectinload(Bookmark.tags)).all()
“`
추가로 동기식 파일 I/O(파비콘 다운로드)를 `BackgroundTasks`로 비동기화하고, 검색 컬럼에 인덱스를 추가했습니다. 이런 최적화는 보통 프로파일링 도구를 돌려야 발견할 수 있지만, AI가 코드를 읽고 잠재적 병목 후보를 미리 좁혀줍니다.
## AI 리팩토링 — 구조 개선
개별 수정을 넘어 프로젝트 구조 자체를 개선할 수 있습니다. 북마크 앱의 `main.py`에 라우트, 비즈니스 로직, DB 쿼리가 전부 섞여 있었습니다. Cursor Composer로 역할별 분리를 요청했습니다.
“`
main.py의 코드를 역할별로 분리해줘.
– routers/bookmarks.py (라우트 핸들러)
– services/bookmark_service.py (비즈니스 로직)
– repositories/bookmark_repo.py (데이터베이스 쿼리)
의존성 주입 패턴을 사용하고, 각 계층의 책임을 명확히 해줘.
“`
다만 주의할 점이 있습니다. AI는 **과도한 추상화**를 좋아하는 경향이 있습니다. 간단한 CRUD 앱에 Factory 패턴, Strategy 패턴, Observer 패턴을 다 넣으라고 할 수도 있습니다. “이 패턴이 왜 필요한지”를 AI에게 물어보고, 설득력 있는 답이 안 나오면 적용하지 않습니다. YAGNI(You Aren’t Gonna Need It) 원칙을 지키는 게 중요합니다.
또한 리팩토링 전에는 반드시 **테스트 코드**를 먼저 확인합니다. 테스트가 없다면 AI에게 “이 코드에 대한 기본 테스트를 작성해줘”라고 먼저 요청한 뒤 리팩토링을 진행합니다. 테스트 없는 대규모 리팩토링은 위험합니다.
## CI/CD에 AI 리뷰 자동화하기
에디터 안에서 수동으로 리뷰하는 것을 넘어, PR이 올라올 때마다 자동으로 AI 리뷰가 실행되도록 만들 수 있습니다. GitHub Copilot for Pull Requests나 CodeRabbit을 연동하면 됩니다.
“`yaml
# .github/workflows/ai-review.yml
name: AI Code Review
on: [pull_request]
jobs:
review:
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v4
– name: Run AI Review
uses: coderabbitai/ai-pr-reviewer@latest
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
“`
PR이 생성되면 자동으로 코드를 분석하고 리뷰 코멘트를 답니다. 새벽에 PR을 올려도 즉시 피드백이 오고, 기본적인 보안 체크를 자동으로 해줍니다. AI 리뷰는 보조 도구로 쓰고, 최종 머지 결정은 사람이 합니다.
## 정리
AI 코드 리뷰의 핵심은 **1차 필터링을 AI에게 맡기고, 사람은 설계 수준의 의사결정에 집중**하는 것입니다. Cursor Codebase Chat으로 보안 취약점을 5분 안에 발견하고, Copilot Chat으로 성능 병목을 찾고, Composer로 리팩토링까지 할 수 있습니다.
처음부터 완벽하게 할 필요는 없습니다. 먼저 Cursor나 Copilot Chat을 열고 “이 코드에서 보안 문제를 찾아줘”라고 물어보는 것부터 시작해 보세요. 거기서부터가 AI 코드 리뷰의 출발점입니다.
—
**관련 영상**: 이 글은 유튜브 영상의 보충 자료입니다. 영상에서 실제 화면 조작과 코드 수정 과정을 확인할 수 있습니다.



















