
AI 코드 리뷰: 자동화된 코드 품질 관리
혼자 개발하면 코드 리뷰를 받을 수 없다고 생각했는데, AI 코드 리뷰 도구가 그 역할을 해줬다. PR마다 자동으로 리뷰받는 세팅을 정리했다.

혼자 개발하면 코드 리뷰를 받을 수 없다고 생각했는데, AI 코드 리뷰 도구가 그 역할을 해줬다. PR마다 자동으로 리뷰받는 세팅을 정리했다.
서버를 끄지 않고 배포하는 법. 롤링, 카나리, 블루-그린의 차이점과 실제 구축 전략. DB 마이그레이션의 난제(팽창-수축 패턴)와 AWS CodeDeploy 활용법까지 심층 분석합니다.

ChatGPT는 질문에 답하지만, AI Agent는 스스로 계획하고 도구를 사용해 작업을 완료한다. 이 차이가 왜 중요한지 정리했다.

세 가지 AI 코딩 도구를 실제로 써보고 비교했다. 자동완성, 코드 생성, 리팩토링 각각 어디가 강한지 솔직한 후기.

롤링 배포, 블루/그린 배포와 카나리 배포는 무엇이 다를까요? 1%의 사용자에게만 먼저 배포하여 위험을 감지하는 카나리 배포의 원리와 Kubernetes/Istio 구현 전략을 정리합니다.

혼자 개발하면서 가장 아쉬운 게 코드 리뷰가 없다는 거였다. 오픈소스 프로젝트에서는 경험 많은 개발자가 내 코드 보면서 "이거 왜 이렇게 짰어?" 물어보고, "여기 버그 있을 것 같은데?" 콕 찝어주고, "이 패턴 쓰면 더 깔끔한데?" 알려줬다. 근데 솔로 파운더가 되니까 그런 피드백이 전혀 없었다. 내 코드에 문제가 있는지 없는지조차 모르고 배포하는 기분이었다.
그러다 AI 코드 리뷰 도구를 발견했다. GitHub PR마다 자동으로 코멘트 달아주는 봇이 있다는 걸 알게 됐다. 처음엔 "AI가 뭘 알겠어" 싶었는데, 써보니까 생각보다 훨씬 유용했다. 내가 놓친 버그, 보안 이슈, 스타일 문제를 콕콕 찝어줬다. 완벽하진 않지만, 아무런 리뷰도 없는 것보다는 백배 나았다.
이 글은 내가 AI 코드 리뷰를 세팅하고 쓰면서 배운 것들을 정리한 기록이다. 어떤 도구가 있고, 뭘 잘 잡아내고, 뭘 못 잡아내는지. 그리고 어떻게 세팅하면 PR마다 자동으로 리뷰받을 수 있는지.
협업할 땐 코드 리뷰가 당연했다. PR 올리면 누군가 읽어보고 코멘트 달아줬다. "이 함수 너무 길어서 읽기 어렵다", "여기 null 체크 안 하면 크래시 날 것 같은데", "이 로직 비효율적이야" 같은 피드백을 받았다. 때론 짜증났지만, 돌이켜보면 그 피드백 덕분에 실력이 늘었다.
근데 혼자 개발하기 시작하니까 그런 피드백이 제로가 됐다. 코드 짜고, 내 눈으로 한 번 훑어보고, "괜찮은 것 같은데?" 하면서 머지하고 배포했다. 문제는 내가 내 코드의 문제를 못 본다는 거였다. 내가 짠 코드니까 당연히 "이렇게 짜면 되지" 싶었고, 더 나은 방법이 있는지 생각조차 안 했다.
이게 마치 글을 쓰고 나서 바로 퍼블리시하는 것과 같았다. 편집자 없이, 베타 리더 없이, 그냥 내 눈으로만 보고 "완벽해" 하면서 올리는 거. 당연히 오타도 많고, 문맥이 이상한 부분도 있고, 논리가 안 맞는 부분도 있다. 코드도 마찬가지였다.
그래서 찾아본 게 AI 코드 리뷰 도구였다. 완벽한 솔루션은 아니지만, 적어도 내가 놓친 명백한 문제들은 잡아줄 거라고 기대했다.
CodeRabbit이라는 도구를 처음 세팅하고 PR을 올렸다. 몇 초 후에 봇이 코멘트를 달기 시작했다.
첫 번째 코멘트: "이 함수에서 user.email을 쓰는데, user가 null일 수 있어요. 옵셔널 체이닝(user?.email)을 쓰는 게 안전합니다."
순간 "아..." 했다. 정말 그랬다. 나는 당연히 유저가 로그인돼 있다고 가정하고 코드를 짰는데, 실제론 로그아웃 상태일 수도 있었다. 이걸 내가 놓친 거다.
두 번째 코멘트: "이 함수가 250줄이네요. 너무 길어서 이해하기 어렵습니다. 여러 개의 작은 함수로 나누는 걸 고려해보세요."
이것도 맞았다. 나는 "일단 돌아가게 만들자" 하면서 한 함수에 온갖 로직을 다 때려넣었다. 나중에 리팩토링하려고 했는데, 사실 언제 할지도 모르고 있었다. AI가 콕 찝어주니까 "지금 고치자" 하는 마음이 들었다.
세 번째 코멘트: "이 API 키를 하드코딩했네요. 환경 변수로 빼는 게 좋습니다."
이건 완전 뒷통수 맞는 느낌이었다. 테스트하려고 임시로 박아놓은 건데, 그대로 커밋했다. 그냥 머지했으면 API 키가 퍼블릭 레포에 올라갈 뻔했다.
이 세 가지 코멘트를 받고 나서 생각이 바뀌었다. "AI가 생각보다 훨씬 유용하네." 완벽하진 않지만, 내가 놓친 명백한 문제들을 잡아줬다. 이게 바로 내가 필요했던 거였다.
AI 코드 리뷰 도구는 생각보다 많다. 내가 써본 것들:
1. CodeRabbit내가 최종적으로 선택한 건 CodeRabbit이었다. 이유는 간단했다. 세팅이 제일 쉽고, 코멘트 퀄리티가 제일 좋았다.
설정 파일 추가
.coderabbit.yaml 파일을 리포 루트에 만들기:
# .coderabbit.yaml
language: "ko" # 한국어로 리뷰받기
early_access: true
reviews:
profile: "chill" # assertive, chill 중 선택
request_changes_workflow: false
high_level_summary: true
poem: false # 시는 끄기
review_status: true
collapse_walkthrough: false
path_filters:
- "!**/*.lock"
- "!**/dist/**"
- "!**/build/**"
auto_review:
enabled: true
drafts: false
tools:
biome:
enabled: true
eslint:
enabled: true
.coderabbit.yaml에 내 규칙 추가:reviews:
guidelines:
- "TypeScript strict 모드 규칙을 따른다"
- "any 타입 사용 금지, unknown 사용"
- "함수는 50줄 이하로 유지"
- "React 컴포넌트는 200줄 이하"
- "의미 있는 변수명 사용 (a, b, c 금지)"
- "console.log는 개발 중에만, 프로덕션 코드에서 제거"
- "에러 핸들링 누락 체크"
CI/CD 파이프라인에 AI 리뷰를 넣으면 더 강력해진다. ESLint, TypeScript 체크, 테스트 실행과 함께 AI 리뷰를 돌릴 수 있다.
# .github/workflows/code-review.yml
name: Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Run ESLint
run: npm run lint
- name: Run TypeScript Check
run: npm run type-check
- name: Run Tests
run: npm test
ai-review:
runs-on: ubuntu-latest
steps:
- name: CodeRabbit Review
uses: coderabbitai/coderabbit-action@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
이렇게 하면 PR 올릴 때마다:
4단계 방어막이 생긴다. 이 중 하나라도 실패하면 머지 못 하게 막을 수 있다.
몇 달 써보니까 AI가 특히 잘 잡아내는 패턴이 있었다:
1. Null/Undefined 에러// AI가 잡아낸 코드
function getUserEmail(userId: string) {
const user = users.find(u => u.id === userId);
return user.email; // user가 undefined일 수 있음!
}
// AI 제안
function getUserEmail(userId: string) {
const user = users.find(u => u.id === userId);
return user?.email ?? 'unknown@example.com';
}
2. 보안 이슈
// AI가 잡아낸 코드
const apiKey = "sk-1234567890abcdef"; // 하드코딩!
fetch(`https://api.example.com?key=${apiKey}`);
// AI 제안
const apiKey = process.env.API_KEY;
if (!apiKey) throw new Error('API_KEY not set');
fetch(`https://api.example.com?key=${apiKey}`);
3. 비효율적인 코드
// AI가 잡아낸 코드
function findUsers(ids: string[]) {
return ids.map(id => {
return users.find(u => u.id === id); // O(n²)
});
}
// AI 제안
function findUsers(ids: string[]) {
const userMap = new Map(users.map(u => [u.id, u]));
return ids.map(id => userMap.get(id)); // O(n)
}
4. 스타일 일관성
이런 건 AI가 거의 100% 잡아낸다. 마치 컴파일러가 문법 에러 잡아내듯이.
반대로 AI가 놓치는 것들도 있다:
1. 비즈니스 로직// 이 코드에 버그가 있지만 AI는 못 잡음
function calculateDiscount(price: number, userLevel: string) {
if (userLevel === 'premium') {
return price * 0.9; // 10% 할인
}
return price;
}
문제: 프리미엄 유저는 20% 할인받아야 하는데 10%만 적용됨. AI는 이게 버그인지 모른다. 비즈니스 요구사항을 모르니까.
2. 아키텍처 결정이런 건 AI가 판단 못 한다. 전체 시스템 맥락을 이해해야 하는데, AI는 PR 단위로만 보니까.
3. UX/제품 관점이것도 AI 밖의 영역이다.
결론: AI는 코드 레벨의 명백한 문제는 잘 잡지만, 맥락이 필요한 판단은 못 한다. 이게 한계다.
내가 CodeRabbit에 월 $12 내는 게 가치 있나?
계산해봤다:
AI 리뷰는 $12로 무제한이다. 물론 시니어 개발자만큼 꼼꼼하진 않지만, 명백한 버그의 80%는 잡아준다. 가성비는 말도 안 되게 좋다.
더 중요한 건 항상 available 하다는 거다. 새벽 3시에 PR 올려도 바로 리뷰받는다. 시니어 개발자는 그럴 수 없다.
처음엔 "AI가 사람을 대체할 수 있나?" 생각했는데, 몇 달 써보니까 답은 "아니다"였다.
AI와 사람은 다른 걸 본다:
AI의 강점:이상적인 조합: AI가 1차 리뷰, 사람이 2차 리뷰.
혼자 개발할 땐 AI만 있어도 충분하다. 하지만 팀이 있으면 AI가 trivial한 것들 걸러주고, 사람은 중요한 것들에 집중할 수 있다.
이게 마치 스펠 체커와 편집자의 관계 같다. 스펠 체커가 오타 잡아주면, 편집자는 스토리 흐름에 집중한다. 둘 다 필요하다.
혼자 개발한다고 코드 리뷰를 포기할 필요 없다. AI 도구가 그 역할을 충분히 해준다.
내가 배운 것:이제 PR 올릴 때마다 누군가 내 코드 봐준다는 안도감이 있다. 완벽하진 않지만, 혼자 덩그러니 개발하는 것보단 백배 낫다.
혼자 개발하는 사람이라면 AI 코드 리뷰, 한 번 써보길 추천한다. 생각보다 훨씬 유용할 거다.