Spring Boot Backend Development - Photo Map MVP
Project Context
Stack: Spring Boot 3.2.11+, Java 17 LTS, PostgreSQL 15, Spring Security 6 (JWT stateless)
Core Features:
- Authentication - JWT login/registration, BCrypt hashing
- Photo Management - Upload with EXIF extraction, asynchronous processing, CRUD operations
- User Scoping - Strict data isolation (users see only their own photos)
- Admin API - User management (ADMIN role)
Key Constraints:
- MVP scope - simple solutions preferred
- Mikrus VPS - limited resources (synchronous API, async background processing)
- User isolation CRITICAL - ALL queries MUST include userId filtering
Architecture Principles
Layered Architecture
Controller (HTTP only) → Service (business logic) → Repository (data access) → Database
User Scoping Pattern (CRITICAL)
All photo queries MUST include userId to enforce data isolation:
// ❌ BAD: Security vulnerability - any user can access any photo
public Photo getPhoto(final Long photoId) {
return photoRepository.findById(photoId).orElseThrow();
}
// ✅ GOOD: User can only access their own photos
public Photo getPhoto(final Long photoId, final Long userId) {
return photoRepository.findByIdAndUserId(photoId, userId)
.orElseThrow(() -> new ResourceNotFoundException("Photo not found"));
}
Transaction Management
- Use
@Transactional on service methods
- Read operations:
@Transactional(readOnly = true)
- Write operations:
@Transactional (default)
For detailed architecture: See references/architecture.md for:
- ALL 5 SOLID principles (SRP, OCP, LSP, ISP, DIP)
- Design patterns (Constructor Injection, Static Factory Methods)
- Service orchestration patterns
When to Use What
Code Quality
- Use
final keyword: Method params, local variables, injected dependencies → references/java-quality.md
- Modern Java 17: Records for DTOs, Text Blocks for SQL, Stream.toList() →
references/java-quality.md
Architecture
- @Service: Business logic, orchestrates repositories →
references/architecture.md
- @Component: Utilities, non-business services
- Records: Immutable response DTOs →
references/rest-api-patterns.md
- @Data classes: Request DTOs with validation →
references/rest-api-patterns.md
Data Access
- Derived queries: Simple queries (findByUserId) →
references/jpa-patterns.md
- @Query (JPQL): Complex queries with multiple conditions →
references/jpa-patterns.md
- Native SQL: Database-specific features, performance optimization →
references/jpa-patterns.md
Async Processing
- Spring Integration File: Photo upload processing →
references/async-processing.md
Implementation Workflows
REST Endpoint Workflow
Step-by-step guide: templates/rest-endpoint-template.md
Quick checklist:
- Create DTO (Record for response, @Data for request) →
references/rest-api-patterns.md
- Create/Update Entity with User relationship →
references/jpa-patterns.md
- Create Repository with user scoping methods →
references/jpa-patterns.md
- Implement Service with @Transactional →
templates/service-template.md
- Create Controller with proper HTTP status codes →
references/rest-api-patterns.md
Complete examples: examples/photo-controller.java, examples/photo-service.java, examples/photo-repository.java
Service Implementation
Template: templates/service-template.md
Key rules:
- Constructor injection with
final fields (@RequiredArgsConstructor)
@Transactional(readOnly = true) for read operations
- All methods MUST accept userId parameter (user scoping)
- Throw
ResourceNotFoundException when not found
- Log at appropriate levels (debug, info, error)
Security & JWT
Complete patterns: references/security-jwt.md
Quick setup:
- SecurityConfig:
examples/security-config.java
- JWT Token Provider:
examples/jwt-token-provider.java
- User Entity with UserDetails:
examples/user-entity.java
Testing
Unit tests: Service layer with Mockito → references/testing.md
Controller tests: MockMvc with @WebMvcTest → references/testing.md
Coverage requirement: >70% for new code
Key Reminders
Security (CRITICAL)
- ✅ User scoping: ALL photo queries include userId
- ✅ JWT validation: Token signature & expiration checked on every request
- ✅ BCrypt passwords: Never store plain text
- ✅ DTOs only: Never expose entities to API
Performance
- ✅
@Transactional(readOnly = true) for queries
- ✅ Database indexes on user_id, frequently queried columns
- ✅
FetchType.LAZY for relationships
- ❌ NO premature optimization - keep simple for MVP
MVP Scope
- ✅ Implement only features from
.ai/prd.md
- ✅ Synchronous processing for API, asynchronous for photo processing
- ✅ Simple solutions over complex ones
- ❌ NO features beyond MVP requirements
Quick Reference
File Structure for Feature
src/main/java/com/photomap/
├── controller/ # {Resource}Controller.java
├── service/ # {Resource}Service.java
├── repository/ # {Resource}Repository.java
├── model/ # {Resource}.java (Entity)
└── dto/ # {Resource}Dto.java, {Resource}CreateRequest.java
Pattern Lookup
| Need |
Solution |
Reference |
| REST endpoint |
Follow layered architecture |
templates/rest-endpoint-template.md |
| User scoping |
findByIdAndUserId() |
references/jpa-patterns.md |
| Validation |
Bean Validation annotations |
references/validation.md |
| Security |
JWT + Spring Security |
references/security-jwt.md |
| Async processing |
Spring Integration File |
references/async-processing.md |
| Testing |
Mockito + MockMvc |
references/testing.md |
| Database changes |
Flyway migrations |
references/database-migrations.md |
Naming Conventions
- Controller:
{Resource}Controller (e.g., PhotoController)
- Service:
{Resource}Service (e.g., PhotoService)
- Repository:
{Resource}Repository (e.g., PhotoRepository)
- Entity:
{Resource} (e.g., Photo)
- DTO:
{Resource}Dto, {Resource}CreateRequest
Related Documentation
Project context:
.ai/prd.md - MVP requirements
.ai/tech-stack.md - Technology specifications
.ai/db-plan.md - Database schema
.ai/api-plan.md - REST API specification
Skill resources:
references/ - Detailed patterns and best practices (loaded on demand)
examples/ - Complete working examples
templates/ - Fill-in-the-blanks templates for common tasks
1---2name: spring-boot-backend3description: Build and implement Spring Boot 3 backend with Java 17 - REST APIs, JPA entities, services, repositories, security (JWT), and database migrations for Photo Map MVP. This skill should be used when creating, developing, or implementing *.java files, backend endpoints, business logic, database entities, DTOs, authentication, or API error handling. File types .java, .xml, .properties, .yml, .sql (project)4---5
6# Spring Boot Backend Development - Photo Map MVP
7
8## Project Context
9
10**Stack:** Spring Boot 3.2.11+, Java 17 LTS, PostgreSQL 15, Spring Security 6 (JWT stateless)
11
12**Core Features:**
131. Authentication - JWT login/registration, BCrypt hashing
142. Photo Management - Upload with EXIF extraction, asynchronous processing, CRUD operations
153. User Scoping - Strict data isolation (users see only their own photos)
164. Admin API - User management (ADMIN role)
17
18**Key Constraints:**
19- MVP scope - simple solutions preferred
20- Mikrus VPS - limited resources (synchronous API, async background processing)
21- **User isolation CRITICAL** - ALL queries MUST include userId filtering
22
23---
24
25## Architecture Principles
26
27### Layered Architecture
28
29**Controller** (HTTP only) → **Service** (business logic) → **Repository** (data access) → **Database**
30
31### User Scoping Pattern (CRITICAL)
32
33**All photo queries MUST include userId to enforce data isolation:**
34
35```java
36// ❌ BAD: Security vulnerability - any user can access any photo
37public Photo getPhoto(final Long photoId) {
38 return photoRepository.findById(photoId).orElseThrow();
39}
40
41// ✅ GOOD: User can only access their own photos
42public Photo getPhoto(final Long photoId, final Long userId) {
43 return photoRepository.findByIdAndUserId(photoId, userId)
44 .orElseThrow(() -> new ResourceNotFoundException("Photo not found"));
45}
46```
47
48### Transaction Management
49
50- Use `@Transactional` on service methods
51- Read operations: `@Transactional(readOnly = true)`
52- Write operations: `@Transactional` (default)
53
54**For detailed architecture:** See `references/architecture.md` for:
55- ALL 5 SOLID principles (SRP, OCP, LSP, ISP, DIP)
56- Design patterns (Constructor Injection, Static Factory Methods)
57- Service orchestration patterns
58
59---
60
61## When to Use What
62
63### Code Quality
64- **Use `final` keyword:** Method params, local variables, injected dependencies → `references/java-quality.md`
65- **Modern Java 17:** Records for DTOs, Text Blocks for SQL, Stream.toList() → `references/java-quality.md`
66
67### Architecture
68- **@Service:** Business logic, orchestrates repositories → `references/architecture.md`
69- **@Component:** Utilities, non-business services
70- **Records:** Immutable response DTOs → `references/rest-api-patterns.md`
71- **@Data classes:** Request DTOs with validation → `references/rest-api-patterns.md`
72
73### Data Access
74- **Derived queries:** Simple queries (findByUserId) → `references/jpa-patterns.md`
75- **@Query (JPQL):** Complex queries with multiple conditions → `references/jpa-patterns.md`
76- **Native SQL:** Database-specific features, performance optimization → `references/jpa-patterns.md`
77
78### Async Processing
79- **Spring Integration File:** Photo upload processing → `references/async-processing.md`
80
81---
82
83## Implementation Workflows
84
85### REST Endpoint Workflow
86
87**Step-by-step guide:** `templates/rest-endpoint-template.md`
88
89**Quick checklist:**
901. Create DTO (Record for response, @Data for request) → `references/rest-api-patterns.md`
912. Create/Update Entity with User relationship → `references/jpa-patterns.md`
923. Create Repository with user scoping methods → `references/jpa-patterns.md`
934. Implement Service with @Transactional → `templates/service-template.md`
945. Create Controller with proper HTTP status codes → `references/rest-api-patterns.md`
95
96**Complete examples:** `examples/photo-controller.java`, `examples/photo-service.java`, `examples/photo-repository.java`
97
98### Service Implementation
99
100**Template:** `templates/service-template.md`
101
102**Key rules:**
103- Constructor injection with `final` fields (@RequiredArgsConstructor)
104- `@Transactional(readOnly = true)` for read operations
105- **All methods MUST accept userId parameter** (user scoping)
106- Throw `ResourceNotFoundException` when not found
107- Log at appropriate levels (debug, info, error)
108
109### Security & JWT
110
111**Complete patterns:** `references/security-jwt.md`
112
113**Quick setup:**
114- SecurityConfig: `examples/security-config.java`
115- JWT Token Provider: `examples/jwt-token-provider.java`
116- User Entity with UserDetails: `examples/user-entity.java`
117
118### Testing
119
120**Unit tests:** Service layer with Mockito → `references/testing.md`
121**Controller tests:** MockMvc with @WebMvcTest → `references/testing.md`
122**Coverage requirement:** >70% for new code
123
124---
125
126## Key Reminders
127
128### Security (CRITICAL)
129- ✅ **User scoping:** ALL photo queries include userId
130- ✅ **JWT validation:** Token signature & expiration checked on every request
131- ✅ **BCrypt passwords:** Never store plain text
132- ✅ **DTOs only:** Never expose entities to API
133
134### Performance
135- ✅ `@Transactional(readOnly = true)` for queries
136- ✅ Database indexes on user_id, frequently queried columns
137- ✅ `FetchType.LAZY` for relationships
138- ❌ NO premature optimization - keep simple for MVP
139
140### MVP Scope
141- ✅ Implement only features from `.ai/prd.md`
142- ✅ Synchronous processing for API, asynchronous for photo processing
143- ✅ Simple solutions over complex ones
144- ❌ NO features beyond MVP requirements
145
146---
147
148## Quick Reference
149
150### File Structure for Feature
151```
152src/main/java/com/photomap/
153├── controller/ # {Resource}Controller.java
154├── service/ # {Resource}Service.java
155├── repository/ # {Resource}Repository.java
156├── model/ # {Resource}.java (Entity)
157└── dto/ # {Resource}Dto.java, {Resource}CreateRequest.java
158```
159
160### Pattern Lookup
161
162| Need | Solution | Reference |
163|------|----------|-----------|
164| REST endpoint | Follow layered architecture | `templates/rest-endpoint-template.md` |
165| User scoping | findByIdAndUserId() | `references/jpa-patterns.md` |
166| Validation | Bean Validation annotations | `references/validation.md` |
167| Security | JWT + Spring Security | `references/security-jwt.md` |
168| Async processing | Spring Integration File | `references/async-processing.md` |
169| Testing | Mockito + MockMvc | `references/testing.md` |
170| Database changes | Flyway migrations | `references/database-migrations.md` |
171
172### Naming Conventions
173
174- **Controller:** `{Resource}Controller` (e.g., PhotoController)
175- **Service:** `{Resource}Service` (e.g., PhotoService)
176- **Repository:** `{Resource}Repository` (e.g., PhotoRepository)
177- **Entity:** `{Resource}` (e.g., Photo)
178- **DTO:** `{Resource}Dto`, `{Resource}CreateRequest`
179
180---
181
182## Related Documentation
183
184**Project context:**
185- `.ai/prd.md` - MVP requirements
186- `.ai/tech-stack.md` - Technology specifications
187- `.ai/db-plan.md` - Database schema
188- `.ai/api-plan.md` - REST API specification
189
190**Skill resources:**
191- `references/` - Detailed patterns and best practices (loaded on demand)
192- `examples/` - Complete working examples
193- `templates/` - Fill-in-the-blanks templates for common tasks