Aller au contenu principal

Chapitre 8: "C'est quoi...?" — Les 40 concepts les plus demandés en entrevue

Objectif

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 ?​

EntityDTO
Mappée à la base de donnéesJuste 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'APIAPI 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());
}
}
Phrase d'entrevue

"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 :

ComposantRôleEn Spring Boot
ModelLes données et la logique métierEntity, Service, Repository
ViewL'affichage (ce que l'utilisateur voit)JSON (API REST) ou Thymeleaf (HTML)
ControllerLe 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)
}
}
Phrase d'entrevue

"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ègleSignification
Client-ServeurLe client et le serveur sont séparés
Sans état (Stateless)Chaque requête contient toute l'information nécessaire
CacheLes réponses peuvent être mises en cache
Interface uniformeURLs cohérentes, méthodes HTTP standard
Système en couchesLe 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éthodeActionExempleCode retour
GETLireGET /api/users/1200 OK
POSTCréerPOST /api/users201 Created
PUTRemplacer entièrementPUT /api/users/1200 OK
PATCHModifier partiellementPATCH /api/users/1200 OK
DELETESupprimerDELETE /api/users/1204 No Content
Phrase d'entrevue

"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 :

LettreOpérationSQLHTTPSpring Data
CCreateINSERTPOSTsave()
RReadSELECTGETfindById(), findAll()
UUpdateUPDATEPUT/PATCHsave()
DDeleteDELETEDELETEdeleteById()

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éthodeExemple
Annotations stéréotype@Component, @Service, @Repository, @Controller
@Bean dans @ConfigurationMéthode qui retourne un objet
@ImportImporter une classe de configuration
Phrase d'entrevue

"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 ?​

TermeDéfinitionAnalogie
ORMObject-Relational Mapping — technique qui mappe les objets Java aux tables SQLLe traducteur entre Java et SQL
JPAJakarta Persistence API — la spécification (interface) de l'ORM en JavaLe contrat / le standard
HibernateL'implémentation la plus populaire de JPALe 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...
Phrase d'entrevue

"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épendancesTélécharge automatiquement les librairies (depuis Maven Central)
BuildCompile, teste, empaquette l'application (.jar)
Lifecyclemvn clean → mvn compile → mvn test → mvn package
pom.xmlLe 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 ?​

OutilRôle
PostmanClient HTTP pour tester manuellement les API REST (envoyer GET, POST, etc.)
Swagger / OpenAPIGé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 ?​

TermeSignificationQuand
CI — Continuous IntegrationCompiler + tester automatiquement à chaque git pushÀ chaque commit
CD — Continuous DeliveryDéployer automatiquement en productionAprès les tests

Outils : GitHub Actions, Jenkins, GitLab CI, CircleCI.


15. C'est quoi Git et GitHub ?​

TermeDéfinition
GitOutil de versionnement — suit l'historique des modifications du code
GitHubPlateforme 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 !)
Phrase d'entrevue

"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èreConstructeurSetterChamp
Immuabilité (final)✅❌❌
Testable sans Spring✅⚠️❌
Dépendances obligatoires✅❌❌
Détecte les dépendances circulaires✅❌❌
Phrase d'entrevue

"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 LombokGénère
@Getter / @SetterGetters et/ou setters
@ToStringtoString()
@EqualsAndHashCodeequals() et hashCode()
@DataTout ce qui est au-dessus
@BuilderPattern Builder
@NoArgsConstructorConstructeur vide
@AllArgsConstructorConstructeur complet
@Slf4jLogger 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));
}
AnnotationVérifie
@NotNullPas null
@NotBlankPas null, pas vide, pas juste des espaces
@NotEmptyPas null, pas vide
@EmailFormat email valide
@Size(min, max)Taille entre min et max
@Min / @MaxValeur numérique min/max
@Pattern(regexp)Correspond à une expression régulière
@Past / @FutureDate 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 :

ConceptQuestionExemple
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éthodeActionExemple
PUTRemplace tout l'objetEnvoyer tous les champs
PATCHModifie partiellementEnvoyer 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
EndpointCe qu'il montre
/actuator/healthL'app est UP ou DOWN
/actuator/infoInformations sur l'app
/actuator/metricsMétriques (mémoire, CPU, requêtes)
/actuator/envVariables d'environnement

Résumé — Les 30 concepts en 1 phrase​

ConceptEn 1 phrase
DTOObjet pour transporter des données sans exposer l'entité
MVCModel (données), View (affichage), Controller (requêtes)
API RESTInterface web qui utilise GET/POST/PUT/DELETE sur des URLs
CRUDCreate, Read, Update, Delete
POJOObjet Java simple sans dépendance framework
BeanObjet créé et géré par Spring
IoCSpring crée les dépendances au lieu du code
ORM/JPAMapper les objets Java aux tables SQL
MavenGestion des dépendances et du build
TomcatServeur web intégré dans Spring Boot
JSONFormat de données léger (clé-valeur)
PostmanClient pour tester les API
SwaggerDocumentation automatique de l'API
DockerConteneur isolé pour l'application
CI/CDBuild + test + déploiement automatique
GitVersionnement du code source
CouchesController → Service → Repository → DB
@AutowiredInjection automatique de dépendances
RecordClasse immuable auto-générée (Java 16+)
LombokGénère getters/setters/equals automatiquement
ResponseEntityRéponse HTTP complète (statut + body)
@ValidDéclenche la validation des entrées
application.ymlFichier de configuration Spring Boot
Spring SecurityAuthentification + autorisation
JWTToken pour identifier l'utilisateur
CORSAutoriser les requêtes cross-origin
SingletonUne seule instance du bean dans toute l'app
PUT vs PATCHPUT remplace tout, PATCH modifie partiellement
Exception CustomException personnalisée avec code HTTP
ActuatorMonitoring et métriques de l'application

⬅️ Chapitre 7: Collections Java | ⬅️ Retour au Module 18