Deuxième étape : Côté Serveur, un projet Maven multi-modules
1. Introduction
Dans cette section, vous découvrirez l’architecture du back-end utilisée dans le projet.
1.1. Principe général
Le back-end repose sur une architecture API REST. Cette architecture permet une communication structurée entre le front-end et le back-end. Lorsque l’utilisateur interagit avec une fonctionnalité du site nécessitant un traitement côté serveur, une requête HTTP est envoyée vers une route spécifique, associée à un Contrôleur.
1.2. Les "Contrôleurs"
Un Contrôleur agit comme un point d’entrée dans le back-end. Il est responsable de la réception de la requête et la transmettre au composant métier. Il ne doit contenir aucune logique métier.
|
Un contrôleur ne doit contenir aucun traitement métier. Son seul rôle est de déléguer le travail aux Services appropriés. |
1.3. Les "Services"
Les services contiennent l’ensemble de la logique métier. Ils sont responsables de l’exécution des opérations demandées, comme l’accès aux données, la validation, ou la coordination entre plusieurs composants.
|
L’objectif de cette séparation est d’assurer une conception modulaire, testable et maintenable. |
1.4. Principe de responsabilité unique
Chaque composant du back-end doit respecter le principe de Responsabilité Unique (Single Responsibility Principle). Cela signifie qu’un module (par exemple un service ou un contrôleur) doit avoir une seule responsabilité claire.
|
Le respect de ce principe améliore la lisibilité du code, facilite la maintenance, et limite les effets de bord. |
2. Structure du projet
Voici la structure attendue de la partie back-end de votre projet. Il s’agit d’un projet Maven multi-modules.
📁 quizmaker-backend/
├── 📁 quizmaker-api/
├── 📁 quizmaker-domain/
└── 📁 quizmaker-spring/
3. Création du projet parent
Pour commencer, nous allons créer et configurer le projet parent :
|
4. Création des sous-modules
Entrez ensuite dans le répertoire du projet parent. Vous allez ensuite y créer les sous-modules du projet.
Nous allons diviser le projet serveur en trois sous-modules différents :
-
quizmaker-api: contient les interfaces communes à tous les sous-modules -
quizmaker-domain: contient les classes métier de l’application -
quizmaker-spring: contient les classes qui mettent en œuvre le serveur Websocket de l’application.
|
5. Vérification de la structure du projet
Après la création des quatre sous-modules, la structure de votre projet doit ressembler à la structure suivante :
📂 quizmaker-backend ├── 📄 pom.xml (1) ├── 📂 quizmaker-api (2) | └── 📄 pom.xml ├── 📂 quizmaker-domain (3) | └── 📄 pom.xml ├── 📂 quizmaker-spring (4) | └── 📄 pom.xml
| 1 | Le fichier POM parent, contenant les propriétés communes des sous-modules. |
| 2 | Un module API, contenant les interfaces et classes abstraites, qui seront utilisées par les autres modules. |
| 3 | Un module Domain, contenant le ou les composants métier (un module peut contenir des sous-modules). |
| 4 | Un module Spring, responsable de la communication entre les clients utilisant le protocole websockets et le composant métier. |
|
Utilisez Maven pour vérifier que votre projet est correctement configuré.
|
La sortie de la commande doit montrer que la production a réussit, comme sur le listing suivant :
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for quizmaker-backend 1.0-SNAPSHOT:
[INFO]
[INFO] quizmaker-backend .................................. SUCCESS [ 0.000 s]
[INFO] quizmaker-api ...................................... SUCCESS [ 0.000 s]
[INFO] quizmaker-domain ................................... SUCCESS [ 0.000 s]
[INFO] quizmaker-spring ................................... SUCCESS [ 0.000 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.063 s
[INFO] Finished at: 2025-11-12T13:52:51+01:00
[INFO] ------------------------------------------------------------------------
6. Configuration de JUnit
| Dans certains cas, en fonction de l’archetype utilisé par Maven, la génération automatisée configure par défaut une dépendance vers JUnit 4, alors que nous souhaitons utiliser JUnit 5. Si c’est votre cas, vous devez effectuer les changements demandés dans cette section. |
|
Configuration du module parent
|
Les dépendances déclarées à l’intérieur de la balise <dependencyManagement> ne sont pas vraiment ajoutés au projet,
elles permettent juste d’assurer que les projets enfants utiliseront la même version : celle configurée dans le projet parent.
|
|
Configuration des sous-modules
|
|
|
Correction des classes de test des imports JUnit
par :
|
7. Dépendance entre modules
Le projet QuizMaker suit une règle simple :
il n’y a pas de cycle de dépendances entre les modules.
Toutes les modifications que vous allez réaliser ne pourront pas violer cette règles. Elle doit être respecté, impérativement.
package server {
package API {}
package Domain { }
package "Spring" as sockets { }
Domain ..> API
sockets ..> API
sockets ..> Domain
}
Fichier
quizmaker-domain/pom.xml
|
Assurez-vous de bien utiliser la propriété project.version comme version de la dépendance.
Cela permet de dire à Maven d’utiliser le module API en développement et ne pas le chercher sur le référentiel.
|
Fichier
quizmaker-spring/pom.xml
|
8. Validation des changements
Pour éviter d’ajouter accidentellement des fichiers indésirables ou inutiles sur git,
nous allons ajouter une fichier .gitignore à votre projet.
wget -O .gitignore https://gitlab.univ-nantes.fr/naomod/defaults/-/raw/main/ignore-files/maven-java-ignore |
Validons maintenant vos changements.
|
9. Configuration du module Parent
Configurez la version du JDK, ainsi que l’encodage des fichiers source dans le projet parent. Ces propriétés seront "héritées" par les sous-modules.
|
Cette dépendance assure que les autres dépendances demandées par Spring Boot aient des versions compatibles. |
10. Configuration du module Spring
Le module quizmaker-spring dépend de différents artefacts et utilise des plugins
|