코드 리뷰 기본기
코드 리뷰에서 무엇을 봐야 하는지, 어떤 순서로 체크하는지, AI에게 효과적으로 리뷰를 요청하는 프롬프트 구조를 배웁니다.
프리미엄 강좌 콘텐츠
이 레슨은 프리미엄 강좌의 일부예요. Pro로 업그레이드하면 모든 프리미엄 강좌와 콘텐츠를 이용할 수 있어요.
- 모든 프리미엄 강좌 이용
- 1000개 이상의 AI 스킬 템플릿 포함
- 매주 새로운 콘텐츠 추가
PR이 올라왔습니다. 300줄 diff. 어디서부터 봐야 할까요? 변수 이름? 들여쓰기? 아니면 전체 구조?
체계 없이 리뷰하면 눈에 보이는 것만 잡습니다 — 대부분 스타일 이슈죠. 진짜 중요한 로직 버그나 보안 취약점은 놓칩니다.
배울 내용
이 레슨을 마치면 리뷰할 때 무엇을 어떤 순서로 체크하는지, 그리고 AI에게 효과적으로 리뷰를 요청하는 프롬프트 구조를 갖추게 됩니다.
리뷰의 우선순위 피라미드
모든 리뷰 코멘트가 같은 가치를 가지지 않습니다. 이 순서로 보세요:
1. 정확성 (Correctness) ← 가장 중요
"이 코드가 의도한 대로 동작하는가?"
2. 보안 (Security)
"취약점이 있는가?"
3. 에러 처리 (Error Handling)
"실패하면 어떻게 되는가?"
4. 설계 (Design)
"구조가 적절한가?"
5. 가독성 (Readability)
"다른 사람이 이해할 수 있는가?"
6. 스타일 (Style) ← 린터에 맡기기
"규칙을 따르는가?"
스타일이 마지막인 이유: 린터와 포매터가 100% 자동으로 처리할 수 있습니다. 사람이 “여기 공백 하나 빠졌네요"를 지적하는 건 리소스 낭비입니다.
✅ Quick Check: 리뷰에서 스타일 이슈에 가장 많은 시간을 쓰는 팀이 있다면 어떤 조언을 하겠어요? (린터와 포매터를 CI에 넣으세요. Prettier, ESLint, Black, gofmt 같은 도구가 스타일을 자동으로 통일합니다. 사람 리뷰어의 시간은 기계가 못하는 것에 써야 합니다 — 로직 정확성, 설계 결정, 비즈니스 맥락.)
AI 리뷰 프롬프트의 구조
“이 코드 리뷰해줘"는 일반적인 코멘트만 돌아옵니다. 구체적 프롬프트가 구체적 피드백을 만듭니다.
효과적인 프롬프트 4요소
역할: "시니어 백엔드 개발자로서 이 코드를 리뷰해주세요."
맥락: "이 PR은 결제 API의 재시도 로직을 리팩토링합니다.
현재 타임아웃 시 무한 재시도 버그가 있어서 수정합니다."
초점: "다음을 중점적으로 봐주세요:
1. 재시도 로직의 정확성
2. 동시 요청 처리 시 race condition
3. 에러 응답 코드의 적절성"
출력: "각 이슈를 심각도로 분류해주세요:
🔴 Critical: 반드시 수정
🟡 Warning: 수정 권장
🔵 Info: 개선 제안"
약한 프롬프트 vs 강한 프롬프트
| 약한 프롬프트 | 강한 프롬프트 |
|---|---|
| “이 코드 리뷰해줘” | “시니어 Python 개발자로서, 이 FastAPI 엔드포인트의 인증 로직을 보안 관점에서 리뷰해줘. SQL 인젝션, 인증 우회, 입력 검증에 집중해줘.” |
| “버그 있어?” | “이 함수에서 edge case를 찾아줘: null 입력, 빈 리스트, 동시 호출, 타임아웃 상황에서 어떻게 동작하는지 분석해줘.” |
| “개선점 알려줘” | “이 코드의 유지보수성을 평가해줘. 6개월 뒤 새 개발자가 수정하기 쉬운지, 테스트하기 쉬운지 관점에서 봐줘.” |
실전 리뷰 체크리스트
AI에게 이 체크리스트를 전달하면 체계적 리뷰를 받을 수 있습니다:
코드 리뷰 체크리스트:
□ 정확성
- 의도한 기능을 정확히 수행하는가?
- edge case 처리가 되어 있는가?
- 기존 테스트가 깨지지 않는가?
□ 보안
- 사용자 입력을 검증하는가?
- SQL 인젝션, XSS 등 취약점은 없는가?
- 인증/인가 체크가 적절한가?
- 민감한 정보가 로그에 남지 않는가?
□ 에러 처리
- 외부 API 호출 실패 시 대응이 있는가?
- null/undefined 참조 가능성은?
- 에러 메시지가 디버깅에 도움이 되는가?
□ 설계
- 단일 책임 원칙(SRP)을 따르는가?
- 함수/클래스가 너무 크지 않은가?
- 적절한 추상화 수준인가?
□ 가독성
- 변수/함수 이름이 의도를 설명하는가?
- 복잡한 로직에 주석이 있는가?
- 제3자가 이해하기 쉬운가?
에러 처리: 놓치기 쉬운 것
리뷰할 때 의도적으로 물어야 하는 질문:
# ❌ happy path만 처리
def get_user(user_id):
response = api.fetch(f"/users/{user_id}")
return response.json()["data"]
# ✅ 실패 경로도 처리
def get_user(user_id):
try:
response = api.fetch(f"/users/{user_id}", timeout=5)
response.raise_for_status()
data = response.json()
return data.get("data")
except Timeout:
logger.warning(f"User API timeout: {user_id}")
raise ServiceUnavailableError("사용자 서비스 응답 지연")
except HTTPError as e:
logger.error(f"User API error: {e.status_code}")
raise
네트워크 타임아웃, HTTP 에러, JSON 파싱 실패, 키 누락 — 이 모든 것이 프로덕션에서 발생합니다.
✅ Quick Check:
response.json()["data"]에서 발생할 수 있는 에러는 몇 가지일까요? (최소 3가지: 1) JSON 파싱 실패(응답이 JSON이 아닌 경우), 2) KeyError(“data” 키가 없는 경우), 3) 응답 자체가 None인 경우. 한 줄에 숨어 있는 여러 실패 지점을 AI가 잡아줍니다.)
핵심 정리
- 리뷰 우선순위: 정확성 → 보안 → 에러 처리 → 설계 → 가독성 → 스타일 (스타일은 린터에 맡기기)
- AI 리뷰 프롬프트는 역할 + 맥락 + 초점 + 출력 형식의 4요소가 있어야 구체적 피드백을 받을 수 있습니다
- 에러 처리는 별도 체크 항목으로 의도적으로 확인해야 합니다 — happy path 리뷰만으로는 프로덕션 장애를 막을 수 없습니다
- “이 코드 리뷰해줘"가 아닌 “시니어 개발자로서 보안 관점에서 인증 로직을 리뷰해줘"가 효과적입니다
다음 레슨
리뷰의 기본 프레임워크를 갖췄습니다. 다음 레슨에서는 코드 스멜 — 작동은 하지만 구조적 문제를 신호하는 패턴들 — 을 AI로 탐지하고 분류하는 방법을 배웁니다.
이해도 체크
먼저 위의 퀴즈를 완료하세요
레슨 완료!