Pernahkah kamu membuka file app.js yang kamu tulis sendiri, tapi malah pusing bacanya? Route, logika bisnis, query database — semua tumplek jadi satu file. Kalau iya, kamu bukan sendirian. Inilah saatnya kamu kenalan dengan MVC Node.js: pola arsitektur yang akan mengubah kode semrawutmu menjadi sesuatu yang rapi, profesional, dan bisa dikembangkan tanpa drama.
Dalam artikel ke-13 dari Seri Belajar Node.js ini, kita akan bedah habis konsep arsitektur Express.js berbasis MVC, lengkap dengan contoh nyata yang bisa langsung kamu praktikkan. Siap naik level?
🏛️ Apa Itu MVC? Analogi Restoran yang Wajib Kamu Tahu
Bayangkan sebuah restoran mewah. Ada tiga peran utama yang bekerja dengan tugasnya masing-masing:
Pola MVC pertama kali diperkenalkan oleh Trygve Reenskaug pada tahun 1978 untuk bahasa Smalltalk. Sekarang, hampir semua framework modern — Laravel, Django, Rails, hingga Express.js — mengadopsinya karena terbukti bekerja dengan baik selama 40+ tahun!
⚡ Kenapa Arsitektur Express.js Tanpa MVC Itu Berbahaya?
Sebelum belajar MVC, kamu perlu merasakan "sakitnya" kode tanpa pola yang jelas. Ini adalah contoh kode Node.js + Express.js yang anti-MVC — semua dijejalkan ke satu file:
const express = require('express');
const db = require('./db');
const app = express();
// Route, logika, dan query semua campur aduk 😰
app.get('/users', async (req, res) => {
const users = await db.query('SELECT * FROM users');
if (users.length === 0) {
return res.send('Tidak ada user');
}
res.json(users);
});
app.listen(3000);
Bayangkan kode ini dengan 50+ route. Mimpi buruk, bukan? Inilah alasan mengapa pola MVC JavaScript wajib kamu kuasai.
🛠️ Implementasi MVC Node.js: Step-by-Step dari Nol
Oke, cukup teorinya! Sekarang kita restrukturisasi project Node.js + Express.js ke pola MVC. Kita akan bangun API sederhana untuk manajemen artikel.
Pastikan kamu sudah install Node.js dan npm di komputermu. Jalankan node --version untuk cek. Minimal versi 18+ ya!
Buat Struktur Folder MVC
Ini adalah tulang punggung pola MVC JavaScript. Setiap folder punya tanggung jawabnya sendiri.
project-mvc/
├── controllers/ # 🤵 Logika request/response
│ └── artikelController.js
├── models/ # 🧑🍳 Logika data & database
│ └── Artikel.js
├── routes/ # 🗺️ Peta URL endpoints
│ └── artikelRoutes.js
├── views/ # 🪟 Template tampilan (jika ada)
├── app.js # Entry point utama
└── package.json
Buat Model — Layer Data
Model adalah "otak" yang menangani semua urusan data. Untuk contoh ini, kita gunakan data statis (tanpa database sungguhan) agar fokus ke konsep MVC-nya.
// Model hanya peduli dengan DATA, bukan HTTP
let artikel = [
{ id: 1, judul: 'Belajar Node.js', penulis: 'Saifi' },
{ id: 2, judul: 'Mengenal MVC', penulis: 'Ahmad' },
];
const ArtikelModel = {
getAll: () => artikel,
getById: (id) => artikel.find(a => a.id === +id),
create: (data) => {
const baru = { id: artikel.length + 1, ...data };
artikel.push(baru);
return baru;
},
};
module.exports = ArtikelModel;
Buat Controller — Layer Logika
Controller adalah "manajer" yang menerima request dari user, minta data ke Model, lalu kirim response yang tepat. Ini inti dari arsitektur Express.js berbasis MVC.
const ArtikelModel = require('../models/Artikel');
// Controller tidak menyentuh database secara langsung!
const artikelController = {
getAll: (req, res) => {
const data = ArtikelModel.getAll();
res.json({ success: true, data });
},
getById: (req, res) => {
const artikel = ArtikelModel.getById(req.params.id);
if (!artikel) return res.status(404).json({ message: 'Tidak ditemukan' });
res.json({ success: true, data: artikel });
},
create: (req, res) => {
const baru = ArtikelModel.create(req.body);
res.status(201).json({ success: true, data: baru });
},
};
module.exports = artikelController;
Buat Routes — Peta URL
Routes adalah "resepsionis" yang menentukan Controller mana yang dipanggil berdasarkan URL dan HTTP method yang diminta user.
const express = require('express');
const router = express.Router();
const ctrl = require('../controllers/artikelController');
// Routes hanya mendelegasikan ke controller ✅
router.get('/', ctrl.getAll);
router.get('/:id', ctrl.getById);
router.post('/', ctrl.create);
module.exports = router;
Rakit Semua di app.js
File app.js sekarang jadi sangat bersih — hanya sebagai entry point yang merakit semua komponen.
const express = require('express');
const artikelRoutes = require('./routes/artikelRoutes');
const app = express();
app.use(express.json());
app.use('/api/artikel', artikelRoutes);
app.listen(3000, () => {
console.log('🚀 Server jalan di http://localhost:3000');
});
Inilah keindahan MVC — setiap file hanya punya satu alasan untuk berubah. Kalau ada perubahan di database? Cukup ubah Model. Mau ganti tampilan? Ubah View saja. Controller tidak perlu tahu detail implementasi Model. Inilah yang disebut Separation of Concerns.
🚀 Best Practices MVC Node.js yang Sering Dilupakan Pemula
Kamu sudah bisa bikin struktur MVC. Sekarang mari pastikan kamu tidak jatuh ke jebakan umum yang bikin kode MVC-mu jadi "MVC KW".
Jangan taruh semua logika bisnis di Controller. Jika Controller kamu punya 100+ baris kode, itu tanda kamu melakukan "fat controller". Pindahkan logika bisnis ke Model atau buat layer Service terpisah.
joi atau express-validator.userController.js, User.js (Model kapital), userRoutes.js.Salah satu keuntungan terbesar pola MVC adalah kode jadi mudah di-test! Di artikel selanjutnya, kita akan belajar cara menulis unit test untuk Controller dan Model menggunakan Jest dan Supertest. Stay tuned!
Artikel ini adalah bagian dari seri lengkap belajar Node.js dari nol hingga mahir. Lihat semua artikel dan daftar isi lengkap di tautan berikut:
No comments:
Post a Comment