코드 리뷰와 리팩토링
AI를 지치지 않는 코드 리뷰어로 활용해요. 버그 발견, 개선 제안, 자신 있는 리팩토링까지 AI와 함께해요.
프리미엄 강좌 콘텐츠
이 레슨은 프리미엄 강좌의 일부예요. Pro로 업그레이드하면 모든 프리미엄 강좌와 콘텐츠를 이용할 수 있어요.
- 모든 프리미엄 강좌 이용
- 1000개 이상의 AI 스킬 템플릿 포함
- 매주 새로운 콘텐츠 추가
🔄 이전 레슨 복습: 이전 레슨에서 AI로 테스트와 품질 보증을 배웠어요. 이제 AI를 코드 리뷰어이자 리팩토링 파트너로 활용하는 법을 다뤄요.
가장 인내심 있는 리뷰어
인간 코드 리뷰어는 소중해요. 하지만 미팅도 있고, 마감도 있고, 컨디션이 안 좋은 날도 있어요. 아침 네 번째 PR은 대충 훑어봐요. 247번째 줄에 숨겨진 미묘한 타입 변환 버그를 놓쳐요.
AI는 대충 훑어보지 않아요. 컨디션 나쁜 날이 없어요. 첫 번째 리뷰든 백 번째 리뷰든 같은 패턴을 잡아요.
AI가 인간 리뷰어를 대체한다는 게 아니에요. AI가 기계적인 검사 — 버그, 보안 이슈, 성능 패턴, 스타일 일관성 — 를 처리해서 인간 리뷰어가 아키텍처, 설계, 비즈니스 로직에 집중할 수 있다는 거예요.
AI 코드 리뷰 프롬프트
최고의 리뷰를 받는 프롬프트 구조:
이 코드를 PR용으로 리뷰해줘. 초점:
1. 버그와 로직 에러
2. 보안 취약점
3. 성능 이슈
4. 가독성과 유지보수성
맥락: [코드가 뭘 하는지 설명]
기존 규칙: [팀의 핵심 규칙 목록]
[코드 붙여넣기]
각 이슈에 대해 명시:
- 심각도 (critical/warning/suggestion)
- 라인 번호 또는 섹션
- 무엇이 잘못됐는지
- 수정 방법
리뷰 실전
실제 코드로 봐요. 사용자 인증 엔드포인트:
app.post('/api/login', async (req, res) => {
const { email, password } = req.body;
const user = await db.query(
`SELECT * FROM users WHERE email = '${email}'`
);
if (user.rows.length === 0) {
return res.status(401).json({ error: 'User not found' });
}
if (password === user.rows[0].password) {
const token = jwt.sign(
{ id: user.rows[0].id, role: user.rows[0].role },
'my-secret-key',
{ expiresIn: '24h' }
);
res.json({ token, user: user.rows[0] });
} else {
return res.status(401).json({ error: 'Wrong password' });
}
});
AI가 잡는 이슈들:
Critical: SQL 인젝션 — email이 SQL 쿼리에 직접 삽입돼요. ' OR 1=1 --을 보내면 끝이에요. 수정: 파라미터화된 쿼리 사용.
Critical: 평문 비밀번호 비교 — 비밀번호를 평문으로 비교해요. DB에 해시 없이 저장됐다는 뜻이에요. 수정: bcrypt.compare() 사용.
Critical: 하드코딩된 JWT 시크릿 — 시크릿 키가 소스 코드에 있어요. 수정: 환경 변수 사용.
Warning: 다른 에러 메시지 — 잘못된 이메일과 잘못된 비밀번호에 다른 메시지를 반환해요. 공격자가 유효한 이메일을 열거할 수 있어요. 수정: 둘 다 “Invalid credentials” 사용.
Warning: 전체 유저 객체 반환 — 비밀번호 해시와 민감한 필드가 포함될 수 있어요. 수정: 필요한 필드만 선택하거나 반환 전 정리.
6개 이슈, 3개가 치명적 보안 취약점. 피곤한 인간 리뷰어는 일부를 잡을 수도 있어요. AI는 매번 전부 잡아요.
초점 맞춘 리뷰
일반 리뷰가 아니라 특정 초점이 필요할 때:
보안 초점 리뷰
이 코드를 보안 취약점에 초점 맞춰 리뷰해줘.
확인: 인젝션 공격, 인증/인가 우회, 민감 데이터 노출,
입력 검증 누락, 안전하지 않은 암호화
성능 초점 리뷰
이 코드를 성능 이슈에 초점 맞춰 리뷰해줘.
확인: N+1 쿼리, 불필요한 메모리 할당, 누락된 DB 인덱스,
캐싱 기회, async에서의 블로킹 연산
가독성 초점 리뷰
이 코드를 가독성과 유지보수성에 초점 맞춰 리뷰해줘.
확인: 불명확한 이름, 너무 많은 것을 하는 함수,
복잡한 조건 로직, 기존 패턴과의 불일치
각 초점이 일반적인 “리뷰해줘"보다 더 깊고 관련성 있는 피드백을 줘요.
AI 지원 리팩토링
리팩토링이 AI가 진가를 발휘하는 곳이에요:
1단계: 코드 평가
200줄로 불어나서 너무 많은 책임을 가진 함수예요.
별개의 관심사를 식별하고 분리 방법을 제안해줘.
2단계: 리팩토링 계획
분석을 기반으로 리팩토링 계획을 만들어줘.
각 단계마다: 변경 내용, 추가/수정할 테스트,
아무것도 안 깨졌는지 검증 방법.
3단계: 점진적 실행
한 번에 전부 리팩토링하지 마세요. 한 번에 하나의 관심사를 추출:
리팩토링 1단계: processOrder에서 검증 로직을
별도의 validateOrder 함수로 추출해줘.
기존 테스트가 여전히 통과해야 해요.
추출된 함수에 대한 새 테스트도 추가해줘.
각 단계 후 테스트 실행. 검증. 그다음 단계로.
4단계: 리팩토링 검증
모든 단계 완료 후:
원본 함수와 리팩토링된 버전이 있어요.
검증해줘:
1. 모든 원래 동작이 보존됐는지
2. 리팩토링에서 놓친 엣지 케이스가 없는지
3. 에러 처리가 동등하거나 더 나은지
핵심 정리
- AI는 기계적 이슈를 일관되게 잡아요 — 보안 결함, 성능 패턴, 스타일 위반
- 초점 맞춘 리뷰 (보안, 성능, 가독성)가 더 깊고 실행 가능한 피드백을 줘요
- 인간 리뷰 전에 AI 리뷰를 해서 뻔한 이슈를 먼저 잡으세요
- 리팩토링은 점진적으로: 평가, 계획, 단계별 실행, 검증
- 인간 리뷰어는 아키텍처, 설계, 비즈니스 로직에 집중해야 해요
다음 레슨: 문서화와 지식 공유 — 모든 개발자가 해야 한다고 알지만 시간을 내지 못하는 것. AI가 이 방정식을 바꿔요.
이해도 체크
먼저 위의 퀴즈를 완료하세요
레슨 완료!