mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-03-30 13:43:26 +08:00
149 lines
3.6 KiB
Markdown
149 lines
3.6 KiB
Markdown
---
|
|
description: 관용적 패턴, 동시성 안전성, 에러 처리, 보안에 대한 포괄적인 Go 코드 리뷰. go-reviewer 에이전트를 호출합니다.
|
|
---
|
|
|
|
# Go 코드 리뷰
|
|
|
|
이 커맨드는 **go-reviewer** 에이전트를 호출하여 Go 전용 포괄적 코드 리뷰를 수행합니다.
|
|
|
|
## 이 커맨드가 하는 것
|
|
|
|
1. **Go 변경사항 식별**: `git diff`로 수정된 `.go` 파일 찾기
|
|
2. **정적 분석 실행**: `go vet`, `staticcheck`, `golangci-lint` 실행
|
|
3. **보안 스캔**: SQL 인젝션, 커맨드 인젝션, 레이스 컨디션 검사
|
|
4. **동시성 리뷰**: 고루틴 안전성, 채널 사용, 뮤텍스 패턴 분석
|
|
5. **관용적 Go 검사**: Go 컨벤션과 모범 사례 준수 여부 확인
|
|
6. **보고서 생성**: 심각도별 이슈 분류
|
|
|
|
## 사용 시점
|
|
|
|
`/go-review`를 사용해야 할 때:
|
|
- Go 코드를 작성하거나 수정한 후
|
|
- Go 변경사항을 커밋하기 전
|
|
- Go 코드가 포함된 PR 리뷰 시
|
|
- 새 Go 코드베이스에 온보딩할 때
|
|
- 관용적 Go 패턴 학습 시
|
|
|
|
## 리뷰 카테고리
|
|
|
|
### CRITICAL (반드시 수정)
|
|
- SQL/커맨드 인젝션 취약점
|
|
- 동기화 없는 레이스 컨디션
|
|
- 고루틴 누수
|
|
- 하드코딩된 인증 정보
|
|
- unsafe 포인터 사용
|
|
- 핵심 경로에서 에러 무시
|
|
|
|
### HIGH (수정 권장)
|
|
- 컨텍스트 없는 에러 래핑 누락
|
|
- 에러 반환 대신 panic 사용
|
|
- 컨텍스트 전파 누락
|
|
- 데드락을 유발하는 버퍼 없는 채널
|
|
- 인터페이스 미충족 에러
|
|
- 뮤텍스 보호 누락
|
|
|
|
### MEDIUM (고려)
|
|
- 비관용적 코드 패턴
|
|
- 공개 항목에 godoc 주석 누락
|
|
- 비효율적인 문자열 연결
|
|
- 슬라이스 사전 할당 누락
|
|
- 테이블 기반 테스트 미사용
|
|
|
|
## 실행되는 자동 검사
|
|
|
|
```bash
|
|
# 정적 분석
|
|
go vet ./...
|
|
|
|
# 고급 검사 (설치된 경우)
|
|
staticcheck ./...
|
|
golangci-lint run
|
|
|
|
# 레이스 감지
|
|
go build -race ./...
|
|
|
|
# 보안 취약점
|
|
govulncheck ./...
|
|
```
|
|
|
|
## 사용 예시
|
|
|
|
````text
|
|
User: /go-review
|
|
|
|
Agent:
|
|
# Go 코드 리뷰 보고서
|
|
|
|
## 리뷰된 파일
|
|
- internal/handler/user.go (수정됨)
|
|
- internal/service/auth.go (수정됨)
|
|
|
|
## 정적 분석 결과
|
|
✓ go vet: 이슈 없음
|
|
✓ staticcheck: 이슈 없음
|
|
|
|
## 발견된 이슈
|
|
|
|
[CRITICAL] 레이스 컨디션
|
|
파일: internal/service/auth.go:45
|
|
이슈: 동기화 없이 공유 맵에 접근
|
|
```go
|
|
var cache = map[string]*Session{} // 동시 접근!
|
|
|
|
func GetSession(id string) *Session {
|
|
return cache[id] // 레이스 컨디션
|
|
}
|
|
```
|
|
수정: sync.RWMutex 또는 sync.Map 사용
|
|
```go
|
|
var (
|
|
cache = map[string]*Session{}
|
|
cacheMu sync.RWMutex
|
|
)
|
|
|
|
func GetSession(id string) *Session {
|
|
cacheMu.RLock()
|
|
defer cacheMu.RUnlock()
|
|
return cache[id]
|
|
}
|
|
```
|
|
|
|
[HIGH] 에러 컨텍스트 누락
|
|
파일: internal/handler/user.go:28
|
|
이슈: 컨텍스트 없이 에러 반환
|
|
```go
|
|
return err // 컨텍스트 없음
|
|
```
|
|
수정: 컨텍스트와 함께 래핑
|
|
```go
|
|
return fmt.Errorf("get user %s: %w", userID, err)
|
|
```
|
|
|
|
## 요약
|
|
- CRITICAL: 1
|
|
- HIGH: 1
|
|
- MEDIUM: 0
|
|
|
|
권장: ❌ CRITICAL 이슈가 수정될 때까지 merge 차단
|
|
````
|
|
|
|
## 승인 기준
|
|
|
|
| 상태 | 조건 |
|
|
|------|------|
|
|
| ✅ 승인 | CRITICAL 또는 HIGH 이슈 없음 |
|
|
| ⚠️ 경고 | MEDIUM 이슈만 있음 (주의하여 merge) |
|
|
| ❌ 차단 | CRITICAL 또는 HIGH 이슈 발견 |
|
|
|
|
## 다른 커맨드와의 연동
|
|
|
|
- `/go-test`를 먼저 사용하여 테스트 통과 확인
|
|
- `/go-build`를 사용하여 build 에러 발생 시 수정
|
|
- `/go-review`를 커밋 전에 사용
|
|
- `/code-review`를 사용하여 Go 외 일반적인 관심사항 리뷰
|
|
|
|
## 관련 항목
|
|
|
|
- 에이전트: `agents/go-reviewer.md`
|
|
- 스킬: `skills/golang-patterns/`, `skills/golang-testing/`
|