코드 리뷰 요정, CodeRabbit이 나타났다 🐰
안녕하세요. 인프랩의 백엔드 개발자 약풍입니다.
코드 리뷰는 버그를 예방하고, 팀의 코드 품질을 유지시키는 중요한 장치입니다. 많은 개발자들이 서로의 코드에 대해 리뷰하고 피드백하는 시간은 꼭 필요하지만, 팀의 규모나 상황에 따라 코드 리뷰가 꼼꼼하게 이루어지지 않는 경우들도 종종 생깁니다.
CodeRabbit은 개발팀이 더 활발한 코드리뷰를 할 수 있도록 도와줍니다. CodeRabbit은 AI 기술을 활용하여 코드 변경 사항을 자동으로 분석하고, 코드에 대해 리뷰합니다. 개발자들은 CodeRabbit을 통해 Pull Request(PR) 생성과 동시에 코드 스타일, 버그 가능성, 성능 개선 포인트 등을 자동으로 리뷰받을 수 있습니다.
이 글에서는 CodeRabbit이 어떤 기능을 제공하는지, 인프랩에서는 어떻게 CodeRabbit 을 활용하여 코드리뷰를 하고있는지 살펴보겠습니다. 🚀
예시 프로젝트
구체적인 이해를 돕기 위하여, 예시 프로젝트를 먼저 소개하겠습니다. 시연용 데모 프로젝트로 자주 사용되는 spring-petclinic 프로젝트에 아주 간단한 피처 기능을 구현하며, CodeRabbit 의 코드리뷰를 받아보겠습니다.
동물병원에 반려동물용 강의 관리 기능을 추가해 보겠습니다. API Endpoint 를 하나 추가하고, 반려동물용 강의를 입력하는 기능을 구현해야 합니다. 구체적인 코드 내용은 Pull Request 를 참고해 주세요. CodeRabbit 의 기능을 소개하기 위해, 코드는 최대한 간단한 구조로 구성해 보았습니다.
CodeRabbit 의 기능 소개
예제 Pull Request 를 바탕으로, CodeRabbit 의 기능을 설명해 보겠습니다. CodeRabbit 에서 제공하는 모든 기능을 소개하지는 않고, 인프랩 개발팀에서 주로 사용하는 기능들을 위주로 설명하겠습니다. CodeRabbit 의 구체적인 기능들은 웹사이트 를 참고해 주세요.
1. 코드 변경사항 요약
코드를 리뷰하는 개발자가 처음 Pull Request 를 열었을 때 읽는 것은 PR Summary 입니다. 리뷰하려는 코드나 Pull Request에 대한 배경지식이 많지 않은 경우, Pull Request 에 대한 문맥을 파악하는 것이 중요합니다. CodeRabbit은 코드 변경사항의 요약본을 보여주고, 리뷰어가 코드 변경사항을 빠르게 파악할 수 있도록 도와줍니다.

CodeRabbit 은 Pull Request 가 열릴 때, 코드의 변경사항을 요약하여 댓글로 달아줍니다. Pull Request 를 리뷰할 다른 개발자들은 이 요약을 읽고, 코드 변경사항에 대한 전반적인 이해를 얻을 수 있습니다. 단순히 요약만 적어줄 뿐만 아니라, 코드의 변경사항을 쉽게 파악할 수 있는 Workthrough를 작성해 줍니다.

또한 개발자들이 이해하기 쉽도록, 코드의 변경사항을 한 눈에 이해할 수 있는 Sequence Diagram 도 생성해 줍니다. Layered Architecture 가 적용되어 있거나, 팀의 코드 컨벤션이 정착되어 있다면 다이어그램 만으로 코드의 구현 내용을 쉽게 예상해 볼 수 있습니다.

리뷰어들은 이러한 배경사항을 읽고, PR 의 문맥을 충분히 이해한 후에 코드리뷰를 시작할 수 있습니다.
2. 코드 리뷰 및 피드백
이제부터는 본격적으로 CodeRabbit 의 코드 리뷰를 살펴보겠습니다. CodeRabbit 을 도입한 후에 리뷰 과정에서 많은 도움을 받았는데, 특히 인간이라면 자주 하게되는 실수들을 CodeRabbit 이 잡아준 적이 많습니다.
오타에 대한 피드백
먼저 타이핑을 하는 과정에서 자주 발생하는 오타를 잘 잡아줍니다. 예를 들어, 작업을 하다 보면 다음과 같이 파일명이나 함수명에 오타를 내는 경우가 종종 있습니다.
package org.springframework.samples.petclinic.course;
import org.springframework.data.jpa.repository.JpaRepository;
// CourseRepository 를 CouresRepository 로 잘못 입력
public interface CouresRepository extends JpaRepository<Course, Integer> {}
이러한 실수는 인간은 잘 하지만, CodeRabbit 은 쉽게 잡아낼 수 있습니다. CodeRabbit 이 해 준 리뷰를 살펴보겠습니다.

CodeRabbit 이 어떤 부분을 실수했는지 알려주고, 어떻게 수정할 수 있는지도 가이드 해주는 것을 확인할 수 있습니다. 인간이 자주 하게 되는 실수는 또 무엇이 있을까요 ?
함수의 인자를 잘못 넘긴 경우
함수를 호출할 때, 인자값을 잘못 넘기는 경우도 있습니다. 예를 들어, 다음과 같은 함수를 살펴보겠습니다.
public class CourseService {
@Transactional()
public Course createCourse(
String name,
String description,
String difficulty,
Integer vetId) {
...
}
}
물론 최근의 언어들에서는 named parameter과 같이 실수를 방지하게 해주는 기능들이 제공되지만, 그럼에도 인자값의 순서를 헷갈려 서 잘못 넘기는 경우가 있습니다. 위의 함수를 다음과 같이 호출해 보겠습니다.
public class CourseFacade {
private final CourseService courseService;
public void createCourse() {
String name = "하루 30분 집사 완전정복";
String description = "인간의 행동과 심리를 배울 수 있는 강의입니다";
String difficulty = "초급";
Integer vetId = 1;
// 인자값을 잘못 넘김
courseService.createCourse(name, description, description, vetId);
}
}
이러한 실수도 CodeRabbit 은 잘 잡아내고 있습니다 (리뷰 내용).

이러한 기계적인 실수는 가장 단순한 실수이지만, 어떻게 보면 사람이 가장 잡기 힘든 실수들이기도 합니다. CodeRabbit 은 이러한 실수들이 프로덕션 환경에 배포되기 전에 잡아줄 수 있습니다.
디버깅을 위한 코드를 남겨놓은 경우
개발을 하는 과정에서 디버깅을 위해 작성한 코드들을 남겨놓는 경우가 있습니다. 가장 대표적으로 console.log()
나 System.out.println()
과 같은 코드들을 삭제하지 않은 경우들이 있습니다. 이러한 코드들은 보안에 좋지 않을 수 있고 성능에도 영향을 주기 때문에, 대부분의 경우 코드에서 삭제해야 합니다. 예제 프로젝트에서도 CodeRabbit 은 이러한 점을 지적하고 있습니다. (리뷰 내용)

팀의 컨벤션에 어긋나는 경우
CodeRabbit 은 팀의 컨벤션에 어긋나는 코드를 작성한 경우도 잡아줍니다. 예를 들어, 예시 프로젝트의 다음과 같은 코드를 살펴봅시다.
-- schema.sql
CREATE TABLE courses (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name VARCHAR(255),
description VARCHAR(1000),
difficulty VARCHAR(255),
-- (팀 컨벤션) Foreign Key 역할을 하는 컬럼은 BIGINT 로 지정해야 함
vet_id INTEGER
);
이 코드는 문법적으로는 문제가 없습니다. 하지만 Foreign Key 역할을 하는 컬럼은 BIGINT
타입으로 데이터 타입을 설정해야 하는 팀 컨벤션이 있다고 가정해 보겠습니다. 위의 코드는 문법적으로는 문제가 없는 코드여서, 자칫 놓칠 수 있는 부분입니다. 하지만 CodeRabbit 은 이러한 부분도 잘 잡아내고 있습니다. (리뷰 내용)

CodeRabbit 은 어떻게 팀 컨벤션에 맞지 않는 코드가 무엇인지 알 수 있었을까요 ? Github Project 마다 CodeRabbit에 대한 설정을 할 수 있기 때문에, 위와 같은 커스텀 설정도 가능합니다. 구체적인 설정 방법은 Review Instructions 파트에서 살펴보도록 하겠습니다.
3. 코드 질문 및 이슈 생성
위의 예시들에서는 간단한 변경사항들에 대한 CodeRabbit 의 코드 리뷰를 살펴보았습니다. 하지만 리뷰해준 내용에 대한 해결책이 바로 떠오르지 않는 경우도 종종 있습니다. 또는 코드리뷰를 읽으며 프로젝트 구조, 성능 최적화, 프레임워크의 사용법 등에 대해 궁금해질 수 있습니다. 이럴 때에는 CodeRabbit 의 코드리뷰에 질문을 하는 방식으로 자유롭게 질문을 할 수 있습니다. 예를 들어, 다음의 코드에 대한 CodeRabbit 의 리뷰를 살펴보겠습니다.
public class CourseController {
private final CourseService courseService;
public ResponseEntity<Integer> createCourse(@RequestBody CreateCourseRequest request) {
Course course = courseService.createCourse(
request.getName(),
request.getDescription(),
request.getDifficulty(),
request.getVetId()
);
return ResponseEntity.ok(course.getId());
}
}
CodeRabbit 은 API 의 비즈니스 로직에 대해 발생하는 에러에 대해 예외처리를 하라고 리뷰해 주었습니다.

CodeRabbit 이 추천해 준 개선방향도 좋지만, 저는 API 에서 발생하는 에러들을 공통 관심사로 묶어서 처리하고 싶습니다. 이러한 경우에는 ChatGPT, Claude 와 같은 LLM 서비스를 이용할 때와 비슷하게, CodeRabbit 에게 자유롭게 질문을 할 수 있습니다.

CodeRabbit에게 질문을 한 후 잠시 기다리면, CodeRabbit 은 질문에 대한 답변을 해줍니다. 더 나아가, CodeRabbit 과 코드리뷰를 하며 바로 Issue 를 생성할 수 있습니다. 다음은 CodeRabbit 가 생성해 준 Issue 입니다.


CodeRabbit과의 전체 대화내용이 궁금하신 분들은 링크를 참고해 주세요.
4. Review Instructions
지금까지 예시 프로젝트를 통해 CodeRabbit과 간단한 코드리뷰를 해 주었습니다. 그런데 CodeRabbit 을 더 똑똑한 팀원으로 만들 수 있는 방법은 무엇이 있을까요 ? 예를 들어, 개발팀의 컨벤션에 대해 코드레빗이 이해할 수 있게 하는 방법은 무엇이 있을까요 ? 바로 Review Instructions 를 설정하는 것입니다. Review Instructions 는 CodeRabbit 이 코드리뷰를 할 때, 어떤 기준으로 리뷰를 해야 하는지에 대한 가이드라인을 설정할 수 있는 기능입니다. 예를 들어, Review Instructions 를 통해 다음과 같은 설정을 할 수 있습니다.
- DDL 컨벤션 설정
- 성능 최적화 설정
- 라이브러리 배경지식 설정
- 설정 파일 형식 설정
CodeRabbit은 .coderabbit.yaml
파일을 통해 프로젝트별 설정을 할 수 있습니다. CodeRabbit 의 공식 문서에 상세히 기술되어 있으니, 구체적인 설정은 문서를 참고해 주세요. 예시 프로젝트에서 적용된 CodeRabbit 설정은 이 파일을 참고해 주시면 됩니다.
문서만 읽으면 살짝 감이 오지 않으실 수도 있으니, 인프랩에서는 어떻게 Review Instructions 를 설정하고 있는지 간단히 소개해 보겠습니다.
예시 1) DDL 컨벤션 설정
인프랩의 백엔드 팀은 Project Architecture, HTTP API, DB Table 설계 시 따르고 있는 컨벤션이 있습니다. 이러한 컨벤션들을 .coderabbit.yaml
의 instruction 에 등록하여, 쉽게 CodeRabbit 에게 컨택스트로 삽입할 수 있습니다. 예를 들어, 다음의 예시를 살펴보겠습니다.
인프랩은 테이블의 구조를 변경할 때, DDL 적용사항을 파일로 관리하고 있습니다. 코드래빗에게 DDL 적용사항을 검토할 때, 팀의 컨벤션을 알려줄 수 있습니다.
...
- path: "scripts/migrations/*.ts"
instructions: >
As a team convention, we do not specify FK constraints. Please avoid suggesting adding FK constraints in code reviews.
This file is a TypeScript file, but the SQL statements that modify the table structure are written as strings. For columns used as primary keys (PK) or foreign keys (FK), you must follow the convention of specifying the column type as "bigint".
If a table column name is "id" or ends with "_id", verify that the column type is "bigint". If the SQL is written with a type other than "bigint", issue a warning. This convention is mandatory, so please raise the severity level of the warning. Add the following characters to the beginning of the warning message so that users can easily notice it: 🚨🚨🚨
...
위의 설정은 RDB Table 설계시 PK, FK 시 컬럼의 타입을 BIGINT
로 설정해야 한다는 팀 컨벤션을 CodeRabbit 에게 알려주고 있습니다. 위의 예시에서 path
는 파일의 경로를, instructions
는 LLM 서비스에게 제공될 프롬프트를 의미합니다. 이러한 설정을 통해, CodeRabbit 은 팀의 컨벤션에 맞지 않는 코드에 대해 리뷰를 해 줄 수 있습니다.
위와 같은 설정을 한다면, CodeRabbit 은 다음의 코드리뷰와 같이 팀의 컨벤션에 맞게 코드리뷰를 해 줍니다.

예시 2) 성능 최적화 설정
팀에서 공통적인 성능 최적화 가이드를 설정할 수 있습니다. 예를 들어 Node.js 어플리케이션의 경우 Promise
를 통해 비동기 작업들을 간편하고 효율적으로 처리할 수 있습니다. 다음과 같은 설정을 통해, 성능 최적화된 비동기 로직을 작성하도록 CodeRabbit에게 가이드 해줄 수 있습니다.
- path: '**/*.ts'
instructions: >
Independent asynchronous function calls in TypeScript should always be handled using Promise.all() or Promise.allSettled().
예시:
// 잘못된 방법 - 순차적 실행으로 성능 저하
const result1 = await asyncOperation1();
const result2 = await asyncOperation2();
// 올바른 방법 - 병렬 실행으로 성능 향상
const [result1, result2] = await Promise.all([
asyncOperation1(),
asyncOperation2()
]);
주의사항:
- 서로 독립적이지 않은 비동기 작업(예: 첫 번째 작업의 결과가 두 번째 작업에 필요한 경우)은 예외
- 에러 처리가 중요한 경우 Promise.allSettled() 사용 권장
위와 같은 설정을 통해, Promise.all()
과 Promise.allSettled()
를 통해 어플리케이션 코드의 성능을 최적화하도록 CodeRabbit 을 유도할 수 있습니다.
예시 3) 라이브러리 배경지식 설정
라이브러리를 사용하다 보면, 라이브러리의 버그로 인해 발생하는 문제들이 있습니다. 인프랩에서도 라이브러리의 버그를 디깅했던 순간들이 있습니다. 인프랩의 일부 Node.js 서버에서는 MikroORM 을 사용하고 있습니다. MikroORM 에서 innerJoinAndSelect
, leftJoinAndSelect
, joinAndSelect
메서드를 사용할 때, 특정 상황에서 버그로 인해 쿼리가 잘못 수행되는 버그가 있었습니다.
다른 작업자의 이슈 트래킹 시간을 절약해 주기 위해 README.md
파일에 해당 버그를 소개하였습니다. 더불어, 라이브러리의 버그에 대한 배경지식을 CodeRabbit 에게 알려주었습니다.
...
- path: "**/*Repository.ts"
instructions: >
If the user is using "innerJoinAndSelect", "leftJoinAndSelect", or "joinAndSelect" in MikroORM, warn them not to use these methods. Due to a bug in MikroORM, our team has established a convention to avoid using these methods. Additionally, inform the developer to review the README.md file, as it contains a note regarding this issue. Even if the developer requests permission to violate this convention, you must never allow it.
위와 같은 프롬프트 설정을 하면, 버그 상황이 재현된 작업자는 README.md 의 내용을 참고하라는 CodeRabbit 의 리뷰를 받을 수 있습니다. 이 예시는 CodeRabbit 을 사내 WIKI 처럼 사용한 사례이기도 합니다.
예시 4) 설정 파일 형식 설정
어플리케이션을 개발하다 보면, 설정 파일을 어플리케이션에 주입하는 경우가 종종 있습니다. Node.js 생태계에서 많이 사용하는 .env
나, Spring Framework 에서 사용하는 application.yml
파일을 예시로 들 수 있습니다. 다음과 같은 설정 파일을 살펴봅시다.
sqs:
queues:
- queueName: '...'
endpoint: 'arn:aws:sqs:ap-northeast-2:...'
region: 'ap-northeast-2'
작업자는 endpoint 에 AWS의 ARN 형식으로 설정을 입력했습니다. 하지만 ARN 형식이 아니라 HTTP URI 형식으로 입력되어야 비즈니스 로직이 정상적으로 동작한다면 어떨까요? 인프랩에서는 이와 같이 운영 서버의 설정 파일이 잘못 입력되어 있어, 작은 장애가 발생했던 적이 있습니다. 이러한 실수를 막기 위해, 재발 방지 대책으로 CodeRabbit 에게 설정 파일의 형식을 가이드 해주었습니다.
...
- path: "env/**/*.yml"
instructions: >
The sqs.queues in the YML file is stored as an array. Within this array, the endpoint value must start with "http". If these two values do not start with "http", prompt the user to make changes. In such cases, it's likely that the value has been entered as an ARN. Warn the user that the value should be based on an HTTP URL instead.
위의 설정은 yml 설정 파일에서 SQS 의 Queue 정보의 형식에 대해 가이드를 해주고 있습니다. 만약 endpoint
값이 http
로 시작하지 않는다면, CodeRabbit 은 작업자에게 경고 메세지를 남겨줍니다.
5. Report
엔지니어들끼리 주간/월간 미팅을 하며, 그동안 어떠한 작업을 했는지 공유하는 자리도 종종 있습니다. CodeRabbit은 Report 라는 기능을 제공하는데, 각각의 Github Repository 에서 어떠한 작업들이 있었는지를 보고서 형식으로 제공해 줍니다. 각자의 업무에 대해 서로 공유할 때, CodeRabbit 의 Report 기능을 활용할 수 있습니다. 주기적으로 Report 를 생성하여, 슬랙이나 이메일 등을 통해 공유하는 것도 가능합니다.

정적 분석도구와의 차이
SonarQube와 같은 정적 분석 도구는 코드 품질, 보안, 버그 가능성 등을 사전에 탐지해 줍니다. 하지만 이러한 도구들은 주로 코드의 정적 패턴 분석에 초점을 맞추기 때문에, 코드의 맥락이나 의도까지 이해하기는 어렵습니다. 예를 들어, 로직의 복잡성이나 설계상의 문제, 비즈니스 흐름에 맞지 않는 구현에 대해서는 깊게 파악하기 힘들다는 한계가 존재합니다.
CodeRabbit은 이런 한계를 보완하는 AI 기반 코드 리뷰 도구로, PR에 포함된 코드 변경 내용을 사람처럼 읽고 판단하여 리뷰 코멘트를 생성합니다. 단순한 문법 오류가 아니라, “왜 이렇게 작성했는지”, “더 나은 설계는 무엇인지”, “이 변경이 기존 코드와 어떤 영향을 주는지”와 같은 맥락 기반 피드백을 제공합니다. 인프랩에서는 SonarQube 와 CodeRabbit 을 함께 사용하여 균형있는 코드 퀄리티 유지를 위해 노력하고 있습니다.
마치며
지금까지 CodeRabbit 의 기능을 간단히 살펴보고, 인프랩에서는 어떻게 활용하고 있는지를 알아보았습니다. 약 7개월간 CodeRabbit 을 사용하며, 팀의 코드리뷰 문화가 더 활성화 되었다고 느꼈습니다. 물론 CodeRabbit 과 같은 AI Code Review Assistant 가 동료들의 코드리뷰를 완전히 대체할 수는 없지만, 동료 개발자들과 상호보완하여 코드리뷰의 효율성을 더 높일 수 있었습니다.
요즘 Copilot, Cursor, MCP Server 등의 Programming AI Assistant 들이 많이 활용되고 있습니다. 코드를 작성할 때 뿐만아니라, 코드리뷰 단계에서도 CodeRabbit과 같은 AI Assistant 를 활용하여 효율성을 높일 수 있습니다. 조금이나마 재미있게 글을 읽으셨길 바라며, 여러분의 Pull Request에 LGTM 👍
이 가득하길 바랍니다!