spring-boot-engineer
Spring Boot 3.xの設定ファイル生成、RESTコントローラーの作成、Spring Security 6の認証フロー実装、Spring Data JPAリポジトリのセットアップ、リアクティブWebFluxエンドポイントの構成を行います。Spring Boot 3.xアプリケーションやマイクロサービス、リアクティブJavaアプリケーションの開発時に使用し、Spring Data JPA・Spring Security 6・WebFlux・Spring Cloud連携・Java REST API設計・マイクロサービスアーキテクチャが必要な場面で呼び出してください。
description の原文を見る
Generates Spring Boot 3.x configurations, creates REST controllers, implements Spring Security 6 authentication flows, sets up Spring Data JPA repositories, and configures reactive WebFlux endpoints. Use when building Spring Boot 3.x applications, microservices, or reactive Java applications; invoke for Spring Data JPA, Spring Security 6, WebFlux, Spring Cloud integration, Java REST API design, or Microservices Java architecture.
SKILL.md 本文
Spring Boot エンジニア
コアワークフロー
- 要件分析 — サービス境界、API、データモデル、セキュリティ要件を特定
- アーキテクチャ設計 — マイクロサービス、データアクセス、クラウド統合、セキュリティを計画;コーディング前に設計を確認
- 実装 — コンストラクタインジェクションとレイヤー化アーキテクチャでサービスを作成(下記のクイックスタートを参照)
- セキュリティ対応 — Spring Security、OAuth2、メソッドセキュリティ、CORS設定を追加;セキュリティルールがコンパイルされ、テストに合格することを確認。コンパイルまたはテストが失敗した場合:エラー出力を確認し、失敗したルールまたは設定を修正して、再実行してから進める
- テスト — ユニット、統合、スライステストを記述;
./mvnw test(または./gradlew test)を実行し、すべてが合格することを確認してから進める。テストが失敗した場合:スタックトレースを確認し、失敗したアサーションまたはコンポーネントを特定し、問題を修正して、完全なスイートを再実行 - デプロイ — Actuatorを通じてヘルスチェックと可観測性を設定;
/actuator/healthがUPを返すことを確認。ヘルスがDOWNの場合:レスポンス内のcomponentsの詳細を確認し、失敗しているコンポーネント(例:データソース、ブローカー)を解決して、再検証
リファレンスガイド
コンテキストに基づいて詳細なガイダンスを読み込む:
| トピック | リファレンス | 読み込むタイミング |
|---|---|---|
| Web レイヤー | references/web.md | コントローラー、REST API、バリデーション、例外処理 |
| データアクセス | references/data.md | Spring Data JPA、リポジトリ、トランザクション、プロジェクション |
| セキュリティ | references/security.md | Spring Security 6、OAuth2、JWT、メソッドセキュリティ |
| クラウドネイティブ | references/cloud.md | Spring Cloud、Config、Discovery、Gateway、レジリエンス |
| テスト | references/testing.md | @SpringBootTest、MockMvc、Testcontainers、テストスライス |
クイックスタート — 最小限の実装構造
標準的な Spring Boot フィーチャーはこれらのレイヤーで構成されます。これらをコピペの出発点として使用してください。
エンティティ
@Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
private String name;
@DecimalMin("0.0")
private BigDecimal price;
// getters / setters or use @Data (Lombok)
}
リポジトリ
public interface ProductRepository extends JpaRepository<Product, Long> {
List<Product> findByNameContainingIgnoreCase(String name);
}
サービス(コンストラクタインジェクション)
@Service
public class ProductService {
private final ProductRepository repo;
public ProductService(ProductRepository repo) { // constructor injection — no @Autowired
this.repo = repo;
}
@Transactional(readOnly = true)
public List<Product> search(String name) {
return repo.findByNameContainingIgnoreCase(name);
}
@Transactional
public Product create(ProductRequest request) {
var product = new Product();
product.setName(request.name());
product.setPrice(request.price());
return repo.save(product);
}
}
REST コントローラー
@RestController
@RequestMapping("/api/v1/products")
@Validated
public class ProductController {
private final ProductService service;
public ProductController(ProductService service) {
this.service = service;
}
@GetMapping
public List<Product> search(@RequestParam(defaultValue = "") String name) {
return service.search(name);
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public Product create(@Valid @RequestBody ProductRequest request) {
return service.create(request);
}
}
DTO(レコード)
public record ProductRequest(
@NotBlank String name,
@DecimalMin("0.0") BigDecimal price
) {}
グローバル例外ハンドラー
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> handleValidation(MethodArgumentNotValidException ex) {
return ex.getBindingResult().getFieldErrors().stream()
.collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage));
}
@ExceptionHandler(EntityNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public Map<String, String> handleNotFound(EntityNotFoundException ex) {
return Map.of("error", ex.getMessage());
}
}
テストスライス
@WebMvcTest(ProductController.class)
class ProductControllerTest {
@Autowired MockMvc mockMvc;
@MockBean ProductService service;
@Test
void createProduct_validRequest_returns201() throws Exception {
var product = new Product(); product.setName("Widget"); product.setPrice(BigDecimal.TEN);
when(service.create(any())).thenReturn(product);
mockMvc.perform(post("/api/v1/products")
.contentType(MediaType.APPLICATION_JSON)
.content("""{"name":"Widget","price":10.0}"""))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.name").value("Widget"));
}
}
制約
必須(MUST DO)
| ルール | 正しいパターン |
|---|---|
| コンストラクタインジェクション | public MyService(Dep dep) { this.dep = dep; } |
| API入力のバリデーション | すべての変更エンドポイントで @Valid @RequestBody MyRequest req |
| タイプセーフな設定 | @ConfigurationProperties(prefix = "app") をレコード/クラスにバインド |
| 適切なステレオタイプ | ビジネスロジックに@Service、データに@Repository、HTTPに@RestController |
| トランザクションスコープ | 複数ステップの書き込みに@Transactional;読み取りに@Transactional(readOnly = true) |
| 内部実装の隠蔽 | @RestControllerAdviceでドメイン例外をキャッチ;スタックトレースではなく問題の詳細を返却 |
| シークレットの外部化 | 環境変数または Spring Cloud Config を使用;application.propertiesには格納しない |
禁止(MUST NOT DO)
- フィールドインジェクション(フィールドの
@Autowired)を使用 - API エンドポイントでの入力バリデーションをスキップ
@Service/@Repository/@Controllerが適用できる場合に@Componentを使用- ブロッキングコードとリアクティブコードを混在させる(例:WebFlux チェーン内で
.block()を呼び出す) application.properties/application.ymlにシークレット認証情報を保存- URL、認証情報、環境固有の値をハードコード
- 非推奨の Spring Boot 2.x パターンを使用(例:
WebSecurityConfigurerAdapter)
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- jeffallan
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/jeffallan/claude-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。