Maximize Page
Tech & DevOps HubEspace Tech & DevOps: Explorez le monde du Dev, du Cloud et des outils DevOps à travers nos articles et discussions Explore the world of development, the cloud and DevOps tools

L'application Flashcards

Date de l'article:10-09-2025
Spring Boot
Application Spring Boot construite autour d'une API REST disposant d'un CRUD complet avec base PostgreSQL. L'application servant de terrain de jeu pour expérimenter Java et poser les bases d'un pipeline CI/CD multi-plateformes
Présentation générale de l'application

Ce projet a été conçu pour explorer concrètement le fonctionnement de Java et de Spring Boot à travers une application réelle. Il sert de socle technique stable permettant de mettre en place et de tester des pipelines CI/CD sur différentes plateformes, tout en expérimentant des outils dédiés à la qualité et à la sécurité du code.

Au fil de la série, cette application devient un véritable fil conducteur pour aborder progressivement des problématiques essentielles du développement moderne. Les sujets traités couvrent les tests unitaires et d'intégration, la gestion des profils Spring dans un contexte multi-branches, ainsi que la mise en place de stratégies de qualité incluant tests API et tests de charge. Le projet intègre également des aspects liés au monitoring et à la sécurité, notamment à travers l'utilisation d'Actuator.


Stack technique
Flashcards est une application RESTful permettant de gérer des catégories et des flashcards associées (question / réponse).
On peut y effectuer des recherches simples (par id, par nom de catégorie, ou mot apparaissant dans la question)

Crée à partir d'un squelette, via: https://start.spring.io/

Configuration du projet:

SpringBoot: 3.5.4 - Build tool: Maven
Language: Java - Packaging: JAR
Java: 17 - Dépendances: Spring Web, Spring Data JPA, PostgreSQL Driver, Lombok

Pré-requis
Pour démarrer l'application en local, vous devez donc, disposer de :
Java 17+
Maven Wrapper (inclus dans le repository)
PostgreSQL 16
Git
On obtient un squelette de base:
src/
 ├─ main/
 │   ├─ java/com/example/flashcards/
 │   │   ├─ controller/       # REST controllers
 │   │   ├─ service/          # Business services
 │   │   ├─ Entities/         # Entities
 │   │   ├─ dto/              # DTO for API exchanges
 │   │   └─ repository/       # JPA interfaces
 │   └─ resources/
 │       └─ application.properties
 └─ test/
     ├─ controller/           # Unit tests for controllers
     ├─ service/              # Unit tests for services
     └─ integration/          # Integration tests

Choix d'utilisation du bootstrapper de maven
(inclus dans le projet)
Le projet utilise le Maven Wrapper, ce qui permet :
  • d'imposer une version Maven unique
  • d'éviter toute dépendance Maven globale
  • de garantir une exécution 100 % reproductible, localement et en CI
Commande principale:
./mvnw clean package

Si Maven n'est pas présent ou incompatible, la version requise est téléchargée automatiquement


Base de données

La base de données Postgres (16) est la base de données principales, les test (ut-it) utilisent la base H2 en mémoire

Création de la base (optionnel)
Après l'installation de Postgress, vérifier; la version et créez la base de données:
psql --version
Retourne #psql (PostgreSQL) 16.9

Un script bash, localisé dans /flashcards/init-db.sh permet de créer la base lors de son lancement. Dans l'application, sur le profil dev (profil par défaut) il se lance automatique avec commande ./mvnw clean install

Manuellement:
psql -h localhost -U postgres
Mot de passe pour l'utilisateur postgres :

#une x connecté:
postgres=# CREATE DATABASE flashcardsdb;
CREATE DATABASE
postgres=# \q

Fichier de données initiales:

Les fichiers init-data.sql sont fournis pour chaque branche afin de créer les tables, et d'insérer des catégories et flashcards de test

Profils Spring et environnements
Branche Profil Port Comportement
develop dev 8080 Localisé dans src/main/resources/db/dev/init-data.sql
Ce fichier est auto-loadé (local et develop) lors de chaques lancement de l'application, toute modification sera donc écrasée au prochain démarrage de l'application
staging staging 8081 Initialisation manuelle: le fichier de données est localisée dans db/staging
Utiliser la commande psql: psql -h localhost -U postgres -d flashcardsdb -f db/staging/init-data.sql pour insérer les données
main prod 8080 Initialisation manuelle: le fichier de données est localisée dans db/prod
Utiliser la commande psql: psql -h localhost -U postgres -d flashcardsdb -f db/prod/init-data.sql pour insérer les données
Configuration des fichiers de profils et configuration de la base de données

Les fichiers sont localisé dans: src/main/resources/
→ Le fichier application.properties défini la base de données, le user et le mot de passe utilisé.
→ L'utilisateur postgres étant l'utilisateur admin par défaut de Postgres, le mot de passe: pswd


L'Application REST
une fois l'application lancée, Spring Boot expose :
CRUD complet pour les categories GET /api/categories - GET /api/categories/{id} - POST - PUT - DELETE
CRUD complet pour les flashcards GET /api/flashcards - GET /api/flashcards/{id} - POST - PUT- DELETE
Endpoints de recherche / filtrage GET /api/categories/search?name=Bash: Search category by name
GET /api/flashcards/search?question=branch: Search flashcards by question

La liste complète est disponible dans le README du projet


Web API

Plus "user-friendly", une interface Web simple est fournie via: src/main/resources/static,
     Elle permet d'effectuer le CRUD complet de manière fluide tout en visualisant les catégories ainsi que les flashcards (question/réponse) associées

Accès à l'application :
http://localhost:8080 (dev, main)
web api
Endpoints Actuator

Pour voir ce qui à été mis en place dans l'application et comment utiliser les accès restreints, voir l'article: Ajout d'Actuator en 3 étapes
     ou, le readme dans le repository Github

PUBLIC - toute branche
health
info
ACCES RESTREINTS - dev / staging
metrics
env
mappings
ACCES RESTREINTS - seulement dev
configprops
loggers

Stratégie de tests et seuil de couverture (vue d'ensemble)
Les tests sont détaillés dans les articles suivants, mais voici la logique globale :
  • Tests unitaires:
    • Profil test: utilisant JUnit 5 / Mockito & Base H2 - Tests rapides et isolés
  • Tests d'intégration:
    • Profil it: @SpringBootTest & API + DB H2 éphémère

Note pour la couverture JaCoCo
En dev, le seuil est fixé à 0 %

Dans staging/main, le seuil de couverture est défini dans les workflows:

  • staging: la CI exige 70% de couverture
  • main: la CI/SonarCloud: CI exige 80% de couverture
Commandes générale pour lancer les tests:
/mvnw clean test
./mvnw clean verify
Commandes individuelles:
./mvnw -Dspring.profiles.active=it test 
./mvnw checkstyle:check 
./mvnw spotbugs:check
./mvnw jacoco:report   
Simuler la couverture jaCoCo (localement) :
/mvnw clean test
./mvnw clean verify -Djacoco.minimum.coverage=0.70

Validation locale avant commit (Developement local)

Ce projet utilise Spotless pour garantir la cohérence du formatage du code. Appliquez la commande pour corriger/aligner le formatage

La validation du code est vérifiée dans la CI avec ./mvnw spotless:check
     Si toutes les commandes sont exécutées avec succès, le code est prêt
     à être poussé en toute sécurité.

En cas de modification du code: avant de commité, ou si des problèmes de formatage sont détectés, appliquez les commandes suivantes:
./mvnw spotless:apply
./mvnw clean verify  

Pour + d'informations concernant l'Intégration Continue, explorez les articles correspondant ou rv dans le readme_ci du repository Flashcards


Conclusion

Cette première brique pose volontairement des bases solides.
L'objectif n'est pas la complexité fonctionnelle, mais la maîtrise réaliste et progressive de l'écosystème CI/CD autour d'une application Spring Boot.

Dans l'article suivant, nous verrons comment ajouter les tests unitaires, en prévision de gérer la couverte de code


Laissez-moi un commentaire

En postant un commentaire anonyme, vous adhérez automatiquement aux conditions d'utilisation du site.