Spring Boot Best Practices for Production Applications
Spring Boot production best practices are a set of guidelines used to build secure, scalable, maintainable, and high-performance applications.
A production application should not only work correctly, but also handle real users, traffic, failures, security risks, monitoring, deployment, and future maintenance.
1. Use Proper Layered Architecture
A Spring Boot application should be organized into clear layers.
Controller Layer
↓
Service Layer
↓
Repository Layer
↓
Database
- Controller handles HTTP requests
- Service contains business logic
- Repository handles database operations
- Entity represents database tables
- DTO transfers data between layers
2. Use DTOs Instead of Exposing Entities
Do not expose JPA entities directly in API responses. Use DTOs to control what data is sent to clients.
public class UserResponse {
private Long id;
private String name;
private String email;
}
This improves security, maintainability, and API design.
3. Secure APIs with Spring Security
Production applications should secure sensitive endpoints using authentication and authorization.
- Use Spring Security
- Use JWT or session-based authentication based on requirement
- Use role-based access control
- Protect admin APIs
- Use HTTPS in production
@PreAuthorize("hasRole('ADMIN')")
@DeleteMapping("/users/{id}")
public String deleteUser(@PathVariable Long id) {
return "User deleted";
}
4. Encode Passwords Using BCrypt
Never store plain-text passwords in the database.
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
5. Validate All Request Data
Always validate incoming user input before processing it.
public class RegisterRequest {
@NotBlank(message = "Name is required")
private String name;
@Email(message = "Invalid email")
private String email;
@Size(min = 8, message = "Password must contain at least 8 characters")
private String password;
}
@PostMapping("/register")
public String register(@Valid @RequestBody RegisterRequest request) {
return "User registered";
}
6. Use Global Exception Handling
Use @RestControllerAdvice to return clean and consistent error responses.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Map<String, Object> handleException(Exception ex) {
return Map.of(
"status", 500,
"message", "Something went wrong"
);
}
}
7. Do Not Expose Internal Error Details
Never expose stack traces, database errors, server paths, or secrets to users.
Bad response:
java.sql.SQLException: Unknown column password_hash...
Good response:
{
"status": 500,
"message": "Internal server error"
}
8. Use Profiles for Different Environments
Use separate profiles for development, testing, staging, and production.
application-dev.properties
application-test.properties
application-prod.properties
spring.profiles.active=prod
9. Store Secrets in Environment Variables
Do not hardcode passwords, API keys, JWT secrets, or database credentials in source code.
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
jwt.secret=${JWT_SECRET}
10. Use Proper Logging
Use logging instead of System.out.println().
private static final Logger log =
LoggerFactory.getLogger(UserService.class);
log.info("User registered successfully");
log.error("Registration failed", ex);
- Use INFO for normal events
- Use WARN for suspicious situations
- Use ERROR for failures
- Never log passwords or tokens
11. Enable Actuator for Monitoring
Spring Boot Actuator helps monitor application health, metrics, and runtime status.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
management.endpoints.web.exposure.include=health,info,metrics
management.endpoint.health.show-details=when-authorized
12. Protect Actuator Endpoints
Actuator endpoints may expose sensitive application information. Protect them in production.
.requestMatchers("/actuator/health").permitAll()
.requestMatchers("/actuator/**").hasRole("ADMIN")
13. Use Database Indexing
Add indexes for frequently searched, filtered, and joined columns.
CREATE INDEX idx_user_email
ON users(email);
Proper indexing improves query performance.
14. Use Pagination for Large Data
Never load thousands of records at once.
Pageable pageable =
PageRequest.of(0, 20);
Page<User> users =
userRepository.findAll(pageable);
15. Use Transactions Carefully
Use @Transactional in the service layer for database consistency.
@Transactional
public void placeOrder(OrderRequest request) {
saveOrder(request);
updateInventory(request);
processPayment(request);
}
- Keep transactions short
- Use readOnly for fetch operations
- Avoid long-running transactions
16. Configure CORS Properly
Do not allow all origins in production.
config.setAllowedOrigins(List.of(
"https://www.dhanishempower.com"
));
17. Use HTTPS in Production
HTTPS protects user data, login credentials, tokens, cookies, and payment information.
- Use SSL certificate
- Redirect HTTP to HTTPS
- Use secure cookies
18. Optimize JPA and Hibernate
- Prefer LAZY loading for collections
- Avoid unnecessary EAGER loading
- Use DTO projections for large responses
- Use pagination
- Monitor generated SQL queries
- Avoid N+1 query problems
19. Use Connection Pooling
Spring Boot uses HikariCP by default. Configure it properly for production.
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.connection-timeout=30000
20. Use Docker for Deployment
Docker makes deployment consistent across environments.
FROM eclipse-temurin:17-jdk-jammy
WORKDIR /app
COPY target/app.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
21. Use Reverse Proxy in Production
Nginx can be used as a reverse proxy for Spring Boot applications.
- Handles SSL
- Routes traffic
- Improves security
- Supports compression
22. Add Rate Limiting
Rate limiting protects APIs from abuse, brute-force attacks, and high traffic spikes.
Common use cases:
- Login APIs
- Payment APIs
- Public APIs
- Search APIs
23. Use Meaningful API Status Codes
| Status Code | Meaning |
|---|---|
| 200 OK | Request successful |
| 201 CREATED | Resource created |
| 400 BAD REQUEST | Invalid input |
| 401 UNAUTHORIZED | Not logged in |
| 403 FORBIDDEN | No permission |
| 404 NOT FOUND | Resource not found |
| 500 INTERNAL SERVER ERROR | Server error |
24. Write Unit and Integration Tests
Production applications should have proper tests.
- Unit tests for service logic
- Repository tests for database queries
- Controller tests for APIs
- Integration tests for complete flows
25. Use CI/CD for Deployment
CI/CD helps automate build, test, and deployment.
- Build application automatically
- Run tests automatically
- Create Docker image
- Deploy safely
Production Checklist
- Use Spring Security
- Use HTTPS
- Use environment variables
- Enable logging
- Enable monitoring
- Protect Actuator endpoints
- Validate input
- Use global exception handling
- Use pagination
- Optimize database queries
- Use Docker and reverse proxy
Common Interview Questions
What are Spring Boot production best practices?
Spring Boot production best practices include security, validation, global exception handling, logging, monitoring, database optimization, pagination, Docker deployment, HTTPS, and environment-based configuration.
Why should we use DTOs?
DTOs prevent exposing entity structure directly and improve API security.
Why should secrets be stored in environment variables?
It prevents sensitive data from being exposed in source code.
Why is monitoring important?
Monitoring helps detect failures, performance issues, and application health problems.
Why is pagination important?
Pagination improves performance by loading data in smaller chunks.
Conclusion
Spring Boot production best practices help developers build applications that are secure, scalable, maintainable, and reliable.
A production-ready Spring Boot application should include proper architecture, security, validation, logging, monitoring, database optimization, exception handling, Docker deployment, HTTPS, and environment-based configuration.
Understanding these best practices is essential for Spring Boot developers because enterprise applications must handle real users, real data, failures, security threats, and future growth.