본 기사는 2025년 3월 26일에 작성되었습니다.
안녕하세요.
Inflab 백엔드 엔지니어 Yakpoong입니다.
코드 리뷰는 버그를 방지하고 팀의 코드 품질을 유지하기 위한 중요한 메커니즘입니다. 많은 엔지니어에게 있어 서로의 코드를 검토하며 피드백을 주고받는 시간은 필수적입니다. 하지만 팀 규모나 상황에 따라 코드 리뷰가 충분히 이루어지지 않는 경우도 자주 발생합니다.
CodeRabbit은 개발팀의 코드 리뷰를 더욱 활발하게 만들어주는 도구입니다. AI로 코드 변경 내용을 자동으로 분석하여 리뷰를 수행합니다. CodeRabbit을 사용하면 Pull Request (PR)를 생성하는 시점부터 코드 스타일, 버그 가능성, 성능 개선 포인트 등에 대한 자동 리뷰를 받을 수 있습니다.
본 기사에서는 CodeRabbit이 어떤 기능을 제공하는지, 그리고 Inflab에서 CodeRabbit을 어떻게 활용하여 코드 리뷰를 진행하고 있는지 소개합니다. 🚀
구체적으로 이해하기 쉽도록 먼저 샘플 프로젝트를 소개해 드립니다. 데모에서 자주 사용되는 spring-petclinic에 아주 간단한 기능을 구현하고 CodeRabbit에게 리뷰를 받았습니다.
주제는 동물병원용 반려동물 강좌 관리 기능 추가입니다. API Endpoint를 1개 추가하여 반려동물 강좌를 등록할 수 있도록 했습니다. 구체적인 코드는 Pull Request를 참조해 주십시오. CodeRabbit의 기능 소개가 목적이므로, 코드는 최대한 단순한 구조로 작성했습니다.
샘플 Pull Request를 바탕으로 CodeRabbit의 기능을 설명하겠습니다. 모든 기능을 다루기보다는 Inflab 개발팀이 주로 사용하는 기능에 초점을 맞춰 소개합니다. 기능의 자세한 내용은 웹사이트를 참고해 주십시오.
리뷰어가 Pull Request를 열었을 때 가장 먼저 읽는 것은 PR Summary입니다. 리뷰 대상 코드나 Pull Request에 대한 사전 지식이 부족할 경우, 우선 PR의 맥락을 파악하는 것이 중요합니다. CodeRabbit은 코드 변경 내용의 요약을 보여주어 리뷰어가 변경점을 빠르게 파악할 수 있도록 돕습니다.
PR Summary
CodeRabbit은 Pull Request가 생성되면 변경 내용을 요약하여 댓글로 달아줍니다. 다른 리뷰어는 이 요약을 읽음으로써 변경 내용의 전체적인 그림을 이해할 수 있습니다. 요약뿐만 아니라, 변경 내용을 쉽게 추적할 수 있는 Walkthrough도 작성합니다.
PR Walkthrough
또한, 엔지니어가 이해하기 쉽도록 코드 변경 내용이 한눈에 보이는 Sequence Diagram까지 생성해 줍니다. Layered Architecture가 적용되었거나 팀의 코드 규약이 정착되어 있다면, 다이어그램만으로도 코드 구현 내용을 쉽게 추측할 수 있습니다.
Sequence Diagram
리뷰어는 이러한 배경 정보를 읽고 PR의 맥락을 충분히 이해한 후에 코드 리뷰를 시작할 수 있습니다.
여기서부터는 본격적으로 CodeRabbit의 코드 리뷰를 살펴보겠습니다. CodeRabbit 도입 후, 리뷰 과정에서 큰 도움을 받고 있습니다. 특히 사람이 실수하기 쉬운 부분을 지적해 준 경우가 여러 번 있었습니다.
우선, 타이핑 중 자주 발생하는 오타(typo)까지 정확하게 찾아냅니다. 작업하다 보면 파일명이나 함수명을 잘못 입력하는 경우가 많습니다.
package org.springframework.samples.petclinic.course;
import org.springframework.data.jpa.repository.JpaRepository;
// CourseRepository를 CouresRepository로 오입력
...
사람은 이런 실수를 자주 하지만, CodeRabbit이라면 쉽게 찾아낼 수 있습니다. 실제 리뷰 사례를 보겠습니다.
クラス名のタイポ
어디가 잘못되었는지 지적할 뿐만 아니라, 어떻게 수정해야 하는지까지 제시해 줍니다. 사람이 흔히 저지르는 실수에는 또 어떤 것들이 있을까요?
함수를 호출할 때 인자(argument)를 잘못 전달하는 경우도 있습니다. 예를 들어, 다음과 같은 함수를 보겠습니다.
public class CourseService {
@Transactional()
public Course createCourse(
...
물론 최근 언어에는 이름 있는 매개변수(named parameter)와 같이 실수를 방지하는 기능이 있지만, 그럼에도 불구하고 인자의 순서를 잘못 전달하는 경우가 있습니다. 위의 함수를 다음과 같이 호출해 보겠습니다.
public class CourseFacade {
private final CourseService courseService;
public void createCourse() {
...
CodeRabbit은 이러한 실수까지도 확실하게 찾아냅니다(리뷰 내용).
関数の引数の渡し間違い
이러한 기계적인 실수는 가장 단순한 오류인 동시에, 보는 각도에 따라 인간이 가장 알아차리기 어려운 것일 수도 있습니다. CodeRabbit이라면 프로덕션 환경에 배포되기 전에 발견해 줍니다.
개발 과정에서 디버깅을 위해 작성했던 코드를 남겨두는 경우가 있습니다. 대표적인 것이 console.log()나 System.out.println()과 같은 코드의 삭제 누락입니다. 이러한 코드는 보안상 바람직하지 않을 뿐만 아니라 성능에도 영향을 미치기 때문에, 대부분의 경우 제거해야 합니다. 샘플 프로젝트에서도 CodeRabbit은 이 점을 지적하고 있습니다(리뷰 내용).
デバッグ用コードの削除漏れ
CodeRabbit은 팀의 규칙에 위배되는 코드를 작성했을 때도 지적해 줍니다. 예를 들어, 샘플 프로젝트의 다음 코드를 살펴보겠습니다.
-- schema.sql
CREATE TABLE courses (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
...
이 코드는 문법적으로는 문제가 없습니다. 그런데 '외래 키(Foreign Key)로 사용할 컬럼은 데이터 타입을 BIGINT로 한다'라는 팀 규칙이 있다고 가정해 봅시다. 문법상으로는 문제가 없기 때문에, 우연히 놓치기 쉬운 부분입니다. 그럼에도 CodeRabbit은 이러한 점까지 확실하게 찾아냅니다(리뷰 내용).
チーム規約に合わないコード
CodeRabbit은 어떤 코드가 팀의 규칙에 맞지 않는지 어떻게 판단했을까요? 사실 GitHub 프로젝트별로 CodeRabbit을 설정할 수 있기 때문에, 이처럼 커스텀 설정도 가능합니다. 구체적인 설정 방법은 후술하는 Review Instructions에서 소개하겠습니다.
여기까지는 간단한 수정 사항에 대한 CodeRabbit의 리뷰를 살펴보았습니다. 하지만 지적된 내용에 대한 해결책이 바로 떠오르지 않는 경우도 많습니다. 또한, 리뷰를 읽으면서 프로젝트 구조나 성능 최적화, 프레임워크 사용법 등에 대해 의문이 생길 수도 있습니다. 그럴 때는 CodeRabbit의 리뷰에 답장하는 형태로 자유롭게 질문할 수 있습니다. 예를 들어, 다음 코드에 대한 CodeRabbit의 리뷰를 살펴보겠습니다.
public class CourseController {
private final CourseService courseService;
public ResponseEntity<Integer> createCourse(@RequestBody CreateCourseRequest request) {
...
CodeRabbit은 API의 비즈니스 로직에서 발생하는 오류를 예외 처리하도록 지적해 주었습니다.
例外処理をしていないコード
CodeRabbit이 제안한 개선 방안도 좋지만, 저는 API에서 발생하는 오류를 교차 관심사(cross-cutting concern)로 묶어 처리하고 싶다고 생각합니다. 이런 경우에는 ChatGPT나 Claude 같은 LLM 서비스를 사용할 때와 마찬가지로 CodeRabbit에게 자유롭게 질문할 수 있습니다.
CodeRabbitに質問
질문하고 잠시 기다리면, CodeRabbit이 답변해 줍니다. 게다가 리뷰의 주고받는 과정 속에서 그 자리에서 이슈(Issue)까지 생성할 수 있습니다. 아래는 CodeRabbit이 생성한 Issue입니다.
CodeRabbitにIssueの作成を依頼
CodeRabbitが作成したIssue
CodeRabbit과의 상호작용 전체가 궁금하신 분은 이 링크를 참고해 주십시오.
지금까지 샘플 프로젝트에서 CodeRabbit을 이용한 간단한 코드 리뷰를 살펴보았습니다. 그렇다면, CodeRabbit을 더욱 똑똑한 팀 멤버로 만들기 위해서는 어떻게 해야 할까요? 예를 들어, 개발팀의 규칙(규약)을 CodeRabbit이 이해하도록 만드는 방법은 없을까요? 그 답이 바로 Review Instructions 설정입니다.
Review Instructions는 CodeRabbit이 어떤 기준으로 검토해야 하는지에 대한 가이드라인을 설정할 수 있는 기능입니다. 예를 들어, 다음과 같은 설정을 할 수 있습니다.
- DDL(데이터 정의어) 규칙 설정
- 성능 최적화 설정
- 라이브러리 배경 지식 설정
- 설정 파일 형식 설정
CodeRabbit은 .coderabbit.yaml 파일을 통해 프로젝트별로 설정을 할 수 있습니다. 자세한 내용은 공식 문서를 참고해 주시기 바랍니다. 샘플 프로젝트에 적용된 설정은 이 파일을 확인해 주세요.
문서만 읽는 것만으로는 이미지를 상상하기 어려울 수 있어, Inflab에서는 Review Instructions를 어떻게 설정하는지 간단히 소개해 드리겠습니다.
Inflab의 백엔드 팀에는 Project Architecture, HTTP API, DB Table 설계 시 따르는 규칙이 있습니다. 이러한 규칙을 .coderabbit.yaml의 instruction에 등록하면 CodeRabbit에게 컨텍스트(context)로 쉽게 전달할 수 있습니다. 다음 예시를 살펴보겠습니다.
Inflab에서는 테이블 구조를 변경할 때 DDL 변경 내용을 파일로 관리합니다. 이 DDL 변경 사항을 CodeRabbit이 검토할 때, 팀의 규칙을 알려줄 수 있습니다.
...
- path: "scripts/migrations/*.ts"
instructions:
...
위 설정에서는 “RDB Table 설계 시, PK・FK 컬럼의 타입은 BIGINT로 한다”라는 팀 규칙을 CodeRabbit에게 전달하고 있습니다. path는 파일 경로이며, instructions는 LLM 서비스에 전달되는 프롬프트입니다. 이 설정을 통해 CodeRabbit은 팀의 규칙에 맞지 않는 코드를 지적할 수 있게 됩니다.
이렇게 설정하면 CodeRabbit은 다음 코드 리뷰처럼 팀의 규칙을 준수하여 검토를 수행합니다.
チームの規約に沿ったコードレビュー
팀 전체에서 공통으로 사용할 성능 최적화 가이드를 설정할 수 있습니다. 예를 들어 Node.js 애플리케이션의 경우, Promise를 사용하면 비동기 처리를 쉽고 효율적으로 다룰 수 있습니다. 다음과 같이 설정하면 CodeRabbit에게 성능이 최적화된 비동기 로직을 작성하도록 지시할 수 있습니다.
- path: '**/*.ts'
instructions:
Independent asynchronous function calls in TypeScript should always be handled using Promise.all() or Promise.allSettled().
...
이 설정을 통해 Promise.all()과 Promise.allSettled()를 사용하여 애플리케이션 코드의 성능을 최적화하도록 CodeRabbit을 유도할 수 있습니다.
라이브러리를 사용하다 보면, 그 라이브러리의 버그가 원인이 되어 문제가 발생하는 경우가 있습니다. Inflab에서도 라이브러리 버그를 깊이 조사한 적이 몇 번 있었습니다. Inflab의 일부 Node.js 서버에서는 MikroORM을 사용합니다. MikroORM에서 innerJoinAndSelect, leftJoinAndSelect, joinAndSelect 메서드를 사용할 때, 특정 상황에서 쿼리가 잘못 실행되는 버그가 있었습니다.
다른 개발자가 원인 조사에 시간을 낭비하지 않도록, README.md에 이 버그에 대해 기재했습니다. 아울러, 이 버그와 관련된 배경 지식도 CodeRabbit에게 알려주었습니다.
...
- path: "**/*Repository.ts"
instructions:
...
이 프롬프트를 설정해 두면, 버그가 발생할 수 있는 방식으로 코드를 작성한 개발자에게 CodeRabbit이 “README.md를 참조하도록” 리뷰해 줍니다. 이는 CodeRabbit을 사내 Wiki처럼 활용한 예시이기도 합니다.
애플리케이션 개발에서는 설정 파일을 애플리케이션에 주입하는 경우가 흔합니다. Node.js 생태계에서 자주 사용되는 .env 파일이나, Spring Framework에서 사용되는 application.yml 파일이 그 예입니다. 다음과 같은 설정 파일을 살펴보겠습니다.
sqs:
queues:
- queueName: '...'
...
여기서는 endpoint에 AWS의 ARN 형식으로 값이 입력되어 있습니다. 하지만, 만약 이 값이 ARN 형식이 아니라 HTTP URI 형식이어야만 비즈니스 로직이 정상적으로 작동하지 않는다면 어떨까요? Inflab에서는 이러한 프로덕션 서버 설정 파일의 입력 실수로 인해 작은 장애가 발생한 적이 있습니다. 같은 실수를 방지하기 위해 재발 방지책으로 CodeRabbit에게 설정 파일 형식을 알려주었습니다.
...
- path: "env/**/*.yml"
instructions: >
...
위의 설정은 yml 설정 파일에 작성되는 SQS Queue 정보의 형식을 지정합니다. endpoint 값이 http로 시작하지 않으면, CodeRabbit이 개발자에게 경고 메시지를 남겨줍니다.
엔지니어들끼리 주간/월간 미팅을 열어 그동안 진행한 작업을 공유하는 경우도 많습니다. CodeRabbit의 Report 기능을 사용하면 각 GitHub 리포지토리에서 어떤 작업이 있었는지 보고서 형태로 정리해 줍니다. 서로의 작업을 공유하는 자리에서 유용한 기능입니다. 주기적으로 Report를 생성하여 Slack이나 이메일 등으로 공유할 수도 있습니다.
CodeRabbit Report
SonarQube와 같은 정적 분석 도구는 코드 품질, 보안, 버그 가능성 등을 사전에 감지해 줍니다. 하지만 이러한 도구들은 주로 코드의 정적인 패턴 분석에 초점을 맞추기 때문에, 코드의 문맥이나 의도까지 이해하기는 어렵습니다. 예를 들어, 로직의 복잡성이나 설계상의 문제, 비즈니스 흐름과 맞지 않는 구현 등은 깊이 파악하기 어려운 한계가 있습니다.
CodeRabbit은 이러한 한계를 보완하는 AI 기반 코드 리뷰 도구입니다. PR(Pull Request)에 포함된 코드 변경 내용을 사람처럼 읽고 판단하여 리뷰 코멘트를 생성합니다. 단순한 문법 오류 지적에 그치지 않고, “왜 이렇게 작성했는지”, “더 좋은 설계는 무엇인지”, “이 변경이 기존 코드에 어떤 영향을 미치는지”와 같은 문맥 기반의 피드백을 제공합니다. Inflab에서는 SonarQube와 CodeRabbit을 병행하여 사용하며 균형 잡힌 코드 품질 유지에 힘쓰고 있습니다.
여기까지 CodeRabbit의 기능과 Inflab에서의 활용 방법을 소개했습니다. 약 7개월 동안 CodeRabbit을 사용해 본 결과, 팀의 코드 리뷰 문화가 더욱 활발해졌다고 느낍니다. 물론, CodeRabbit 같은 AI Code Review Assistant가 동료에 의한 코드 리뷰를 완전히 대체할 수는 없습니다. 그럼에도 불구하고, 동료 엔지니어와 상호 보완적으로 활용함으로써 코드 리뷰의 효율성을 한층 더 높일 수 있었습니다.
최근에는 Copilot, Cursor, MCP Server 등의 Programming AI Assistant가 널리 사용되고 있습니다. 코드를 작성할 때뿐만 아니라, 코드 리뷰 단계에서도 CodeRabbit과 같은 AI Assistant를 활용하면 효율을 높일 수 있습니다. 조금이라도 재미있게 읽어주셨기를 바랍니다. 여러분의 Pull Request가 LGTM 👍으로 가득하길 응원합니다!