springboot-patterns
Spring Boot architecture patterns, REST API design, layered services, data access, caching, async processing, and logging. Use for Java Spring Boot backend work.
About this skill
This skill equips AI agents, primarily Claude, with a robust set of best practices and architectural patterns essential for developing highly scalable and maintainable Spring Boot applications. It provides detailed guidance and code examples for designing RESTful APIs, implementing layered services, optimizing data access, integrating caching mechanisms for performance, handling asynchronous processing, and setting up effective logging strategies. Drawing from the 'everything-claude-code' repository, this skill ensures that AI-generated code adheres to industry standards for production-ready systems, focusing on critical aspects like resource management, comprehensive error handling, and API versioning to build enterprise-grade Java backend solutions.
Best use case
Generating Spring Boot microservices, designing and implementing robust REST APIs, creating data persistence layers, integrating caching into Java applications, setting up asynchronous tasks and event processing, or establishing effective logging and observability for backend projects.
Spring Boot architecture patterns, REST API design, layered services, data access, caching, async processing, and logging. Use for Java Spring Boot backend work.
Well-structured, production-grade Java code adhering to specified Spring Boot architectural patterns and best practices, including correctly designed REST API endpoints, clearly separated service layers, efficient data access implementations, integrated caching, asynchronous processing setup, and comprehensive logging mechanisms.
Practical example
Example input
Generate a Spring Boot REST API for managing 'orders' that follows a layered architecture. Include endpoints for listing (with pagination), retrieving by ID, creating, updating, and deleting orders. Ensure it uses best practices for data access, includes caching for order retrieval, and incorporates structured logging.
Example output
The AI would generate a `OrderController` class with appropriate `@RestController`, `@RequestMapping`, and `@Validated` annotations, featuring methods like `list(@RequestParam page, @RequestParam size)` for pagination and standard CRUD operations. It would also produce `OrderService` and `OrderRepository` interfaces and their implementations, demonstrating proper dependency injection and a clear layered architecture. The generated code would incorporate caching logic using Spring's annotations, robust error handling, and structured logging, reflecting the patterns and code style provided in the skill documentation.
When to use this skill
- When developing new Java Spring Boot backend services that require adherence to established architectural patterns and best practices; when refactoring or extending existing Spring Boot applications for improved scalability, maintainability, and performance; or when needing boilerplate code or architectural guidance for common enterprise Spring Boot development scenarios.
When not to use this skill
- For frontend development tasks (e.g., JavaScript frameworks like React or Angular); for backend development using non-Java frameworks (e.g., Python/Django, Node.js/Express, Ruby on Rails); or for tasks unrelated to application architecture, code generation, or backend development.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/springboot-patterns/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How springboot-patterns Compares
| Feature / Agent | springboot-patterns | Standard Approach |
|---|---|---|
| Platform Support | Claude | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | easy | N/A |
Frequently Asked Questions
What does this skill do?
Spring Boot architecture patterns, REST API design, layered services, data access, caching, async processing, and logging. Use for Java Spring Boot backend work.
Which AI agents support this skill?
This skill is designed for Claude.
How difficult is it to install?
The installation complexity is rated as easy. You can find the installation instructions above.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
Related Guides
Best AI Skills for Claude
Explore the best AI skills for Claude and Claude Code across coding, research, workflow automation, documentation, and agent operations.
AI Agents for Coding
Browse AI agent skills for coding, debugging, testing, refactoring, code review, and developer workflows across Claude, Cursor, and Codex.
ChatGPT vs Claude for Agent Skills
Compare ChatGPT and Claude for AI agent skills across coding, writing, research, and reusable workflow execution.
SKILL.md Source
# Spring Boot 開発パターン
スケーラブルで本番グレードのサービスのためのSpring BootアーキテクチャとAPIパターン。
## REST API構造
```java
@RestController
@RequestMapping("/api/markets")
@Validated
class MarketController {
private final MarketService marketService;
MarketController(MarketService marketService) {
this.marketService = marketService;
}
@GetMapping
ResponseEntity<Page<MarketResponse>> list(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
Page<Market> markets = marketService.list(PageRequest.of(page, size));
return ResponseEntity.ok(markets.map(MarketResponse::from));
}
@PostMapping
ResponseEntity<MarketResponse> create(@Valid @RequestBody CreateMarketRequest request) {
Market market = marketService.create(request);
return ResponseEntity.status(HttpStatus.CREATED).body(MarketResponse::from(market));
}
}
```
## リポジトリパターン(Spring Data JPA)
```java
public interface MarketRepository extends JpaRepository<MarketEntity, Long> {
@Query("select m from MarketEntity m where m.status = :status order by m.volume desc")
List<MarketEntity> findActive(@Param("status") MarketStatus status, Pageable pageable);
}
```
## トランザクション付きサービスレイヤー
```java
@Service
public class MarketService {
private final MarketRepository repo;
public MarketService(MarketRepository repo) {
this.repo = repo;
}
@Transactional
public Market create(CreateMarketRequest request) {
MarketEntity entity = MarketEntity.from(request);
MarketEntity saved = repo.save(entity);
return Market.from(saved);
}
}
```
## DTOと検証
```java
public record CreateMarketRequest(
@NotBlank @Size(max = 200) String name,
@NotBlank @Size(max = 2000) String description,
@NotNull @FutureOrPresent Instant endDate,
@NotEmpty List<@NotBlank String> categories) {}
public record MarketResponse(Long id, String name, MarketStatus status) {
static MarketResponse from(Market market) {
return new MarketResponse(market.id(), market.name(), market.status());
}
}
```
## 例外ハンドリング
```java
@ControllerAdvice
class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
ResponseEntity<ApiError> handleValidation(MethodArgumentNotValidException ex) {
String message = ex.getBindingResult().getFieldErrors().stream()
.map(e -> e.getField() + ": " + e.getDefaultMessage())
.collect(Collectors.joining(", "));
return ResponseEntity.badRequest().body(ApiError.validation(message));
}
@ExceptionHandler(AccessDeniedException.class)
ResponseEntity<ApiError> handleAccessDenied() {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body(ApiError.of("Forbidden"));
}
@ExceptionHandler(Exception.class)
ResponseEntity<ApiError> handleGeneric(Exception ex) {
// スタックトレース付きで予期しないエラーをログ
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(ApiError.of("Internal server error"));
}
}
```
## キャッシング
構成クラスで`@EnableCaching`が必要です。
```java
@Service
public class MarketCacheService {
private final MarketRepository repo;
public MarketCacheService(MarketRepository repo) {
this.repo = repo;
}
@Cacheable(value = "market", key = "#id")
public Market getById(Long id) {
return repo.findById(id)
.map(Market::from)
.orElseThrow(() -> new EntityNotFoundException("Market not found"));
}
@CacheEvict(value = "market", key = "#id")
public void evict(Long id) {}
}
```
## 非同期処理
構成クラスで`@EnableAsync`が必要です。
```java
@Service
public class NotificationService {
@Async
public CompletableFuture<Void> sendAsync(Notification notification) {
// メール/SMS送信
return CompletableFuture.completedFuture(null);
}
}
```
## ロギング(SLF4J)
```java
@Service
public class ReportService {
private static final Logger log = LoggerFactory.getLogger(ReportService.class);
public Report generate(Long marketId) {
log.info("generate_report marketId={}", marketId);
try {
// ロジック
} catch (Exception ex) {
log.error("generate_report_failed marketId={}", marketId, ex);
throw ex;
}
return new Report();
}
}
```
## ミドルウェア / フィルター
```java
@Component
public class RequestLoggingFilter extends OncePerRequestFilter {
private static final Logger log = LoggerFactory.getLogger(RequestLoggingFilter.class);
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
long start = System.currentTimeMillis();
try {
filterChain.doFilter(request, response);
} finally {
long duration = System.currentTimeMillis() - start;
log.info("req method={} uri={} status={} durationMs={}",
request.getMethod(), request.getRequestURI(), response.getStatus(), duration);
}
}
}
```
## ページネーションとソート
```java
PageRequest page = PageRequest.of(pageNumber, pageSize, Sort.by("createdAt").descending());
Page<Market> results = marketService.list(page);
```
## エラー回復力のある外部呼び出し
```java
public <T> T withRetry(Supplier<T> supplier, int maxRetries) {
int attempts = 0;
while (true) {
try {
return supplier.get();
} catch (Exception ex) {
attempts++;
if (attempts >= maxRetries) {
throw ex;
}
try {
Thread.sleep((long) Math.pow(2, attempts) * 100L);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
throw ex;
}
}
}
}
```
## レート制限(Filter + Bucket4j)
**セキュリティノート**: `X-Forwarded-For`ヘッダーはデフォルトでは信頼できません。クライアントがそれを偽装できるためです。
転送ヘッダーは次の場合のみ使用してください:
1. アプリが信頼できるリバースプロキシ(nginx、AWS ALBなど)の背後にある
2. `ForwardedHeaderFilter`をBeanとして登録済み
3. application propertiesで`server.forward-headers-strategy=NATIVE`または`FRAMEWORK`を設定済み
4. プロキシが`X-Forwarded-For`ヘッダーを上書き(追加ではなく)するよう設定済み
`ForwardedHeaderFilter`が適切に構成されている場合、`request.getRemoteAddr()`は転送ヘッダーから正しいクライアントIPを自動的に返します。この構成がない場合は、`request.getRemoteAddr()`を直接使用してください。これは直接接続IPを返し、唯一信頼できる値です。
```java
@Component
public class RateLimitFilter extends OncePerRequestFilter {
private final Map<String, Bucket> buckets = new ConcurrentHashMap<>();
/*
* セキュリティ: このフィルターはレート制限のためにクライアントを識別するために
* request.getRemoteAddr()を使用します。
*
* アプリケーションがリバースプロキシ(nginx、AWS ALBなど)の背後にある場合、
* 正確なクライアントIP検出のために転送ヘッダーを適切に処理するようSpringを
* 設定する必要があります:
*
* 1. application.properties/yamlで server.forward-headers-strategy=NATIVE
* (クラウドプラットフォーム用)またはFRAMEWORKを設定
* 2. FRAMEWORK戦略を使用する場合、ForwardedHeaderFilterを登録:
*
* @Bean
* ForwardedHeaderFilter forwardedHeaderFilter() {
* return new ForwardedHeaderFilter();
* }
*
* 3. プロキシが偽装を防ぐためにX-Forwarded-Forヘッダーを上書き(追加ではなく)
* することを確認
* 4. コンテナに応じてserver.tomcat.remoteip.trusted-proxiesまたは同等を設定
*
* この構成なしでは、request.getRemoteAddr()はクライアントIPではなくプロキシIPを返します。
* X-Forwarded-Forを直接読み取らないでください。信頼できるプロキシ処理なしでは簡単に偽装できます。
*/
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
// ForwardedHeaderFilterが構成されている場合は正しいクライアントIPを返す
// getRemoteAddr()を使用。そうでなければ直接接続IPを返す。
// X-Forwarded-Forヘッダーを適切なプロキシ構成なしで直接信頼しない。
String clientIp = request.getRemoteAddr();
Bucket bucket = buckets.computeIfAbsent(clientIp,
k -> Bucket.builder()
.addLimit(Bandwidth.classic(100, Refill.greedy(100, Duration.ofMinutes(1))))
.build());
if (bucket.tryConsume(1)) {
filterChain.doFilter(request, response);
} else {
response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
}
}
}
```
## バックグラウンドジョブ
Springの`@Scheduled`を使用するか、キュー(Kafka、SQS、RabbitMQなど)と統合します。ハンドラーをべき等かつ観測可能に保ちます。
## 可観測性
- 構造化ロギング(JSON)via Logbackエンコーダー
- メトリクス: Micrometer + Prometheus/OTel
- トレーシング: Micrometer TracingとOpenTelemetryまたはBraveバックエンド
## 本番デフォルト
- コンストラクタインジェクションを優先、フィールドインジェクションを避ける
- RFC 7807エラーのために`spring.mvc.problemdetails.enabled=true`を有効化(Spring Boot 3+)
- ワークロードに応じてHikariCPプールサイズを構成、タイムアウトを設定
- クエリに`@Transactional(readOnly = true)`を使用
- `@NonNull`と`Optional`で適切にnull安全性を強制
**覚えておいてください**: コントローラーは薄く、サービスは焦点を絞り、リポジトリはシンプルに、エラーは集中的に処理します。保守性とテスト可能性のために最適化してください。Related Skills
swiftui-patterns
SwiftUI 架构模式,使用 @Observable 进行状态管理,视图组合,导航,性能优化,以及现代 iOS/macOS UI 最佳实践。
perl-patterns
现代 Perl 5.36+ 的惯用法、最佳实践和约定,用于构建稳健、可维护的 Perl 应用程序。
kotlin-ktor-patterns
Ktor 服务器模式,包括路由 DSL、插件、身份验证、Koin DI、kotlinx.serialization、WebSockets 和 testApplication 测试。
kotlin-exposed-patterns
JetBrains Exposed ORM 模式,包括 DSL 查询、DAO 模式、事务、HikariCP 连接池、Flyway 迁移和仓库模式。
rust-patterns
Idiomatic Rust patterns, ownership, error handling, traits, concurrency, and best practices for building safe, performant applications.
laravel-patterns
Laravel architecture patterns, routing/controllers, Eloquent ORM, service layers, queues, events, caching, and API resources for production apps.
springboot-verification
Verification loop for Spring Boot projects: build, static analysis, tests with coverage, security scans, and diff review before release or PR.
springboot-tdd
Test-driven development for Spring Boot using JUnit 5, Mockito, MockMvc, Testcontainers, and JaCoCo. Use when adding features, fixing bugs, or refactoring.
springboot-security
Spring Security best practices for authn/authz, validation, CSRF, secrets, headers, rate limiting, and dependency security in Java Spring Boot services.
jpa-patterns
JPA/Hibernate patterns for entity design, relationships, query optimization, transactions, auditing, indexing, pagination, and pooling in Spring Boot.
django-patterns
Django architecture patterns, REST API design with DRF, ORM best practices, caching, signals, middleware, and production-grade Django apps.
python-patterns
Python-specific design patterns and best practices including protocols, dataclasses, context managers, decorators, async/await, type hints, and package organization. Use when working with Python code to apply Pythonic patterns.