머지(Merge) 버튼 누르기 전 필수 관문: AI 에이전트 'code-review' 스킬 완벽 해부
1. 바쁜 동료를 대신해 줄 꼼꼼한 코드 리뷰어
모든 개발팀이 겪는 딜레마가 있습니다. 꼼꼼한 코드 리뷰가 품질을 지킨다는 건 알지만, 스프린트 마감에 쫓기다 보면 수백 줄의 PR diff를 앞에 두고 "LGTM(Looks Good To Me)"을 누르고 싶은 유혹에 빠집니다.
하지만 그렇게 무심코 머지된 코드 한 줄이 대규모 장애를 부릅니다:
- 반복문 안에 숨어 있던 N+1 데이터베이스 쿼리로 서버 다운
- 사용자 입력값을 그대로 쿼리에 이어 붙인 SQL 인젝션 취약점
null이나 빈 배열을 고려하지 않아 터지는 런타임 익셉션
code-review는 피로를 느끼지 않는 24시간 시니어 보안·성능 전문가로서, 변경된 diff의 숨은 위험을 머지 전에 명확히 짚어내는 에이전트 스킬입니다.
2. code-review 란 무엇인가?
- 스킬 이름:
code-review
- 호출 명령어:
/code-review <PR URL 또는 파일 경로>
- 지원 환경: Claude Code, Codex, Gemini CLI / Antigravity, GitHub Copilot 등
- 주요 트리거:
"review this before I merge","is this code safe?","N+1 쿼리 확인해줘"
PR URL이나 diff 텍스트, 혹은 특정 소스 파일 경로만 던져주면 작동합니다. 단순히 코드 스타일(들여쓰기, 네이밍)만 지적하는 린터 수준을 넘어, 비즈니스 로직의 결함과 시스템 보안 취약점을 구조적으로 추적합니다.
3. 4차원 정밀 검토 렌즈
code-review는 4가지 축을 기준으로 코드를 다각도에서 분석합니다:
mindmap root((4차원 코드 리뷰)) 보안 (Security) SQL 인젝션 & XSS 방어 인증·인가 결함 탐지 하드코딩된 API Key 및 Secret SSRF 및 경로 조작 위험 성능 (Performance) 루프 내 N+1 쿼리 발생 불필요한 메모리 할당 및 누수 핫패스(Hot Path)의 O(n²) 복잡도 인덱스 누락 대량 조회 정확성 (Correctness) 빈 입력·null·경계값 에지케이스 경쟁 상태(Race Condition) 에러 전파 누락 오프바이원(Off-by-one) 오차 유지보수성 (Maintainability) 단일 책임 원칙(SRP) 준수 코드 중복 및 가독성 테스트 코드 누락 점검
4. 표준 리뷰 리포트 출력 포맷
검토가 끝나면 감정적인 비판 없이, 엔지니어가 즉시 수정할 수 있는 정량적 리포트를 출력합니다:
## Code Review: PR #412 사용자 인증 최적화 ### 요약 (Summary) 인증 토큰 재발급 로직을 개편했습니다. 전반적인 아키텍처는 깔끔하지만, 보안과 데이터베이스 조회 효율에서 중대한 개선점이 있습니다. ### 중대 결함 (Critical Issues) | # | 파일 | 라인 | 이슈 내용 | 심각도 | |---|---|---|---|---| | 1 | auth_service.py | L16 | 원시 SQL에 사용자 입력값 직결합 (SQL Injection 위험) | 🔴 Critical | ### 성능 제안 (Suggestions) | # | 파일 | 라인 | 제안 내용 | 구분 | |---|---|---|---|---| | 1 | database.py | L37 | 반복문 내부에서 count() 호출 (N+1 발생 -> JOIN으로 일괄 집계 권장) | Performance | ### 잘된 점 (What Looks Good) - 세션 무효화 처리가 원자적(Atomic)으로 잘 묶여 있습니다. - 단위 테스트 커버리지가 핵심 분기를 모두 포괄합니다. ### 최종 판정 (Verdict) ⚠️ **Request Changes** (보안 이슈 1건 수정 후 머지 요망)
5. 실무 시나리오: N+1 쿼리와 SQL 인젝션 잡아내기
실제 리뷰에서 에이전트가 어떤 지점을 찾아내는지 보여주는 대표 사례입니다.
❌ 리뷰에 걸린 문제의 코드
# 사용자 목록을 돌며 게시글 댓글 수를 세는 코드 def get_user_stats(users): stats = [] for user in users: # 치명적 결함 1: SQL 인젝션 위험 cursor.execute(f"SELECT * FROM user_profiles WHERE user_id = '{user.id}'") # 치명적 결함 2: 루프마다 쿼리를 날리는 N+1 병목 comments_count = db.query(Comment).filter_by(author_id=user.id).count() stats.append({"user": user, "comments": comments_count}) return stats
✅ code-review의 수정 제안
- 인젝션 방어: f-string을 파라미터화된 쿼리(
?또는 바인딩)로 즉시 전환.
- N+1 제거: 단 한 번의
GROUP BY쿼리로 전체 사용자의 댓글 수를 매핑하는 딕셔너리로 집계.
수정 전 수천 번 발생하던 DB 쿼리가 단 2번의 쿼리로 줄어들며, 서버 응답 속도는 10배 이상 빨라집니다.
6. 다양한 AI 코딩 도구에서의 연동과 활용
오픈 에이전트 규격으로 패키징되어 있어 다양한 도구에서 자유롭게 활용됩니다:
- Claude Code: GitHub CLI 연동을 통해 PR 브랜치 체크아웃 후 자동 리뷰 수행
- Codex / Gemini CLI: CI 파이프라인이나 로컬 훅에서 diff 파일 자동 검사
- 에이전트 워크플로우: PR 생성 전 사전 자가 검토(Pre-flight Check) 단계로 배치
7. 마무리: 버그는 배포 전에 잡는 것이 가장 저렴하다
프로덕션에 배포된 뒤 터진 버그를 수습하는 비용은, 로컬에서 PR 단계에 고치는 비용의 100배에 달합니다.
풀 리퀘스트를 올리기 전, 혹은 동료에게 리뷰를 요청하기 전 잠시만 시간을 내어 AI 어시스턴트에게 물어보세요:
/code-review 이 PR 머지하기 전에 위험한 부분 있는지 확인해줘
작은 질문 하나가 수많은 야근과 주말 장애 대응을 막아줍니다.
다른 글
- 다음 글: 난해한 알고리즘을 5살 아이도 이해하게: AI 에이전트 'ELI5' 스킬
- 현재 글: 머지(Merge) 버튼 누르기 전 필수 관문: AI 에이전트 'code-review' 스킬 완벽 해부
- 이전 글: 터미널에서 브라우저를 직접 조종하다: AI 에이전트 'playwright' 브라우저 자동화 스킬