코드 리뷰
한 줄 요약
Pull Request에서 코드를 검토하고 피드백을 주고받는 과정
선행 지식
- Pull Request란 - PR의 개념
- PR 생성하기 - PR 생성 방법
개요
코드 리뷰는 다른 사람의 코드를 검토하고 피드백을 주는 과정입니다. 버그를 사전에 발견하고, 코드 품질을 높이며, 팀원 간 지식을 공유합니다.
코드 리뷰 화면
┌─────────────────────────────────────────────────────────────────┐
│ Pull Request #42: feat: 로그인 기능 추가 │
├─────────────────────────────────────────────────────────────────┤
│ [Conversation] [Commits (3)] [Files changed (5)] │
├─────────────────────────────────────────────────────────────────┤
│ │
│ src/auth/login.js +45 -10 │
│ ─────────────────────────────────────────────────────────────── │
│ 10 │ function login(email, password) { │
│ 11 │ + if (!validateEmail(email)) { ← 추가된 코드 │
│ 12 │ + throw new Error('Invalid email'); │
│ 13 │ + } │
│ 14 │ // ... rest of the code │
│ │ │
│ │ 💬 [Start a review] [Add single comment] │
│ │
└─────────────────────────────────────────────────────────────────┘
리뷰어로서
댓글 달기
- “Files changed” 탭 클릭
- 코드 줄 옆
+버튼 클릭 - 댓글 작성
┌─────────────────────────────────────────────────────────────────┐
│ 11 │ + if (!validateEmail(email)) { │
│ │ ┌───────────────────────────────────────────────────────┐ │
│ │ │ validateEmail 함수가 정의되어 있지 않은 것 같습니다. │ │
│ │ │ utils.js에서 import 해주세요. │ │
│ │ │ │ │
│ │ │ [Add single comment] [Start a review] │ │
│ │ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
리뷰 유형
| 유형 | 용도 |
|---|---|
| Comment | 단순 의견, 질문 |
| Approve | 승인 (병합 가능) |
| Request changes | 수정 요청 (수정 전 병합 불가) |
리뷰 제출
- “Review changes” 버튼 클릭
- 요약 댓글 작성
- 리뷰 유형 선택
- “Submit review” 클릭
┌─────────────────────────────────────────────────────────────────┐
│ Finish your review │
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ 전반적으로 좋습니다! 몇 가지 사소한 수정 사항 남겼습니다. │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
│ ○ Comment │
│ ○ Approve ✓ │
│ ● Request changes │
│ │
│ [Submit review] │
└─────────────────────────────────────────────────────────────────┘
좋은 리뷰 댓글
구체적으로
❌ "이거 별로예요"
✅ "이 함수가 null을 반환할 수 있는데, 호출하는 쪽에서 처리가 없어요"
이유와 함께
❌ "이름을 바꿔주세요"
✅ "getData보다 fetchUserProfile이 더 명확할 것 같아요.
무슨 데이터인지 바로 알 수 있거든요."
제안 형태로
❌ "이 코드 틀렸어요"
✅ "이 부분, 이렇게 하면 어떨까요?
```javascript
const result = items.filter(item => item.active);
```"
칭찬도 함께
✅ "이 부분 깔끔하게 리팩토링되었네요! 👍"
✅ "에러 처리가 꼼꼼하게 되어있어서 좋습니다"
리뷰 받는 사람으로서
피드백에 응답하기
리뷰어: "이 변수명이 모호해 보입니다"
응답 방식:
1. 수정: 코드 수정 후 push, "Fixed!" 댓글
2. 설명: "이 이름을 선택한 이유는..."
3. 논의: "다른 의견이 있는데, 논의해볼까요?"
리뷰 반영 후
# 1. 리뷰 내용 반영
git add .
git commit -m "fix: 리뷰 반영 - 변수명 수정"
# 2. push (PR에 자동 반영)
git push
# 3. 리뷰 댓글에 응답
# "수정했습니다!" or "Resolved"Resolve conversation
해결된 댓글은 “Resolve conversation” 버튼으로 정리합니다.
리뷰 체크리스트
코드 품질
- 코드가 읽기 쉬운가?
- 중복 코드가 없는가?
- 함수/변수 이름이 명확한가?
- 불필요한 주석이 없는가?
기능
- 요구사항을 충족하는가?
- 엣지 케이스 처리가 되었는가?
- 에러 처리가 적절한가?
보안
- 입력 검증이 되었는가?
- 민감한 정보가 노출되지 않는가?
- SQL 인젝션, XSS 등 취약점은 없는가?
성능
- 비효율적인 알고리즘은 없는가?
- 불필요한 API 호출은 없는가?
- 메모리 누수 가능성은 없는가?
리뷰 에티켓
리뷰어
- 비판이 아닌 제안 형태로
- 코드를 비판하되 사람을 비판하지 않음
- 시간 내에 리뷰 완료
- 명확하게 수정 필요/선택 사항 구분
작성자
- 열린 마음으로 피드백 수용
- 방어적이지 않게 응답
- 감사 표현 - 리뷰어의 시간을 존중
- 빠른 응답 - 리뷰 흐름 유지
자주 하는 실수
리뷰가 너무 늦음
문제: PR이 오래 열려있음
해결:
- 리뷰 요청 후 24-48시간 내 리뷰
- 바쁘면 간단히라도 확인 의사 표시
너무 까다로운 리뷰
문제: 사소한 것까지 모두 지적
해결:
- 중요도 표시: “nit:”, “minor:”, “blocker:”
- 선택 사항은 “제안입니다” 표시
관련 문서
- Pull Request란 - PR 개념
- PR 생성하기 - PR 생성 방법
- git diff - 변경사항 확인
더 알아보기
- 충돌 해결하기 - 리뷰 중 충돌 해결