Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

🌱 Spring

Présentation

Spring est un framework Java open source, largement utilisé pour développer des applications d’entreprise.
Il fournit une infrastructure robuste, modulaire et extensible, qui permet de créer des applications maintenables, testables et scalables.


✅ Avantages

📈 Popularité et maturité du framework

Spring est l’un des frameworks Java les plus répandus. Il est :

  • Massivement documenté
  • Activement maintenu
  • Soutenu par une large communauté

👉 Cela facilite l’adoption de bonnes pratiques, l’intégration de bibliothèques fiables et la résolution rapide des problèmes.


🧱 Architecture en couches

L’application suit une architecture en couches, favorisant la séparation des responsabilités et la maintenabilité.
Chaque couche a un rôle spécifique :


📂 controller

Gère les requêtes HTTP (REST) et renvoie les réponses appropriées.
Utilise les annotations comme @RestController, @GetMapping, @PostMapping, etc.

Exemples : UserController, AuthController

Responsabilités :

  • Déléguer la logique métier aux services
  • Valider les entrées utilisateur
  • Retourner les statuts HTTP adaptés (200, 404, etc.)

📂 dto (Data Transfer Object)

Permet de transporter les données entre les couches sans exposer les entités.

Exemples : UserDTO, UserRegistrationDTO

Responsabilités :

  • Structurer les données entrantes/sortantes
  • Contrôler ce qui est exposé à l’API
  • Sécuriser et simplifier les échanges

📂 exception

Centralise la gestion des erreurs.

Exemples : ResourceNotFoundException, GlobalExceptionHandler

Responsabilités :

  • Définir des exceptions personnalisées
  • Gérer globalement les erreurs (@ControllerAdvice)
  • Fournir des réponses claires aux utilisateurs

📂 mapper

Convertit les données entre les entités (model) et les DTOs (dto).

Exemple : UserMapper

Responsabilités :

  • Séparer la logique de transformation
  • Faciliter les conversions bidirectionnelles

📂 model

Contient les entités JPA qui représentent les tables de la base de données.

Exemples : User, Transaction

Responsabilités :

  • Définir les champs persistés
  • Spécifier les relations JPA
  • Ajouter les contraintes de validation

📂 repository

Gère l’accès aux données avec Spring Data JPA.

Exemple : UserRepository extends JpaRepository<User, Long>

Responsabilités :

  • Fournir les opérations CRUD
  • Définir des requêtes personnalisées (findByEmail, etc.)

📂 security

Configure la sécurité de l’application : authentification, autorisation, filtres.

Exemples : SecurityConfig, JwtAuthenticationFilter, CustomUserDetailsService

Responsabilités :

  • Définir les règles d’accès
  • Gérer le token JWT
  • Sécuriser les endpoints

📂 service

Contient la logique métier.

Exemples : UserService, TransactionService

Responsabilités :

  • Orchestrer les appels aux repositories
  • Implémenter les règles métier
  • Fournir une API métier aux controller

♻️ Injection de dépendances (IoC)

Spring utilise l’inversion de contrôle (IoC) et l’injection de dépendances, ce qui permet :

  • 🔁 De réduire le couplage entre les composants
  • 🧪 De faciliter les tests unitaires
  • 🧠 De centraliser la configuration des beans

Exemple de dépendances Maven :

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

🌐 Orientation RESTful

Spring facilite le développement d’API REST, devenues essentielles dans les architectures modernes, notamment les applications web SPA (Single Page Application) ou mobiles. L’utilisation des annotations comme @RestController, @GetMapping, @PostMapping, etc., rend le développement rapide et clair.

🗄️ Gestion simplifiée de la base de données

Nous utilisons Hibernate comme implémentation de la spécification JPA (Java Persistence API), couplé à Spring Data JPA. Cette combinaison nous permet de simplifier considérablement l’accès aux données et la gestion des entités.

Grâce à Spring Data JPA, nous pouvons :

  • Définir des interfaces Repository qui permettent d’effectuer des opérations CRUD (Create, Read, Update, Delete) sans avoir à écrire de requêtes SQL ou HQL manuellement.
  • Créer des requêtes personnalisées simplement en nommant les méthodes de façon explicite, par exemple :
      Optional<User> findByEmail(String email);
    
      boolean existsByEmail(String email);
    
      List<User> findByFirstname(String firstname);
    
      List<User> findByLastname(String lastname);
    

🧪 Facilité de tests

Spring propose de nombreux outils et annotations pour les tests unitaires et tests d’intégration (@SpringBootTest, @MockBean, etc.), ce qui garantit la qualité logicielle du projet.


🗂️ Arborescence du projet Spring Boot

src
└── main
    ├── java
    │   └── com
    │       └── pecunia
    │           ├── controller
    │           │   └── UserController.java
    │           │
    │           ├── dto
    │           │   ├── UserDTO.java
    │           │   └── UserLoginDTO.java
    │           │   └── UserRegistrationDTO.java
    │           │   └── UserUpdateDTO.jav
    │           │
    │           ├── exception
    │           │   └── GlobalExceptionHandler.java
    │           │   └──ResourceNotFoundException.java
    │           │
    │           ├── mapper
    │           │   └── UserMapper.java
    │           │
    │           ├── model
    │           │   └── User.java
    │           │
    │           ├── repository
    │           │   └── UserRepository.java
    │           │
    │           ├── security
    │           │   ├── AuthenticationService.java
    │           │   ├── JwtAuthenticationFilter.java
    │           │   ├── JwtService.java
    │           │   ├── PasswordMatchersValidator.java
    │           │   ├── PasswordMatches.java
    │           │   ├── SecurityConfig.java
    │           │   └── TokenBlackList.java
    │           │
    │           ├── service
    │           │   ├── CustomUserDetailsService.java
    │           │   └── UserService.java
    │           │
    │           └── MonProjetApplication.java
    │
    └── resources
        ├── staapplication.propertiesc/
        └── application-dev.properties

🔄 Résumé du flux de données

[Client HTTP]
     ↓
[Controller] → [DTO] → [Service] → [Mapper] → [Model] → [Repository] → [Database]
                                       ↑
                                    [Exception]
                                       ↓
                                [Security Layer]