요즘처럼 빠른 개발 사이클을 요구하는 시대에는 코드 리뷰도 지연 없이 진행되는 것이 매우 중요합니다. 하지만 현실에서는 리뷰어의 부재나 단순한 누락으로 PR 이 오랫동안 방치되는 일이 빈번하게 발생하곤 하죠. 저는 이 문제를 해결하기 위해 "PR 리뷰 자동화 시스템"을 만들었습니다. 리뷰어가 직접 나서지 않아도, AI가 PR을 감지하고 리뷰를 생성하고, 필요에 따라 라벨링까지 자동으로 처리하는 구조입니다.

이번 글에서는 이 자동화 시스템이 어떻게 동작하는지, 그리고 이를 실제로 운영하면서 얻게 된 인사이트들을 함께 나누고자 합니다. 🤖


리뷰는 누가 하나요? AI가 합니다.

리뷰 자동화의 핵심은 LLM 기반의 리뷰 생성입니다. Gemini 모델을 활용해 코드 변경 내용을 요약하고 이에 대한 리뷰 코멘트를 생성합니다. PR이 생성된 지 1시간이 지났고, 아직 리뷰가 없는 경우에만 리뷰를 생성해 과도한 중복을 방지합니다.

리뷰 작성이 완료되면 PR에 자동으로 라벨을 추가하여 상태를 표시하고, 모든 과정을 GitHub Actions + winston 기반 로깅으로 추적합니다.

const reviews = await generateReviewByGemini(blobContents);

for (const review of reviews) {
  await octokit.rest.pulls.createReview({
    owner,
    repo,
    pull_number: pull.number,
    event: 'COMMENT',
    body: review
  });
}

이 간단한 인터페이스 덕분에 리뷰 작성은 한 줄의 프롬프트 생성으로 충분합니다.


PR 리뷰, 데이터로 들여다보기 👀

자동화 시스템을 구현한 뒤에는 "정말 잘 작동하는가?"를 확인하기 위해 데이터를 수집하고 시각화해봤습니다.

PR 번호별 이벤트 매트릭스

PR #129에 대한 리뷰, 라벨 추가, 중복 리뷰 등의 이벤트가 시간순으로 어떻게 발생했는지를 히트맵으로 표현했습니다.

한 PR에 리뷰 요청이 한 번만 발생하도록 제어했지만, 백그라운드에서 중복 확인 메시지가 꾸준히 찍히고 있음을 볼 수 있습니다. 이건 나중에 최적화 포인트가 되겠죠!

이벤트 종류별 빈도

가장 많이 발생한 이벤트는 "이미 리뷰가 제출되었습니다"라는 중복 메시지였습니다. 실제 리뷰나 라벨링은 각 한 번씩만 발생했고, 나머지는 상태 유지 메시지라고 볼 수 있습니다.


자동화 시스템 구조 요약