Formation Java / Spring Boot – Vision architecturale avancée
Journée purement informative
À l’issue de cette journée, vous sevez capable de :
Lien vers un cours complet avec un exemple pratique à réaliser
Structure utilisée dans vos projets :
controller/ service/ repository/ domain/ ou model/ dto/
Flux :
Controller → Service → Repository → Database
Le domaine est couplé à la technique.
Si demain :
Que devient votre logique métier ?
Elle est en partie prisonnière du framework.
Si cela vous êtes intéresse et si nous avons le temps, j’ai un cours complet sur cette architecture que nous pourrons aborder avec des exemples de code.
Architecture hexagonale (Alistair Cockburn) :
Le cœur du métier ne dépend d’aucune technologie.
Par conséquent, on utilise des Ports et des Adapters
Le domaine est au centre et les technologies sont autour.
[ REST ] | [ MQ ] — [ CORE ] — [ DB ] | [ CLI ]
Comme vous maitrisez la notion d’interface, tout devient limpide et simple…
Dans MVC : Service → Repository concret
Dans Hexagonale, c’est différent :
domain/ ├── model/ ├── port/ application/ ├── usecase/ infrastructure/ ├── persistence/ ├── mq/ ├── web/
Exemple :
public interface CompteRepositoryPort { Option<Compte> findByNumero(String numero); void save(Compte compte); }
Ici, aucune dépendance Spring.
public class VirementUseCase { private final CompteRepositoryPort repository; public VirementUseCase(CompteRepositoryPort repository) { this.repository = repository; } public Either<String, Void> virer(...) { ... } }
@Repository public class CompteRepositoryAdapter implements CompteRepositoryPort { private final SpringDataCompteRepository jpaRepo; @Override public Option<Compte> findByNumero(String numero) { return Option.ofOptional(jpaRepo.findByNumero(numero)); } }
@RestController public class VirementController { private final VirementUseCase useCase; @PostMapping("/virement") public ResponseEntity<?> virer(...) { ... } }
Dépendance descendante forte.
Controller → Service → Repository → JPA → PostgreSQL
Le domaine ne dépend de rien.
Controller → UseCase ← RepositoryAdapter
MVC :
dépendance fréquente
Hexagonale :
MVC : changement technique impactant
Adapter
peu de couches
Pourquoi les banques utilisent souvent une architecture proche de l’hexagonale ?
La raison est que le domaine métier doit survivre aux frameworks !
Dans votre projet actuel :
Créer :
public interface AuditPort { void enregistrer(VirementEvent event); }
Implémenter :
@Component public class RabbitAuditAdapter implements AuditPort
Modifier le UseCase pour dépendre du Port.
Remplacer RabbitMQ par une implémentation console. Aucune modification dans le UseCase.
Vous savez maintenant :
Les derniers jours on pourra aborder :
Vous êtes désormais des développeur.euse.s confirmés.
```