📚 Fiches de Révision

87 questions organisées par thème

🏠 Retour à l'accueil
Filtrer par thème :

Domain Driven Design(20 questions)

Question 1

Quelles affirmations sont vraies concernant l'Ubiquitous Language (Langage Ubiquitaire) ?

☑️A.C'est un langage partagé entre développeurs et experts métier✓ Bonne réponse
☑️B.Il doit être utilisé dans le code source✓ Bonne réponse
C.C'est un langage de programmation spécifique
☑️D.Il améliore la communication entre l'équipe technique et le business✓ Bonne réponse
💡

Explication :

L'Ubiquitous Language est un langage commun structuré autour du modèle de domaine, utilisé par les développeurs ET les experts métier. Il doit se refléter dans le code (noms de classes, méthodes, etc.).

Question 2

Quelles sont les caractéristiques d'une Entity en DDD ?

☑️A.Elle est définie par une identité unique✓ Bonne réponse
☑️B.Son identité persiste dans le temps✓ Bonne réponse
C.Elle est toujours immuable
☑️D.Elle peut être suivie à travers différents états✓ Bonne réponse
💡

Explication :

Une Entity est définie par son identité unique (ex: un ID) qui persiste dans le temps, pas par ses attributs. Elle n'est PAS immuable contrairement aux Value Objects.

Question 3

Quelles sont les caractéristiques d'un Value Object ?

☑️A.Il est défini par ses attributs, pas par une identité✓ Bonne réponse
☑️B.Il doit être immuable (immutable)✓ Bonne réponse
C.Il a toujours une clé primaire en base de données
☑️D.Il est préféré aux Entities quand c'est possible✓ Bonne réponse
💡

Explication :

Les Value Objects sont définis par leur valeur (attributs), doivent être immuables, et sont préférés aux Entities car ils simplifient le code. Ils n'ont PAS d'identité propre.

Question 4

Concernant les Aggregates en DDD, quelles affirmations sont correctes ?

☑️A.Un Aggregate est un groupe d'objets liés traités comme une unité✓ Bonne réponse
☑️B.L'Aggregate Root contrôle l'accès aux membres internes✓ Bonne réponse
C.Chaque Entity doit être un Aggregate Root
☑️D.Il garantit la cohérence des données lors des modifications✓ Bonne réponse
💡

Explication :

Un Aggregate est un cluster d'objets associés avec une 'Root Entity' (Aggregate Root) qui contrôle l'accès. Il garantit la cohérence mais toutes les Entities ne sont PAS des Aggregate Roots.

Question 5

Qu'est-ce qu'un Bounded Context ?

☑️A.Une limite logique où un modèle de domaine est défini et applicable✓ Bonne réponse
☑️B.Chaque contexte peut avoir sa propre définition des mêmes termes✓ Bonne réponse
C.Un framework de développement Java
☑️D.Il permet d'isoler les différentes parties du système✓ Bonne réponse
💡

Explication :

Un Bounded Context est une frontière dans laquelle un modèle de domaine spécifique est défini. Le même mot peut avoir des significations différentes dans différents contextes.

Question 6

Quels sont les rôles des Repositories en DDD ?

☑️A.Encapsuler la persistance des objets du domaine✓ Bonne réponse
☑️B.Permettre la récupération des objets du domaine✓ Bonne réponse
C.Contenir la logique métier complexe
☑️D.Il y a généralement un Repository par Aggregate✓ Bonne réponse
💡

Explication :

Les Repositories encapsulent la persistance et la récupération des objets du domaine. La logique métier appartient aux Services ou aux Entities, pas aux Repositories.

Question 7

À quoi sert l'Anti-corruption Layer (ACL) ?

☑️A.Traduire entre deux Bounded Contexts différents✓ Bonne réponse
☑️B.Empêcher un modèle externe de 'polluer' le modèle interne✓ Bonne réponse
C.Améliorer les performances des requêtes
☑️D.Utiliser des DTOs et mappers pour l'isolation✓ Bonne réponse
💡

Explication :

L'ACL est une couche de traduction qui protège le modèle interne des influences externes (modèles legacy, APIs tierces). Elle utilise des DTOs et mappers, mais n'est pas liée aux performances.

Question 8

Concernant le Core Domain et les Generic Subdomains, quelles affirmations sont vraies ?

☑️A.Le Core Domain représente la partie la plus critique du système✓ Bonne réponse
☑️B.C'est là où la valeur business principale doit être concentrée✓ Bonne réponse
☑️C.Les Generic Subdomains ont une faible valeur ajoutée métier✓ Bonne réponse
D.Tous les sous-domaines doivent recevoir le même niveau d'investissement
💡

Explication :

Le Core Domain est le cœur de la valeur métier et doit recevoir le plus d'attention. Les Generic Subdomains (technique, support) sont nécessaires mais n'apportent pas de valeur unique.

Question 9

Quelles sont les caractéristiques des Services en DDD ?

☑️A.Ils contiennent une logique qui ne s'intègre pas naturellement dans une Entity✓ Bonne réponse
☑️B.Ils sont généralement stateless✓ Bonne réponse
C.Ils remplacent toujours les Entities
☑️D.Ils peuvent orchestrer plusieurs Aggregates✓ Bonne réponse
💡

Explication :

Les Services sont stateless et contiennent une logique qui ne s'intègre pas dans une Entity ou un Value Object. Ils ne remplacent PAS les Entities mais complètent l'architecture.

Question 10

Qu'est-ce que le Context Map en DDD ?

☑️A.Un document ou diagramme montrant les liens entre Bounded Contexts✓ Bonne réponse
B.Une carte géographique du déploiement
☑️C.Il aide à visualiser les relations entre différentes parties du système✓ Bonne réponse
☑️D.Il identifie les patterns d'intégration utilisés✓ Bonne réponse
💡

Explication :

Le Context Map est une visualisation des relations entre Bounded Contexts et des patterns d'intégration utilisés (ACL, Shared Kernel, etc.). Ce n'est pas lié au déploiement.

Question 11

Concernant les Factories en DDD, quelles affirmations sont correctes ?

☑️A.Elles sont responsables de la création d'objets complexes✓ Bonne réponse
☑️B.Elles peuvent créer des Aggregates entiers✓ Bonne réponse
C.Elles remplacent les constructeurs dans tous les cas
☑️D.Elles encapsulent la logique de création✓ Bonne réponse
💡

Explication :

Les Factories créent des objets complexes ou des Aggregates. Elles ne remplacent PAS tous les constructeurs, seulement quand la logique de création est complexe.

Question 12

Qu'est-ce que le 'Refactoring toward deeper insight' en DDD ?

☑️A.Améliorer le design quand la compréhension métier évolue✓ Bonne réponse
B.Refactorer uniquement pour améliorer les performances
☑️C.Peut nécessiter des changements significatifs du modèle✓ Bonne réponse
☑️D.Le code doit refléter les nouvelles connaissances acquises✓ Bonne réponse
💡

Explication :

À mesure que la compréhension du domaine s'améliore, le design doit être refactoré pour refléter ces insights, même si cela nécessite des changements majeurs. Ce n'est pas limité aux performances.

Question 13

Concernant les 'Intention-revealing interfaces', quelles sont les bonnes pratiques ?

☑️A.Les interfaces doivent nommer explicitement leur intention métier✓ Bonne réponse
☑️B.Exemple : PayrollService.getHourlyRate(Employee) plutôt que ErpService.getHourlyRate(sapId)✓ Bonne réponse
C.Les noms techniques sont préférés aux noms métier
☑️D.Le but business doit être clair dans la signature✓ Bonne réponse
💡

Explication :

Les interfaces doivent révéler l'intention métier, pas les détails techniques. Des noms business explicites (PayrollService, Employee) sont préférés aux noms techniques (ErpService, sapId).

Question 14

Dans l'exemple d'un siège d'avion, quand doit-on utiliser une Entity vs un Value Object ?

☑️A.Entity si chaque siège est tracké individuellement (ex: Air France)✓ Bonne réponse
☑️B.Value Object si n'importe quel siège libre convient (ex: low-cost)✓ Bonne réponse
☑️C.Entity quand l'identité de chaque siège importe✓ Bonne réponse
D.Value Object car les sièges sont toujours immuables
💡

Explication :

Si chaque siège a une identité (réservation spécifique) → Entity. Si n'importe quel siège équivalent convient → Value Object. Les sièges ne sont pas nécessairement immuables.

Question 15

Pourquoi le DDD encourage-t-il les échanges fréquents avec les experts métier ?

☑️A.Pour aligner le code avec la logique business✓ Bonne réponse
☑️B.Pour construire l'Ubiquitous Language ensemble✓ Bonne réponse
C.Pour réduire les coûts de développement uniquement
☑️D.Pour améliorer la compréhension du domaine✓ Bonne réponse
💡

Explication :

Les échanges fréquents alignent le code avec le business, construisent le langage commun et améliorent la compréhension. Le but n'est pas uniquement de réduire les coûts.

Question 16

En DDD, qu'est-ce qui distingue une Entity d'un Value Object ?

☑️A.L'Entity a une identité unique qui persiste✓ Bonne réponse
☑️B.Le Value Object est défini par ses attributs, pas son identité✓ Bonne réponse
C.L'Entity est toujours mutable, le Value Object jamais
☑️D.Le Value Object n'a pas d'identité propre✓ Bonne réponse
💡

Explication :

L'Entity a une identité, le Value Object est défini par ses attributs. Mais l'Entity n'est pas TOUJOURS mutable (elle peut avoir des champs finaux).

Question 17

Dans le TP Feature Flipping, la classe Feature est-elle une Entity ou un Value Object ?

☑️A.Entity car elle a un attribut 'name' qui sert d'identifiant✓ Bonne réponse
B.Value Object car elle est immuable
☑️C.Entity car equals() compare uniquement le 'name'✓ Bonne réponse
D.Value Object car elle n'a pas d'annotation @Entity
💡

Explication :

Feature est une Entity : elle a un champ 'name' qui sert d'identité, et equals() compare uniquement le 'name'. L'annotation @Entity n'est pas requise au niveau domain.

Question 18

Dans le TP, l'expression 'dev & admin | guest' est parsée dans quel ordre ?

☑️A.((dev & admin) | guest) car & a priorité sur |✓ Bonne réponse
B.(dev & (admin | guest)) car | a priorité sur &
C.De gauche à droite sans priorité
D.Erreur de parsing
💡

Explication :

L'opérateur & (AND) a priorité sur | (OR), comme en mathématiques et en programmation. Donc (dev & admin) | guest.

Question 19

Que retourne RoleExpression.toPredicate() ?

☑️A.Un Predicate<UserRoles> pour tester les rôles✓ Bonne réponse
B.Un boolean directement
C.Une liste de rôles
D.Un String représentant l'expression
💡

Explication :

toPredicate() retourne un Predicate<UserRoles> qui peut être testé avec .test(userRoles). stringify() retourne le String.

Question 20

Dans le TP, comment la classe Feature valide-t-elle son nom ?

☑️A.Dans le constructeur avec IllegalArgumentException si null/blank✓ Bonne réponse
B.Avec une annotation @NotNull
C.Dans une méthode validate() séparée
D.Par un Validator externe
💡

Explication :

La validation est dans le constructeur : 'if (name == null || name.isBlank()) throw new IllegalArgumentException()'. C'est le pattern DDD recommandé.

Test Driven Development(18 questions)

Question 1

Quelles sont les étapes du cycle TDD (Red-Green-Refactor) ?

☑️A.Écrire un test qui échoue (Red)✓ Bonne réponse
☑️B.Écrire le code minimal pour passer le test (Green)✓ Bonne réponse
C.Optimiser les performances avant tout
☑️D.Refactorer le code en gardant les tests verts✓ Bonne réponse
💡

Explication :

Le cycle TDD est : Red (test échoue) → Green (code minimal pour passer) → Refactor (améliorer sans casser). L'optimisation des performances n'est PAS une étape du cycle.

Question 2

Pourquoi écrire un test qui échoue d'abord (étape Red) ?

☑️A.Pour confirmer que le test harness fonctionne✓ Bonne réponse
☑️B.Pour éviter les 'faux positifs' (tests qui passent toujours)✓ Bonne réponse
C.Pour ralentir le développement
☑️D.Pour valider que le test détecte bien l'absence de la fonctionnalité✓ Bonne réponse
💡

Explication :

L'étape Red confirme que le test fonctionne et détecte vraiment l'absence de fonctionnalité. Cela évite les tests qui passent toujours (faux positifs).

Question 3

Quels outils sont utilisés pour le TDD en Java ?

☑️A.JUnit pour exécuter les tests✓ Bonne réponse
☑️B.AssertJ pour les assertions fluides✓ Bonne réponse
☑️C.Mockito pour les mocks✓ Bonne réponse
D.Maven pour la couverture de code
💡

Explication :

JUnit est le framework de test, AssertJ pour les assertions lisibles, Mockito pour les mocks. Maven est un outil de build, pas spécifiquement pour la couverture (c'est JaCoCo par exemple).

Question 4

Quels sont les anti-patterns à éviter en TDD ?

☑️A.Le couplage entre les tests (ordre dépendant)✓ Bonne réponse
☑️B.Tester les méthodes privées directement✓ Bonne réponse
☑️C.Tester les librairies tierces✓ Bonne réponse
☑️D.Des tests trop lents qui découragent leur exécution✓ Bonne réponse
💡

Explication :

Tous sont des anti-patterns : les tests doivent être indépendants, tester le comportement public, ne pas tester le code tiers, et être rapides à exécuter.

Question 5

Quelles sont les caractéristiques d'un bon test unitaire ?

☑️A.Il est indépendant des autres tests✓ Bonne réponse
☑️B.Il teste le comportement public, pas l'implémentation✓ Bonne réponse
C.Il peut dépendre de l'ordre d'exécution
☑️D.Il est rapide à exécuter✓ Bonne réponse
💡

Explication :

Les tests doivent être indépendants (ordre invariant), tester le comportement public, et être rapides. Un test ne doit JAMAIS dépendre de l'ordre d'exécution.

Question 6

Quels sont les différents niveaux de tests ?

☑️A.Tests unitaires : fonctions/méthodes isolées✓ Bonne réponse
☑️B.Tests d'intégration : interaction entre modules✓ Bonne réponse
☑️C.Tests E2E : flux utilisateur complets✓ Bonne réponse
☑️D.Tests de performance : validation sous charge✓ Bonne réponse
💡

Explication :

Tous ces niveaux existent : unitaires (isolation), social/intégration (collaborateurs), E2E (flux complets), performance (charge).

Question 7

Concernant Mockito, quelles affirmations sont vraies ?

☑️A.mock() crée un objet simulé✓ Bonne réponse
☑️B.when() définit le comportement du mock✓ Bonne réponse
☑️C.verify() vérifie les interactions avec le mock✓ Bonne réponse
D.Les mocks remplacent toujours les vraies classes
💡

Explication :

Mockito permet de créer des mocks (mock()), définir leur comportement (when()) et vérifier les appels (verify()). Les mocks ne remplacent PAS toujours les vraies classes, seulement pour isoler le code testé.

Question 8

Qu'est-ce que l'ATDD (Acceptance Test Driven Development) ?

☑️A.Écrire des tests d'acceptation avant le code✓ Bonne réponse
☑️B.Les tests sont basés sur les critères d'acceptation du client✓ Bonne réponse
C.C'est une technique pour améliorer les performances
☑️D.Il est souvent combiné avec BDD (Behavior Driven Development)✓ Bonne réponse
💡

Explication :

ATDD écrit des tests basés sur les critères d'acceptation du client avant le développement. Il est souvent combiné avec BDD. Ce n'est pas lié aux performances.

Question 9

Concernant la couverture de code, quelles affirmations sont vraies ?

☑️A.Elle mesure le pourcentage de code exécuté par les tests✓ Bonne réponse
B.100% de couverture garantit l'absence de bugs
☑️C.Elle aide à identifier le code non testé✓ Bonne réponse
☑️D.Elle est un indicateur, pas un objectif en soi✓ Bonne réponse
💡

Explication :

La couverture mesure le code exécuté par les tests et aide à identifier les lacunes. Mais 100% de couverture ne garantit PAS l'absence de bugs, car elle ne teste pas tous les cas.

Question 10

Pourquoi les méthodes privées ne doivent-elles pas être testées directement ?

☑️A.Elles sont testées indirectement via le comportement public✓ Bonne réponse
☑️B.Tester l'implémentation rend les tests fragiles✓ Bonne réponse
C.Elles ne contiennent jamais de bugs
☑️D.Le refactoring devient difficile si les tests dépendent de l'implémentation✓ Bonne réponse
💡

Explication :

Les méthodes privées sont des détails d'implémentation. Les tester directement rend les tests fragiles au refactoring. Elles sont testées via le comportement public.

Question 11

Concernant les tests avec des parsers TDD, quels cas doivent être testés ?

☑️A.Gestion des nulls et chaînes vides✓ Bonne réponse
☑️B.Termes invalides✓ Bonne réponse
☑️C.Espaces en début et fin✓ Bonne réponse
☑️D.Imbrication complexe des opérateurs✓ Bonne réponse
💡

Explication :

Tous ces cas doivent être testés : nulls/blanks, termes invalides, espaces parasites, et les cas complexes d'opérateurs imbriqués.

Question 12

Concernant la hiérarchie des exceptions en Java, quelles affirmations sont vraies ?

☑️A.Error représente des problèmes système (ne pas capturer)✓ Bonne réponse
☑️B.Exception représente des exceptions vérifiées (checked)✓ Bonne réponse
☑️C.RuntimeException représente des exceptions non vérifiées (unchecked)✓ Bonne réponse
D.Toutes les exceptions doivent être déclarées dans la signature
💡

Explication :

Error = problèmes système. Exception = checked (à déclarer ou capturer). RuntimeException = unchecked (pas obligé de déclarer). Seules les checked doivent être déclarées.

Question 13

Quelles syntaxes Mockito permettent de vérifier qu'une méthode n'a JAMAIS été appelée ?

☑️A.verify(mock, times(0)).method()✓ Bonne réponse
☑️B.verify(mock, never()).method()✓ Bonne réponse
C.verifyNever(mock).method()
D.assertNever(mock.method())
💡

Explication :

times(0) et never() sont équivalents en Mockito pour vérifier qu'une méthode n'a pas été appelée.

Question 14

Quelles annotations sont OBLIGATOIRES pour un test unitaire avec Mockito (JUnit 5) ?

☑️A.@ExtendWith(MockitoExtension.class)✓ Bonne réponse
☑️B.@Mock sur les dépendances✓ Bonne réponse
C.@SpringBootTest
D.@InjectMocks sur la classe testée
💡

Explication :

@ExtendWith et @Mock sont essentiels. @SpringBootTest est pour les tests d'intégration, pas les tests unitaires. @InjectMocks est utile mais pas toujours obligatoire.

Question 15

Concernant ArgumentCaptor en Mockito, quelles affirmations sont vraies ?

☑️A.Il permet de capturer les arguments passés à une méthode mockée✓ Bonne réponse
☑️B.Il s'utilise avec @Captor ou ArgumentCaptor.forClass()✓ Bonne réponse
C.Il remplace les assertions AssertJ
☑️D.On récupère la valeur capturée avec captor.getValue()✓ Bonne réponse
💡

Explication :

ArgumentCaptor capture les arguments pour les vérifier ensuite. Il complète AssertJ, ne le remplace pas.

Question 16

Pourquoi les tests dans le TP utilisent-ils @Nested ?

☑️A.Pour grouper les tests par fonctionnalité/méthode testée✓ Bonne réponse
☑️B.Pour améliorer la lisibilité des rapports de test✓ Bonne réponse
C.C'est obligatoire avec JUnit 5
D.Pour partager un setup commun entre tests liés
💡

Explication :

@Nested permet de grouper les tests et améliore la lisibilité. Ce n'est pas obligatoire et ne permet pas de partager le setup automatiquement.

Question 17

Dans le test du contrôleur : 'verify(service, times(0)).saveFeature(any())' signifie ?

☑️A.Vérifier que saveFeature n'a jamais été appelée✓ Bonne réponse
B.Sauvegarder le feature 0 fois
C.Vérifier que saveFeature a été appelée au moins une fois
D.Attendre que saveFeature soit appelée
💡

Explication :

times(0) vérifie que la méthode n'a PAS été appelée. C'est utilisé pour s'assurer qu'en cas d'erreur, on ne sauvegarde pas.

Question 18

Dans AssertJ, quelle assertion vérifie qu'une collection contient exactement les éléments attendus, dans n'importe quel ordre ?

A.containsExactly()
☑️B.containsExactlyInAnyOrder()✓ Bonne réponse
C.contains()
D.hasSameElementsAs()
💡

Explication :

containsExactlyInAnyOrder() vérifie les mêmes éléments sans ordre. containsExactly() impose l'ordre. contains() n'est pas exact.

Inversion of Control(17 questions)

Question 1

Qu'est-ce que l'Inversion of Control (IoC) ?

☑️A.Déléguer la gestion du cycle de vie des objets à un conteneur✓ Bonne réponse
☑️B.Le framework gère la création et l'injection des dépendances✓ Bonne réponse
C.Un design pattern pour améliorer les performances
☑️D.Permet de gagner en flexibilité en 'donnant les clés au conteneur'✓ Bonne réponse
💡

Explication :

L'IoC consiste à déléguer la gestion des objets au conteneur (Spring, CDI). Le framework crée, injecte et détruit les composants. Ce n'est pas un pattern de performance.

Question 2

Quelles sont les caractéristiques de la Dependency Injection (DI) ?

☑️A.Le conteneur est responsable de créer et fournir les composants✓ Bonne réponse
☑️B.Le conteneur peut injecter des wrappers/proxies au lieu des objets réels✓ Bonne réponse
C.Elle facilite uniquement le développement, pas les tests
☑️D.Elle favorise la composition plutôt que l'héritage✓ Bonne réponse
💡

Explication :

La DI permet au conteneur de créer et injecter les dépendances (parfois via proxies). Elle favorise la composition over inheritance et facilite aussi les tests via les mocks.

Question 3

À quoi sert l'annotation @Autowired (ou @Inject) ?

☑️A.Indiquer où une dépendance doit être injectée✓ Bonne réponse
B.Créer une nouvelle instance à chaque appel
☑️C.Peut être utilisée sur un attribut ou un paramètre de méthode✓ Bonne réponse
☑️D.Le conteneur résout automatiquement la dépendance✓ Bonne réponse
💡

Explication :

@Autowired/@Inject indique au conteneur où injecter une dépendance. Elle ne crée PAS une nouvelle instance à chaque appel (dépend du scope).

Question 4

Concernant l'annotation @Scope, quelles affirmations sont vraies ?

☑️A.Le scope par défaut est 'singleton' (une instance par conteneur)✓ Bonne réponse
☑️B.Le scope 'prototype' crée une nouvelle instance à chaque demande✓ Bonne réponse
☑️C.Le scope 'request' est lié à une requête HTTP✓ Bonne réponse
D.Le scope 'session' est le scope par défaut
💡

Explication :

Le scope par défaut est singleton (une instance). Prototype crée une nouvelle instance à chaque fois. Request est lié à une requête HTTP. Session n'est PAS le défaut.

Question 5

Pourquoi faut-il éviter d'utiliser 'new' pour les composants injectables ?

☑️A.Cela court-circuite le conteneur et casse la chaîne d'injection✓ Bonne réponse
☑️B.L'objet créé ne bénéficie pas des injections du conteneur✓ Bonne réponse
C.C'est toujours plus lent que l'injection
☑️D.Les proxies et wrappers ne sont pas appliqués✓ Bonne réponse
💡

Explication :

Utiliser 'new' bypasse le conteneur : l'objet n'a pas ses dépendances injectées et les proxies (pour les transactions, etc.) ne sont pas appliqués. Ce n'est pas une question de performance.

Question 6

À quoi sert l'annotation @Bean (ou @Produces) ?

☑️A.Définir comment construire un bean complexe✓ Bonne réponse
☑️B.Utilisée sur une méthode qui retourne le bean à injecter✓ Bonne réponse
C.Remplacer automatiquement toutes les dépendances
☑️D.Utile quand la construction nécessite une logique personnalisée✓ Bonne réponse
💡

Explication :

@Bean/@Produces définit comment créer un bean quand la construction est complexe. Elle ne remplace pas automatiquement les dépendances.

Question 7

Quels sont les avantages de l'IoC avec les Repositories automatiques ?

☑️A.Simplification des opérations de base de données via interfaces✓ Bonne réponse
☑️B.Génération automatique du code CRUD✓ Bonne réponse
☑️C.Les requêtes sont déduites du nom des méthodes✓ Bonne réponse
D.Nécessite toujours d'écrire du SQL manuellement
💡

Explication :

Avec Spring Data, les Repositories génèrent automatiquement le CRUD et déduisent les requêtes du nom des méthodes (findByFirstname). Pas besoin de SQL manuel pour les cas simples.

Question 8

Concernant les erreurs courantes en IoC, quelles affirmations sont vraies ?

☑️A.Oublier que le scope par défaut est singleton peut causer des problèmes✓ Bonne réponse
☑️B.Le scope 'request' utilise ThreadLocal, attention aux parallel streams✓ Bonne réponse
☑️C.On ne peut injecter que ce que le conteneur connaît✓ Bonne réponse
D.On peut injecter dans n'importe quel objet créé avec 'new'
💡

Explication :

Erreurs courantes : oublier le singleton par défaut, ThreadLocal avec parallel streams (request scope), et tenter d'injecter des composants inconnus. On ne peut PAS injecter dans des objets créés manuellement.

Question 9

Que permettent les annotations @Service et @Repository ?

☑️A.Déclarer un composant que le conteneur doit gérer✓ Bonne réponse
☑️B.@Repository offre des fonctionnalités CRUD de base✓ Bonne réponse
C.Elles sont interchangeables sans aucune différence
☑️D.@Service indique une classe contenant de la logique métier✓ Bonne réponse
💡

Explication :

@Service et @Repository déclarent des composants gérés. @Repository offre le CRUD, @Service indique la logique métier. Elles ne sont PAS totalement interchangeables (sémantique différente).

Question 10

Concernant @RestController en Spring, quelles affirmations sont vraies ?

☑️A.Combine @Controller et @ResponseBody✓ Bonne réponse
☑️B.Les méthodes retournent directement des objets sérialisés✓ Bonne réponse
C.Nécessite toujours de retourner des vues HTML
☑️D.Peut utiliser @Autowired pour injecter des repositories✓ Bonne réponse
💡

Explication :

@RestController combine @Controller + @ResponseBody. Les méthodes retournent des objets JSON/XML, pas des vues HTML. On peut injecter des dépendances via @Autowired.

Question 11

Quel est le scope par DÉFAUT d'un bean Spring ?

A.prototype
B.request
☑️C.singleton✓ Bonne réponse
D.session
💡

Explication :

Le scope par défaut est 'singleton' : une seule instance par conteneur Spring.

Question 12

Comment Spring génère-t-il automatiquement les requêtes dans un Repository ?

A.En analysant le code source à la compilation
☑️B.En déduisant la requête du nom de la méthode✓ Bonne réponse
C.En lisant les annotations SQL
D.En utilisant un fichier de configuration XML
💡

Explication :

Spring Data déduit la requête à partir du nom de la méthode (ex: findByFirstname génère SELECT * WHERE firstname = ?).

Question 13

Quel Repository Spring Data est correctement défini ?

☑️A.public interface FeatureRepo extends CrudRepository<Feature, String> {}✓ Bonne réponse
B.public class FeatureRepo extends CrudRepository<Feature, String> {}
C.public interface FeatureRepo implements CrudRepository<Feature, String> {}
D.@Repository public abstract class FeatureRepo extends CrudRepository<Feature, String> {}
💡

Explication :

Un Repository Spring Data DOIT être une interface qui EXTENDS CrudRepository (ou JpaRepository). Une classe ne peut pas hériter d'une interface.

Question 14

Quelle(s) annotation(s) peuvent être utilisées pour injecter une dépendance ?

☑️A.@Autowired✓ Bonne réponse
☑️B.@Inject✓ Bonne réponse
☑️C.@Resource✓ Bonne réponse
D.@Dependency
💡

Explication :

@Autowired (Spring), @Inject (JSR-330), et @Resource (JSR-250) permettent l'injection. @Dependency n'existe pas.

Question 15

Quelles annotations marquent une classe comme composant géré par Spring ?

☑️A.@Component✓ Bonne réponse
☑️B.@Service✓ Bonne réponse
C.@Bean
☑️D.@Repository✓ Bonne réponse
💡

Explication :

@Component, @Service (logique métier), et @Repository (accès données) sont des stéréotypes. @Bean est pour les méthodes, pas les classes.

Question 16

Quelle est la différence entre @Service et @Repository ?

☑️A.@Service indique une logique métier✓ Bonne réponse
☑️B.@Repository indique un accès aux données✓ Bonne réponse
☑️C.@Repository offre une traduction automatique des exceptions✓ Bonne réponse
D.Ils sont totalement interchangeables sans différence
💡

Explication :

@Service = logique métier, @Repository = accès données avec traduction des exceptions. Ils ne sont PAS interchangeables, ils ont une sémantique différente.

Question 17

Pourquoi l'injection par constructeur est-elle préférée à @Autowired sur un champ ?

☑️A.Permet l'immutabilité avec des champs final✓ Bonne réponse
☑️B.Facilite les tests unitaires (pas besoin de Spring)✓ Bonne réponse
C.Est obligatoire en Spring 6
☑️D.Rend les dépendances explicites✓ Bonne réponse
💡

Explication :

L'injection par constructeur permet les champs final, facilite les tests, et rend les dépendances explicites. Ce n'est pas obligatoire en Spring 6.

REST API(27 questions)

Question 1

Quelles sont les caractéristiques de REST (Representational State Transfer) ?

☑️A.C'est une architecture, pas un protocole✓ Bonne réponse
☑️B.Les ressources sont identifiées de manière unique✓ Bonne réponse
☑️C.Il s'appuie sur le protocole HTTP✓ Bonne réponse
D.Il est plus complexe que SOAP
💡

Explication :

REST est une architecture (pas un protocole comme SOAP), avec identification unique des ressources, utilisant HTTP. REST est plus SIMPLE que SOAP, pas plus complexe.

Question 2

Quelles sont les différences entre REST et SOAP ?

☑️A.REST est une architecture, SOAP est un protocole✓ Bonne réponse
☑️B.REST identifie les ressources de manière unique, SOAP non✓ Bonne réponse
☑️C.SOAP est basé sur un contrat (WSDL)✓ Bonne réponse
D.REST est plus lourd et complexe que SOAP
💡

Explication :

REST = architecture avec identification des ressources. SOAP = protocole avec contrat WSDL. REST est plus LÉGER que SOAP, pas plus lourd.

Question 3

Concernant le niveau 0 du modèle de Richardson, quelles affirmations sont vraies ?

☑️A.HTTP est utilisé uniquement comme tunnel✓ Bonne réponse
☑️B.Souvent un seul point d'entrée avec POST✓ Bonne réponse
☑️C.C'est appelé 'Swamp of POX'✓ Bonne réponse
D.Les ressources sont correctement identifiées par des URIs
💡

Explication :

Le niveau 0 (Swamp of POX) utilise HTTP comme simple tunnel, souvent avec un seul endpoint POST. Les ressources ne sont PAS encore identifiées, c'est le niveau 1.

Question 4

Concernant le niveau 1 du modèle de Richardson (Resources), quelles affirmations sont vraies ?

☑️A.Introduction des ressources identifiées par des URIs✓ Bonne réponse
☑️B.Exemple : /doctors/martin au lieu d'un seul endpoint✓ Bonne réponse
C.Les verbes HTTP sont correctement utilisés
☑️D.Chaque ressource a une URI distincte✓ Bonne réponse
💡

Explication :

Le niveau 1 introduit les ressources avec des URIs distinctes (/doctors/martin). Les verbes HTTP corrects sont le niveau 2, pas le niveau 1.

Question 5

Concernant le niveau 2 du modèle de Richardson (HTTP Verbs), quelles affirmations sont vraies ?

☑️A.Utilisation correcte des verbes HTTP (GET, POST, PUT, DELETE)✓ Bonne réponse
☑️B.Utilisation des codes de statut HTTP appropriés (200, 201, etc.)✓ Bonne réponse
C.Inclut les liens hypermédia (HATEOAS)
☑️D.GET pour lire, POST pour créer, PUT pour mettre à jour✓ Bonne réponse
💡

Explication :

Le niveau 2 utilise correctement les verbes et les codes de statut HTTP. HATEOAS est le niveau 3, pas le niveau 2.

Question 6

Concernant le niveau 3 du modèle de Richardson (HATEOAS), quelles affirmations sont vraies ?

☑️A.Les réponses incluent des liens hypermédia✓ Bonne réponse
☑️B.L'état de l'application est piloté par les liens✓ Bonne réponse
☑️C.Permet la découvrabilité des actions possibles✓ Bonne réponse
D.C'est le niveau atteint par toutes les APIs REST
💡

Explication :

HATEOAS ajoute des liens dans les réponses pour guider le client. Peu d'APIs atteignent réellement ce niveau dans la pratique.

Question 7

Quels verbes HTTP correspondent aux opérations CRUD ?

☑️A.POST pour Create (création)✓ Bonne réponse
☑️B.GET pour Read (lecture)✓ Bonne réponse
☑️C.PUT pour Update (mise à jour complète)✓ Bonne réponse
D.PATCH pour Delete (suppression)
💡

Explication :

POST=Create, GET=Read, PUT=Update complet, PATCH=Update partiel, DELETE=Delete. PATCH n'est pas pour la suppression.

Question 8

À quoi servent les query strings en REST ?

☑️A.Filtrage des résultats (filter)✓ Bonne réponse
☑️B.Pagination (offset, limit)✓ Bonne réponse
☑️C.Tri des résultats (sort)✓ Bonne réponse
D.L'implémentation est totalement standardisée
💡

Explication :

Les query strings servent au filtrage, pagination et tri. L'implémentation n'est PAS standardisée (chaque API peut utiliser différents noms de paramètres).

Question 9

Concernant la négociation de contenu HTTP, quelles affirmations sont vraies ?

☑️A.Le client indique ses préférences via le header Accept✓ Bonne réponse
☑️B.Le serveur répond selon ses capacités✓ Bonne réponse
☑️C.Permet de demander différents formats (JSON, XML)✓ Bonne réponse
D.Est utilisée uniquement pour la langue
💡

Explication :

La négociation de contenu via Accept permet de demander format, langue, encodage. Elle n'est pas limitée à la langue.

Question 10

Quels codes de statut HTTP indiquent un succès ?

☑️A.200 OK✓ Bonne réponse
☑️B.201 Created✓ Bonne réponse
C.400 Bad Request
☑️D.202 Accepted✓ Bonne réponse
💡

Explication :

Les codes 2XX indiquent un succès : 200 (OK), 201 (Created), 202 (Accepted). 400 est une erreur client (4XX).

Question 11

Quels codes de statut HTTP indiquent une erreur client ?

☑️A.400 Bad Request✓ Bonne réponse
☑️B.401 Unauthorized✓ Bonne réponse
☑️C.403 Forbidden✓ Bonne réponse
D.500 Internal Server Error
💡

Explication :

Les codes 4XX sont des erreurs client : 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden). 500 est une erreur serveur (5XX).

Question 12

Quels codes de statut HTTP indiquent une erreur serveur ?

☑️A.500 Internal Server Error✓ Bonne réponse
☑️B.501 Not Implemented✓ Bonne réponse
☑️C.503 Service Unavailable✓ Bonne réponse
D.404 Not Found
💡

Explication :

Les codes 5XX sont des erreurs serveur : 500, 501, 503. 404 est une erreur client (ressource non trouvée).

Question 13

Quelle est la différence entre PUT et PATCH ?

☑️A.PUT remplace la ressource entière✓ Bonne réponse
☑️B.PATCH effectue une mise à jour partielle✓ Bonne réponse
C.PUT et PATCH sont totalement interchangeables
☑️D.PATCH ne nécessite que les champs à modifier✓ Bonne réponse
💡

Explication :

PUT remplace la ressource entière, PATCH ne modifie que certains champs. Ils ne sont PAS interchangeables.

Question 14

Pourquoi le cache HTTP est-il important en REST ?

☑️A.GET est cacheable par défaut✓ Bonne réponse
☑️B.POST n'est pas cacheable✓ Bonne réponse
☑️C.Améliore les performances en évitant des requêtes inutiles✓ Bonne réponse
D.Tous les verbes HTTP sont cacheables
💡

Explication :

GET est cacheable, POST non. Le cache améliore les performances. Tous les verbes ne sont PAS cacheables (POST, PUT, DELETE ne le sont pas par défaut).

Question 15

Pourquoi le code 418 'I'm a teapot' existe-t-il ?

☑️A.C'est un easter egg défini dans la RFC 2324✓ Bonne réponse
B.Il indique une erreur de serveur grave
☑️C.Il est utilisé pour le café par le Hyper Text Coffee Pot Control Protocol✓ Bonne réponse
D.C'est un code de statut sérieux pour la production
💡

Explication :

418 'I'm a teapot' est un easter egg de la RFC 2324 (HTCPCP - protocole de cafetière). Ce n'est PAS un code sérieux pour la production.

Question 16

Que signifie l'acronyme REST ?

A.Remote Execution State Transfer
☑️B.Representational State Transfer✓ Bonne réponse
C.Resource Exchange Standard Technology
D.Request-response Endpoint Service Transfer
💡

Explication :

REST = Representational State Transfer, une architecture pour les APIs web utilisant HTTP.

Question 17

Quel code HTTP DOIT être retourné après une création réussie avec POST ?

A.200 OK
☑️B.201 Created✓ Bonne réponse
C.204 No Content
D.202 Accepted
💡

Explication :

201 Created est le code approprié pour une création réussie. 200 OK indique un succès général, 204 est pour un succès sans body.

Question 18

Quel code HTTP retourner pour un DELETE réussi sur une ressource existante (sans body de retour) ?

A.200 OK
B.201 Created
☑️C.204 No Content✓ Bonne réponse
D.404 Not Found
💡

Explication :

204 No Content est le code approprié pour un DELETE réussi sans contenu de retour. 200 OK implique un body dans la réponse.

Question 19

Quel code retourner si on essaie de modifier une ressource qui n'existe pas avec PUT ?

A.400 Bad Request
☑️B.404 Not Found✓ Bonne réponse
C.204 No Content
D.500 Internal Server Error
💡

Explication :

404 Not Found car la ressource ciblée n'existe pas. 400 serait pour une requête mal formée.

Question 20

Dans un @RestController, comment retourner un code 201 avec l'URL de la ressource créée ?

A.return ResponseEntity.ok(resource);
☑️B.return ResponseEntity.created(URI.create("/path")).build();✓ Bonne réponse
C.return new ResponseEntity<>(HttpStatus.CREATED);
D.return ResponseEntity.status(201).body(resource);
💡

Explication :

ResponseEntity.created(uri).build() retourne 201 avec le header Location. La méthode ok() retourne 200, pas 201.

Question 21

Quelles méthodes HTTP sont idempotentes ?

☑️A.GET✓ Bonne réponse
B.POST
☑️C.PUT✓ Bonne réponse
☑️D.DELETE✓ Bonne réponse
💡

Explication :

GET, PUT et DELETE sont idempotents (même résultat si répétés). POST n'est PAS idempotent (crée une nouvelle ressource à chaque appel).

Question 22

Quels codes HTTP indiquent un succès SANS body dans la réponse ?

A.200 OK
B.201 Created
☑️C.204 No Content✓ Bonne réponse
D.202 Accepted
💡

Explication :

SEUL 204 No Content indique explicitement l'absence de body. 200, 201 et 202 peuvent tous avoir un body.

Question 23

Différence entre 401 Unauthorized et 403 Forbidden ?

☑️A.401 = authentification manquante ou invalide✓ Bonne réponse
☑️B.403 = authentifié mais pas autorisé✓ Bonne réponse
C.401 = interdit d'accéder
D.403 = authentification expirée
💡

Explication :

401 = pas authentifié (ou token invalide). 403 = authentifié mais pas les droits. C'est une distinction importante !

Question 24

Pourquoi le contrôleur utilise StringUtils.hasText() plutôt que != null ?

☑️A.Pour vérifier que le string n'est pas null ET pas vide/blanc✓ Bonne réponse
B.Pour améliorer les performances
C.C'est une convention Spring obligatoire
☑️D.Pour éviter les NullPointerException✓ Bonne réponse
💡

Explication :

hasText() vérifie que le string n'est pas null, pas vide, et pas composé uniquement d'espaces. Cela évite aussi les NPE.

Question 25

Dans le TP, que retourne POST /features si le nom est vide ?

A.200 OK
B.201 Created
☑️C.400 Bad Request✓ Bonne réponse
D.422 Unprocessable Entity
💡

Explication :

Le contrôleur retourne 400 Bad Request pour les données invalides (nom vide, expression invalide).

Question 26

PUT /features/{name} avec un body contenant un nom différent retourne ?

A.200 OK avec mise à jour
B.201 Created
☑️C.400 Bad Request✓ Bonne réponse
D.404 Not Found
💡

Explication :

Le contrôleur vérifie que id.equals(featureBean.name), sinon 400 Bad Request. Le nom dans l'URL et le body doivent correspondre.

Question 27

Le contrôleur du TP retourne ResponseEntity.noContent().build() pour DELETE. Quel code HTTP cela génère ?

A.200 OK
B.202 Accepted
☑️C.204 No Content✓ Bonne réponse
D.205 Reset Content
💡

Explication :

noContent() génère un 204 No Content, approprié pour un DELETE réussi sans body de retour.

Spring Cloud(5 questions)

Question 1

Qu'est-ce que Spring Cloud ?

☑️A.Un ensemble d'outils pour créer des applications distribuées✓ Bonne réponse
☑️B.Étroitement intégré à Spring Boot✓ Bonne réponse
C.Un langage de programmation
☑️D.Permet de créer des applications résilientes et stateless✓ Bonne réponse
💡

Explication :

Spring Cloud est une suite d'outils intégrés à Spring Boot pour créer des applications distribuées résilientes et stateless. Ce n'est pas un langage.

Question 2

Qu'est-ce que le Service Registry (Annuaire de services) ?

☑️A.Les services s'enregistrent auprès d'un annuaire✓ Bonne réponse
☑️B.Permet la découverte dynamique des services✓ Bonne réponse
C.Remplace complètement les URLs fixes
☑️D.Exemple : Eureka de Netflix✓ Bonne réponse
💡

Explication :

Le Service Registry permet aux services de s'enregistrer et d'être découverts dynamiquement (Eureka). Il ne remplace pas complètement les URLs, mais facilite le routing.

Question 3

Qu'est-ce que le Service Discovery ?

☑️A.Le client récupère la liste des services disponibles✓ Bonne réponse
☑️B.Les services sont appelés par leur nom logique✓ Bonne réponse
C.Nécessite de connaître les IPs et ports à l'avance
☑️D.Permet le load balancing côté client✓ Bonne réponse
💡

Explication :

Le Service Discovery permet de découvrir les services par nom sans connaître les IPs/ports à l'avance. Il facilite le load balancing côté client.

Question 4

Concernant l'architecture client/serveur HTTP dans Spring Cloud, quelles sont les caractéristiques ?

☑️A.Utilisation du cache HTTP✓ Bonne réponse
☑️B.Communication stateless✓ Bonne réponse
☑️C.Utilisation des verbes et codes de statut HTTP✓ Bonne réponse
D.Les sessions côté serveur sont obligatoires
💡

Explication :

L'architecture repose sur HTTP avec cache, statelessness, verbes et codes de statut. Les sessions côté serveur ne sont PAS obligatoires (stateless).

Question 5

Dans Spring Cloud, pourquoi appeler les services par leur nom plutôt que par URL ?

☑️A.Découplage : pas besoin de connaître l'IP/port✓ Bonne réponse
☑️B.Permet le load balancing automatique✓ Bonne réponse
☑️C.Résilience si une instance tombe✓ Bonne réponse
D.C'est uniquement pour des raisons de lisibilité
💡

Explication :

Appeler par nom permet le découplage, le load balancing et la résilience. Ce n'est pas juste pour la lisibilité mais pour des raisons techniques importantes.