가독성, 정확성, 엣지 케이스를 사전 점검하고 리뷰어 체크리스트와 질문을 생성하는 Claude Code PR review 워크플로우.

PR 리뷰가 오래 걸리는 이유는 코드가 “어려워서”만은 아닙니다. 리뷰어가 변경사항(diff)에서 의도, 위험, 영향을 재구성해야 하기 때문에 시간이 늘어납니다. diff는 변경된 부분만 보여주고 전체 이야기는 보여주지 않습니다.
작은 수정 하나가 숨겨진 의존성을 건드릴 수 있습니다: 필드 이름을 바꾸면 리포트가 깨지고, 기본값을 바꾸면 동작이 달라지며, 조건문을 미세하게 바꾸면 에러 처리 방식이 변할 수 있습니다. 리뷰 시간이 길어지는 건 리뷰어가 컨텍스트를 얻으려고 여기저기 클릭하고, 로컬에서 앱을 실행해보고, PR이 무엇을 하려는지 이해하려고 추가 질문을 던져야 하기 때문입니다.
사람들의 읽기 패턴 문제도 있습니다. 우리는 diff를 예측 가능한 방식으로 훑어봅니다: “주요” 변경에 집중하고 버그가 숨어 있는 지루한 라인(경계 검사, null 처리, 로깅, 정리)을 놓치기 쉽습니다. 또한 기대하는 내용을 읽는 경향이 있어 복사·붙여넣기 실수나 조건 반전이 그대로 넘어갈 수 있습니다.
좋은 사전 검토는 결론이나 승인(approve)이 아닙니다. 빠르고 구조화된 두 번째 눈으로 사람이 속도를 늦추어야 할 지점을 가리키는 것입니다. 가장 바람직한 출력은:
하지 말아야 할 것: PR을 “승인”하거나, 요구사항을 만들어내거나, 근거 없는 런타임 동작을 추정하는 것. 만약 diff에 충분한 컨텍스트(예상 입력, 제약, 호출자 계약)가 포함되어 있지 않다면 사전 검토가 그것을 명시하고 정확히 무엇이 빠졌는지 적어야 합니다.
AI 도움은 비즈니스 로직이나 의미가 사라지기 쉬운 리팩터를 건드리는 중간 규모 PR에서 가장 강력합니다. 반대로 정답이 깊은 조직 고유 지식(레거시 동작, 프로덕션 성능 특이점, 내부 보안 규칙)에 달려 있다면 약합니다.
예: “단순히 페이지네이션을 업데이트”하는 PR은 종종 한 페이지씩 밀림(off-by-one), 빈 결과, API와 UI 간 정렬 불일치 등을 숨깁니다. 사전 검토는 사람이 30분을 들여 이를 재발견하기 전에 이런 질문들을 제기해야 합니다.
Claude를 빠르고 까다로운 1차 검토자 정도로 대하세요. PR을 배포할지 결정하는 사람이 아니라 문제를 조기에 표면화하는 것이 목적입니다: 혼란스러운 코드, 숨겨진 동작 변화, 누락된 테스트, 가까이 있으면 잊기 쉬운 엣지 케이스들.
공정한 사람 리뷰어가 필요로 할 정보를 주세요:
PR이 알려진 고위험 영역(인증, 결제, 마이그레이션, 동시성)을 건드리면 그 점을 미리 알리세요.
그다음 행동 가능한 출력물을 요청하세요. 강력한 요청 예시는:
불확실성에 대해선 사람을 관여시켜야 합니다. Claude에게 발견 항목을 “diff에서 확실한 것” vs “확인이 필요한 것”으로 라벨을 붙이게 하고, 각 우려를 불러일으킨 정확한 라인을 인용하게 하세요.
Claude는 보여주는 것만큼만 잘합니다. 거대한 diff를 목표나 제약 없이 붙여넣으면 일반적인 조언만 나오고 실제 위험을 놓칩니다.
구체적인 목표와 성공 기준으로 시작하세요. 예: “이 PR은 로그인 엔드포인트에 레이트 리미팅을 추가합니다. 응답 형태는 바뀌면 안 됩니다. 평균 지연시간은 50ms 이하를 유지해야 합니다.”
다음으로, 중요한 것만 포함하세요. 파일 20개가 바뀌었지만 실제 로직은 3개만 바뀌었다면 그 3개만 집중하세요. 스니펫만으로 오해가 생길 수 있는 경우에는 함수 시그니처, 핵심 타입, 동작을 변경하는 설정 같은 주변 컨텍스트도 포함하세요.
마지막으로 테스트 기대치를 명확히 하세요. 엣지 케이스에 대한 단위 테스트, 핵심 경로의 통합 테스트, 수동 UI 점검이 필요한지 등을 명시하세요. 테스트가 의도적으로 빠진 경우 그 이유를 적으세요.
잘 작동하는 간단한 “컨텍스트 팩”:
좋은 Claude Code PR 리뷰는 촘촘한 루프로 작동합니다: 충분한 컨텍스트를 주고 구조화된 노트를 받아 그것을 행동으로 바꿉니다. 사람을 대체하지 않습니다. 팀원이 긴 시간을 들여 읽기 전에 쉬운 실수를 잡아냅니다.
항상 같은 패스를 사용해 결과를 예측 가능하게 유지하세요:
노트를 받으면 짧은 머지 게이트로 바꾸세요:
Merge checklist (간단히 유지):
마지막으로 머지 전에 명확성을 강제하는 3~5개의 질문을 요청하세요. 예: “API가 빈 리스트를 반환하면 어떻게 되나요?” 또는 “동시 요청에서 이게 안전한가요?”
Claude는 고정된 렌즈를 주면 가장 유용합니다. 루브릭이 없으면 스타일 사소한 것에만 코멘트하는 경향이 있고, 가장 위험한 경계 케이스를 놓칠 수 있습니다.
실용적 루브릭:
프롬프트 시 각 카테고리당 한 단락씩 요청하고 “가장 위험한 이슈 우선”을 지정하세요. 그 순서는 사람들의 집중을 유지하게 합니다.
재사용 가능한 기본 프롬프트를 사용해 PR마다 결과가 비슷하게 보이도록 하세요. PR 설명을 붙이고 diff를 붙여넣으세요. 사용자에게 보이는 동작이면 예상 동작을 1~2문장 추가하세요.
You are doing a pre-review of a pull request.
Context
- Repo/service: <name>
- Goal of change: <1-2 sentences>
- Constraints: <perf, security, backward compatibility, etc>
Input
- PR description:
<...>
- Diff (unified diff):
<...>
Output format
1) Summary (max 4 bullets)
2) Readability notes (nits + suggested rewrites)
3) Correctness risks (what could break, and why)
4) Edge cases to test (specific scenarios)
5) Reviewer checklist (5-10 checkboxes)
6) Questions to ask the author before merge (3-7)
Rules
- Cite evidence by quoting the relevant diff lines and naming file + function/class.
- If unsure, say what info you need.
고위험 변경(인증, 결제, 권한, 마이그레이션)에는 명시적 실패와 롤백 사고를 추가하세요:
Extra focus for this review:
- Security/privacy risks, permission bypass, data leaks
- Money/credits/accounting correctness (double-charge, idempotency)
- Migration safety (locks, backfill, down path, runtime compatibility)
- Monitoring/alerts and rollback plan
Return a “stop-ship” section listing issues that should block merge.
리팩터의 경우 “동작 변경 없음”을 강제 규칙으로 만드세요:
This PR is a refactor. Assume behavior must be identical.
- Flag any behavior change, even if minor.
- List invariants that must remain true.
- Point to the exact diff hunks that could change behavior.
- Suggest a minimal test plan to confirm equivalence.
빠른 스킴을 원하면 “200단어 내로 답변” 같은 제한을 추가하세요. 깊이를 원하면 “추론 10개까지” 등을 요청하세요.
Claude의 노트는 사람이 닫을 수 있는 짧은 체크리스트로 바뀔 때 유용합니다. diff를 반복하지 마세요. 위험과 결정들을 캡처하세요.
항목을 두 버킷으로 나누면 스레드가 선호도 논쟁으로 흐르지 않습니다:
Must-fix (block merge)
Nice-to-have (follow-ups)
롤아웃 준비성도 캡처하세요: 가장 안전한 배포 순서, 릴리스 후 모니터링할 사항, 변경을 되돌릴 방법.
사전 검토는 명확성을 강제하는 소수의 질문으로 끝나야만 도움이 됩니다.
이 질문들에 평이한 단어로 답할 수 없다면 머지를 멈추고 범위를 좁히거나 증거를 추가하세요.
대부분 실패는 모델 문제보다 프로세스 문제입니다.
체크아웃 엔드포인트 같은 새 기능을 추가하는 PR이라면 서비스 전체를 붙여넣지 마세요. 핸들러, 검증, DB 쓰기, 스키마 변경만 붙여넣고 목표를 적으세요: “목표: 이중 청구 방지. 비목표: 네이밍 리팩터.” 그러면 코멘트 수가 줄고 검증하기 쉬운 코멘트만 옵니다.
작고 현실감 있는 PR 예: 설정 화면에 “display name” 필드를 추가합니다. 서버의 검증과 클라이언트의 UI 텍스트를 건드려 작지만 버그가 숨어있기 쉬운 변경입니다.
다음은 붙여넣을 만한 diff 스니펫(예상 동작과 관련 티켓 2~3문장과 함께):
- if len(name) == 0 { return error("name required") }
+ if len(displayName) < 3 { return error("display name too short") }
+ if len(displayName) > 30 { return error("display name too long") }
- <TextInput label="Name" value={name} />
+ <TextInput label="Display name" value={displayName} helperText="Shown on your profile" />
예상되는 발견 예시:
len(displayName)을 통과하지만 실제로는 비어 보입니다. 검증 전에 trim하세요.이를 체크리스트로 바꾸세요:
Claude Code PR 리뷰는 몇 가지 빠른 점검으로 끝날 때 가장 효과적입니다:
효과를 보려면 2~4주 동안 두 가지 지표를 추적하세요: 리뷰 시간(오픈부터 첫 의미 있는 리뷰, 오픈부터 머지까지)과 재작업(리뷰 후 추가 커밋 수 또는 코드 변경이 필요한 코멘트 수).
표준화가 완벽한 프롬프트보다 낫습니다. 하나의 템플릿을 정하고 짧은 컨텍스트 블록(무엇이 바뀌었고 왜, 어떻게 테스트할지)을 요구하며 “완료”가 무엇인지 합의하세요.
팀이 채팅 기반 개발로 기능을 만든다면 동일한 워크플로를 Koder.ai 내부에서도 적용할 수 있습니다: 변경을 생성하고 소스 코드를 내보내고, 사전 검토 체크리스트를 PR에 첨부해 사람 리뷰가 가장 위험한 부분에 집중하도록 하세요.