Clean architecture pour une application durable et sécurisée

Rémy Bonneau .

28 septembre 2026

Checklist pour une Clean Architecture réussie : logique métier dans des use cases, indépendance technologique, 3 couches, tests sans BDD, compréhension facile du métier et du code.

Table des matières

Une application peut fonctionner pendant des années tout en devenant presque impossible à faire évoluer. La clean architecture répond à ce problème en séparant les règles métier, les cas d’usage, l’interface et les détails techniques. Je présente ici son fonctionnement, ses bénéfices pour la cybersécurité, une méthode d’implémentation concrète et les situations où cette approche serait excessive.

Une architecture qui protège le métier des choix techniques

  • Principe central : les dépendances doivent pointer vers le cœur métier.
  • Organisation : domaine, application, adaptateurs et infrastructure ont des responsabilités distinctes.
  • Effet concret : une base de données, une API ou une interface peuvent changer sans réécrire les règles métier.
  • Sécurité : la séparation facilite les contrôles, mais ne remplace ni l’authentification ni l’analyse des menaces.
  • Limite : pour une petite application CRUD, cette structure peut ajouter une complexité inutile.

Le principe qui change toute la conception

Le point de départ est simple. Les règles qui donnent sa valeur à l’application ne doivent pas dépendre d’un framework, d’une base SQL, d’un fournisseur cloud ou d’un protocole HTTP. Elles doivent rester utilisables même si ces éléments disparaissent.

J’appelle cela la règle des dépendances. Le code externe peut dépendre du code métier, mais le métier ne doit pas connaître les détails techniques qui l’entourent. Cette inversion rend le système plus stable et évite qu’un choix temporaire devienne une contrainte permanente.

Dans une application de gestion des paiements, par exemple, la règle « une facture ne peut être réglée deux fois » appartient au domaine métier. Elle ne devrait pas être enfouie dans un contrôleur web ou dans une requête SQL. Le fournisseur de paiement n’est qu’un moyen d’exécuter cette règle.

Cette philosophie est proche de l’architecture hexagonale, de l’architecture en oignon et du modèle ports-adaptateurs. Les noms changent, mais l’idée reste la même : isoler les décisions importantes des mécanismes remplaçables.

Diagramme illustrant la clean architecture : le cœur

Les quatre zones d’une application bien découplée

Le domaine métier

Au centre se trouvent les entités, les objets valeur et les règles métier. Une entité représente un concept important, comme un contrat, une commande ou un utilisateur. Elle ne devrait pas importer une bibliothèque liée à une base de données ou à une interface web.

Le domaine contient aussi les invariants, c’est-à-dire les conditions qui doivent toujours rester vraies. Pour une commande, cela peut être l’interdiction d’une quantité négative ou l’impossibilité de modifier une commande déjà expédiée.

Les cas d’usage

Cette couche décrit ce que l’utilisateur ou un système externe peut faire. Elle orchestre les étapes nécessaires pour créer une commande, clôturer un incident ou générer un rapport, sans connaître le format précis d’une requête HTTP.

Les interfaces nécessaires sont définies ici. Une interface de dépôt, par exemple, exprime le besoin de charger une commande, tandis que son implémentation concrète se trouve à l’extérieur. Le cœur indique donc ce dont il a besoin, sans imposer la manière de le fournir.

Les adaptateurs

Les adaptateurs traduisent les données entre le monde extérieur et l’application. Un contrôleur transforme une requête HTTP en commande applicative. Un présentateur convertit le résultat en réponse JSON. Cette couche évite que les formats externes contaminent les règles internes.

L’infrastructure

L’infrastructure regroupe les détails techniques comme Entity Framework, PostgreSQL, Redis, un service de messagerie ou un fournisseur d’identité. Elle implémente les interfaces définies par les couches internes grâce à l’injection de dépendances.

Cette organisation ne signifie pas qu’il faut obligatoirement créer quatre projets séparés. Dans une petite solution, des modules bien délimités peuvent suffire. Ce qui compte vraiment est la direction des dépendances, pas le nombre de dossiers affichés dans l’explorateur de fichiers.

Comment la mettre en place sans créer une usine à gaz

  1. Commencer par le métier : lister les règles, les décisions et les cas d’usage avant de choisir les bibliothèques.
  2. Définir les frontières : séparer ce qui relève du domaine, de l’orchestration, de l’interface et de l’infrastructure.
  3. Créer les contrats : placer les interfaces nécessaires dans la couche qui exprime le besoin.
  4. Construire les adaptateurs : connecter la base de données, les API et les files de messages sans faire remonter leurs détails.
  5. Vérifier les dépendances : utiliser les tests d’architecture ou l’analyse statique pour empêcher les références interdites.

Je recommande de partir d’un seul cas d’usage complet plutôt que de réorganiser toute l’application d’un coup. Une fonction comme « créer un client » permet de tester la circulation des données, la validation, la persistance et la gestion des erreurs sur un périmètre réduit.

Le flux ressemble généralement à ceci : le contrôleur reçoit la demande, le cas d’usage applique les règles, un port demande l’enregistrement d’une donnée, puis un adaptateur d’infrastructure utilise la base choisie. Le contrôleur ne sait pas comment la donnée est stockée et le domaine ne sait même pas que HTTP existe.

Les tests suivent la même logique. Les règles métier peuvent être testées rapidement sans démarrer de serveur ni de base de données. Les tests d’intégration vérifient ensuite les adaptateurs, tandis que quelques tests de bout en bout contrôlent le fonctionnement global.

Ce que cette séparation apporte à la cybersécurité

Une architecture découplée ne rend pas automatiquement une application sûre. Elle crée toutefois de meilleures conditions pour appliquer la sécurité dès la conception, car les responsabilités et les points d’accès sont plus faciles à identifier.

Limiter les privilèges

Un service applicatif peut recevoir uniquement l’interface dont il a besoin. Il n’a pas forcément accès à toutes les tables, à tous les fichiers ou à toutes les opérations d’administration. Cette limitation réduit l’impact d’une erreur ou d’une compromission.

Isoler les données sensibles

Les objets métier ne devraient pas transporter inutilement des mots de passe, des jetons ou des secrets techniques. Des modèles dédiés aux entrées et aux sorties permettent de contrôler précisément les données exposées par l’API.

Contrôler chaque requête

La validation et l’autorisation doivent être appliquées à chaque opération sensible. Une interface bien séparée aide à distinguer l’authentification, qui vérifie l’identité, de l’autorisation, qui vérifie les droits sur une action précise.

J’ajoute toujours une analyse des menaces avant de considérer le travail terminé. Il faut se demander ce qui arrive si un adaptateur est compromis, si un utilisateur modifie une requête ou si un service externe renvoie une réponse inattendue. La séparation des couches facilite la revue, mais elle ne remplace ni le chiffrement, ni la journalisation, ni la gestion des secrets.

Quand cette approche est pertinente et quand elle ne l’est pas

Le découplage devient particulièrement utile lorsque le métier est complexe, que plusieurs équipes interviennent ou que la durée de vie du produit dépasse quelques mois. Il est aussi intéressant lorsqu’une organisation prévoit de changer de base de données, d’interface ou de fournisseur cloud.

Approche Atout principal Limite Usage adapté
Application CRUD simple Rapidité de développement Couplage plus fort Outil interne ou prototype
Monolithe modulaire Déploiement simple et frontières claires Discipline nécessaire entre modules Produit métier de taille moyenne
Architecture en couches découplées Testabilité et évolution maîtrisée Plus de contrats et de code initial Application durable et métier complexe
Microservices Déploiement indépendant Forte complexité opérationnelle Organisation déjà mature à grande échelle

Pour une petite application qui crée, lit, modifie et supprime quelques enregistrements, une structure très élaborée peut ralentir l’équipe sans bénéfice réel. Je préfère alors un monolithe modulaire, avec des frontières propres, puis j’introduis davantage d’abstraction uniquement lorsqu’un besoin concret apparaît.

Il ne faut surtout pas confondre cette méthode avec les microservices. Une application peut appliquer ces principes dans un seul déploiement. Dans beaucoup de projets, ce choix est même plus raisonnable, car il conserve une exploitation simple tout en protégeant le cœur métier.

Les erreurs qui rendent l’architecture contre-productive

Multiplier les abstractions sans besoin

Créer une interface pour chaque classe ne rend pas automatiquement le code flexible. Une abstraction est utile lorsqu’elle protège une frontière ou permet de remplacer une dépendance. Sinon, elle ajoute surtout du bruit et complique la lecture.

Copier les mêmes données partout

Les DTO, les modèles de domaine et les modèles de persistance peuvent être différents, mais pas systématiquement. Je les sépare lorsque leurs responsabilités divergent réellement. Copier chaque propriété trois ou quatre fois sans raison augmente le risque d’incohérence.

Laisser l’infrastructure décider du métier

Une règle placée dans une procédure stockée ou dans un contrôleur sera difficile à réutiliser et à tester. Les contraintes propres au métier doivent rester proches des objets et des cas d’usage qui les portent.

Oublier les transactions et les erreurs

Le découpage logique ne résout pas les problèmes de cohérence. Il faut encore décider où commence une transaction, comment une opération est rejouée et quelle réponse est renvoyée après un échec externe. Ces décisions appartiennent au comportement applicatif, pas uniquement à la base de données.

Lire aussi : Système d'information utile - Exemples concrets et cybersécurité

Appliquer une recette identique partout

Une architecture utile doit suivre le risque, la complexité et la durée de vie du produit. Si les règles métier sont faibles et stables, une structure légère peut être meilleure. Si elles sont nombreuses et changeantes, investir dans des frontières solides paiera rapidement.

La bonne mesure pour savoir si votre architecture reste saine

Je ne mesure pas la qualité d’une architecture au nombre de couches ou de projets. Je regarde plutôt si une modification métier peut être réalisée sans toucher simultanément à l’interface, à la base de données et à plusieurs services techniques.

Un bon signal est la facilité avec laquelle l’équipe peut tester une règle importante, remplacer un adaptateur ou comprendre le parcours d’une donnée. Si chaque évolution exige de parcourir toute l’application, les frontières sont probablement trop faibles.

La démarche la plus pragmatique consiste donc à protéger d’abord les décisions qui ont une valeur métier ou un impact de sécurité. Le reste peut rester simple. Cette discipline offre un logiciel plus testable, plus lisible et plus résistant aux changements, sans transformer chaque projet en démonstration théorique d’architecture.

Cet article a un caractère purement informatif et éducatif. Le contenu a été élaboré avec l'aide d'outils analytiques et linguistiques modernes (IA). Avant de prendre une décision, consultez un expert.

Questions fréquentes

Les dépendances doivent pointer vers le cœur métier. Le domaine et les cas d’usage ne doivent pas dépendre d’un framework, d’une base de données ou de HTTP, tandis que l’infrastructure implémente les interfaces définies par les couches internes.
Commencez par les règles métier, définissez les frontières, placez les interfaces dans la couche qui exprime le besoin, puis construisez les adaptateurs techniques. Il est préférable de tester d’abord un cas d’usage complet, comme la création d’un client, plutôt que de réorganiser toute l’application.
Elle facilite la limitation des privilèges, l’isolation des données sensibles et la séparation entre authentification et autorisation. Elle rend aussi les contrôles plus lisibles, mais ne remplace ni le chiffrement, ni la journalisation, ni la gestion des secrets ou l’analyse des menaces.
Pour une petite application CRUD aux règles métier simples et stables, une structure légère peut être plus efficace. Le monolithe modulaire convient souvent à un produit métier de taille moyenne, tandis qu’un découplage plus poussé devient pertinent lorsque le métier est complexe, durable ou amené à changer de base, d’interface ou de fournisseur cloud.
Évaluer l'article

Moyenne: 5.0 / 5 · 1 évaluation

Tags

clean architecture injection de dépendances tests d’architecture monolithe modulaire modélisation des menaces
Autor Rémy Bonneau
Rémy Bonneau
Je m'appelle Rémy Bonneau et j'ai neuf ans d'expérience dans le domaine de la gestion IT, des projets et de la transformation. Mon intérêt pour ces sujets a commencé lorsque j'ai réalisé à quel point une bonne gestion des projets peut transformer une entreprise et améliorer son efficacité. J'aime explorer les défis complexes que rencontrent les organisations et proposer des solutions claires et accessibles. Au fil des ans, j'ai eu l'occasion de travailler sur divers projets qui m'ont permis d'affiner ma capacité à simplifier des concepts techniques et à les rendre compréhensibles pour tous. Je m'efforce toujours de fournir des informations précises, utiles et à jour, en vérifiant mes sources et en suivant les tendances du secteur. Mon objectif est d'aider les lecteurs à naviguer dans le monde en constante évolution de la gestion IT et à comprendre les enjeux de la transformation digitale.
Commentaires (0)
Ajouter un commentaire