PR-Agent Review 기능 분석

Tasker_Jang·2025년 4월 29일
0

PR-Agent의 Review 기능은 AI를 활용하여 풀 리퀘스트(PR)의 코드를 분석하고 리뷰 의견을 제공하는 도구입니다.

Review 기능이 하는 일

PR-Agent의 /review 명령어는 여러분의 PR(Pull Request)을 꼼꼼히 분석해서 다음과 같은 인사이트를 제공합니다:

  • 🐛 잠재적 버그 식별: "이 부분에서 Null 체크가 누락되었네요"
  • 🔒 보안 취약점 탐지: "이 API 엔드포인트는 인증이 필요해 보입니다"
  • 📊 리뷰 난이도 평가: "이 PR의 리뷰 난이도는 3/5입니다"
  • 🧪 테스트 관련 피드백: "이 주요 기능에 테스트 케이스가 누락되었습니다"
  • 🔍 중요 이슈 하이라이트: "이 코드 변경은 기존 기능에 영향을 줄 수 있습니다"
  • ✂️ PR 분할 제안: "이 PR은 두 개의 독립적인 기능으로 나눌 수 있습니다"

내부 동작 방식

/review 명령어의 마법은 pr_agent/tools/pr_reviewer.py 파일에 있는 PRReviewer 클래스에서 일어납니다. 이 클래스의 주요 부분을 살펴보겠습니다:

class PRReviewer:
    def __init__(self, pr_url: str, ...):
        # PR 정보 초기화
        
    async def run(self):
        # 1. PR 정보 수집
        # 2. AI 모델 호출 준비
        # 3. 리뷰 결과 처리 및 게시

리뷰 프로세스는 다음과 같은 단계로 진행됩니다:

  1. 정보 수집: PR의 모든 정보(파일, 변경사항, 설명 등)를 수집합니다
  2. AI 호출 준비: 수집한 정보로 AI 모델에 전송할 프롬프트를 구성합니다
  3. AI 분석 실행: 구성된 프롬프트로 AI 모델(GPT-4, Claude 등)을 호출합니다
  4. 결과 가공: AI의 응답을 파싱하고 구조화된 리뷰로 변환합니다
  5. 리뷰 게시: 결과를 PR에 댓글로 게시합니다

Review 설정 분석

/review 명령어는 configuration.toml 파일을 통해 세밀하게 조정할 수 있습니다:

[pr_reviewer]
# 어떤 리뷰 요소를 포함할지 결정
require_score_review=false              # 점수 평가 포함 여부
require_tests_review=true               # 테스트 관련 피드백 포함 여부
require_estimate_effort_to_review=true  # 리뷰 난이도 평가 포함 여부
require_security_review=true            # 보안 분석 포함 여부
require_ticket_analysis_review=true     # 티켓 분석 포함 여부

# 출력 관련 설정
persistent_comment=true                 # 리뷰를 같은 댓글로 업데이트
final_update_message=true               # 최종 업데이트 메시지 표시

# 라벨 관련 설정
enable_review_labels_security=true      # 보안 관련 라벨 활성화
enable_review_labels_effort=true        # 노력 관련 라벨 활성화

이런 설정을 통해 여러분의 팀과 프로젝트에 딱 맞는 리뷰어를 구성할 수 있습니다. 중요한 부분만 리뷰하고 싶다면 필요한 항목만 활성화하면 됩니다!

프롬프트

AI에게 전달되는 시스템 프롬프트는 대략 이런 내용을 담고 있습니다:

당신은 PR-Reviewer, Git Pull Request(PR)를 리뷰하도록 설계된 언어 모델입니다.
PR 코드 변경 사항을 분석하고 다음 측면에서 평가해주세요:
- 잠재적 문제점
- 코드 품질
- 보안 우려사항
...

사용자 프롬프트에는 실제 PR 정보가 포함됩니다:

PR 정보:
제목: '새로운 로그인 기능 추가'
브랜치: 'feature/login'

PR Git Diff:
=====
## File: 'src/auth/login.js'
@@ -0,0 +1,20 @@
+ function login(username, password) {
+   // 코드 내용
+ }
...
=====

이 두 프롬프트를 조합하여 AI는 코드를 철저히 분석하고 구조화된 피드백을 제공합니다.

대규모 PR 처리 방법

대규모 PR을 처리할 때의 핵심 과제는 AI 모델의 토큰 제한을 관리하는 것입니다. PR-Agent는 이를 위해 몇 가지 스마트한 전략을 사용합니다:

1. 토큰 핸들링

self.token_handler = TokenHandler(get_settings().max_model_tokens)

토큰 핸들러는 모델의 최대 토큰 수를 관리하고, PR 내용이 너무 클 경우 자동으로 조정합니다.

2. 추가 리뷰

if self.is_incremental and self._can_run_incremental_review():
    # 새 변경사항만 리뷰

이전에 리뷰된 PR에 새 커밋이 추가되었을 때, 전체가 아닌 새 변경사항만 리뷰합니다.

3. 컨텍스트 최적화

get_pr_diff(self.git_provider,
           self.token_handler,
           model,
           add_line_numbers_to_hunks=True)

코드 차이(diff)를 가져올 때, 토큰 한도에 맞게 중요한 부분만 선택적으로 포함합니다.

AI가 만드는 구조화된 피드백

AI의 리뷰 결과는 다음과 같은 YAML 구조로 반환됩니다:

review:
  summary: "로그인 기능 구현 및 사용자 인증 흐름 추가"
  general_analysis: "코드는 전반적으로 잘 구성되어 있지만, 몇 가지 개선할 점이 있습니다..."
  security_concerns: "비밀번호가 평문으로 전송되고 있어 보안 위험이 있습니다..."
  tests_review: "로그인 실패 케이스에 대한 테스트가 누락되었습니다..."
  estimated_effort_to_review: 3
  pr_can_be_split: false

이 구조화된 응답은 마크다운 형식으로 변환되어 PR에 댓글로 게시됩니다:

## PR 리뷰

### 요약
로그인 기능 구현 및 사용자 인증 흐름 추가

### 일반 분석
코드는 전반적으로 잘 구성되어 있지만...

### 보안 우려사항
⚠️ 비밀번호가 평문으로 전송되고 있어...

### 테스트 리뷰
로그인 실패 케이스에 대한 테스트가 누락되었습니다...

### 리뷰 난이도: 3/5

특별한 기능들

티켓 컨텍스트 활용

await extract_and_cache_pr_tickets(self.git_provider, self.vars)

PR과 연결된 티켓(이슈) 정보를 추출하여 AI가 더 넓은 맥락에서 코드를 이해할 수 있게 합니다.

지속적 댓글 업데이트

if get_settings().pr_reviewer.persistent_comment:
    self.git_provider.publish_persistent_comment(...)

새 리뷰가 생성될 때마다 기존 댓글을 업데이트하여 PR 히스토리를 깔끔하게 유지합니다.

자동 라벨링

if get_settings().pr_reviewer.enable_review_labels_security:
    # 보안 관련 라벨 설정

리뷰 결과에 따라 자동으로 PR에 라벨을 추가하여 확인이 필요한 PR을 쉽게 식별할 수 있게 합니다.

profile
ML Engineer 🧠 | AI 모델 개발과 최적화 경험을 기록하며 성장하는 개발자 🚀 The light that burns twice as bright burns half as long ✨

0개의 댓글