Le rôle de la couche service
Le service décide : il applique les règles métier, orchestre les appels au repository, transforme entités ↔ DTO. C'est le seul endroit où vit la logique — pas dans le contrôleur, pas dans le repository.
@Service déclare la classe comme un bean géré par Spring.
L'injection par constructeur
On injecte les dépendances via le constructeur (et non par champ) : c'est testable, immuable (final) et explicite.
@Service public class CampagneService { private final CampagneRepository repo; private final FournisseurRepository fournisseurs; public CampagneService(CampagneRepository r, FournisseurRepository f) { this.repo = r; this.fournisseurs = f; } }
Un aperçu de SOLID
Cinq principes pour un code maintenable :
- S — une classe, une responsabilité.
- O — ouverte à l'extension, fermée à la modification.
- L — substituabilité des sous-types.
- I — interfaces spécifiques plutôt qu'une géante.
- D — dépendre d'abstractions (interfaces), pas d'implémentations.
CampagneRepository, pas d'une implémentation concrète.Transactions
@Transactional garantit qu'un ensemble d'opérations réussit ou échoue en bloc. (Support selon la base : MongoDB gère les transactions multi-documents sur un replica set / Atlas.)
Prépare CampagneService avec ses dépendances injectées par constructeur. Au chapitre 8, on y écrit les vraies règles : rejoindre une campagne, calculer le palier, refuser une campagne clôturée.
- Le service porte la logique métier ;
@Service. - Injection par constructeur (testable,
final). - SOLID pour la maintenabilité ;
@Transactionalpour l'atomicité.