Spring-Boot
Junior
Quiz-Springboot-Junior
Spring-Security
Jwt
Spring-Data-Jpa
Hibernate
Validation
Exception-Handling
Junit
Questions-Entretien-Spring-Junior
Qcm-Springboot-Junior
Java
Back-End
📝
Entretien Spring Boot Junior : Security et JPA
20 questions Spring Boot niveau junior : Spring Security, JWT, Spring Data JPA avancé, Hibernate, validation, exception handling et tests JUnit pour entretien.
Banque de révision : les 30 questions corrigées
Voici l'intégralité des 30 questions de « Entretien Spring Boot Junior : Security et JPA », chacune avec sa bonne réponse et son explication. Le quiz interactif ci-dessus en tire une sélection aléatoire à chaque tentative — utilisez cette liste complète pour réviser.
Explication :
Tous sont des stéréotypes de
@Component. @Repository ajoute la traduction automatique des exceptions JPA en DataAccessException. @Service et @Controller sont des spécialisations sémantiques pour la logique métier et la couche web.
Utilisez le stéréotype le plus spécifique. Cela améliore la lisibilité et permet à Spring d'appliquer des comportements supplémentaires (ex: traduction d'exceptions pour @Repository).
Explication :
Grâce à
PersistenceExceptionTranslationPostProcessor, les repositories annotés @Repository voient leurs exceptions JPA/Hibernate traduites en exceptions Spring de la hiérarchie DataAccessException, cohérentes quel que soit le fournisseur.
Cette traduction rend votre couche service indépendante de l'implémentation JPA sous-jacente.
Explication :
Le cycle de vie complet : 1) Instantiation, 2) Injection des dépendances, 3) Appels Aware (BeanNameAware, BeanFactoryAware, ApplicationContextAware), 4) BeanPostProcessor.postProcessBeforeInitialization, 5) @PostConstruct / InitializingBean.afterPropertiesSet, 6) BeanPostProcessor.postProcessAfterInitialization, 7) Bean prêt, 8) @PreDestroy / DisposableBean.destroy.
Utilisez
@PostConstruct pour la logique d'initialisation après injection des dépendances, et @PreDestroy pour le nettoyage.
Explication :
@RequestParam lie les paramètres de query string (?page=1&size=10) ou de formulaire. @RequestBody lit le corps de la requête HTTP (JSON, XML) et le convertit en objet Java via HttpMessageConverter (Jackson par défaut).
Pour une requête POST avec JSON, utilisez
@RequestBody. Pour une requête GET avec des filtres, utilisez @RequestParam.
Explication :
Les relations doivent être LAZY par défaut pour éviter de charger des données inutiles. Pour la sérialisation JSON, utilisez
@JsonManagedReference/@JsonBackReference ou @JsonIgnore pour éviter les boucles infinies. Utilisez @EntityGraph pour les chargements spécifiques.
Le piège classique : @OneToMany EAGER + sérialisation Jackson = requêtes SQL en cascade et réponse JSON infinie.
Explication :
Spring AOP permet de séparer les préoccupations transversales (logging, sécurité, transactions). On crée une classe
@Aspect avec des méthodes annotées @Before, @After, @Around et des pointcuts pour cibler les méthodes.
Exemple de pointcut pour logger toutes les méthodes d'un package service :
@Before("execution(* com.example.service.*.*(..))").
Explication :
Les DTOs sont des objets simples (sans logique) qui transportent les données. Ils évitent d'exposer les entités JPA (risque de lazy loading, sécurité, couplage). On les utilise entre le contrôleur et le service, ou en réponse/requête API.
Utilisez
MapStruct ou ModelMapper pour convertir automatiquement les entités en DTO et vice-versa.
Explication :
Pour des datasources multiples : créez des classes
@Configuration séparées, définissez les propriétés (spring.datasource.primary, spring.datasource.secondary), marquez-en une @Primary, et utilisez @Qualifier pour choisir.
Utilisez
@EnableJpaRepositories avec basePackages et entityManagerFactoryRef pour lier chaque datasource à ses repositories.
Explication :
Activez le cache avec
@EnableCaching. Annoter une méthode @Cacheable("users") pour mettre en cache son résultat. @CacheEvict vide le cache, @CachePut met à jour. Spring Boot fournit des implémentations (ConcurrentHashMap, EhCache, Redis).
Pour le cache distribué en production, utilisez Redis avec
spring-boot-starter-data-redis.
Explication :
Le N+1 se produit quand JPA exécute 1 requête pour l'entité principale, puis N requêtes pour chaque entité liée (lazy loading). Solutions :
JOIN FETCH dans JPQL, @EntityGraph pour définir ce qui doit être chargé, ou @BatchSize pour grouper les requêtes.
Activez les logs SQL (
spring.jpa.show-sql=true) pour détecter le N+1. Si vous voyez une avalanche de SELECT, vous avez un N+1.
Explication :
Flyway et Liquibase sont les solutions standards. Elles versionnent les changements de schéma SQL, les appliquent automatiquement au démarrage, et assurent la cohérence entre les environnements.
Ne JAMAIS utiliser
spring.jpa.hibernate.ddl-auto=create ou update en production. Préférez validate avec Flyway/Liquibase.
Explication :
@ComponentScan scanne les packages pour trouver les composants Spring (@Component, @Service, etc.). @EntityScan (dans Spring Boot) scanne les packages pour trouver les entités JPA (@Entity).
Si vos entités sont dans un package différent de votre classe principale, utilisez
@EntityScan("com.example.entities").
Explication :
Spring Data fournit
Pageable. Le contrôleur accepte @PageableDefault Pageable pageable, le repository retourne Page<T>. Les paramètres ?page=0&size=20&sort=name,asc sont automatiquement interprétés.
Pour personnaliser les noms des paramètres :
@PageableDefault(size = 20, sort = "name").
Explication :
@WebMvcTest(MonController.class) charge uniquement la couche web. MockMvc permet de simuler des requêtes HTTP et de vérifier les réponses. On mocke les services avec @MockBean.
Exemple :
mockMvc.perform(get("/users/1")).andExpect(status().isOk()).andExpect(jsonPath("$.name").value("Alice"));.
Explication :
Spring Security est le standard de sécurité pour Spring. Ajoutez
spring-boot-starter-security, et il sécurise automatiquement les endpoints (authentification par défaut). Personnalisez avec une SecurityFilterChain.
Dès que vous ajoutez le starter, tous les endpoints sont protégés. Le mot de passe par défaut est généré dans les logs au démarrage.
Explication :
@CrossOrigin(origins = "http://localhost:4200") sur un contrôleur ou méthode. Globalement : implémenter WebMvcConfigurer.addCorsMappings() ou définir un bean CorsFilter.
En production, soyez restrictif sur les origines autorisées. Évitez
allowedOrigins("*").
Explication :
@ConfigurationProperties mappe un groupe de propriétés vers un objet Java structuré. Exemple : @ConfigurationProperties(prefix = "app.mail") mappe app.mail.host, app.mail.port vers les champs d'une classe.
Ajoutez
spring-boot-configuration-processor pour avoir l'auto-complétion dans l'IDE lors de l'édition du application.properties.
Explication :
Spring Events permettent une communication découplée. Un composant publie un événement via
ApplicationEventPublisher.publishEvent(). D'autres composants le reçoivent via @EventListener, sans dépendance directe.
Pour les événements asynchrones, ajoutez
@Async sur le listener et @EnableAsync sur la configuration.
Explication :
Implémentez l'interface
Validator de Spring pour des validations complexes multi-champs. Ou créez des annotations de validation personnalisées avec @Constraint qui peuvent être réutilisées partout.
Pour une validation qui nécessite l'accès à la base de données, injectez un repository dans votre Validator personnalisé.
Explication :
RestTemplate est l'ancien client synchrone (déprécié, en maintenance). WebClient (Spring WebFlux) est le client moderne, supportant le synchrone et le réactif. Créez un bean WebClient.Builder et injectez-le.
WebClient peut être utilisé même sans WebFlux. Ajoutez
spring-boot-starter-webflux et utilisez .block() pour des appels synchrones.
Explication :
Le Circuit Breaker détecte les échecs répétés vers un service externe et "ouvre le circuit" pour éviter des appels inutiles. Resilience4j (successeur de Hystrix) s'intègre avec Spring Boot et fournit
@CircuitBreaker.
Combinez CircuitBreaker avec
@Retry (réessayer avant d'ouvrir) et @TimeLimiter (timeout) pour une stratégie de résilience complète.
Explication :
Spring Boot supporte l'upload via
MultipartFile. Utilisez @RequestParam("file") MultipartFile file dans le contrôleur. Configurez la taille max avec spring.servlet.multipart.max-file-size et max-request-size.
Ne stockez pas les fichiers dans la base de données. Stockez-les sur le système de fichiers ou un service cloud (S3), et gardez le chemin en base.
Explication :
Spring Batch structure les traitements batch en Jobs composés de Steps (ItemReader → ItemProcessor → ItemWriter). Il gère les transactions, les reprises sur erreur, et le chunk processing pour de gros volumes.
Utilisez Spring Batch pour les imports/exports massifs, la génération de rapports, ou le nettoyage de données.
Explication :
@EnableScheduling active le support. @Scheduled(fixedRate = 5000) exécute toutes les 5 secondes. @Scheduled(cron = "0 0 * * * *") utilise une expression cron.
Pour les environnements distribués, utilisez un scheduler distribué (ShedLock) pour éviter que la tâche ne s'exécute sur plusieurs instances.
Explication :
Créez des fichiers
messages.properties (défaut), messages_fr.properties, messages_en.properties. Utilisez MessageSource pour récupérer les messages. AcceptHeaderLocaleResolver détecte la langue du navigateur.
Dans un contrôleur REST, injectez le
MessageSource ou utilisez LocaleContextHolder.getLocale().
Explication :
spring-boot-starter-test regroupe les dépendances de test essentielles : JUnit 5 (framework de test), Mockito (mocks), AssertJ (assertions fluides), Hamcrest (matchers), JSONassert (assertions JSON), et Spring Test.
Utilisez
@SpringBootTest pour les tests d'intégration (charge tout le contexte). Pour des tests plus légers, utilisez des slices comme @WebMvcTest ou @DataJpaTest.
Explication :
Créez une classe
@RestControllerAdvice avec @ExceptionHandler(MethodArgumentNotValidException.class). Extrayez les erreurs de champ, construisez un DTO d'erreur structuré (code, message, détails), et retournez-le avec un statut HTTP approprié.
Structure recommandée pour l'erreur :
{ "status": 400, "message": "Validation failed", "errors": [{ "field": "email", "message": "Invalid email" }] }.
Explication :
Spring Cloud fournit des solutions pour les architectures microservices : Service Discovery (Eureka, Consul), Configuration centralisée (Config Server), API Gateway (Spring Cloud Gateway), Circuit Breaker (Resilience4j), Distributed Tracing (Sleuth/Micrometer).
Commencez par Spring Cloud Netflix Eureka pour le service discovery et Spring Cloud Gateway pour le routage.
Explication :
Optimisations clés : compression GZIP (
server.compression.enabled=true), cache (@Cacheable, Redis), optimisation JPA (lazy loading, batch size, éviter N+1), pool de connexions (HikariCP par défaut, ajuster pool-size), et monitoring (Actuator + Micrometer).
Utilisez un APM (Application Performance Monitoring) comme Prometheus + Grafana, ou Spring Boot Admin pour surveiller la production.
Explication :
Deux approches : 1)
mvn spring-boot:build-image (Cloud Native Buildpacks, sans Dockerfile). 2) Dockerfile multi-stage (builder avec Maven/Gradle + runtime avec JRE). Les deux produisent une image Docker optimisée.
Les Buildpacks sont recommandés : ils créent des images optimisées, sécurisées, avec une JRE adaptée, sans avoir à écrire de Dockerfile.