Hamed Cédric SYLLA

Spring Boot – Écoutez vos entités sans faire crier votre code : SQL vs MongoDB

Introduction

Saviez-vous que vous pouvez déclencher des actions automatiquement dans Spring Boot à chaque fois qu’une entité est créée, modifiée ou supprimée ?

Grâce aux EntityListeners (JPA) ou aux EventListeners MongoDB, Spring permet de réagir à la vie de vos entités, sans avoir à le coder dans vos services.

Mais cette magie peut rapidement devenir dangereuse si mal utilisée : logique invisible, difficultés de test, couplage fort, etc.

Cet article explore :

  • la différence entre les deux types de listeners
  • les méthodes à override
  • les avantages réels, mais surtout les inconvénients
  • comment les utiliser sans compromettre la lisibilité et la maintenabilité (Clean Code)

1. Pourquoi vouloir « écouter » les entités ?

Cas d’usage typiques :

  • Mettre à jour automatiquement des champs
  • Logger les opérations
  • Nettoyer les champs (email en lowercase, suppression d’espaces)
  • Déclencher des événements métiers (notifications, alertes…)

Centraliser du comportement transversal, sans l’éparpiller dans tous vos services.

2. EntityListeners (JPA – SQL)

2.1 Activation

L’activation se fait avec l’annotation @EntityListeners

2.2 Exemple d’implémentation

Toutes les méthodes prennent un seul paramètre : l’entité concernée (de type Object ou typé comme sur l’exemple si vous le souhaitez).

3. MongoDB : AbstractMongoEventListener (Spring Data Mongo)

3.1 Activation

3.2 Exemple d’implémentation

Les méthodes reçoivent un unique événement typé, ex. BeforeSaveEvent<User>.
Utilisez event.getSource() pour l’objet Java, event.getDocument() pour le BSON, et event.getCollectionName() si besoin.

4. Comparaison SQL vs Mongo

CritèreEntityListener (JPA)Mongo Event Listener
StandardJPA / Hibernate (Java EE)Spécifique Spring Data Mongo
Accès aux donnéesObjet Java uniquementObjet Java + Document BSON
Type de méthodesAnnotations (@PrePersist,…)Méthodes à override
Contexte (user/session)DifficileDifficile
Complexité des scénariosMoyennePlus riche grâce aux événements typés
Lisibilité / MaintenanceRisque élevé si abuséRisque élevé si abusé

5. Clean Code : ce qu’il faut absolument éviter

Mauvaises pratiques

  • Mettre de la logique métier lourde (ex : appel à une API, envoi de mail, billing…)
  • Modifier d’autres entités ou collections dans le listener sans contrôle transactionnel
  • Utiliser des listeners comme une “solution magique” pour éviter les services

Bonnes pratiques

  • Garder les listeners simples et prévisibles
  • Ne faire que des tâches techniques (audit, nettoyage, timestamps…)
  • Si besoin de logique métier : publier un événement Spring (ApplicationEventPublisher) et le traiter ailleurs
  • Bien documenter chaque listener
  • Tester isolément chaque listener

6. Tester les Listeners

  • Tester les listeners de façon unitaire (Mockito sur les événements)
  • Attention : certains listeners s’exécutent aussi dans les tests d’intégration
  • Prévoir une désactivation conditionnelle (via @Profile("!test"), par exemple)

7. Avantages / Inconvénients

Avantages

  • Centralise des comportements communs
  • Évite de dupliquer des blocs de code (ex : timestamps)
  • Simplifie les entités en surface

Inconvénients

  • Logique invisible → difficile à comprendre sans lire tout le projet
  • Pas transactionnel si on modifie plusieurs objets
  • Trop de magie nuit à la lisibilité
  • Testabilité réduite si mal structuré

Conclusion

Les EntityListeners (JPA) et AbstractMongoEventListener sont des outils puissants… mais pas toujours adaptés.
Dans une démarche Clean Code, il faut :

  • éviter l’abus de logique métier dans ces hooks
  • préférer des usages techniques simples
  • bien tester et documenter

Astuce : si un développeur ne comprend pas pourquoi un champ est modifié sans appel explicite → c’est que le listener est mal utilisé.

Sources & lectures recommandées

Leave a Comment