Architecture MVC
Séparation des responsabilités en Modèle, Vue et Contrôleur, et application concrète du pattern MVC dans une API Express avec une arborescence routes/controllers/models/services.
Le pattern MVC (Model – View – Controller) est une façon de découper une application pour que chaque partie ait un rôle unique et prévisible. On l'utilise autant pour les interfaces graphiques que pour les API, avec une « vue » qui renvoie du JSON plutôt que du HTML.
🧩 Les trois responsabilités
- Modèle : données + règles métier. Il sait comment lire, valider et manipuler les informations.
- Vue : représentation envoyée au client. Dans une API, c'est le JSON de la réponse.
- Contrôleur : point d'entrée HTTP. Il reçoit la requête, délègue au modèle, et forme la réponse.
En API, la « Vue » est souvent minimale : le contrôleur renvoie directement un objet sérialisé en JSON. Le découpage Modèle / Contrôleur reste le plus important.
🔄 Le cycle d'une requête
- Le routeur reçoit
GET /articles/42. - Il appelle le contrôleur
getArticle(req, res). - Le contrôleur demande au modèle
Article.findById(42). - Le modèle interroge la base et renvoie un objet.
- Le contrôleur renvoie l'objet en JSON (la vue).
// controllers/articleController.js
import { Article } from "../models/article.js"
export async function getArticle(req, res) {
const article = await Article.findById(req.params.id)
if (!article) return res.status(404).json({ error: "Introuvable" })
res.json(article)
}🗂️ Arborescence recommandée
Une structure en dossiers évite les fichiers « Dieu » qui mélangent tout.
src/
├── routes/
│ └── articles.js # déclare les endpoints
├── controllers/
│ └── articleController.js # logique HTTP (req/res)
├── services/
│ └── articleService.js # logique métier réutilisable
├── models/
│ └── article.js # accès aux données
└── index.js # configuration ExpressLes routes ne font que brancher les URLs aux contrôleurs. La logique va dans les contrôleurs, l'accès aux données dans les modèles.
🔌 Brancher le tout avec Express
Le routeur fait le lien entre l'URL et le contrôleur, sans contenir de logique.
// routes/articles.js
import { Router } from "express"
import { getArticle, listArticles } from "../controllers/articleController.js"
const router = Router()
router.get("/", listArticles)
router.get("/:id", getArticle)
export default router// index.js
import express from "express"
import articlesRouter from "./routes/articles.js"
const app = express()
app.use(express.json())
app.use("/articles", articlesRouter)
app.listen(3000)🧠 Modèle vs Contrôleur vs Service
- Le contrôleur parle HTTP : il lit
req.params, écritres.status(...). - Le service porte la logique métier (calculs, règles) et est réutilisable ailleurs.
- Le modèle porte l'accès aux données (requêtes, ORM).
Dès qu'un contrôleur commence à contenir des requêtes SQL ou des règles métier complexes, extrayez-les dans un service ou un modèle. Gardez les contrôleurs fins.
➡️ Suite
La page La couche modèle détaille comment bien écrire le modèle et ses validations.
Quiz du chapitre
MVC & ORM
Terminez le quiz du chapitre pour le marquer comme complété.
MVC & ORM
Architecture MVC et accès aux données : séparer les responsabilités, concevoir une couche modèle propre et utiliser un ORM (Prisma) dans une API Express.
La couche modèle
Rôle du modèle dans une architecture MVC, validation des données, distinction entre services et contrôleurs, et pourquoi ne pas écrire de SQL dans un contrôleur.