코드리뷰테스트데이터·SQL보안by affaan-m
파이썬 코드 리뷰
PEP 8 준수, 타입 힌트, 보안, 그리고 파이써닉 관용구를 아우르는 포괄적인 파이썬 코드 리뷰를 제공하며, `python-reviewer` 에이전트를 호출합니다.
한 줄 평가 — 다음 사람 도와주세요
언제 쓰나
PEP 8 준수 여부, 타입 힌트의 적절성, 잠재적 보안 취약점, 그리고 파이썬스러운 코드 스타일에 대한 종합적인 피드백이 필요할 때 사용합니다.
SKILL.md
Lattice 한국어 번역 · 원본 affaan-m/everything-claude-code (841beea). 복사 → 저장하면 Claude Code가 인식합니다.
---
description: PEP 8 규정 준수, 타입 힌트, 보안, 파이썬 관용구에 대한 포괄적인 파이썬 코드 검토. python-reviewer 에이전트를 호출합니다.
---
# 파이썬 코드 검토
이 명령어는 포괄적인 파이썬 코드 검토를 위해 **python-reviewer** 에이전트를 호출합니다.
## 이 명령어는 무엇을 하나요?
1. **파이썬 변경 사항 식별**: `git diff`를 통해 수정된 `.py` 파일을 찾습니다.
2. **정적 분석 실행**: `ruff`, `mypy`, `pylint`, `black --check`를 실행합니다.
3. **보안 검사**: SQL 인젝션, 명령어 인젝션, 안전하지 않은 역직렬화를 확인합니다.
4. **타입 안전성 검토**: 타입 힌트와 mypy 오류를 분석합니다.
5. **파이썬 코드 확인**: 코드가 PEP 8 및 파이썬 모범 사례를 따르는지 확인합니다.
6. **보고서 생성**: 심각도별 이슈를 분류합니다.
## 언제 사용하나요?
`/python-review`는 다음과 같은 경우에 사용하세요:
* 파이썬 코드를 작성하거나 수정한 후
* 파이썬 변경 사항을 커밋하기 전
* 파이썬 코드가 포함된 풀 리퀘스트 검토 시
* 새로운 파이썬 코드베이스에 온보딩할 때
* 파이썬 패턴 및 관용구를 학습할 때
## 검토 카테고리
### CRITICAL (반드시 수정)
* SQL/명령어 인젝션 취약점
* 안전하지 않은 eval/exec 사용
* Pickle의 안전하지 않은 역직렬화
* 하드코딩된 자격 증명
* YAML의 안전하지 않은 load
* 오류를 숨기는 bare except 구문
### HIGH (수정 권장)
* 공개 함수의 타입 힌트 누락
* 가변 기본 인수
* 예외를 조용히 삼키는 경우
* 리소스에 대한 컨텍스트 관리자를 사용하지 않는 경우
* 컴프리헨션 대신 C 스타일 루핑 사용
* isinstance() 대신 type() 사용
* 잠금 없이 발생하는 경쟁 상태(Race conditions)
### MEDIUM (고려)
* PEP 8 서식 위반
* 공개 함수의 독스트링 누락
* 로깅 대신 print 문 사용
* 비효율적인 문자열 연산
* 이름 없는 상수에 대한 매직 넘버
* f-string 대신 문자열 포맷 사용
* 불필요한 리스트 생성
## 실행되는 자동 검사
```bash
# 타입 검사
mypy .
# 린팅 및 포맷팅
ruff check .
black --check .
isort --check-only .
# 보안 스캔
bandit -r .
# 종속성 감사
pip-audit
safety check
# 테스트
pytest --cov=app --cov-report=term-missing
```
## 사용 예시
```text
User: /python-review
Agent:
# 파이썬 코드 검토 보고서
## 검토된 파일
- app/routes/user.py (수정됨)
- app/services/auth.py (수정됨)
## 정적 분석 결과
✓ ruff: 이슈 없음
✓ mypy: 오류 없음
WARNING: black: 2개의 파일 재포맷 필요
✓ bandit: 보안 이슈 없음
## 발견된 이슈
[CRITICAL] SQL 인젝션 취약점
파일: app/routes/user.py:42
이슈: 사용자 입력이 SQL 쿼리에 직접 삽입됨
```python
query = f"SELECT * FROM users WHERE id = {user_id}" # 잘못됨
```
수정: 매개변수화된 쿼리 사용
```python
query = "SELECT * FROM users WHERE id = %s" # 올바름
cursor.execute(query, (user_id,))
```
[HIGH] 가변 기본 인수
파일: app/services/auth.py:18
이슈: 가변 기본 인수로 인해 공유 상태 발생
```python
def process_items(items=[]): # 잘못됨
items.append("new")
return items
```
수정: None을 기본값으로 사용
```python
def process_items(items=None): # 올바름
if items is None:
items = []
items.append("new")
return items
```
[MEDIUM] 타입 힌트 누락
파일: app/services/auth.py:25
이슈: 공개 함수에 타입 주석 없음
```python
def get_user(user_id): # 잘못됨
return db.find(user_id)
```
수정: 타입 힌트 추가
```python
def get_user(user_id: str) -> Optional[User]: # 올바름
return db.find(user_id)
```
[MEDIUM] 컨텍스트 관리자 미사용
파일: app/routes/user.py:55
이슈: 예외 발생 시 파일이 닫히지 않음
```python
f = open("config.json") # 잘못됨
data = f.read()
f.close()
```
수정: 컨텍스트 관리자 사용
```python
with open("config.json") as f: # 올바름
data = f.read()
```
## 요약
- CRITICAL: 1
- HIGH: 1
- MEDIUM: 2
권장 사항: FAIL: CRITICAL 이슈가 수정될 때까지 병합 차단
## 필요한 포맷팅
실행: `black app/routes/user.py app/services/auth.py`
```
## 승인 기준
| 상태 | 조건 |
|------------|--------------------------------------|
| PASS: 승인 | CRITICAL 또는 HIGH 이슈 없음 |
| WARNING: 경고 | MEDIUM 이슈만 있음 (주의해서 병합) |
| FAIL: 차단 | CRITICAL 또는 HIGH 이슈 발견됨 |
## 다른 명령어와의 통합
* 테스트가 통과하는지 확인하려면 먼저 `tdd-workflow` 스킬을 사용하세요.
* 파이썬 관련이 아닌 문제를 해결하려면 `/code-review`를 사용하세요.
* 커밋하기 전에 `/python-review`를 사용하세요.
* 정적 분석 도구가 실패하면 `/build-fix`를 사용하세요.
## 프레임워크별 검토
### Django 프로젝트
검토자는 다음을 확인합니다:
* N+1 쿼리 문제 (`select_related` 및 `prefetch_related` 사용)
* 모델 변경 사항에 대한 마이그레이션 누락
* ORM으로 가능한 경우 원시 SQL 사용
* 다단계 작업에 대한 `transaction.atomic()` 누락
### FastAPI 프로젝트
검토자는 다음을 확인합니다:
* CORS 잘못된 구성
* 요청 유효성 검사를 위한 Pydantic 모델
* 응답 모델의 정확성
* 적절한 async/await 사용
* 의존성 주입 패턴
### Flask 프로젝트
검토자는 다음을 확인합니다:
* 컨텍스트 관리 (앱 컨텍스트, 요청 컨텍스트)
* 적절한 오류 처리
* Blueprint 구성
* 구성 관리
## 관련
* Agent: `agents/python-reviewer.md`
* Skills: `skills/python-patterns/`, `skills/python-testing/`
## 일반적인 수정
### 타입 힌트 추가
```python
# 이전
def calculate(x, y):
return x + y
# 이후
from typing import Union
def calculate(x: Union[int, float], y: Union[int, float]) -> Union[int, float]:
return x + y
```
### 컨텍스트 관리자 사용
```python
# 이전
f = open("file.txt")
data = f.read()
f.close()
# 이후
with open("file.txt") as f:
data = f.read()
```
### 리스트 컴프리헨션 사용
```python
# 이전
result = []
for item in items:
if item.active:
result.append(item.name)
# 이후
result = [item.name for item in items if item.active]
```
### 가변 기본값 수정
```python
# 이전
def append(value, items=[]):
items.append(value)
return items
# 이후
def append(value, items=None):
if items is None:
items = []
items.append(value)
return items
```
### f-string 사용 (Python 3.6+)
```python
# 이전
name = "Alice"
greeting = "Hello, " + name + "!"
greeting2 = "Hello, {}".format(name)
# 이후
greeting = f"Hello, {name}!"
```
### 루프 내 문자열 연결 수정
```python
# 이전
result = ""
for item in items:
result += str(item)
# 이후
result = "".join(str(item) for item in items)
```
## 파이썬 버전 호환성
검토자는 코드가 최신 파이썬 버전의 기능을 사용할 때 이를 알려줍니다:
| 기능 | 최소 파이썬 |
|-------------|-----------|
| 타입 힌트 | 3.5+ |
| f-string | 3.6+ |
| Walrus 연산자 (`:=`) | 3.8+ |
| 위치 전용 매개변수 | 3.8+ |
| Match 문 | 3.10+ |
| 타입 유니온 (`x | None`) | 3.10+ |
프로젝트의 `pyproject.toml` 또는 `setup.py`에 올바른 최소 파이썬 버전이 명시되어 있는지 확인하세요.필요한 도구
호버하면 설명CC
설치 + 호출 (2단계)
Claude Code CLI 기준.
- 1
SKILL.md 저장
아래 버튼으로 복사 → 다음 경로로 저장.
~/.claude/skills/everything-claude-code-153/SKILL.md - 2
호출
Claude Code 채팅창에서 자연어로 부르면 자동 발동:
예) PEP 8 준수 여부
트리거가 안 잡히면 SKILL.md의
description줄에 더 구체적인 한국어 키워드를 추가해보세요.