Chapitre 8: "C'est quoi...?" — Les 40 concepts les plus demandés en entrevue
Ce chapitre regroupe les questions de type "C'est quoi un DTO ?", "C'est quoi MVC ?" — les questions de vocabulaire et de concepts que tout intervieweur pose en premier. Si vous ne pouvez réviser qu'un seul chapitre, c'est celui-ci.
1. C'est quoi un DTO (Data Transfer Object) ?
Un DTO est un objet simple qui sert à transporter des données entre les couches de l'application, sans logique métier.
Pourquoi ne pas utiliser l'Entity directement ?
| Entity | DTO |
|---|---|
| Mappée à la base de données | Juste un conteneur de données |
| Contient des relations JPA (lazy loading) | Contient uniquement les champs nécessaires |
| Peut exposer des données sensibles (mot de passe, rôle) | On choisit exactement quoi exposer |
| Changer la BDD = changer l'API | API indépendante de la BDD |
Exemple concret
// ENTITY (liée à la BDD)
@Entity
public class User {
@Id @GeneratedValue
private Long id;
private String name;
private String email;
private String password; // ← ne doit JAMAIS être exposé !
private String role;
@OneToMany(mappedBy = "user")
private List<Order> orders; // ← lazy loading, peut causer N+1
}
// DTO (ce que le client reçoit)
public record UserDTO(
Long id,
String name,
String email
// pas de password, pas de rôle, pas de orders
) {}
// Conversion dans le Service
@Service
public class UserService {
public UserDTO toDto(User user) {
return new UserDTO(user.getId(), user.getName(), user.getEmail());
}
}
"A DTO is a simple object used to transfer data between layers. I use DTOs to avoid exposing JPA entities in the API — this prevents leaking sensitive fields like passwords and avoids lazy-loading issues."
2. C'est quoi MVC (Model-View-Controller) ?
Un pattern architectural qui sépare l'application en 3 responsabilités :
| Composant | Rôle | En Spring Boot |
|---|---|---|
| Model | Les données et la logique métier | Entity, Service, Repository |
| View | L'affichage (ce que l'utilisateur voit) | JSON (API REST) ou Thymeleaf (HTML) |
| Controller | Le chef d'orchestre qui reçoit les requêtes et coordonne | @Controller ou @RestController |
En Spring Boot REST, le "View" c'est le JSON
@RestController // Controller
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public UserDTO getUser(@PathVariable Long id) {
return userService.findById(id); // Model → converti en JSON (View)
}
}
"MVC separates the application into Model (data/logic), View (presentation), and Controller (request handling). In a REST API, the View is the JSON response automatically serialized by Jackson."
3. C'est quoi une API REST ?
API = Application Programming Interface (interface pour que deux programmes communiquent)
REST = Representational State Transfer (style architectural pour les APIs web)
Les 6 règles de REST
| Règle | Signification |
|---|---|
| Client-Serveur | Le client et le serveur sont séparés |
| Sans état (Stateless) | Chaque requête contient toute l'information nécessaire |
| Cache | Les réponses peuvent être mises en cache |
| Interface uniforme | URLs cohérentes, méthodes HTTP standard |
| Système en couches | Le client ne sait pas s'il parle au serveur final |
| Code à la demande (optionnel) | Le serveur peut envoyer du code exécutable |
Les méthodes HTTP
| Méthode | Action | Exemple | Code retour |
|---|---|---|---|
| GET | Lire | GET /api/users/1 | 200 OK |
| POST | Créer | POST /api/users | 201 Created |
| PUT | Remplacer entièrement | PUT /api/users/1 | 200 OK |
| PATCH | Modifier partiellement | PATCH /api/users/1 | 200 OK |
| DELETE | Supprimer | DELETE /api/users/1 | 204 No Content |
"REST is an architectural style for web APIs. It uses HTTP methods (GET, POST, PUT, DELETE) to perform CRUD operations on resources identified by URLs. It's stateless — each request is independent."
4. C'est quoi CRUD ?
Les 4 opérations de base sur les données :
| Lettre | Opération | SQL | HTTP | Spring Data |
|---|---|---|---|---|
| C | Create | INSERT | POST | save() |
| R | Read | SELECT | GET | findById(), findAll() |
| U | Update | UPDATE | PUT/PATCH | save() |
| D | Delete | DELETE | DELETE | deleteById() |
5. C'est quoi un POJO ?
POJO = Plain Old Java Object
Un objet Java simple, sans aucune dépendance sur un framework :
// C'est un POJO — juste des champs, getters, setters
public class User {
private String name;
private String email;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
Un Java Bean est un POJO qui suit des conventions : constructeur sans argument, getters/setters, sérialisable.
Un Spring Bean est un objet géré par le conteneur Spring (peut être un POJO annoté @Component, @Service, etc.).
6. C'est quoi un Bean Spring ?
Un objet créé et géré par le conteneur Spring (ApplicationContext).
// Ceci est un Bean Spring — Spring le crée et le gère
@Service
public class UserService {
// Spring l'instancie automatiquement au démarrage
// Spring l'injecte là où il est nécessaire
// Spring gère son cycle de vie
}
// Ceci n'est PAS un Bean — créé manuellement
UserService service = new UserService();
Comment créer un Bean ?
| Méthode | Exemple |
|---|---|
| Annotations stéréotype | @Component, @Service, @Repository, @Controller |
| @Bean dans @Configuration | Méthode qui retourne un objet |
| @Import | Importer une classe de configuration |
"A Spring Bean is an object managed by the Spring IoC container. Spring creates it, injects its dependencies, and manages its lifecycle. By default, beans are singletons."
7. C'est quoi IoC (Inversion of Control) ?
Sans IoC : le code crée ses propres dépendances.
Avec IoC : le conteneur crée les dépendances et les fournit au code.
// SANS IoC — le code contrôle la création
public class OrderService {
private UserRepository repo = new UserRepository(); // Crée lui-même
private EmailService email = new EmailService(); // Crée lui-même
}
// AVEC IoC — Spring contrôle la création
@Service
public class OrderService {
private final UserRepository repo; // Spring fournit
private final EmailService email; // Spring fournit
public OrderService(UserRepository repo, EmailService email) {
this.repo = repo; // Injecté par Spring
this.email = email; // Injecté par Spring
}
}
L'injection de dépendances (DI) est le mécanisme concret qui implémente IoC.
8. C'est quoi ORM et JPA et Hibernate ?
| Terme | Définition | Analogie |
|---|---|---|
| ORM | Object-Relational Mapping — technique qui mappe les objets Java aux tables SQL | Le traducteur entre Java et SQL |
| JPA | Jakarta Persistence API — la spécification (interface) de l'ORM en Java | Le contrat / le standard |
| Hibernate | L'implémentation la plus populaire de JPA | Le logiciel qui fait le travail |
JPA (spécification) → Hibernate (implémentation)
↓ ↓
"voici comment ça "voici le code qui
devrait fonctionner" le fait fonctionner"
// JPA Annotations (standard)
@Entity // JPA dit : "cette classe est une entité"
@Table(name = "users") // JPA dit : "mappée à la table users"
public class User {
@Id // JPA dit : "ceci est la clé primaire"
@GeneratedValue // JPA dit : "auto-incrémentée"
private Long id;
@Column(name = "full_name") // JPA dit : "mappé à cette colonne"
private String name;
}
// Hibernate fait le travail derrière : génère les requêtes SQL,
// gère le cache, le lazy loading, les transactions...
"JPA is the specification that defines how Java objects map to database tables. Hibernate is the most popular implementation of JPA. I use JPA annotations so my code isn't tied to Hibernate specifically."
9. C'est quoi Maven ?
Un outil de gestion de build et de dépendances pour les projets Java.
| Fonctionnalité | Description |
|---|---|
| Dépendances | Télécharge automatiquement les librairies (depuis Maven Central) |
| Build | Compile, teste, empaquette l'application (.jar) |
| Lifecycle | mvn clean → mvn compile → mvn test → mvn package |
| pom.xml | Le fichier de configuration du projet |
<!-- pom.xml — le cœur de Maven -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Maven vs Gradle : Maven utilise XML (verbeux mais standard), Gradle utilise Groovy/Kotlin (plus concis mais courbe d'apprentissage).
10. C'est quoi Tomcat ?
Un serveur web / conteneur de servlets qui exécute les applications Java.
Spring Boot intègre Tomcat directement :
java -jar monapp.jar
↓
┌──────────────────────┐
│ Spring Boot │
│ ┌──────────────────┐ │
│ │ Tomcat intégré │ │ ← écoute sur le port 8080
│ │ (embedded) │ │
│ └──────────────────┘ │
│ ┌──────────────────┐ │
│ │ Votre code │ │
│ │ Controllers │ │
│ │ Services │ │
│ └──────────────────┘ │
└──────────────────────┘
Pas besoin d'installer Tomcat séparément — Spring Boot l'embarque dans le .jar.
11. C'est quoi JSON ?
JSON = JavaScript Object Notation — un format de données léger et lisible.
{
"id": 1,
"name": "Jean Dupont",
"email": "jean@mail.com",
"active": true,
"roles": ["USER", "ADMIN"],
"address": {
"city": "Montréal",
"postalCode": "H2X 1Y4"
}
}
En Spring Boot, Jackson convertit automatiquement les objets Java en JSON et vice versa :
// Java → JSON (sérialisation)
@GetMapping("/users/1")
public UserDTO getUser() {
return new UserDTO(1L, "Jean", "jean@mail.com");
// Jackson transforme automatiquement en JSON
}
// JSON → Java (désérialisation)
@PostMapping("/users")
public void create(@RequestBody UserDTO dto) {
// Jackson transforme le JSON du body en objet UserDTO
}
12. C'est quoi Postman et Swagger ?
| Outil | Rôle |
|---|---|
| Postman | Client HTTP pour tester manuellement les API REST (envoyer GET, POST, etc.) |
| Swagger / OpenAPI | Génère automatiquement une documentation interactive de l'API |
Swagger en Spring Boot :
<!-- Ajouter dans pom.xml -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>
Ensuite, accédez à http://localhost:8080/swagger-ui.html pour tester vos endpoints directement depuis le navigateur.
13. C'est quoi Docker ?
Docker crée des conteneurs : des environnements isolés qui contiennent votre application + toutes ses dépendances.
Sans Docker : Avec Docker :
"Ça marche sur ma machine" "Ça marche PARTOUT"
Mon PC : Conteneur :
├── Java 17 ├── Java 17
├── Maven 3.9 ├── Maven 3.9
├── PostgreSQL 15 ├── App.jar
└── Mon App └── (tout est inclus)
↕ Conflits possibles ↕ Isolé et portable
# Dockerfile pour Spring Boot
FROM eclipse-temurin:17-jre
COPY target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
14. C'est quoi CI/CD ?
| Terme | Signification | Quand |
|---|---|---|
| CI — Continuous Integration | Compiler + tester automatiquement à chaque git push | À chaque commit |
| CD — Continuous Delivery | Déployer automatiquement en production | Après les tests |
Outils : GitHub Actions, Jenkins, GitLab CI, CircleCI.
15. C'est quoi Git et GitHub ?
| Terme | Définition |
|---|---|
| Git | Outil de versionnement — suit l'historique des modifications du code |
| GitHub | Plateforme web qui héberge les dépôts Git + collaboration |
git add . # Préparer les changements
git commit -m "fix" # Enregistrer dans l'historique local
git push origin main # Envoyer sur GitHub
git pull # Récupérer les changements des autres
git branch feature-x # Créer une branche
git merge feature-x # Fusionner une branche
16. C'est quoi l'architecture en couches (Layered Architecture) ?
Règle d'or
Chaque couche ne communique qu'avec la couche directement en dessous.
✅ Controller → Service → Repository → Database
❌ Controller → Repository (jamais directement !)
❌ Controller → Database (jamais directement !)
"I follow a layered architecture: Controller handles HTTP, Service contains business logic, Repository handles data access. Each layer only talks to the layer directly below it. This separation makes the code testable and maintainable."
17. C'est quoi le Spring IoC Container (ApplicationContext) ?
Le conteneur qui crée, configure et assemble tous les beans Spring au démarrage :
Démarrage de l'application :
1. @SpringBootApplication → lance le scan
2. Trouve @Component, @Service, @Repository, @Controller
3. Crée les instances (beans)
4. Résout les dépendances (@Autowired)
5. Injecte les dépendances
6. Appelle @PostConstruct
7. ══════ Application prête ══════
18. C'est quoi @Autowired ? C'est quoi l'injection de dépendances ?
3 façons d'injecter en Spring :
// ✅ 1. Injection par CONSTRUCTEUR (recommandée)
@Service
public class OrderService {
private final UserRepository userRepo;
private final EmailService emailService;
public OrderService(UserRepository userRepo, EmailService emailService) {
this.userRepo = userRepo;
this.emailService = emailService;
}
}
// ⚠️ 2. Injection par SETTER
@Service
public class OrderService {
private UserRepository userRepo;
@Autowired
public void setUserRepo(UserRepository userRepo) {
this.userRepo = userRepo;
}
}
// ❌ 3. Injection par CHAMP (déconseillée)
@Service
public class OrderService {
@Autowired
private UserRepository userRepo;
}
Pourquoi le constructeur est le meilleur ?
| Critère | Constructeur | Setter | Champ |
|---|---|---|---|
Immuabilité (final) | ✅ | ❌ | ❌ |
| Testable sans Spring | ✅ | ⚠️ | ❌ |
| Dépendances obligatoires | ✅ | ❌ | ❌ |
| Détecte les dépendances circulaires | ✅ | ❌ | ❌ |
"I prefer constructor injection because it allows final fields (immutability), makes dependencies explicit, and works without Spring for testing. Since Spring 4.3, @Autowired is optional on a single constructor."
19. C'est quoi un Record Java ?
Un Record (Java 16+) est un type spécial pour les objets immuables qui contiennent uniquement des données :
// Avant (POJO classique — 30 lignes)
public class UserDTO {
private final Long id;
private final String name;
private final String email;
public UserDTO(Long id, String name, String email) {
this.id = id; this.name = name; this.email = email;
}
public Long getId() { return id; }
public String getName() { return name; }
public String getEmail() { return email; }
// + equals(), hashCode(), toString()...
}
// Après (Record — 1 ligne !)
public record UserDTO(Long id, String name, String email) {}
// Génère automatiquement : constructeur, getters, equals, hashCode, toString
Idéal pour : DTOs, requêtes, réponses, événements.
20. C'est quoi Lombok ?
Une librairie qui génère automatiquement le code répétitif (boilerplate) à la compilation :
// Sans Lombok — 50+ lignes
public class User {
private Long id;
private String name;
private String email;
// constructeur, getters, setters, equals, hashCode, toString...
}
// Avec Lombok — 5 lignes
@Data // getters, setters, equals, hashCode, toString
@NoArgsConstructor // constructeur sans argument
@AllArgsConstructor // constructeur avec tous les arguments
@Builder // pattern Builder
public class User {
private Long id;
private String name;
private String email;
}
| Annotation Lombok | Génère |
|---|---|
@Getter / @Setter | Getters et/ou setters |
@ToString | toString() |
@EqualsAndHashCode | equals() et hashCode() |
@Data | Tout ce qui est au-dessus |
@Builder | Pattern Builder |
@NoArgsConstructor | Constructeur vide |
@AllArgsConstructor | Constructeur complet |
@Slf4j | Logger log |
21. C'est quoi ResponseEntity ?
Un objet Spring qui représente la réponse HTTP complète (statut + headers + body) :
// Sans ResponseEntity — pas de contrôle sur le statut
@GetMapping("/{id}")
public UserDTO getUser(@PathVariable Long id) {
return userService.findById(id); // toujours 200 OK
}
// Avec ResponseEntity — contrôle total
@GetMapping("/{id}")
public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {
return userService.findById(id)
.map(ResponseEntity::ok) // 200 OK
.orElse(ResponseEntity.notFound().build()); // 404 Not Found
}
@PostMapping
public ResponseEntity<UserDTO> create(@Valid @RequestBody CreateUserRequest req) {
UserDTO created = userService.create(req);
return ResponseEntity
.status(HttpStatus.CREATED) // 201 Created
.header("Location", "/api/users/" + created.id())
.body(created);
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> delete(@PathVariable Long id) {
userService.delete(id);
return ResponseEntity.noContent().build(); // 204 No Content
}
22. C'est quoi @Valid et la validation Bean Validation ?
// DTO avec contraintes de validation
public record CreateUserRequest(
@NotBlank(message = "Le nom est obligatoire")
String name,
@Email(message = "Email invalide")
@NotBlank
String email,
@Size(min = 8, message = "Minimum 8 caractères")
String password,
@Min(value = 18, message = "Minimum 18 ans")
int age
) {}
// Controller — @Valid déclenche la validation
@PostMapping
public ResponseEntity<UserDTO> create(@Valid @RequestBody CreateUserRequest req) {
// Si la validation échoue → 400 Bad Request automatique
return ResponseEntity.status(HttpStatus.CREATED)
.body(userService.create(req));
}
| Annotation | Vérifie |
|---|---|
@NotNull | Pas null |
@NotBlank | Pas null, pas vide, pas juste des espaces |
@NotEmpty | Pas null, pas vide |
@Email | Format email valide |
@Size(min, max) | Taille entre min et max |
@Min / @Max | Valeur numérique min/max |
@Pattern(regexp) | Correspond à une expression régulière |
@Past / @Future | Date dans le passé/futur |
23. C'est quoi application.properties / application.yml ?
Le fichier de configuration de l'application Spring Boot :
# application.yml
server:
port: 8080
spring:
datasource:
url: jdbc:postgresql://localhost:5432/mydb
username: admin
password: secret
jpa:
hibernate:
ddl-auto: update
show-sql: true
app:
jwt:
secret: mySecretKey
expiration: 86400000
On accède aux valeurs avec @Value :
@Value("${app.jwt.secret}")
private String jwtSecret;
@Value("${server.port}")
private int port;
24. C'est quoi Spring Security ?
Le framework de sécurité de Spring pour l'authentification et l'autorisation :
| Concept | Question | Exemple |
|---|---|---|
| Authentification | "Qui es-tu ?" | Login + mot de passe, JWT |
| Autorisation | "As-tu le droit ?" | Rôle USER, ADMIN |
25. C'est quoi JWT (JSON Web Token) ?
Un token (jeton) envoyé dans chaque requête pour prouver l'identité de l'utilisateur :
JWT = HEADER.PAYLOAD.SIGNATURE
eyJhbGciOiJIUzI1NiJ9. ← Header (algorithme)
eyJzdWIiOiJhbGljZSJ9. ← Payload (données : user, rôle, expiration)
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ← Signature (vérification)
Le flux
1. POST /api/auth/login { "email": "alice@mail.com", "password": "123" }
2. Serveur vérifie → Génère un JWT → Le retourne au client
3. Client stocke le JWT
4. GET /api/users Header: Authorization: Bearer eyJhbG...
5. Serveur valide le JWT → Autorise la requête
26. C'est quoi CORS ?
CORS = Cross-Origin Resource Sharing
Quand votre frontend (localhost:3000) appelle votre backend (localhost:8080), le navigateur bloque la requête par sécurité. CORS autorise ces requêtes cross-origin.
@Configuration
public class CorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE");
}
};
}
}
27. C'est quoi Singleton dans Spring ?
Par défaut, chaque bean Spring est un Singleton — une seule instance partagée dans toute l'application :
@Service
public class UserService { ... } // UNE seule instance, partagée partout
// Partout dans l'app, c'est le MÊME objet UserService
@RestController
class UserController {
private final UserService userService; // même instance
}
@RestController
class AdminController {
private final UserService userService; // même instance !
}
28. C'est quoi la différence entre PUT et PATCH ?
| Méthode | Action | Exemple |
|---|---|---|
| PUT | Remplace tout l'objet | Envoyer tous les champs |
| PATCH | Modifie partiellement | Envoyer seulement les champs à modifier |
// PUT — remplace tout
@PutMapping("/{id}")
public UserDTO update(@PathVariable Long id, @RequestBody UserDTO dto) {
// Tous les champs sont écrasés
}
// PATCH — modifie partiellement
@PatchMapping("/{id}")
public UserDTO patch(@PathVariable Long id, @RequestBody Map<String, Object> updates) {
// Seuls les champs envoyés sont modifiés
}
29. C'est quoi une Exception Custom ?
// Exception personnalisée
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
}
// Utilisation
public User findById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("User not found: " + id));
}
// Gestion globale
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {
return ResponseEntity.status(404)
.body(new ErrorResponse(404, ex.getMessage()));
}
}
public record ErrorResponse(int status, String message) {}
30. C'est quoi Spring Actuator ?
Des endpoints de monitoring prêts à l'emploi :
# application.yml
management:
endpoints:
web:
exposure:
include: health, info, metrics
| Endpoint | Ce qu'il montre |
|---|---|
/actuator/health | L'app est UP ou DOWN |
/actuator/info | Informations sur l'app |
/actuator/metrics | Métriques (mémoire, CPU, requêtes) |
/actuator/env | Variables d'environnement |
Résumé — Les 30 concepts en 1 phrase
| Concept | En 1 phrase |
|---|---|
| DTO | Objet pour transporter des données sans exposer l'entité |
| MVC | Model (données), View (affichage), Controller (requêtes) |
| API REST | Interface web qui utilise GET/POST/PUT/DELETE sur des URLs |
| CRUD | Create, Read, Update, Delete |
| POJO | Objet Java simple sans dépendance framework |
| Bean | Objet créé et géré par Spring |
| IoC | Spring crée les dépendances au lieu du code |
| ORM/JPA | Mapper les objets Java aux tables SQL |
| Maven | Gestion des dépendances et du build |
| Tomcat | Serveur web intégré dans Spring Boot |
| JSON | Format de données léger (clé-valeur) |
| Postman | Client pour tester les API |
| Swagger | Documentation automatique de l'API |
| Docker | Conteneur isolé pour l'application |
| CI/CD | Build + test + déploiement automatique |
| Git | Versionnement du code source |
| Couches | Controller → Service → Repository → DB |
| @Autowired | Injection automatique de dépendances |
| Record | Classe immuable auto-générée (Java 16+) |
| Lombok | Génère getters/setters/equals automatiquement |
| ResponseEntity | Réponse HTTP complète (statut + body) |
| @Valid | Déclenche la validation des entrées |
| application.yml | Fichier de configuration Spring Boot |
| Spring Security | Authentification + autorisation |
| JWT | Token pour identifier l'utilisateur |
| CORS | Autoriser les requêtes cross-origin |
| Singleton | Une seule instance du bean dans toute l'app |
| PUT vs PATCH | PUT remplace tout, PATCH modifie partiellement |
| Exception Custom | Exception personnalisée avec code HTTP |
| Actuator | Monitoring et métriques de l'application |