From java
Use when writing, testing, or reviewing Spring Boot 4 code — controllers, services, repositories, security configuration, Spring test annotations (@WebMvcTest, @DataJpaTest, @SpringBootTest), ProblemDetail error handling, API versioning, or any Spring Framework 7 / Jakarta EE 11 patterns.
How this skill is triggered — by the user, by Claude, or both
Slash command
/java:springThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
- Spring @Service (트랜잭션/DI), @RestController, @Repository, @Component 파일 작성
java:spring vs java:coder| 작업 | 스킬 |
|---|---|
@Service class OrderServiceImpl — Spring DI/트랜잭션 포함 | java:spring |
@RestController class OrderController — Spring MVC | java:spring |
@Repository class JpaOrderRepository — Spring Data JPA | java:spring |
record CreateOrderRequest(...) — 순수 DTO 정의 | java:coder |
interface OrderRepository — 도메인 인터페이스 | java:coder |
class OrderNotFoundException — 도메인 예외 | java:coder |
레이어 선택:
│
├─ HTTP 요청/응답 처리 → @RestController
│ → @RequestMapping("/api/v1/resource")
│ → 비즈니스 로직 금지 (Service로 위임)
│ → @Valid 입력 검증
│ → 201 Created + Location 헤더 (생성 시)
│
├─ 비즈니스 로직 조율 → @Service
│ → 생성자 주입만
│ → @Transactional(readOnly = true) 클래스 기본값
│ → 쓰기 메서드만 @Transactional 추가
│
├─ 데이터 접근 → @Repository + JpaRepository
│ → 커스텀 쿼리는 @Query 또는 QueryDSL
│ → N+1 주의 (Fetch Join, EntityGraph)
│
└─ 외부 HTTP 클라이언트 → RestClient (Spring 6.1+)
→ Timeout 설정 필수
→ Circuit Breaker 적용
에러 처리 흐름:
│
├─ 도메인 예외 정의
│ → extends RuntimeException
│ → 명확한 이름: OrderNotFoundException, PaymentFailedException
│
├─ @RestControllerAdvice에서 처리
│ → ProblemDetail.forStatusAndDetail(HttpStatus, message)
│ → problem.setTitle(), setType() 설정
│
└─ 검증 오류 (@Valid 실패)
→ MethodArgumentNotValidException 처리
→ errors 필드에 field→message 맵 추가
무엇을 테스트하는가?
│
├─ Controller (HTTP 레이어만)
│ → @WebMvcTest(MyController.class)
│ → @MockitoBean으로 Service 교체 (Spring Boot 4+)
│ → MockMvc로 요청/응답 검증
│
├─ Repository (DB 쿼리)
│ → @DataJpaTest
│ → H2 인메모리 또는 @Testcontainers
│ → 실제 쿼리 실행 검증
│
└─ 전체 스택 통합
→ @SpringBootTest(webEnvironment = RANDOM_PORT)
→ @Testcontainers + PostgreSQL 컨테이너
→ RestAssured 또는 TestRestTemplate
@Mock vs @MockitoBean?스프링 컨텍스트가 필요한가?
│
├─ 필요 없음 (단위 테스트)
│ → @Mock (Mockito)
│ → @ExtendWith(MockitoExtension.class)
│
└─ 필요 (슬라이스/통합 테스트)
→ @MockitoBean (Spring Boot 4+, 구: @MockBean Deprecated)
→ @WebMvcTest, @DataJpaTest 안에서 사용
→ 테스트 전략/Mock 상세 사용법 → java:tester
NOTE: 테스트 전략(단위/통합 비율, TDD 사이클, Mock 범위 결정)은 → java:tester Spring 테스트 어노테이션 사용법(@WebMvcTest, @DataJpaTest, @SpringBootTest)은 이 스킬에서 제공
해결 전략:
│
├─ 단건 조회 → Fetch Join
│ → @Query("SELECT o FROM Order o JOIN FETCH o.lines WHERE o.id = :id")
│
├─ 목록 조회 (페이징 포함) → @EntityGraph
│ → @EntityGraph(attributePaths = {"lines"})
│
└─ 복잡한 조회 → QueryDSL + Projection DTO
→ record로 Projection 정의
DO:
@Transactional(readOnly = true) 클래스 기본값@Valid 입력 검증@WebMvcTest@DataJpaTest201 Created + Location 헤더DON'T:
@Autowired 필드 주입@Transactional| 상황 | 위임 스킬 |
|---|---|
| 순수 Java 코드 작성 | java:coder |
| 테스트 전략/TDD | java:tester |
| 코드 리뷰 | java:reviewer |
references/spring-boot4-rules.md — Controller, Service, Repository, 에러 처리, 테스트, 설정, ObservabilityCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub ppzxc/java-plugins --plugin java