Makhmadane LO
Lead Senior Développer / Cloud / Ops
Partie 1 : Système de Gestion d'Assurances
Avec Spring Boot 3.5.6
🎯 Objectifs Pédagogiques
À la fin de ce projet, vous devez être capable de :
• Concevoir et développer une API REST complète avec Spring Boot
• Implémenter une architecture en couches propre et maintenable
• Gérer la persistance des données avec JPA/Hibernate
• Appliquer les bonnes pratiques de développement backend
• Documenter une API avec OpenAPI/Swagger
• Gérer les erreurs et valider les données
• Mettre en œuvre des design patterns professionnels
📖 Contexte du Projet
La compagnie d'assurances "SecureLife" souhaite moderniser son système
d'information en développant une plateforme web pour gérer ses contrats d'assurance.
La première phase consiste à développer le backend sous forme d'API REST.
La compagnie propose trois types d'assurances :
🚗 Assurance Automobile
• Protège les véhicules contre les dommages et accidents
• Informations : immatriculation, puissance fiscale, coefficient bonus-malus
• Calcul de prime basé sur la puissance du véhicule et l'historique
🏠 Assurance Habitation
• Couvre les logements contre les sinistres
• Informations : adresse, superficie, zone à risque
• Calcul de prime basé sur la superficie et l'exposition aux risques
👤 Assurance Vie
• Garantit un capital en cas de décès de l'assuré
• Informations : âge de l'assuré, capital garanti, bénéficiaire
• Calcul de prime basé sur l'âge et le montant du capital
Interne
Makhmadane LO
Lead Senior Développer / Cloud / Ops
📋 Exigences Fonctionnelles
1. Gestion des Contrats
Votre système doit permettre de :
Créer un nouveau contrat d'assurance (Auto, Habitation ou Vie)
Consulter les détails d'un contrat
Modifier les informations d'un contrat existant
Supprimer un contrat
Lister tous les contrats avec pagination
Rechercher des contrats selon différents critères
2. Informations Communes
Chaque contrat doit contenir :
• Un numéro de contrat unique (généré automatiquement)
• Le nom complet du client
• L'adresse email du client
• Une cotisation mensuelle de base
• Une prime annuelle (calculée automatiquement)
• Un statut (ACTIVE, SUSPENDED, CANCELLED, EXPIRED)
• Les dates de création et de dernière modification
3. Calcul des Primes
Le système doit calculer automatiquement la prime annuelle selon des formules
spécifiques à chaque type d'assurance. Vous devez concevoir ces formules de manière
cohérente et réaliste.
4. Recherche et Filtrage
Les utilisateurs doivent pouvoir rechercher des contrats selon :
• Le nom du client (recherche partielle, insensible à la casse)
• L'adresse email du client
• Le type d'assurance
• Le statut du contrat
• Une fourchette de primes (min-max)
5. Gestion des Statuts
Le système doit permettre de changer le statut d'un contrat :
• ACTIVE → SUSPENDED
• ACTIVE → CANCELLED
• SUSPENDED → ACTIVE
• SUSPENDED → CANCELLED
Interne
Makhmadane LO
Lead Senior Développer / Cloud / Ops
6. Statistiques
Fournir des endpoints pour obtenir :
• Le nombre total de contrats par statut
• Le chiffre d'affaires total (somme des primes annuelles)
🛠️ Exigences Techniques
Stack Technologique Imposée
Technologie Version Usage
Java 17 Langage de programmation
Spring Boot 3.5.6 Framework backend
PostgreSQL 15+ Base de données
Maven 3.8+ Gestion des dépendances
Lombok Latest Réduction du boilerplate
MapStruct Latest Mapping objet-objet
SpringDoc OpenAPI 2.8.5 Documentation API
Architecture Obligatoire
Votre projet DOIT respecter l'architecture en couches suivante :
entity/ → Entités JPA dto/request/ → DTOs pour les entrées dto/response/ → DTOs pour les sorties
dto/filter/ → DTOs pour les filtres mapper/ → Interfaces MapStruct repository/ → Interfaces JPA Repository
specification/ → JPA Specifications service/ → Logique métier resource/ → Contrôleurs REST exception/ →
Gestion des erreurs config/ → Configurations Spring
🔑 Concepts à Mettre en Œuvre
Votre projet DOIT obligatoirement utiliser :
1. Spring Boot & Configuration
@SpringBootApplication
@Configuration et @Bean
Fichier [Link]
Spring Boot DevTools
Interne
Makhmadane LO
Lead Senior Développer / Cloud / Ops
2. JPA / Hibernate
@Entity, @Table, @Id, @GeneratedValue, @Column
Héritage d'entités (stratégie à choisir)
@PrePersist et @PreUpdate
JpaRepository pour CRUD
Méthodes dérivées (findByEmail, existsByEmail)
JPA Specifications pour filtrage dynamique
3. API REST
@RestController, @RequestMapping
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping,
@PatchMapping
@PathVariable, @RequestParam, @RequestBody
ResponseEntity avec codes HTTP (200, 201, 204, 400, 404, 409)
Versioning d'API (/api/v1 et /api/v2)
4. Validation
@Valid sur les paramètres
@NotNull, @NotBlank, @Email, @Min, @Max
Messages d'erreur personnalisés
5. DTOs
Séparation Request / Response
DTO pour les filtres de recherche
PageResponse générique
6. Mapping
MapStruct avec @Mapper
Configuration annotation processor Maven
Mappings personnalisés avec @Mapping
7. Pagination & Tri
Utilisation de Pageable
Paramètres : page, size, sortBy, direction
Métadonnées de pagination dans la réponse
8. Gestion des Exceptions
@RestControllerAdvice
@ExceptionHandler
Interne
Makhmadane LO
Lead Senior Développer / Cloud / Ops
Exceptions personnalisées (ResourceNotFoundException,
DuplicateResourceException)
Gestion des erreurs de validation
9. Logging
SLF4J avec @Slf4j (Lombok)
Logs dans services et contrôleurs
10. Documentation
Swagger/OpenAPI
@Tag, @Operation, @Parameter
Configuration personnalisée
11. Injection de Dépendances
Constructor Injection avec @RequiredArgsConstructor
Interfaces pour les services
12. Lombok
@Data, @Builder, @NoArgsConstructor, @AllArgsConstructor
@Slf4j pour le logging
13. Transactions
@Transactional sur les méthodes de service
📊 Fonctionnalités Minimales Requises
Endpoints à Implémenter
Méthode Endpoint Description Code
POST /api/v1/insurances/auto Créer auto 201
POST /api/v1/insurances/home Créer habitation 201
POST /api/v1/insurances/life Créer vie 201
GET /api/v1/insurances/{id} Récupérer par ID 200
GET /api/v1/insurances Lister (paginated) 200
GET /api/v1/insurances/search Rechercher 200
PUT /api/v1/insurances/auto/{id} Modifier auto 200
PATCH /api/v1/insurances/{id}/status Changer statut 202
Interne
Makhmadane LO
Lead Senior Développer / Cloud / Ops
Méthode Endpoint Description Code
DELETE /api/v1/insurances/{id} Supprimer 204
GET /api/v1/insurances/stats Statistiques 200
✅ Règles de Validation
Pour Tous les Contrats
• Nom du client : obligatoire, non vide
• Email : obligatoire, format valide
• Prime de base : obligatoire, strictement positive
Pour l'Assurance Auto
• Immatriculation : obligatoire, unique
• Puissance : obligatoire, entre 1 et 50 CV
• Bonus/Malus : obligatoire, entre 50% et 350%
Pour l'Assurance Habitation
• Adresse : obligatoire, non vide
• Superficie : obligatoire, minimum 10 m²
• Zone à risque : obligatoire
Pour l'Assurance Vie
• Âge : obligatoire, entre 18 et 80 ans
• Capital garanti : obligatoire, minimum 10 000€
• Bénéficiaire : obligatoire, non vide
🚫 Règles Métier
• Unicité : Un email ne peut être associé qu'à un seul contrat actif
• Unicité : Une plaque d'immatriculation ne peut être assurée qu'une fois
• Génération : Le numéro de contrat doit être généré automatiquement
• Calcul : Les primes doivent être recalculées à chaque modification
• Horodatage : Les dates doivent être gérées automatiquement
🚫 Redis Cache
Pour améliorer les performances du système "SecureLife" et réduire la charge sur la
base de données PostgreSQL, vous devez intégrer Redis comme couche de cache.
Cette optimisation est cruciale car :
Interne
Makhmadane LO
Lead Senior Développer / Cloud / Ops
• Les consultations de contrats sont fréquentes
• Les statistiques sont calculées régulièrement
• La recherche par critères est intensive
• Certaines données (types d'assurance, zones à risque) changent rarement
📦 Livrables Attendus
• Code Source : Projet Maven complet avec architecture en couches
• Base de Données : Script SQL avec Flyway ou données de test
• Documentation : [Link] + Swagger accessible
• Tests : Collection Postman ou fichier .http (min 10 requêtes)
• Rapport Technique : PDF avec architecture, modèle de données, choix
techniques
⚠️ Contraintes Importantes
• Interdit : Spring Data REST (génération automatique endpoints)
• Pas de frontend : Focus uniquement sur le backend
• Obligatoire : Tous les concepts listés
• Obligatoire : L'application doit démarrer sans erreur
• Obligatoire : PostgreSQL comme base de données
• Obligatoire : MapStruct pour le mapping
💡 Conseils
• Commencez par le modèle de données
• Implémentez d'abord un type d'assurance complet
• Testez au fur et à mesure avec Swagger
• Utilisez Git avec des commits réguliers
• Documentez votre code
• Respectez les conventions Java
Bon courage ! 🚀
Date de remise : À définir par le formateur
Format de remise : Lien GitHub
Interne