☘️ 배경
팀에서 코드 리뷰를 진행하기 어려운 상황이지만 미리 위험 요소를 제거하고 코드 품질을 높일 수 있었으면 좋겠다.
그러면 이걸 AI에게 맡겨보면 어떨까?
Cursor IDE에서 직접 "이 PR 리뷰해줘"라고 요청했더니, 꽤 쓸만한 리뷰가 나왔다.
하지만 문제는 이게 일회성이라는 것이었다. 매번 같은 품질의 리뷰를 받으려면 프로세스를 정형화할 필요가 있었다.
그래서 Cursor의 Agent Skill 기능을 활용해 PR 리뷰 워크플로우를 자동화하고, 리뷰 효과를 수치로 측정하는 시스템을 만들었다.
🤖 Cursor Skill 만들기
Cursor Skill이란
Cursor의 Agent Skill은 마크다운 파일(`SKILL.md`)로 작성하는 AI 에이전트용 작업 매뉴얼이다.
특정 키워드가 포함된 요청이 들어오면 해당 스킬이 자동으로 실행된다.
저장 위치
| 범위 | 경로 |
| 개인 (모든 프로젝트) | `~/.cursor/skills/skill-name/SKILL.md` |
| 프로젝트 | `.cursor/skills/skill-name/SKILL.md` |
나는 모든 프로젝트에서 사용 가능 하도록 개인 경로에 생성했다.
최종 디렉토리 구조
~/.cursor/skills/pr-review/
├── SKILL.md # 리뷰 워크플로우 정의
├── logs/
│ └── reviews.jsonl # 리뷰 데이터 누적 저장
└── scripts/
└── stats.py # 통계 요약 스크립트
🪄 워크플로우 설계
skill이 실행되었을 때 AI가 어떤 순서로 작업을 처리해야할지를 정의한 내용을 상세히 기제했다.
작업 순서부터, 어떻게 처리할지
핵심: git worktree 활용
AI를 통해서 PR 리뷰를 쉽게 할 수 있게 되었지만 PR 리뷰를 위해 작업 중인 브랜치가 있을 경우 리뷰가 가능하도록 먼저 정리가 필요했다. 현재 작업을 stash하거나 커밋하고, 리뷰 브랜치로 전환하고, 끝나면 다시 돌아와야 한다.
매번 이 작업을 진행하기에는 번거로웠고, 이렇게 될 경우 PR 리뷰와 작업을 동시에 진행할 수 없는 문제가 있었다.
이를 해결하기 위해 `git worktree`를 사용했다.
git worktree를 사용하면 브랜치 전환 없이 다른 폴더에서 PR 브랜치를 열 수 있다.
# develop에서 작업 중인데 my-branch PR을 리뷰해야 할 때
git worktree add ../my-repo-pr78 my-branch
이러면:
- `my-repo/` → develop 작업 계속 가능
- `my-repo-pr78/` → my-branch 브랜치 체크아웃 상태
워크트리에서 리뷰하고, 수정이 필요하면 그 자리에서 바로 수정/커밋/푸시까지 가능하다.
상황별 분기
모든 경우에 워크트리가 필요한 건 아니다. 현재 브랜치 위치가 PR을 진행할 브랜치에 있다면 현재 브랜치에서 바로 리뷰/수정을 진행하면 되기 때문에 워크트리를 생성할 필요가 없다.
그래서 현재 위치한 브랜치를 확인하고 그에 따라 리뷰/수정을 진행할 환경을 분기하도록 했다.
리뷰 요청 → 현재 브랜치 확인
├─ 현재 브랜치 != PR 브랜치 → 워크트리 생성, 워크트리에서 작업
└─ 현재 브랜치 == PR 브랜치 → 워크트리 안 만듬, 현재 폴더에서 작업
전체 흐름
1. PR 정보 수집 (gh CLI)
2. 브랜치 확인 → 워크트리 생성 여부 결정
3. diff 분석
4. 변경 파일 정밀 분석
5. 체크리스트 기반 리뷰 작성
6. (수정 요청 시) 코드 수정 → 커밋/푸시
7. 리뷰 종료 → 수용률 확인 → 로그 저장 → 워크트리 삭제
✅ 리뷰 체크리스트
AI가 코드를 볼 때 무엇을 중점적으로 봐야 하는지 정의했다.
정확성
- 로직 오류, 오프바이원 에러, 잘못된 조건 분기
- 누락된 에러 핸들링 (try-catch, null 체크)
- 비동기 처리 누락 (await, Promise 체인)
- API 엔드포인트/파라미터 불일치
일관성
- 기존 코드 패턴과의 불일치
- 네이밍 컨벤션 위반
- 동일 데이터의 중복 정의
- dead code (미사용 변수, 임포트, 데이터)
유지보수성
- 과도하게 복잡한 조건문
- 매직 넘버/스트링
- 함수 크기 및 책임 분리
보안/성능
- XSS, SQL 인젝션 등 보안 취약점
- 불필요한 API 호출, 중복 렌더링
✨ 리뷰 효과 측정
"AI 리뷰가 실제로 도움이 되는가?"를 데이터로 측정해 부족한 부분을 개선하고, 실제로 얼마나 유용한지를 확인하고자 했다.
핵심 지표
| 지표 | 설명 | 왜 중요한가 |
| 수용률 | AI가 찾아낸 이슈 중 실제 수정한 비율 | AI 리뷰가 유용했는지 직접 측정 |
| 리뷰 밀도 | 이슈 건수 / 변경 1000줄 | 코드 품질 수준 파악 |
| Critical 검출률 | Critical이 있었던 PR 비율 | 버그 사전 차단 효과 |
| 미수정 사유 | 수정하지 않은 항목의 이유 | 리뷰 품질 개선 피드백 |
데이터 저장
리뷰 종료 시 JSON Lines 형식으로 로그를 누적한다.
{
"reviewId": "pr-78",
"date": "2026-03-31",
"repo": "repo name",
"author": "auth name",
"branch": "my-branch → develop",
"filesChanged": 12,
"additions": 829,
"deletions": 313,
"issues": { "critical": 4, "medium": 4, "low": 4 },
"accepted": 10,
"rejected": 2,
"rejectedReasons": ["사유 1", "사유 2"]
}
통계 스크립트
"리뷰 통계"라고 입력하면 Python 스크립트가 실행되어 누적 데이터를 요약하는 기능도 추가했다.
============================================================
PR 리뷰 통계 요약
============================================================
📊 전체 현황
총 리뷰 건수 : 1건
총 변경 파일 : 12개
총 변경 코드 : +829 / -313 (1142줄)
🔍 심각도 분포
Critical/High : 4건
Medium : 4건
Low/Style : 4건
합계 : 12건
📈 핵심 지표
수용률 : 83.3% (10/12)
리뷰 밀도 : 10.5건 / 1000줄
Critical 검출률 : 100.0% (1/1 PR)
❌ 미수정 사유 (상위 5개)
[1건] dead code 삭제로 중복 없어져 공통 상수 추출 불필요
============================================================
아직 1건이라 데이터가 적지만, 쌓이면 수용률 추이, 저장소별 비교, 반복되는 이슈 패턴 등이 보일 것이다.
✏️ Learning Points
1. Skill 작성 시 "하지 말아야 할 것"을 명시해야 한다
초기 버전에서 통계 스크립트를 실행하면, python 스크립트 결과를 AI가 다시 요약해서 보여줬다. 스크립트가 포맷팅한 출력이 있는데 이걸 무시하고 "수용률 83.3%입니다" 한 줄로 줄여버린 것이다.
SKILL.md에 이 한 줄을 추가해 해결했다:
> **중요: 스크립트 실행 결과를 요약하지 말고 그대로 출력하라.**
2. worktree의 `--detach` 모드는 리뷰 전용이 아니다
처음에 워크트리를 생성할 때 `--detach` 옵션을 추가해서 만들었다. 읽기 전용으로 충분하다고 생각했는데, 리뷰 후 수정 요청이 들어오면 워크트리에서 커밋할 수 없는 문제가 생겼다. 결국 수정이 원본 워크스페이스에 반영되면서 워크트리를 통한 격리의 의미가 사라졌다.
브랜치 모드(`--detach` 없이)로 생성하면 워크트리에서 수정/커밋/푸시까지 가능하기에 현재 위치를 확인해서 상황에 따라 리뷰 환경을 구성하도록 했다.
3. 코드 리뷰의 유용성을 확인하는 지표 : 수용률
하나의 리뷰에서 AI가 12건을 이슈로 리뷰를 했는데 10건 수정, 2건은 합당한 사유로 미수정 되었다. 이때 전체 12건의 이슈 중 10건이 수정 되었기 때문에 AI 리뷰는 수용률 83.3%이다.
이 값이 "AI 리뷰가 쓸만한가?"를 측정할 수 있는 기준이 된다. 만약 수용률이 30%미만이라면 리뷰 기준을 재조정 해야하고, 90% 이상이면 팀 도입을 고려해볼 수 있을 것 같다.
아직은 리뷰를 통계가 많이 쌓이지 않았기 때문에 더 데이터를 쌓은 뒤에 확인을 해봐야할 것 같다. 데이터가 쌓이는 걸 기다리면서 좀 더 편리하게 리뷰 할 수 있게 고도화를 고민해봐야겠다.
정리
| 항목 | 내용 |
| 도구 | Cursor Agent Skill + gh CLI + git worktree |
| 스킬 위치 | `~/.cursor/skills/pr-review/` (모든 프로젝트에서 사용) |
| 트리거 | "PR 리뷰해줘", "코드 리뷰해줘" |
| 리뷰 기준 | 정확성, 일관성, 유지보수성, 보안/성능 4개 카테고리 |
| 심각도 | Critical/High, Medium, Low/Style 3단계 |
| 효과 측정 | 수용률, 리뷰 밀도, Critical 검출률, 미수정 사유 |
| 실제 리뷰 결과 | 수용률 83.3%, 12건 중 Critical 4건 검출 |
'AI' 카테고리의 다른 글
| [프로젝트 - F-T 번역기 ] 제미나이에게 MBTI를 가르치려면? — RAG와 임베딩 기초 (0) | 2026.03.30 |
|---|---|
| [프로젝트 - F-T 번역기 ] 프롤로그 (1) | 2026.03.11 |
댓글