Claude CLI로 PR 코드 리뷰 자동화하기

코드 리뷰 시스템을 고민하던 중 AI 기반으로 해보고 싶었습니다.

만든 계기

CodeRabbit 같은 서비스도 있고 GitHub Copilot 리뷰 기능도 있지만, 선택한 건 Claude CLI였습니다. 이미 쓰고 있는 도구고, GitHub Actions에 붙이는 것도 크게 어렵지 않아 보였습니다.

두 가지에 집중했습니다. 하나는 추가 비용 없이 가볍게 도입하는 것, 다른 하나는 제대로 된 리뷰 프롬프트를 만드는 것. 도구보다 프롬프트가 리뷰 품질을 결정한다고 생각했습니다.

전체 구조

동작 방식은 단순합니다.

  1. PR이 열리거나 커밋이 추가되면 GitHub Actions 트리거
  2. gh pr diff 로 diff 추출 (변경된 부분이 많을 수 있기에 청크 단위로 분할하여 추출)
  3. Claude CLI에 diff를 넘겨서 리뷰 요청
  4. 결과를 PR 코멘트로 게시
PR 오픈 / 커밋 추가

diff 추출 (gh pr diff)

청크 분할

각 청크 리뷰 → 최종 요약

PR 코멘트 게시

CLI로 붙이기

GitHub Actions에서 Claude CLI를 호출하는 방식입니다. Claude를 구독해 사용하고 있어 추가 비용은 따로 없었습니다. self-hosted runner에 Claude CLI를 설치해두고, diff 파일 경로를 프롬프트에 넘깁니다.

CHUNK_REVIEW=$(claude -p "$REVIEW_PROMPT" --allowedTools "Read,Grep")

ReadGrep 툴만 허용했습니다. diff 파일을 직접 읽고, 레포 내 중복 코드나 이미 사용 중인 라이브러리를 Grep으로 확인하게 하기 위해서입니다.

diff가 클 경우엔 파일 단위로 청크를 나눠서 각각 리뷰한 뒤 마지막에 한 번 더 요약을 요청합니다.

  • 1단계: 각 청크별 리뷰
  • 2단계: 전체 리뷰를 합쳐서 중복 제거 후 최종 요약

프롬프트 설계

프롬프트를 .github/prompts/ 에 파일로 분리했습니다. 워크플로우와 리뷰 정책을 분리해두면 정책을 바꿀 때 워크플로우를 건드리지 않아도 됩니다.

리뷰 품질을 높이는 데 신경 쓴 부분들이 있습니다.

리뷰하지 않을 것도 명시했습니다. 코드 스타일, 포매팅, 사소한 네이밍은 제외했습니다. 안 그러면 노이즈가 너무 많아집니다.

Grep을 적극적으로 쓰게 했습니다. 레포에 이미 같은 유틸이 있는지, 사용 중인 라이브러리가 있는지 직접 확인하도록 했습니다. Claude가 레포를 뒤지면서 맥락을 파악하게 하는 게 포인트입니다.

심각도를 3단계로 나눴습니다. [필수] / [권장] / [참고] 로 구분하고 심각도 높은 순으로 최대 10개만 출력하게 했습니다. 리뷰가 너무 많으면 오히려 안 읽게 됩니다.

모호한 표현을 금지했습니다. “확인하면 좋겠음”, “검증 필요” 대신 구체적으로 무엇을 해야 하는지 적도록 했습니다.

출력 형식도 고정했습니다.

### 리뷰

> **[필수]** `파일명:라인` — 내용
> **[권장]** `파일명:라인` — 내용
> **[참고]** `파일명:라인` — 내용

---

### Summary

머지: ✅ 가능 / ⚠️ 수정 후 가능 / ❌ 수정 필요
한줄평: (한 줄 평가)

실제로 잡아낸 것들

테스트 삼아 SQL Injection 취약점이 있는 코드를 PR에 포함시켜봤습니다.

# 취약한 코드
query = f"SELECT * FROM users WHERE id={user_id}"
cursor.execute(query)

# 안전한 코드
query = "SELECT * FROM users WHERE id=%(user_id)s"
cursor.execute(query, {"user_id": user_id})

리뷰 결과:

### 리뷰

> **[필수]** `query.py:10` — f-string으로 쿼리를 직접 조합하고 있어 SQL Injection에 취약합니다.
> user_id가 외부 입력에서 오는 경우 공격자가 임의 SQL을 실행할 수 있습니다.
> 파라미터 바인딩 방식으로 되돌려야 합니다.

---

### Summary

머지: ❌ 수정 필요
한줄평: SQL Injection 취약점이 포함된 코드입니다. 머지 전 반드시 수정하세요.

제대로 잡아냈습니다.

한계

self-hosted runner가 필요합니다. Claude CLI가 설치된 환경이 필요해서 GitHub 기본 runner로는 안 됩니다.

대규모 리팩토링엔 약합니다. 청크로 나눠도 파일 간 의존성이 복잡한 변경에선 전체 맥락을 파악하기 어렵습니다.

사람 리뷰를 대체하는 게 아니라 1차 필터 로 쓰는 용도입니다. 보안 이슈나 명백한 버그를 사람이 보기 전에 걸러주는 것만으로도 충분히 가치가 있습니다.

마무리

프롬프트를 다듬을수록 리뷰 품질이 올라가는 게 재밌었습니다. 결국 도구보다 프롬프트가 핵심이었습니다.

관심 있으시면 워크플로우보다 프롬프트 설계 위주로 참고하시는 걸 추천드립니다.