# 🏛️ Architecture Logicielle - BricoLoc Evolution > **Document de Référence Architecture** > Version 1.0 - Octobre 2025 --- ## 📋 Table des Matières 1. [Vue d'Ensemble](#vue-densemble) 2. [Principes Architecturaux](#principes-architecturaux) 3. [Patterns Utilisés](#patterns-utilisés) 4. [Architecture Legacy](#architecture-legacy) 5. [Architecture Moderne](#architecture-moderne) 6. [Comparaison Architecturale](#comparaison-architecturale) 7. [Décisions Techniques](#décisions-techniques) 8. [Qualités Architecturales](#qualités-architecturales) --- ## 🎯 Vue d'Ensemble ### Contexte BricoLoc est une plateforme de location d'outils en ligne. L'application actuelle (Legacy) souffre de plusieurs problèmes architecturaux accumulés depuis 2013 : - ❌ **Architecture monolithique** avec couplage fort - ❌ **Logique métier éparpillée** (frontend, backend, base de données) - ❌ **Maintenance difficile** (régressions fréquentes) - ❌ **Performance dégradée** (temps de réponse > 3s) - ❌ **Scalabilité limitée** ### Objectif Démontrer une **refonte architecturale complète** en appliquant les **principes et patterns modernes** d'architecture logicielle. ### Approche Création de **deux applications** côte à côte : 1. **Legacy** : Simulation du système actuel avec ses problèmes 2. **Moderne** : Nouvelle architecture avec résolution des problèmes --- ## 🏛️ Principes Architecturaux ### SOLID Principles #### **S** - Single Responsibility Principle > Une classe/module ne doit avoir qu'une seule raison de changer. **Application** : - Séparation claire entre couches (UI, Business Logic, Data) - Composants React mono-responsabilité - Services dédiés par domaine métier #### **O** - Open/Closed Principle > Ouvert à l'extension, fermé à la modification. **Application** : - Utilisation d'interfaces et abstractions - Pattern Strategy pour comportements variables - Plugins et extensions sans modifier le code existant #### **L** - Liskov Substitution Principle > Les classes dérivées doivent être substituables à leurs classes de base. **Application** : - Interfaces respectées par toutes les implémentations - Repository pattern avec différentes sources de données #### **I** - Interface Segregation Principle > Les clients ne doivent pas dépendre d'interfaces qu'ils n'utilisent pas. **Application** : - Interfaces spécifiques par contexte - Composants avec props minimales #### **D** - Dependency Inversion Principle > Dépendre des abstractions, pas des implémentations. **Application** : - Injection de dépendances - Abstractions (interfaces) entre couches --- ### Clean Architecture ``` ┌─────────────────────────────────────────────┐ │ UI Layer (React Components) │ │ - Pages, Components, Hooks │ └──────────────────┬──────────────────────────┘ │ ┌──────────────────▼──────────────────────────┐ │ Application Layer (Use Cases) │ │ - Services, Business Logic │ └──────────────────┬──────────────────────────┘ │ ┌──────────────────▼──────────────────────────┐ │ Domain Layer (Entities) │ │ - Models, Types, Business Rules │ └──────────────────┬──────────────────────────┘ │ ┌──────────────────▼──────────────────────────┐ │ Infrastructure Layer (Data Sources) │ │ - Repositories, APIs, Database │ └─────────────────────────────────────────────┘ ``` **Règles** : - Les dépendances pointent **vers l'intérieur** - Le domaine ne dépend de rien - L'infrastructure dépend du domaine (inversion) --- ### Separation of Concerns Chaque partie du système a une **responsabilité claire** : | Couche | Responsabilité | Exemples | |--------|----------------|----------| | **UI** | Présentation | Composants React, pages | | **Application** | Orchestration | Services, use cases | | **Domain** | Métier | Entities, business rules | | **Infrastructure** | Technique | API calls, DB access | --- ## 🎨 Patterns Utilisés ### 1. Repository Pattern **Objectif** : Abstraire l'accès aux données ```typescript // Interface (Domain Layer) interface OutilRepository { findAll(filters?: OutilFilters): Promise findById(id: string): Promise create(outil: CreateOutilDTO): Promise update(id: string, data: UpdateOutilDTO): Promise delete(id: string): Promise } // Implémentation (Infrastructure Layer) class SupabaseOutilRepository implements OutilRepository { constructor(private supabase: SupabaseClient) {} async findAll(filters?: OutilFilters): Promise { // Implémentation Supabase } // ... autres méthodes } ``` **Bénéfices** : - ✅ Changement de source de données sans impact - ✅ Tests facilités (mock du repository) - ✅ Logique data isolée --- ### 2. Service Layer Pattern **Objectif** : Centraliser la logique métier ```typescript // Service Layer class ReservationService { constructor( private reservationRepo: ReservationRepository, private stockService: StockService, private pricingService: PricingService ) {} async createReservation(data: CreateReservationDTO): Promise { // 1. Vérifier disponibilité const isAvailable = await this.stockService.checkAvailability( data.outilId, data.entrepotId, data.dateDebut, data.dateFin ) if (!isAvailable) { throw new UnavailableError() } // 2. Calculer prix const prix = await this.pricingService.calculate(data) // 3. Créer réservation const reservation = await this.reservationRepo.create({ ...data, prixTotal: prix }) // 4. Mettre à jour stock await this.stockService.reserve(data.outilId, data.entrepotId) return reservation } } ``` **Bénéfices** : - ✅ Logique métier centralisée et réutilisable - ✅ Orchestration des opérations complexes - ✅ Tests unitaires faciles --- ### 3. Dependency Injection **Objectif** : Découpler les dépendances ```typescript // Container DI (simplifié) class ServiceContainer { private static instance: ServiceContainer private services = new Map() register(key: string, factory: () => T): void { this.services.set(key, factory) } resolve(key: string): T { const factory = this.services.get(key) return factory() } } // Enregistrement container.register('outilRepository', () => new SupabaseOutilRepository(supabaseClient) ) container.register('outilService', () => new OutilService( container.resolve('outilRepository') ) ) // Utilisation const outilService = container.resolve('outilService') ``` --- ### 4. Factory Pattern **Objectif** : Créer des objets complexes ```typescript class ReservationFactory { static create(dto: CreateReservationDTO, user: User): Reservation { return { id: generateId(), utilisateurId: user.id, outilId: dto.outilId, statut: 'en_attente_paiement', createdAt: new Date(), // ... autres champs calculés } } static createFromLegacy(legacyData: any): Reservation { // Adapter les anciennes données } } ``` --- ### 5. Observer Pattern (Realtime) **Objectif** : Réagir aux changements en temps réel ```typescript // Supabase Realtime = Observer Pattern const stockChannel = supabase .channel('stocks') .on('postgres_changes', { event: 'UPDATE', schema: 'public', table: 'stocks' }, (payload) => { // Notifier les observers (composants React) updateStockCache(payload.new) } ) .subscribe() ``` --- ## 🕰️ Architecture Legacy ### Vue d'Ensemble ```mermaid graph TD A[Client Browser] --> B[Apache HTTP Reverse Proxy] B --> C[Tomcat - Spring Framework Frontend] C --> D[WebLogic - Java EE Backend] D --> E[Oracle Database] D --> F[MySQL Cache DB] C --> F G[Client Lourd Stocks] --> H[WCF Service] H --> E I[SAP ERP] --> J[Batch CSV] J --> E ``` ### Problèmes Architecturaux #### 1. **Couplage Fort** - Frontend accède directement à la BDD (court-circuite backend) - Logique métier dans les procédures stockées PL/SQL - Dépendance directe aux technologies (Oracle, WebLogic) #### 2. **Monolithe Complexe** - Tout dans une seule application - Déploiement all-or-nothing - Scaling vertical uniquement #### 3. **Maintenance Difficile** - Code spaghetti accumulé sur 10+ ans - Tables avec 150+ colonnes - Documentation obsolète - Pas de tests automatisés #### 4. **Performance** - Synchronisation stocks quotidienne (décalage 24h) - Pas de cache efficace - Requêtes SQL non optimisées --- ## ⚡ Architecture Moderne ### Style Architectural : Microservices Hybride + Clean Architecture L'architecture moderne combine : - **Microservices** pour la décomposition fonctionnelle et l'autonomie - **Clean Architecture** (couches) à l'intérieur de chaque microservice - **API Gateway** pour l'orchestration - **Event-Driven** pour la communication asynchrone ### Vue d'Ensemble - Architecture Microservices ```mermaid graph TB subgraph "Client Layer" A[Web App - Next.js] B[Mobile App - Future] end subgraph "API Gateway Layer" C[API Gateway / BFF] end A --> C B --> C subgraph "Microservices Layer" D[Auth Service
Supabase Auth] E[Catalogue Service
Next.js API + Supabase] F[Reservation Service
Next.js API + Supabase] G[Payment Service
Next.js API + Stripe Mock] H[Notification Service
Next.js API + Resend] I[Inventory Service
Next.js API + Supabase Realtime] end C --> D C --> E C --> F C --> G C --> H C --> I subgraph "Data Layer" J[(Supabase PostgreSQL
+ Realtime)] K[Cache - Redis/Supabase] L[Storage - Supabase Storage] end E --> J F --> J I --> J E --> K F --> K I --> L subgraph "Event Bus" M[Event Bus
Supabase Realtime Channels] end F --> M I --> M M --> H ``` ### Décomposition en Microservices #### 🔐 **Auth Service** (Supabase Auth) **Responsabilité** : Authentification et autorisation - Inscription / Connexion - Gestion des tokens JWT - Gestion des rôles (RBAC) - OAuth providers (Google, etc.) **Technologies** : Supabase Auth (géré) --- #### 📚 **Catalogue Service** **Responsabilité** : Gestion du catalogue d'outils - CRUD outils - Recherche et filtrage - Catégories - Comparateur de prix **API Endpoints** : - `GET /api/catalogue/outils` - `GET /api/catalogue/outils/:id` - `GET /api/catalogue/categories` - `POST /api/catalogue/search` **Base de données** : Tables `outils`, `categories`, `outil_images`, `prix_comparatifs` **Architecture interne** (Clean Architecture) : ``` catalogue-service/ ├── domain/ │ ├── entities/ │ │ └── outil.entity.ts │ └── repositories/ │ └── outil.repository.interface.ts │ ├── application/ │ ├── use-cases/ │ │ ├── get-outils.use-case.ts │ │ └── search-outils.use-case.ts │ └── services/ │ └── catalogue.service.ts │ └── infrastructure/ ├── repositories/ │ └── supabase-outil.repository.ts └── api/ └── routes.ts ``` --- #### 📅 **Reservation Service** **Responsabilité** : Gestion des réservations - Création de réservations - Vérification de disponibilité - Calcul des prix - Gestion du cycle de vie (en cours, terminée, annulée) **API Endpoints** : - `POST /api/reservations` - `GET /api/reservations/:id` - `GET /api/reservations/user/:userId` - `PATCH /api/reservations/:id/cancel` - `GET /api/reservations/check-availability` **Base de données** : Table `reservations` **Events émis** : - `reservation.created` - `reservation.confirmed` - `reservation.cancelled` **Architecture interne** : ``` reservation-service/ ├── domain/ │ ├── entities/ │ │ └── reservation.entity.ts │ ├── value-objects/ │ │ ├── date-range.vo.ts │ │ └── price.vo.ts │ └── rules/ │ └── availability.rule.ts │ ├── application/ │ ├── use-cases/ │ │ ├── create-reservation.use-case.ts │ │ └── check-availability.use-case.ts │ └── services/ │ ├── reservation.service.ts │ └── pricing.service.ts │ └── infrastructure/ ├── repositories/ │ └── supabase-reservation.repository.ts └── events/ └── reservation.events.ts ``` --- #### 📦 **Inventory Service** **Responsabilité** : Gestion des stocks temps réel - Stocks par entrepôt - Disponibilité en temps réel - Réservation temporaire de stock - Synchronisation multi-entrepôts **API Endpoints** : - `GET /api/inventory/stocks/:outilId` - `GET /api/inventory/entrepots/:entrepotId/stocks` - `POST /api/inventory/reserve` - `POST /api/inventory/release` **Base de données** : Table `stocks`, `entrepots` **Realtime** : Supabase Realtime pour push des mises à jour **Events émis/écoutés** : - Écoute : `reservation.confirmed` → Décrémente stock - Écoute : `reservation.cancelled` → Libère stock - Émet : `stock.updated` --- #### 💳 **Payment Service** **Responsabilité** : Gestion des paiements - Intégration Stripe (simulée) - Création de payment intent - Confirmation de paiement - Remboursements **API Endpoints** : - `POST /api/payment/create-intent` - `POST /api/payment/confirm` - `POST /api/payment/refund` - `GET /api/payment/:id/status` **Base de données** : Table `transactions` (logs) **Events émis** : - `payment.succeeded` - `payment.failed` --- #### 💬 **Notification Service** **Responsabilité** : Notifications multi-canal - Emails (Resend API) - Notifications in-app - SMS (futur) **API Endpoints** : - `POST /api/notifications/send` - `GET /api/notifications/user/:userId` **Events écoutés** : - `reservation.created` → Email confirmation - `payment.succeeded` → Email facture - `stock.low` → Email admin --- ### Communication entre Microservices #### 1. **Communication Synchrone** (REST) Pour les opérations nécessitant une réponse immédiate : ```typescript // Reservation Service appelle Inventory Service const availability = await fetch('/api/inventory/check-availability', { method: 'POST', body: JSON.stringify({ outilId, entrepotId, dateDebut, dateFin }) }) ``` #### 2. **Communication Asynchrone** (Events) Pour les opérations non-bloquantes : ```typescript // Reservation Service émet un event await eventBus.publish('reservation.confirmed', { reservationId, outilId, entrepotId, dateDebut, dateFin }) // Inventory Service écoute l'event eventBus.subscribe('reservation.confirmed', async (data) => { await inventoryService.reserveStock(data.outilId, data.entrepotId) }) ``` **Implémentation** : Supabase Realtime Channels (Pub/Sub) --- ### API Gateway / BFF (Backend For Frontend) Le frontend Next.js agit comme **BFF (Backend For Frontend)** : ```typescript // app/api/reservations/route.ts (API Gateway pattern) export async function POST(request: Request) { const data = await request.json() // 1. Vérifier auth const user = await authService.getCurrentUser() // 2. Vérifier disponibilité (appel Inventory Service) const isAvailable = await inventoryService.checkAvailability(data) if (!isAvailable) { return NextResponse.json({ error: 'Unavailable' }, { status: 400 }) } // 3. Créer réservation (appel Reservation Service) const reservation = await reservationService.create({ ...data, utilisateurId: user.id }) // 4. Créer payment intent (appel Payment Service) const paymentIntent = await paymentService.createIntent({ amount: reservation.prixTotal, reservationId: reservation.id }) return NextResponse.json({ reservation, paymentIntent }) } ``` **Avantages du BFF** : - ✅ Agrégation de plusieurs microservices - ✅ Réduction du nombre d'appels frontend - ✅ Logique d'orchestration centralisée - ✅ Adaptation au besoin du client (web, mobile) --- ### Architecture Hybride : Couches + Microservices Chaque microservice implémente **Clean Architecture** en interne : ``` ┌─────────────────────────────────────────────────────────┐ │ MICROSERVICE │ │ ┌─────────────────────────────────────────────────┐ │ │ │ API Layer (Controllers/Routes) │ │ │ └────────────────┬────────────────────────────────┘ │ │ │ │ │ ┌────────────────▼────────────────────────────────┐ │ │ │ Application Layer (Use Cases, Services) │ │ │ └────────────────┬────────────────────────────────┘ │ │ │ │ │ ┌────────────────▼────────────────────────────────┐ │ │ │ Domain Layer (Entities, Business Rules) │ │ │ └────────────────┬────────────────────────────────┘ │ │ │ │ │ ┌────────────────▼────────────────────────────────┐ │ │ │ Infrastructure (Repositories, DB, Events) │ │ │ └─────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘ ``` **Pourquoi Hybride ?** - ✅ **Microservices** : Autonomie, scalabilité indépendante, équipes séparées - ✅ **Clean Architecture** : Maintenabilité, testabilité, indépendance technologique - ✅ **Best of both worlds** ### Structure des Dossiers - Architecture Microservices ``` apps/modern-app/ ├── src/ │ ├── app/ # Next.js App Router (UI + BFF) │ │ ├── (auth)/ │ │ ├── (main)/ │ │ └── api/ # API Gateway / BFF │ │ ├── catalogue/ # Catalogue Service API │ │ ├── reservations/ # Reservation Service API │ │ ├── inventory/ # Inventory Service API │ │ ├── payment/ # Payment Service API │ │ └── notifications/ # Notification Service API │ │ │ ├── components/ # UI Components (Presentation) │ │ │ ├── services/ # Microservices (Business Logic) │ │ ├── catalogue/ │ │ │ ├── domain/ │ │ │ │ ├── entities/ │ │ │ │ └── repositories/ │ │ │ ├── application/ │ │ │ │ ├── use-cases/ │ │ │ │ └── services/ │ │ │ └── infrastructure/ │ │ │ ├── repositories/ │ │ │ └── supabase/ │ │ │ │ │ ├── reservation/ │ │ │ ├── domain/ │ │ │ ├── application/ │ │ │ └── infrastructure/ │ │ │ │ │ ├── inventory/ │ │ │ ├── domain/ │ │ │ ├── application/ │ │ │ └── infrastructure/ │ │ │ │ │ ├── payment/ │ │ │ ├── domain/ │ │ │ ├── application/ │ │ │ └── infrastructure/ │ │ │ │ │ └── notification/ │ │ ├── domain/ │ │ ├── application/ │ │ └── infrastructure/ │ │ │ ├── shared/ # Code partagé entre services │ │ ├── domain/ # Shared entities, value objects │ │ ├── infrastructure/ # Shared utilities │ │ └── events/ # Event Bus │ │ │ ├── hooks/ # Custom React Hooks │ └── types/ # TypeScript Types ``` **Remarque** : Chaque microservice suit Clean Architecture en interne (domain → application → infrastructure) ### Flux de Données - Architecture Microservices ```mermaid sequenceDiagram participant U as User (UI) participant BFF as API Gateway (BFF) participant RS as Reservation Service participant IS as Inventory Service participant PS as Payment Service participant EB as Event Bus participant NS as Notification Service participant DB as Supabase DB U->>BFF: POST /api/reservations BFF->>IS: Check Availability IS->>DB: Query stocks DB-->>IS: Stock data IS-->>BFF: Available BFF->>RS: Create Reservation RS->>DB: Insert reservation DB-->>RS: Reservation created RS->>EB: Publish "reservation.created" RS-->>BFF: Reservation object BFF->>PS: Create Payment Intent PS-->>BFF: Payment Intent BFF-->>U: {reservation, paymentIntent} EB->>IS: Event "reservation.created" IS->>DB: Reserve stock EB->>NS: Event "reservation.created" NS->>U: Send confirmation email ``` --- ## 📊 Comparaison Architecturale ### Styles Architecturaux | Aspect | Legacy | Moderne | |--------|--------|---------| | **Style** | Monolithe | Microservices Hybride | | **Frontend** | MVC (Spring) | SPA + BFF (Next.js) | | **Backend** | Java EE (monolithe) | Microservices (Next.js API) | | **Communication** | SOAP | REST + Events | | **Déploiement** | Tout-en-un | Indépendant par service | | **Scalabilité** | Verticale | Horizontale par service | | **Architecture interne** | ❌ Aucune | Clean Architecture | ### Caractéristiques | Aspect | Legacy | Moderne | |--------|--------|---------| | **Couplage** | Fort (direct DB access) | Faible (via interfaces) | | **Cohésion** | Faible | Forte (services focalisés) | | **Testabilité** | Difficile | Facile (isolation) | | **Autonomie** | ❌ Aucune | ✅ Par service | | **Résilience** | ❌ Single point of failure | ✅ Fault isolation | | **Maintenance** | Complexe (tout lié) | Simple (services isolés) | ### Décomposition | Critère | Legacy | Moderne | |---------|--------|---------| | **Granularité** | 1 application | 6 microservices | | **Base de données** | 1 monolithe Oracle | Database per service (logique) | | **Déploiement** | 1 artefact | 6 services indépendants | | **Équipes** | 1 équipe | Possibilité d'équipes par service | | **Technologies** | Uniformes | Polyglotte (si besoin) | ### Patterns | Pattern | Legacy | Moderne | |---------|--------|---------| | **Microservices** | ❌ Non | ✅ Oui | | **API Gateway / BFF** | ❌ Non | ✅ Oui | | **Event-Driven** | ❌ Non | ✅ Oui (Supabase Realtime) | | **Repository** | ❌ Non | ✅ Oui | | **Service Layer** | ⚠️ Partiel | ✅ Oui | | **Dependency Injection** | ❌ Non | ✅ Oui | | **Clean Architecture** | ❌ Non | ✅ Oui (par service) | | **SOLID** | ❌ Non | ✅ Oui | | **CQRS** | ❌ Non | ⚠️ Partiel (read/write séparés) | ### Bénéfices de l'Architecture Microservices #### ✅ Avantages 1. **Autonomie** : Chaque service peut être développé/déployé/scalé indépendamment 2. **Isolation des pannes** : Un service en panne n'affecte pas les autres 3. **Scalabilité ciblée** : Scale uniquement les services sous charge (ex: Inventory Service) 4. **Flexibilité technologique** : Possibilité d'utiliser différentes techs par service 5. **Équipes indépendantes** : Une équipe par service (futur) 6. **Déploiement continu** : Déploiement d'un service sans impact sur les autres #### ⚠️ Complexités introduites 1. **Distributed system** : Gestion de la cohérence, latence réseau 2. **Observabilité** : Besoin de tracing distribué (logs, metrics) 3. **Transactions distribuées** : Saga pattern (si nécessaire) 4. **Tests d'intégration** : Plus complexes (inter-services) **Mitigations appliquées** : - ✅ Event-driven pour asynchrone (résilience) - ✅ BFF pour agrégation (moins d'appels frontend) - ✅ Supabase pour gestion centralisée de la data - ✅ Next.js pour colocalisation (simplicité de déploiement) ### Métriques | Métrique | Legacy | Moderne | Impact | |----------|--------|---------|--------| | **Complexité Cyclomatique** | ~35 | ~8 | -77% | | **Couplage (afferent/efferent)** | ~15 | ~3 | -80% | | **Lignes par fichier** | ~500 | ~150 | -70% | | **Tests Coverage** | 0% | 80%+ | +∞ | --- ## 🎯 Décisions Techniques Toutes les décisions architecturales majeures sont documentées dans les [ADR](./docs/architecture/ADR/). ### ADR Principaux | # | Titre | Décision | |---|-------|----------| | [001](./docs/architecture/ADR/001-mono-repo.md) | Structure Mono-repo | pnpm workspaces | | [002](./docs/architecture/ADR/002-framework-frontend.md) | Framework Frontend | Next.js 14 | | [003](./docs/architecture/ADR/003-backend-supabase.md) | Backend & BDD | Supabase | | [004](./docs/architecture/ADR/004-architecture-layers.md) | Architecture en Couches | Clean Architecture | | [005](./docs/architecture/ADR/005-patterns.md) | Patterns | Repository + Service Layer | --- ## 🏆 Qualités Architecturales ### 1. Maintenabilité **Legacy** : ⭐ (1/5) - Code spaghetti - Pas de séparation des responsabilités - Documentation obsolète **Moderne** : ⭐⭐⭐⭐⭐ (5/5) - Code modulaire et propre - Séparation claire des couches - Documentation à jour ### 2. Testabilité **Legacy** : ⭐ (1/5) - Couplage fort = tests difficiles - Pas de tests existants - Dépendances sur BDD réelle **Moderne** : ⭐⭐⭐⭐⭐ (5/5) - Interfaces = mocking facile - Tests unitaires isolés - Tests d'intégration avec Supabase local ### 3. Scalabilité **Legacy** : ⭐⭐ (2/5) - Scaling vertical uniquement - Monolithe = réplication complète - Coûts exponentiels **Moderne** : ⭐⭐⭐⭐⭐ (5/5) - Scaling horizontal (Vercel) - Supabase géré et scalable - Coûts linéaires ### 4. Performance **Legacy** : ⭐⭐ (2/5) - Temps de réponse lents - Pas de cache efficace - Synchronisation différée **Moderne** : ⭐⭐⭐⭐⭐ (5/5) - SSR/SSG optimisés - Cache intelligent (React Query) - Temps réel (Supabase) ### 5. Sécurité **Legacy** : ⭐⭐ (2/5) - Hash MD5 (faible) - SQL injection possible - Pas de RLS **Moderne** : ⭐⭐⭐⭐⭐ (5/5) - JWT sécurisés (Supabase) - Parameterized queries - Row Level Security (RLS) --- ## 📚 Références ### Livres - **Clean Architecture** - Robert C. Martin - **Design Patterns** - Gang of Four - **Domain-Driven Design** - Eric Evans ### Articles & Ressources - [The Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) - [SOLID Principles](https://en.wikipedia.org/wiki/SOLID) - [Repository Pattern](https://martinfowler.com/eaaCatalog/repository.html) --- ## 🔄 Évolution Ce document évolue avec le projet. Chaque décision architecturale majeure doit : 1. Être discutée en équipe 2. Faire l'objet d'un ADR 3. Être intégrée dans ce document 4. Être reflétée dans le code --- *Document maintenu par : Équipe Architecture* *Dernière révision : Octobre 2025*