Bonnes pratiques Spring Boot
Votre objectif est d'écrire des applications Spring Boot de haute qualité en suivant les bonnes pratiques établies.
Configuration du projet et structure
- Outil de build : Utilisez Maven (
pom.xml) ou Gradle (build.gradle) pour la gestion des dépendances. - Starters : Utilisez les starters Spring Boot (par exemple,
spring-boot-starter-web,spring-boot-starter-data-jpa) pour simplifier la gestion des dépendances. - Structure des packages : Organisez le code par feature/domaine (par exemple,
com.example.app.order,com.example.app.user) plutôt que par couche (par exemple,com.example.app.controller,com.example.app.service).
Injection de dépendances et composants
- Injection par constructeur : Utilisez toujours l'injection basée sur le constructeur pour les dépendances requises. Cela rend les composants plus faciles à tester et les dépendances explicites.
- Immuabilité : Déclarez les champs de dépendance comme
private final. - Stéréotypes de composants : Utilisez les annotations
@Component,@Service,@Repositoryet@Controller/@RestControllerde manière appropriée pour définir les beans.
Configuration
- Configuration externalisée : Utilisez
application.yml(ouapplication.properties) pour la configuration. YAML est souvent préféré pour sa lisibilité et sa structure hiérarchique. - Propriétés type-safe : Utilisez
@ConfigurationPropertiespour lier la configuration à des objets Java fortement typés. - Profils : Utilisez les profils Spring (
application-dev.yml,application-prod.yml) pour gérer les configurations spécifiques à l'environnement. - Gestion des secrets : Ne codez pas les secrets en dur. Utilisez des variables d'environnement ou un outil dédié de gestion des secrets comme HashiCorp Vault ou AWS Secrets Manager.
Couche web (Contrôleurs)
- APIs RESTful : Concevez des endpoints RESTful clairs et cohérents.
- DTOs (Data Transfer Objects) : Utilisez les DTOs pour exposer et consommer les données au niveau de la couche API. N'exposez pas directement les entités JPA au client.
- Validation : Utilisez la validation Java Bean (JSR 380) avec les annotations (
@Valid,@NotNull,@Size) sur les DTOs pour valider les payloads de requête. - Gestion d'erreurs : Implémentez un gestionnaire d'exceptions global en utilisant
@ControllerAdviceet@ExceptionHandlerpour fournir des réponses d'erreur cohérentes.
Couche service
- Logique métier : Encapsulez toute la logique métier au sein des classes
@Service. - Absence d'état : Les services doivent être sans état.
- Gestion des transactions : Utilisez
@Transactionalsur les méthodes de service pour gérer les transactions de base de données de manière déclarative. Appliquez-le au niveau de granularité le plus fin nécessaire.
Couche données (Repositories)
- Spring Data JPA : Utilisez les repositories Spring Data JPA en étendant
JpaRepositoryouCrudRepositorypour les opérations standard sur la base de données. - Requêtes personnalisées : Pour les requêtes complexes, utilisez
@Queryou l'API JPA Criteria. - Projections : Utilisez les projections de DTO pour récupérer uniquement les données nécessaires de la base de données.
Journalisation
- SLF4J : Utilisez l'API SLF4J pour la journalisation.
- Déclaration du logger :
private static final Logger logger = LoggerFactory.getLogger(MyClass.class); - Journalisation paramétrée : Utilisez des messages paramétrés (
logger.info("Processing user {}...", userId);) au lieu de la concaténation de chaînes pour améliorer les performances.
Tests
- Tests unitaires : Écrivez des tests unitaires pour les services et les composants en utilisant JUnit 5 et un framework de mocking comme Mockito.
- Tests d'intégration : Utilisez
@SpringBootTestpour les tests d'intégration qui chargent le contexte de l'application Spring. - Test slices : Utilisez les annotations test slice comme
@WebMvcTest(pour les contrôleurs) ou@DataJpaTest(pour les repositories) pour tester des parties spécifiques de l'application de manière isolée. - Testcontainers : Envisagez d'utiliser Testcontainers pour les tests d'intégration fiables avec des bases de données réelles, des message brokers, etc.
Sécurité
- Spring Security : Utilisez Spring Security pour l'authentification et l'autorisation.
- Encodage des mots de passe : Encodez toujours les mots de passe en utilisant un algorithme de hachage fort comme BCrypt.
- Sanitisation des entrées : Prévenez les injections SQL en utilisant Spring Data JPA ou des requêtes paramétrées. Prévenez les attaques Cross-Site Scripting (XSS) en encodant correctement la sortie.