Dr.
BADR EL KHALYLY
Backend Checklist par Layer
1. Controller Layer
Endpoints (REST, GraphQL)
Request Mapping (GET, POST, PUT, DELETE)
RequestBody, PathVariable, RequestParam
Produces/Consumes (JSON, XML)
Versioning (v1, v2 API)
2. Controller Advice (Global Exception Handling)
@ControllerAdvice
@ExceptionHandler (Custom Exceptions)
Standard Error Response (timestamp, status, message, path)
Handle Auth errors (401, 403)
Handle Validation errors (400)
3. Authentication / Authorization Layer
AuthService (login, register)
JWT/OAuth2 handling
Password hashing (BCrypt)
UserDetailsService implementation
SecurityConfig (HttpSecurity)
4. Service Layer
Business logic separation
@Service beans
Transaction management (@Transactional)
Call Repositories + Mappers
Unit tests with @MockBean
5. Repository Layer
Spring Data JPA repositories
Custom queries (JPQL, Native)
Pagination & Sorting
Optional<T> handling
Auditing (createdAt, updatedAt)
6. DTO & Mapper Layer
Request DTO (input validation)
Response DTO (hide sensitive fields)
Mapper (MapStruct or manual mapping)
Avoid exposing Entities directly
7. Validation
Bean Validation (@NotNull, @Email, @Size, @Pattern)
Custom Validators (e.g. UniqueEmailValidator)
Validation groups (Create vs Update)
8. Logging
Use SLF4J (log.info, log.error)
Centralized log format (JSON logs if needed)
Log important events (auth, errors, external calls)
Mask sensitive info (passwords, tokens)
9. Filters
Implement javax.servlet.Filter or OncePerRequestFilter
LoggingFilter (trace request/response)
AuthFilter (JWT extraction)
CORSFilter (if not handled by Spring Security)
10. Interceptors
Implement HandlerInterceptor
PreHandle (auth checks, request enrich)
PostHandle (modify response if needed)
AfterCompletion (logging, metrics)
11. AOP (Aspect-Oriented Programming)
@Aspect for cross-cutting concerns
LoggingAspect (method calls, execution time)
SecurityAspect (role-based checks if needed)
Performance monitoring aspect
12. Internationalization (i18n)
messages.properties (default)
messages_fr.properties, messages_en.properties…
LocaleResolver (Accept-Language header)
Use in Controllers & Exceptions
Extra (Best Practices)
API Documentation (Swagger / OpenAPI)
Caching (Spring Cache, Redis)
Testing (Unit + Integration)
Configuration Management (@ConfigurationProperties, Profiles)
Documentation API (Swagger / OpenAPI)
Intégrer springdoc-openapi (meilleur choix pour Spring Boot 2+).
URL par défaut : /swagger-ui.html ou /swagger-ui/index.html.
Ajouter des métadonnées (titre, description, version).
Sécuriser Swagger (ne pas l’exposer en production sans authentification).
Mise en cache (Spring Cache, Redis)
Activer le cache avec @EnableCaching.
Utiliser @Cacheable, @CacheEvict, @CachePut.
Choisir un fournisseur :
o SimpleCache (InMemory, uniquement pour le développement).
o Redis (prêt pour la production, distribué).
Configurer un TTL (Time To Live) pour éviter les données périmées.
Tests
Tests unitaires : JUnit5 + Mockito (par ex. Service/Repository).
Tests d’intégration : @SpringBootTest (Controller + DB).
Utiliser MockMvc pour tester les endpoints REST.
TestContainers (Postgres, Redis) pour simuler des environnements réels.
Générer un rapport de couverture (JaCoCo, SonarQube).
Gestion de la configuration
a) @ConfigurationProperties
Créer des classes pour binder les configurations (ex. MailProperties).
Centraliser les paramètres au lieu d’utiliser @Value.
b) Profils
Définir des profils : application-dev.yml, application-test.yml, application-prod.yml.
Activer via spring.profiles.active=dev.
Ne jamais stocker de secrets dans application.yml (utiliser Vault, AWS Secret Manager,
etc.).
c) Environnement
Injecter des valeurs spécifiques avec Environment env.getProperty("clé").
Utile pour lire des configurations dynamiques.
d) ConditionalConfiguration
@ConditionalOnProperty (activer/désactiver des beans).
@Profile("dev") (beans spécifiques à un profil).
@ConditionalOnClass (charger un bean seulement si une classe est disponible).