backend-claude-code 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.json +42 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +35 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +33 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +32 -0
- package/.mcp.json +19 -0
- package/CLAUDE.md +126 -0
- package/README.md +142 -0
- package/agents/code-reviewer.md +84 -0
- package/agents/database-reviewer.md +91 -0
- package/agents/java-build-resolver.md +127 -0
- package/agents/java-performance-reviewer.md +262 -0
- package/agents/planner.md +99 -0
- package/agents/security-reviewer.md +119 -0
- package/agents/tdd-guide.md +189 -0
- package/bin/cli.js +144 -0
- package/commands/db-migrate.md +134 -0
- package/commands/dev-build.md +72 -0
- package/commands/dev-coverage.md +73 -0
- package/commands/dev-fix.md +75 -0
- package/commands/dev-plan.md +501 -0
- package/commands/dev-review.md +144 -0
- package/commands/dev-run.md +385 -0
- package/commands/dev-test.md +89 -0
- package/commands/dev-verify.md +95 -0
- package/commands/dev.md +45 -0
- package/commands/git-commit.md +112 -0
- package/commands/git-issue.md +74 -0
- package/commands/git-pr.md +184 -0
- package/commands/git-push.md +28 -0
- package/package.json +24 -0
- package/rules/architecture.md +33 -0
- package/rules/coding-style.md +113 -0
- package/rules/controller-patterns.md +63 -0
- package/rules/dto-patterns.md +76 -0
- package/rules/entity-patterns.md +70 -0
- package/rules/error-handling.md +56 -0
- package/rules/hooks.md +73 -0
- package/rules/repository-patterns.md +75 -0
- package/rules/security.md +101 -0
- package/rules/service-patterns.md +70 -0
- package/rules/testing.md +174 -0
- package/skills/api-design/SKILL.md +523 -0
- package/skills/architecture-decision-records/SKILL.md +179 -0
- package/skills/database-migrations/SKILL.md +429 -0
- package/skills/hexagonal-architecture/SKILL.md +276 -0
- package/skills/java-coding-standards/SKILL.md +236 -0
- package/skills/jpa-patterns/SKILL.md +218 -0
- package/skills/postgres-patterns/SKILL.md +147 -0
- package/skills/springboot-patterns/SKILL.md +255 -0
- package/skills/springboot-security/SKILL.md +241 -0
- package/skills/springboot-tdd/SKILL.md +236 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(./mvnw:*)",
|
|
5
|
+
"Bash(./gradlew:*)",
|
|
6
|
+
"Bash(mvn:*)",
|
|
7
|
+
"Bash(gradle:*)",
|
|
8
|
+
"Bash(java -version:*)",
|
|
9
|
+
"Bash(git diff:*)",
|
|
10
|
+
"Bash(git log:*)",
|
|
11
|
+
"Bash(git status:*)",
|
|
12
|
+
"Bash(git diff --name-only:*)",
|
|
13
|
+
"Bash(grep -rn:*)",
|
|
14
|
+
"Bash(find . -name:*)",
|
|
15
|
+
"Bash(ls:*)"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"hooks": {
|
|
19
|
+
"PostToolUse": [
|
|
20
|
+
{
|
|
21
|
+
"matcher": "Edit|Write",
|
|
22
|
+
"hooks": [
|
|
23
|
+
{
|
|
24
|
+
"type": "command",
|
|
25
|
+
"command": "if echo \"$FILE_PATH\" | grep -q '\\.java$'; then echo '[Hook] Java 파일 변경 감지 — 컴파일 중...'; (./mvnw compile -q --no-transfer-progress 2>&1 | tail -5 || ./gradlew compileJava -q 2>&1 | tail -5) && echo '[Hook] 컴파일 OK' || echo '[Hook] 컴파일 실패 — /java-build 실행을 권장합니다'; fi"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"Stop": [
|
|
31
|
+
{
|
|
32
|
+
"matcher": "",
|
|
33
|
+
"hooks": [
|
|
34
|
+
{
|
|
35
|
+
"type": "command",
|
|
36
|
+
"command": "if [ -f pom.xml ] || [ -f build.gradle ] || [ -f build.gradle.kts ]; then echo '[Hook] 최종 빌드 검증 중...'; (./mvnw verify -q --no-transfer-progress 2>&1 | tail -10 || ./gradlew check -q 2>&1 | tail -10) && echo '[Hook] 모든 검사 통과' || echo '[Hook] 검증 실패 — 빌드 로그를 확인하세요'; fi"
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 버그 리포트
|
|
3
|
+
about: 버그를 발견했을 때 사용하세요
|
|
4
|
+
title: '[BUG] '
|
|
5
|
+
labels: bug
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 버그 설명
|
|
10
|
+
<!-- 어떤 문제가 발생했는지 간략히 설명 -->
|
|
11
|
+
|
|
12
|
+
## 재현 절차
|
|
13
|
+
1.
|
|
14
|
+
2.
|
|
15
|
+
3.
|
|
16
|
+
|
|
17
|
+
## 기대 동작
|
|
18
|
+
<!-- 어떻게 동작해야 하는지 -->
|
|
19
|
+
|
|
20
|
+
## 실제 동작
|
|
21
|
+
<!-- 실제로 어떻게 동작하는지 -->
|
|
22
|
+
|
|
23
|
+
## 로그 / 스택 트레이스
|
|
24
|
+
```
|
|
25
|
+
# 관련 로그나 스택 트레이스를 붙여넣으세요
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 환경
|
|
29
|
+
- Spring Boot 버전:
|
|
30
|
+
- Java 버전:
|
|
31
|
+
- OS:
|
|
32
|
+
- 빌드 도구 (Maven / Gradle):
|
|
33
|
+
|
|
34
|
+
## 추가 정보
|
|
35
|
+
<!-- 기타 관련 정보 (스크린샷, 설정 파일 등) -->
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 기능 요청
|
|
3
|
+
about: 새로운 기능을 제안할 때 사용하세요
|
|
4
|
+
title: '[FEAT] '
|
|
5
|
+
labels: enhancement
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 목적
|
|
10
|
+
<!-- 이 기능이 왜 필요한지, 어떤 문제를 해결하는지 -->
|
|
11
|
+
|
|
12
|
+
## 도메인 / 레이어
|
|
13
|
+
<!-- 어느 영역에 해당하는지 체크 -->
|
|
14
|
+
- [ ] Controller (API 엔드포인트)
|
|
15
|
+
- [ ] Service (비즈니스 로직)
|
|
16
|
+
- [ ] Repository (데이터 접근)
|
|
17
|
+
- [ ] Domain (엔티티 / VO)
|
|
18
|
+
- [ ] 인프라 (설정, 보안, 배포)
|
|
19
|
+
|
|
20
|
+
## 제안하는 해결책
|
|
21
|
+
<!-- 어떻게 구현하면 좋을지 -->
|
|
22
|
+
|
|
23
|
+
## 인수 조건
|
|
24
|
+
<!-- 이 기능이 완료됐다고 판단하는 기준 -->
|
|
25
|
+
- [ ]
|
|
26
|
+
- [ ]
|
|
27
|
+
- [ ]
|
|
28
|
+
|
|
29
|
+
## 대안
|
|
30
|
+
<!-- 고려한 다른 접근법이 있다면 -->
|
|
31
|
+
|
|
32
|
+
## 추가 정보
|
|
33
|
+
<!-- 참고 자료, 관련 이슈 등 -->
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
## 변경 내용
|
|
2
|
+
<!-- 무엇을 바꿨는지 간략히 -->
|
|
3
|
+
|
|
4
|
+
## 변경 이유
|
|
5
|
+
<!-- 왜 이 변경이 필요한지 -->
|
|
6
|
+
|
|
7
|
+
## 관련 이슈
|
|
8
|
+
<!-- Closes #123 -->
|
|
9
|
+
|
|
10
|
+
## 테스트
|
|
11
|
+
- [ ] 단위 테스트 추가/수정 (`@ExtendWith(MockitoExtension.class)`)
|
|
12
|
+
- [ ] 웹 레이어 테스트 (`@WebMvcTest`)
|
|
13
|
+
- [ ] 통합 테스트 (`@SpringBootTest`)
|
|
14
|
+
- [ ] JaCoCo 커버리지 80%+ 확인 (`./mvnw verify`)
|
|
15
|
+
|
|
16
|
+
## 변경 유형
|
|
17
|
+
- [ ] feat: 새 기능
|
|
18
|
+
- [ ] fix: 버그 수정
|
|
19
|
+
- [ ] refactor: 기능 변경 없는 코드 개선
|
|
20
|
+
- [ ] docs: 문서 변경
|
|
21
|
+
- [ ] test: 테스트 추가/수정
|
|
22
|
+
- [ ] chore: 빌드/설정 변경
|
|
23
|
+
- [ ] perf: 성능 개선
|
|
24
|
+
|
|
25
|
+
## Spring Boot 체크리스트
|
|
26
|
+
- [ ] 생성자 주입 사용 (`@Autowired` 필드 주입 없음)
|
|
27
|
+
- [ ] `@Transactional` 서비스 레이어에만 적용
|
|
28
|
+
- [ ] 엔티티 직접 반환 없음 (DTO 변환)
|
|
29
|
+
- [ ] `@Valid` 검증 적용
|
|
30
|
+
- [ ] 하드코딩된 시크릿 없음
|
|
31
|
+
- [ ] N+1 쿼리 없음 (EAGER fetch 없음)
|
|
32
|
+
- [ ] 예외 처리 누락 없음 (swallowed exception 없음)
|
package/.mcp.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"github": {
|
|
4
|
+
"command": "npx",
|
|
5
|
+
"args": ["-y", "@modelcontextprotocol/server-github@2025.4.8"],
|
|
6
|
+
"env": {
|
|
7
|
+
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"context7": {
|
|
11
|
+
"command": "npx",
|
|
12
|
+
"args": ["-y", "@upstash/context7-mcp@2.1.4"]
|
|
13
|
+
},
|
|
14
|
+
"sequential-thinking": {
|
|
15
|
+
"command": "npx",
|
|
16
|
+
"args": ["-y", "@modelcontextprotocol/server-sequential-thinking@2025.12.18"]
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
Java/Spring Boot 백엔드 API 프로젝트를 위한 Claude Code 가이드.
|
|
4
|
+
|
|
5
|
+
> **이 파일을 프로젝트에 맞게 커스터마이징하세요.** 특히 "프로젝트 개요"와 "아키텍처" 섹션.
|
|
6
|
+
|
|
7
|
+
## 프로젝트 개요
|
|
8
|
+
|
|
9
|
+
<!-- TODO: 프로젝트 목적과 주요 도메인을 여기에 작성하세요 -->
|
|
10
|
+
Spring Boot 기반 REST API 백엔드 서비스.
|
|
11
|
+
|
|
12
|
+
## 빌드 명령어
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# Gradle
|
|
16
|
+
./gradlew compileJava # 컴파일
|
|
17
|
+
./gradlew test # 단위 테스트
|
|
18
|
+
./gradlew check # 전체 테스트 + 린트
|
|
19
|
+
./gradlew bootRun # 로컬 실행
|
|
20
|
+
./gradlew jacocoTestReport # 커버리지 리포트
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 아키텍처
|
|
24
|
+
|
|
25
|
+
3계층 표준 아키텍처:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
Controller → Service → Repository → Database
|
|
29
|
+
(HTTP) (Business) (Data Access)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
src/main/java/com/example/
|
|
34
|
+
├── controller/ # REST 엔드포인트, 입력 검증
|
|
35
|
+
├── service/ # 비즈니스 로직, 트랜잭션
|
|
36
|
+
├── repository/ # Spring Data JPA 인터페이스
|
|
37
|
+
├── domain/ # 엔티티, VO, 도메인 모델
|
|
38
|
+
├── dto/ # 요청/응답 DTO (record 선호)
|
|
39
|
+
├── exception/ # 도메인 예외, 글로벌 핸들러
|
|
40
|
+
└── config/ # Spring 설정 클래스
|
|
41
|
+
|
|
42
|
+
src/test/java/com/example/
|
|
43
|
+
├── controller/ # @WebMvcTest
|
|
44
|
+
├── service/ # @ExtendWith(MockitoExtension.class)
|
|
45
|
+
├── repository/ # @DataJpaTest
|
|
46
|
+
└── integration/ # @SpringBootTest
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 개발 워크플로우
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
1. 기능 계획 → /dev plan (코드베이스 분석 후 계획서 작성)
|
|
53
|
+
2. 구현 & 검증 → /dev run (계획서 기반 구현 + 빌드 확인)
|
|
54
|
+
3. 테스트 → /dev test (TDD 워크플로우, 테스트 먼저 작성)
|
|
55
|
+
4. 리뷰 → /dev review (로컬 변경 또는 PR 종합 리뷰)
|
|
56
|
+
5. 커밋 → /git commit
|
|
57
|
+
6. PR 생성 → /git pr
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
전체 파이프라인 한 번에: `/dev`
|
|
61
|
+
|
|
62
|
+
## 슬래시 커맨드
|
|
63
|
+
|
|
64
|
+
### dev — 개발 워크플로우
|
|
65
|
+
|
|
66
|
+
| 커맨드 | 설명 |
|
|
67
|
+
|--------|------|
|
|
68
|
+
| `/dev` | 계획 → 구현 → 테스트 전체 워크플로우 |
|
|
69
|
+
| `/dev plan` | 코드베이스 분석 후 구현 계획서 작성 |
|
|
70
|
+
| `/dev run` | 계획서 기반 코드 구현 및 검증 |
|
|
71
|
+
| `/dev test` | TDD 워크플로우 (테스트 먼저 작성) |
|
|
72
|
+
| `/dev review` | 로컬 변경(Java 특화) 또는 PR 종합 리뷰 |
|
|
73
|
+
| `/dev build` | 빌드 오류 진단 및 수정 |
|
|
74
|
+
| `/dev fix` | 빌드 에러 자동 수정 |
|
|
75
|
+
| `/dev verify` | 빌드·정적분석·테스트·커버리지·보안 전체 검증 |
|
|
76
|
+
| `/dev coverage` | 커버리지 분석 및 미달 영역 테스트 생성 |
|
|
77
|
+
|
|
78
|
+
### git — GitHub 워크플로우
|
|
79
|
+
|
|
80
|
+
| 커맨드 | 설명 |
|
|
81
|
+
|--------|------|
|
|
82
|
+
| `/git commit` | 변경사항 커밋 |
|
|
83
|
+
| `/git pr` | PR 자동 생성 (push → PR → CI 확인) |
|
|
84
|
+
| `/git issue` | 이슈 생성 (`bug` / `feat`) |
|
|
85
|
+
|
|
86
|
+
### 기타
|
|
87
|
+
|
|
88
|
+
| 커맨드 | 설명 |
|
|
89
|
+
|--------|------|
|
|
90
|
+
| `/db-migrate` | DB 마이그레이션 실행·상태 확인·롤백 |
|
|
91
|
+
|
|
92
|
+
## 에이전트
|
|
93
|
+
|
|
94
|
+
| 에이전트 | 용도 | 언제 사용 |
|
|
95
|
+
|---------|------|----------|
|
|
96
|
+
| `code-reviewer` | Java/Spring Boot 코드 리뷰 | 코드 수정 후 항상 |
|
|
97
|
+
| `java-build-resolver` | 빌드/컴파일 에러 수정 | 빌드 실패 시 |
|
|
98
|
+
| `security-reviewer` | 보안 취약점 분석 | 인증/인가/입력처리 변경 시 |
|
|
99
|
+
| `tdd-guide` | TDD 워크플로우 안내 | 새 기능/버그수정 시 |
|
|
100
|
+
| `planner` | 기능 구현 계획 수립 | 복잡한 기능 시작 전 |
|
|
101
|
+
| `database-reviewer` | DB 쿼리·스키마 최적화 | JPA/SQL 변경 시 |
|
|
102
|
+
| `java-performance-reviewer` | JVM·N+1·커넥션 풀·캐시 성능 분석 | 성능 이슈 발생 시 |
|
|
103
|
+
|
|
104
|
+
## 핵심 규칙
|
|
105
|
+
|
|
106
|
+
1. **코드 수정 후**: 반드시 `code-reviewer` 에이전트 실행
|
|
107
|
+
2. **새 기능**: TDD 워크플로우 준수 (테스트 RED → 구현 GREEN → 리팩토링)
|
|
108
|
+
3. **빌드 실패**: `java-build-resolver` 에이전트 사용, 증상 억제 금지
|
|
109
|
+
4. **보안 코드**: `security-reviewer` 실행 필수 (인증/DB쿼리/파일처리)
|
|
110
|
+
5. **커밋 전**: `./mvnw verify` 또는 `./gradlew check` 통과 확인
|
|
111
|
+
6. **의존성 주입**: 필드 주입(`@Autowired`) 금지 — 생성자 주입 필수
|
|
112
|
+
|
|
113
|
+
## 스킬 참조
|
|
114
|
+
|
|
115
|
+
| 작업 | 스킬 |
|
|
116
|
+
|------|------|
|
|
117
|
+
| REST API 구조 설계 | `springboot-patterns` |
|
|
118
|
+
| JPA 엔티티/쿼리 최적화 | `jpa-patterns` |
|
|
119
|
+
| 보안 설정 | `springboot-security` |
|
|
120
|
+
| TDD 패턴 | `springboot-tdd` |
|
|
121
|
+
| 코딩 표준 | `java-coding-standards` |
|
|
122
|
+
| DB 마이그레이션 | `database-migrations` |
|
|
123
|
+
| PostgreSQL 쿼리/인덱스 | `postgres-patterns` |
|
|
124
|
+
| 헥사고날 아키텍처 | `hexagonal-architecture` |
|
|
125
|
+
| REST API 설계 원칙 | `api-design` |
|
|
126
|
+
| ADR 작성 | `architecture-decision-records` |
|
package/README.md
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# backend-claude-code
|
|
2
|
+
|
|
3
|
+
Java/Spring Boot 백엔드 프로젝트에 Claude Code 설정을 빠르게 적용하는 harness.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 설치
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# 현재 디렉토리에 설치
|
|
11
|
+
./install.sh
|
|
12
|
+
|
|
13
|
+
# 특정 프로젝트 경로에 설치
|
|
14
|
+
./install.sh /path/to/your/project
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
설치 시 이미 존재하는 파일은 덮어쓰지 않고 스킵합니다.
|
|
18
|
+
복사된 파일 목록은 `.claude/.installed-files`에 기록됩니다.
|
|
19
|
+
|
|
20
|
+
## 제거
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# 현재 디렉토리에서 제거
|
|
24
|
+
./uninstall.sh
|
|
25
|
+
|
|
26
|
+
# 특정 프로젝트 경로에서 제거
|
|
27
|
+
./uninstall.sh /path/to/your/project
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
`.installed-files`에 기록된 파일만 삭제합니다. 프로젝트에서 직접 만든 파일은 건드리지 않습니다.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 설치 후 해야 할 일
|
|
35
|
+
|
|
36
|
+
1. `CLAUDE.md` — 프로젝트 이름, 아키텍처, 패키지 구조를 맞게 수정
|
|
37
|
+
2. `.mcp.json` — `GITHUB_TOKEN` 환경변수 설정
|
|
38
|
+
3. `.claude/settings.json` — 기존 파일이 있다면 수동 병합
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 포함 항목
|
|
43
|
+
|
|
44
|
+
### 에이전트 (8개)
|
|
45
|
+
|
|
46
|
+
| 에이전트 | 역할 |
|
|
47
|
+
|---------|------|
|
|
48
|
+
| `java-reviewer` | Java/Spring Boot 코드 리뷰 |
|
|
49
|
+
| `java-build-resolver` | 빌드·컴파일 에러 수정 |
|
|
50
|
+
| `security-reviewer` | 보안 취약점 분석 (OWASP) |
|
|
51
|
+
| `tdd-guide` | TDD 워크플로우 안내 |
|
|
52
|
+
| `planner` | 기능 구현 계획 수립 |
|
|
53
|
+
| `database-reviewer` | DB 쿼리·스키마 최적화 |
|
|
54
|
+
| `performance-optimizer` | 성능 병목 분석 |
|
|
55
|
+
| `code-reviewer` | 코드 품질 종합 리뷰 |
|
|
56
|
+
|
|
57
|
+
### 슬래시 커맨드 (13개)
|
|
58
|
+
|
|
59
|
+
#### dev — 개발 워크플로우
|
|
60
|
+
|
|
61
|
+
| 커맨드 | 설명 |
|
|
62
|
+
|--------|------|
|
|
63
|
+
| `/dev` | 계획 → 구현 → 테스트 전체 워크플로우 실행 |
|
|
64
|
+
| `/dev plan` | 코드베이스 분석 후 구현 계획서 작성 |
|
|
65
|
+
| `/dev run` | 계획서 기반 코드 구현 및 검증 |
|
|
66
|
+
| `/dev test` | TDD 워크플로우 (테스트 먼저 작성) |
|
|
67
|
+
| `/dev review` | 로컬 변경사항(Java 특화) 또는 PR 종합 리뷰 |
|
|
68
|
+
| `/dev build` | 빌드 오류 진단 및 수정 |
|
|
69
|
+
| `/dev fix` | 빌드 에러 자동 수정 |
|
|
70
|
+
| `/dev verify` | 빌드·정적분석·테스트·커버리지·보안 전체 검증 |
|
|
71
|
+
| `/dev coverage` | 커버리지 분석 및 미달 영역 테스트 생성 |
|
|
72
|
+
|
|
73
|
+
#### git — GitHub 워크플로우
|
|
74
|
+
|
|
75
|
+
| 커맨드 | 설명 |
|
|
76
|
+
|--------|------|
|
|
77
|
+
| `/git commit` | 변경사항 커밋 |
|
|
78
|
+
| `/git pr` | PR 자동 생성 (push → PR → CI 확인) |
|
|
79
|
+
| `/git issue` | 이슈 생성 (`bug` / `feat`) |
|
|
80
|
+
|
|
81
|
+
#### 기타
|
|
82
|
+
|
|
83
|
+
| 커맨드 | 설명 |
|
|
84
|
+
|--------|------|
|
|
85
|
+
| `/db-migrate` | DB 마이그레이션 실행·상태 확인·롤백 (Flyway/Liquibase 자동 감지) |
|
|
86
|
+
|
|
87
|
+
### 스킬 (10개)
|
|
88
|
+
|
|
89
|
+
> 사용법: 프롬프트에서 `skill: <이름>` 으로 참조
|
|
90
|
+
|
|
91
|
+
#### Spring Boot
|
|
92
|
+
|
|
93
|
+
| 스킬 | 설명 |
|
|
94
|
+
|------|------|
|
|
95
|
+
| `springboot-patterns` | Controller·Service·Repository 구조, 공통 패턴 |
|
|
96
|
+
| `springboot-security` | Spring Security 설정 및 리뷰 기준 |
|
|
97
|
+
| `springboot-tdd` | JUnit5·Mockito·Testcontainers TDD 워크플로우 |
|
|
98
|
+
|
|
99
|
+
#### Java
|
|
100
|
+
|
|
101
|
+
| 스킬 | 설명 |
|
|
102
|
+
|------|------|
|
|
103
|
+
| `java-coding-standards` | Java 코딩 규칙·관용구·금지 패턴 |
|
|
104
|
+
| `jpa-patterns` | 엔티티 설계, N+1 해결, 쿼리 최적화 |
|
|
105
|
+
|
|
106
|
+
#### 데이터베이스
|
|
107
|
+
|
|
108
|
+
| 스킬 | 설명 |
|
|
109
|
+
|------|------|
|
|
110
|
+
| `database-migrations` | Flyway·Liquibase 마이그레이션 패턴 |
|
|
111
|
+
| `postgres-patterns` | PostgreSQL 쿼리·인덱스·성능 패턴 |
|
|
112
|
+
|
|
113
|
+
#### 아키텍처
|
|
114
|
+
|
|
115
|
+
| 스킬 | 설명 |
|
|
116
|
+
|------|------|
|
|
117
|
+
| `hexagonal-architecture` | 헥사고날 아키텍처 (Ports & Adapters) 구현 |
|
|
118
|
+
| `api-design` | REST API 설계 원칙·버저닝·에러 포맷 |
|
|
119
|
+
| `architecture-decision-records` | ADR 작성 가이드 |
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
### 규칙
|
|
123
|
+
|
|
124
|
+
| 파일 | 적용 범위 |
|
|
125
|
+
|------|----------|
|
|
126
|
+
| `coding-style` | 전체 Java 파일 |
|
|
127
|
+
| `testing` | 테스트 파일 |
|
|
128
|
+
| `security` | 인증·인가·입력처리 |
|
|
129
|
+
| `hooks` | PostToolUse·Stop 자동화 |
|
|
130
|
+
| `architecture` | 레이어 구조 및 책임 |
|
|
131
|
+
| `controller-patterns` | `*Controller.java` |
|
|
132
|
+
| `dto-patterns` | `*Dtos.java` |
|
|
133
|
+
| `entity-patterns` | `*Entity.java`, `domain/**` |
|
|
134
|
+
| `repository-patterns` | `*Repository*.java` |
|
|
135
|
+
| `service-patterns` | `*Service.java` |
|
|
136
|
+
| `error-handling` | 예외 처리 전반 |
|
|
137
|
+
|
|
138
|
+
### GitHub 템플릿
|
|
139
|
+
|
|
140
|
+
- `.github/PULL_REQUEST_TEMPLATE.md` — Spring Boot 체크리스트 포함 PR 템플릿
|
|
141
|
+
- `.github/ISSUE_TEMPLATE/bug_report.md` — 버그 리포트
|
|
142
|
+
- `.github/ISSUE_TEMPLATE/feature_request.md` — 기능 요청
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-reviewer
|
|
3
|
+
description: Expert Java and Spring Boot code reviewer specializing in layered architecture, JPA patterns, security, and concurrency. Use for all Java code changes. MUST BE USED for Spring Boot projects.
|
|
4
|
+
tools: ["Read", "Grep", "Glob", "Bash"]
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
You are a senior Java engineer ensuring high standards of idiomatic Java and Spring Boot best practices.
|
|
8
|
+
When invoked:
|
|
9
|
+
1. Run `git diff -- '*.java'` to see recent Java file changes
|
|
10
|
+
2. Run `./mvnw verify -q` or `./gradlew check` if available
|
|
11
|
+
3. Focus on modified `.java` files
|
|
12
|
+
4. Begin review immediately
|
|
13
|
+
|
|
14
|
+
You DO NOT refactor or rewrite code — you report findings only.
|
|
15
|
+
|
|
16
|
+
## Review Priorities
|
|
17
|
+
|
|
18
|
+
### CRITICAL -- Security
|
|
19
|
+
- **SQL injection**: String concatenation in `@Query` or `JdbcTemplate` — use bind parameters (`:param` or `?`)
|
|
20
|
+
- **Command injection**: User-controlled input passed to `ProcessBuilder` or `Runtime.exec()` — validate and sanitise before invocation
|
|
21
|
+
- **Path traversal**: User-controlled input passed to `new File(userInput)`, `Paths.get(userInput)`, or `FileInputStream(userInput)` without `getCanonicalPath()` validation
|
|
22
|
+
- **Hardcoded secrets**: API keys, passwords, tokens in source — must come from environment or secrets manager
|
|
23
|
+
- **PII/token logging**: `log.info(...)` calls near auth code that expose passwords or tokens
|
|
24
|
+
- **Missing `@Valid`**: Raw `@RequestBody` without Bean Validation — never trust unvalidated input
|
|
25
|
+
- **CSRF disabled without justification**: Stateless JWT APIs may disable it but must document why
|
|
26
|
+
|
|
27
|
+
If any CRITICAL security issue is found, stop and escalate to `security-reviewer`.
|
|
28
|
+
|
|
29
|
+
### CRITICAL -- Error Handling
|
|
30
|
+
- **Swallowed exceptions**: Empty catch blocks or `catch (Exception e) {}` with no action
|
|
31
|
+
- **`.get()` on Optional**: Calling `repository.findById(id).get()` without `.isPresent()` — use `.orElseThrow()`
|
|
32
|
+
- **Missing `@RestControllerAdvice`**: Exception handling scattered across controllers instead of centralised
|
|
33
|
+
- **Wrong HTTP status**: Returning `200 OK` with null body instead of `404`, or missing `201` on creation
|
|
34
|
+
|
|
35
|
+
### HIGH -- Spring Boot Architecture
|
|
36
|
+
- **Field injection**: `@Autowired` on fields is a code smell — constructor injection is required
|
|
37
|
+
- **Business logic in controllers**: Controllers must delegate to the service layer immediately
|
|
38
|
+
- **`@Transactional` on wrong layer**: Must be on service layer, not controller or repository
|
|
39
|
+
- **Missing `@Transactional(readOnly = true)`**: Read-only service methods must declare this
|
|
40
|
+
- **Entity exposed in response**: JPA entity returned directly from controller — use DTO or record projection
|
|
41
|
+
|
|
42
|
+
### HIGH -- JPA / Database
|
|
43
|
+
- **N+1 query problem**: `FetchType.EAGER` on collections — use `JOIN FETCH` or `@EntityGraph`
|
|
44
|
+
- **Unbounded list endpoints**: Returning `List<T>` from endpoints without `Pageable` and `Page<T>`
|
|
45
|
+
- **Missing `@Modifying`**: Any `@Query` that mutates data requires `@Modifying` + `@Transactional`
|
|
46
|
+
- **Dangerous cascade**: `CascadeType.ALL` with `orphanRemoval = true` — confirm intent is deliberate
|
|
47
|
+
|
|
48
|
+
### MEDIUM -- Concurrency and State
|
|
49
|
+
- **Mutable singleton fields**: Non-final instance fields in `@Service` / `@Component` are a race condition
|
|
50
|
+
- **Unbounded `@Async`**: `CompletableFuture` or `@Async` without a custom `Executor` — default creates unbounded threads
|
|
51
|
+
- **Blocking `@Scheduled`**: Long-running scheduled methods that block the scheduler thread
|
|
52
|
+
|
|
53
|
+
### MEDIUM -- Java Idioms and Performance
|
|
54
|
+
- **String concatenation in loops**: Use `StringBuilder` or `String.join`
|
|
55
|
+
- **Raw type usage**: Unparameterised generics (`List` instead of `List<T>`)
|
|
56
|
+
- **Missed pattern matching**: `instanceof` check followed by explicit cast — use pattern matching (Java 16+)
|
|
57
|
+
- **Null returns from service layer**: Prefer `Optional<T>` over returning null
|
|
58
|
+
|
|
59
|
+
### MEDIUM -- Testing
|
|
60
|
+
- **`@SpringBootTest` for unit tests**: Use `@WebMvcTest` for controllers, `@DataJpaTest` for repositories
|
|
61
|
+
- **Missing Mockito extension**: Service tests must use `@ExtendWith(MockitoExtension.class)`
|
|
62
|
+
- **`Thread.sleep()` in tests**: Use `Awaitility` for async assertions
|
|
63
|
+
- **Weak test names**: `testFindUser` gives no information — use `should_return_404_when_user_not_found`
|
|
64
|
+
|
|
65
|
+
## Diagnostic Commands
|
|
66
|
+
```bash
|
|
67
|
+
git diff -- '*.java'
|
|
68
|
+
./mvnw verify -q
|
|
69
|
+
./gradlew check
|
|
70
|
+
./mvnw checkstyle:check
|
|
71
|
+
./mvnw spotbugs:check
|
|
72
|
+
./mvnw test
|
|
73
|
+
grep -rn "@Autowired" src/main/java --include="*.java"
|
|
74
|
+
grep -rn "FetchType.EAGER" src/main/java --include="*.java"
|
|
75
|
+
grep -rn "\.get()" src/main/java --include="*.java" | grep -v "//.*\.get()"
|
|
76
|
+
```
|
|
77
|
+
Read `pom.xml`, `build.gradle`, or `build.gradle.kts` to determine the build tool and Spring Boot version before reviewing.
|
|
78
|
+
|
|
79
|
+
## Approval Criteria
|
|
80
|
+
- **Approve**: No CRITICAL or HIGH issues
|
|
81
|
+
- **Warning**: MEDIUM issues only
|
|
82
|
+
- **Block**: CRITICAL or HIGH issues found
|
|
83
|
+
|
|
84
|
+
For detailed Spring Boot patterns and examples, see `skill: springboot-patterns`.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: database-reviewer
|
|
3
|
+
description: PostgreSQL database specialist for query optimization, schema design, security, and performance. Use PROACTIVELY when writing SQL, creating migrations, designing schemas, or troubleshooting database performance. Incorporates Supabase best practices.
|
|
4
|
+
tools: ["Read", "Write", "Edit", "Bash", "Grep", "Glob"]
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Database Reviewer
|
|
9
|
+
|
|
10
|
+
You are an expert PostgreSQL database specialist focused on query optimization, schema design, security, and performance. Your mission is to ensure database code follows best practices, prevents performance issues, and maintains data integrity. Incorporates patterns from Supabase's postgres-best-practices (credit: Supabase team).
|
|
11
|
+
|
|
12
|
+
## Core Responsibilities
|
|
13
|
+
|
|
14
|
+
1. **Query Performance** — Optimize queries, add proper indexes, prevent table scans
|
|
15
|
+
2. **Schema Design** — Design efficient schemas with proper data types and constraints
|
|
16
|
+
3. **Security & RLS** — Implement Row Level Security, least privilege access
|
|
17
|
+
4. **Connection Management** — Configure pooling, timeouts, limits
|
|
18
|
+
5. **Concurrency** — Prevent deadlocks, optimize locking strategies
|
|
19
|
+
6. **Monitoring** — Set up query analysis and performance tracking
|
|
20
|
+
|
|
21
|
+
## Diagnostic Commands
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
psql $DATABASE_URL
|
|
25
|
+
psql -c "SELECT query, mean_exec_time, calls FROM pg_stat_statements ORDER BY mean_exec_time DESC LIMIT 10;"
|
|
26
|
+
psql -c "SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) FROM pg_stat_user_tables ORDER BY pg_total_relation_size(relid) DESC;"
|
|
27
|
+
psql -c "SELECT indexrelname, idx_scan, idx_tup_read FROM pg_stat_user_indexes ORDER BY idx_scan DESC;"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Review Workflow
|
|
31
|
+
|
|
32
|
+
### 1. Query Performance (CRITICAL)
|
|
33
|
+
- Are WHERE/JOIN columns indexed?
|
|
34
|
+
- Run `EXPLAIN ANALYZE` on complex queries — check for Seq Scans on large tables
|
|
35
|
+
- Watch for N+1 query patterns
|
|
36
|
+
- Verify composite index column order (equality first, then range)
|
|
37
|
+
|
|
38
|
+
### 2. Schema Design (HIGH)
|
|
39
|
+
- Use proper types: `bigint` for IDs, `text` for strings, `timestamptz` for timestamps, `numeric` for money, `boolean` for flags
|
|
40
|
+
- Define constraints: PK, FK with `ON DELETE`, `NOT NULL`, `CHECK`
|
|
41
|
+
- Use `lowercase_snake_case` identifiers (no quoted mixed-case)
|
|
42
|
+
|
|
43
|
+
### 3. Security (CRITICAL)
|
|
44
|
+
- RLS enabled on multi-tenant tables with `(SELECT auth.uid())` pattern
|
|
45
|
+
- RLS policy columns indexed
|
|
46
|
+
- Least privilege access — no `GRANT ALL` to application users
|
|
47
|
+
- Public schema permissions revoked
|
|
48
|
+
|
|
49
|
+
## Key Principles
|
|
50
|
+
|
|
51
|
+
- **Index foreign keys** — Always, no exceptions
|
|
52
|
+
- **Use partial indexes** — `WHERE deleted_at IS NULL` for soft deletes
|
|
53
|
+
- **Covering indexes** — `INCLUDE (col)` to avoid table lookups
|
|
54
|
+
- **SKIP LOCKED for queues** — 10x throughput for worker patterns
|
|
55
|
+
- **Cursor pagination** — `WHERE id > $last` instead of `OFFSET`
|
|
56
|
+
- **Batch inserts** — Multi-row `INSERT` or `COPY`, never individual inserts in loops
|
|
57
|
+
- **Short transactions** — Never hold locks during external API calls
|
|
58
|
+
- **Consistent lock ordering** — `ORDER BY id FOR UPDATE` to prevent deadlocks
|
|
59
|
+
|
|
60
|
+
## Anti-Patterns to Flag
|
|
61
|
+
|
|
62
|
+
- `SELECT *` in production code
|
|
63
|
+
- `int` for IDs (use `bigint`), `varchar(255)` without reason (use `text`)
|
|
64
|
+
- `timestamp` without timezone (use `timestamptz`)
|
|
65
|
+
- Random UUIDs as PKs (use UUIDv7 or IDENTITY)
|
|
66
|
+
- OFFSET pagination on large tables
|
|
67
|
+
- Unparameterized queries (SQL injection risk)
|
|
68
|
+
- `GRANT ALL` to application users
|
|
69
|
+
- RLS policies calling functions per-row (not wrapped in `SELECT`)
|
|
70
|
+
|
|
71
|
+
## Review Checklist
|
|
72
|
+
|
|
73
|
+
- [ ] All WHERE/JOIN columns indexed
|
|
74
|
+
- [ ] Composite indexes in correct column order
|
|
75
|
+
- [ ] Proper data types (bigint, text, timestamptz, numeric)
|
|
76
|
+
- [ ] RLS enabled on multi-tenant tables
|
|
77
|
+
- [ ] RLS policies use `(SELECT auth.uid())` pattern
|
|
78
|
+
- [ ] Foreign keys have indexes
|
|
79
|
+
- [ ] No N+1 query patterns
|
|
80
|
+
- [ ] EXPLAIN ANALYZE run on complex queries
|
|
81
|
+
- [ ] Transactions kept short
|
|
82
|
+
|
|
83
|
+
## Reference
|
|
84
|
+
|
|
85
|
+
For detailed index patterns, schema design examples, connection management, concurrency strategies, JSONB patterns, and full-text search, see skills: `postgres-patterns` and `database-migrations`.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
**Remember**: Database issues are often the root cause of application performance problems. Optimize queries and schema design early. Use EXPLAIN ANALYZE to verify assumptions. Always index foreign keys and RLS policy columns.
|
|
90
|
+
|
|
91
|
+
*Patterns adapted from Supabase Agent Skills (credit: Supabase team) under MIT license.*
|