
Dalam dunia pengembangan software, developer sering menemukan berbagai pendekatan untuk merancang aplikasi. Dua istilah yang cukup sering muncul adalah Domain-Driven Design (DDD) dan Model-View-Controller (MVC).
Keduanya sama-sama berhubungan dengan cara membangun aplikasi agar lebih terstruktur. Namun, DDD dan MVC sebenarnya memiliki tujuan yang berbeda.
MVC lebih dikenal sebagai pola arsitektur atau pola desain yang membantu memisahkan bagian aplikasi berdasarkan tanggung jawabnya. Sementara itu, DDD merupakan pendekatan yang berfokus pada pemahaman dan pemodelan domain bisnis yang menjadi inti dari aplikasi.
Karena namanya sering muncul bersamaan, tidak sedikit developer yang mengira DDD dan MVC merupakan dua pilihan yang harus dipilih salah satunya.
Padahal, keduanya bahkan bisa digunakan secara bersamaan.
Lalu, apa perbedaan DDD dan MVC? Mana yang lebih baik? Dan kapan sebaiknya menggunakan masing-masing pendekatan? Mari kita bahas dengan contoh sederhana.
Apa Itu DDD?
Domain-Driven Design (DDD) adalah pendekatan dalam pengembangan software yang menjadikan domain bisnis sebagai pusat perhatian dalam proses perancangan aplikasi.
DDD berusaha membuat software lebih dekat dengan permasalahan bisnis yang ingin diselesaikan.
Misalnya kita membuat aplikasi marketplace.
Di dalamnya terdapat proses seperti:
- pelanggan membuat pesanan,
- produk ditambahkan ke pesanan,
- pembayaran dilakukan,
- pesanan diproses,
- barang dikirim,
- pesanan selesai.
Dalam DDD, developer tidak hanya memikirkan bagaimana membuat database dan halaman web. Developer juga perlu memahami aturan bisnis di balik proses tersebut.
Konsep yang sering ditemukan dalam DDD antara lain:
- Entity,
- Value Object,
- Aggregate,
- Aggregate Root,
- Repository,
- Domain Service,
- Domain Event,
- Bounded Context,
- Ubiquitous Language.
Dengan konsep tersebut, struktur software diharapkan dapat mencerminkan bagaimana bisnis sebenarnya bekerja.
Apa Itu MVC?
MVC (Model-View-Controller) adalah pola yang membagi aplikasi menjadi tiga bagian utama:
Model
View
Controller
Masing-masing memiliki tanggung jawab berbeda.
Model
Model bertanggung jawab terhadap data dan logika yang berkaitan dengan data.
Contohnya:
User
Product
Order
View
View merupakan bagian yang berhubungan dengan tampilan yang dilihat pengguna.
Contohnya:
Halaman Login
Halaman Produk
Halaman Checkout
Controller
Controller menerima request dari pengguna dan mengatur proses antara View dengan Model.
Contohnya:
UserController
ProductController
OrderController
Secara sederhana, alurnya dapat digambarkan seperti:
User
↓
Controller
↓
Model
↓
Database
↓
Controller
↓
View
↓
User
MVC membuat aplikasi lebih terstruktur karena setiap bagian memiliki tanggung jawab yang berbeda.
Perbedaan Utama DDD dan MVC
Perbedaan paling mendasar terletak pada fokus dan tujuannya.
DDD berfokus pada:
Bagaimana memahami dan memodelkan masalah bisnis?
Sedangkan MVC berfokus pada:
Bagaimana memisahkan bagian aplikasi berdasarkan tanggung jawabnya?
Jadi, keduanya sebenarnya menjawab masalah yang berbeda.
| Aspek | DDD | MVC |
|---|---|---|
| Fokus utama | Domain bisnis | Struktur aplikasi |
| Tujuan | Memodelkan kompleksitas bisnis | Memisahkan tanggung jawab |
| Konsep utama | Entity, Aggregate, Value Object | Model, View, Controller |
| Cocok untuk | Bisnis kompleks | Banyak jenis aplikasi |
| Fokus komunikasi bisnis | Tinggi | Tidak menjadi fokus utama |
| Dapat digunakan bersama? | Ya | Ya |
DDD Lebih Fokus pada Bisnis
Salah satu karakteristik utama DDD adalah fokus terhadap domain.
Misalnya sebuah perusahaan memiliki sistem pembayaran.
Developer perlu memahami:
- bagaimana pembayaran dibuat,
- kapan pembayaran dianggap berhasil,
- kapan pembayaran gagal,
- apakah pembayaran dapat dibatalkan,
- bagaimana refund dilakukan,
- aturan apa yang berlaku pada transaksi.
Informasi tersebut kemudian diterjemahkan ke dalam model domain.
Contohnya:
Payment
├── PaymentStatus
├── PaymentMethod
├── Money
└── Refund
Jadi, desain software dibentuk berdasarkan pemahaman terhadap bisnis.
MVC Lebih Fokus pada Pemisahan Tanggung Jawab
MVC tidak secara khusus mengatakan bagaimana bisnis harus dimodelkan.
Fokus utamanya adalah memisahkan:
Model
View
Controller
Misalnya dalam aplikasi toko:
ProductController
Product
product.blade.php
Controller menangani request, Model menangani data, dan View menampilkan informasi.
MVC membantu membuat kode lebih terorganisir, tetapi tidak otomatis membuat model bisnis menjadi baik.
Inilah salah satu perbedaan penting antara MVC dan DDD.
Apakah DDD dan MVC Bisa Digunakan Bersamaan?
Bisa.
Bahkan dalam project tertentu, kombinasi keduanya dapat memberikan hasil yang baik.
Misalnya sebuah aplikasi menggunakan MVC sebagai struktur dasar aplikasinya, tetapi bagian bisnisnya dirancang menggunakan prinsip DDD.
Contohnya:
Controller
↓
Application Service
↓
Domain
↓
Repository
↓
Database
Dalam struktur tersebut:
- Controller menangani request,
- Application Service mengatur alur aplikasi,
- Domain berisi aturan bisnis,
- Repository menangani akses data.
MVC dapat membantu mengatur bagian antarmuka aplikasi, sedangkan DDD membantu memodelkan domain bisnis.
Contoh DDD dan MVC pada Aplikasi Toko Online
Misalnya kita membuat fitur checkout.
Pengguna menekan tombol:
“Checkout”
Dalam aplikasi berbasis MVC, request dapat masuk ke:
CheckoutController
Controller kemudian memanggil proses tertentu.
Jika aplikasi sederhana, proses tersebut mungkin langsung berhubungan dengan Model.
Namun pada aplikasi yang lebih kompleks, kita dapat menggunakan pendekatan DDD:
CheckoutController
↓
CheckoutService
↓
Order
↓
Payment
↓
Repository
Di sini Controller tidak perlu mengetahui semua aturan bisnis.
Misalnya aturan:
Pesanan tidak boleh diproses jika pembayaran belum berhasil.
Aturan tersebut sebaiknya berada di bagian domain yang memang bertanggung jawab terhadap proses tersebut.
Dengan begitu, Controller tidak menjadi tempat menumpuk semua logika bisnis.
Masalah Jika Semua Logika Ditaruh di Controller
Dalam project kecil, menaruh proses bisnis di Controller mungkin terasa praktis.
Misalnya:
public function checkout()
{
// cek stok
// hitung total
// cek pembayaran
// buat order
// update stok
// kirim notifikasi
}
Pada awalnya tidak terlihat bermasalah.
Namun ketika fitur semakin banyak, Controller dapat berubah menjadi sangat panjang.
Misalnya:
OrderController
├── createOrder()
├── cancelOrder()
├── confirmOrder()
├── payment()
├── refund()
├── shipment()
└── completeOrder()
Jika seluruh aturan bisnis dimasukkan ke sana, maintenance dapat menjadi lebih sulit.
Pendekatan DDD membantu memindahkan aturan bisnis ke model domain yang lebih tepat.
Contoh Pembagian Tanggung Jawab
Dengan pendekatan yang lebih terstruktur, kita dapat memiliki:
OrderController
↓
OrderApplicationService
↓
Order Aggregate
↓
OrderRepository
Masing-masing memiliki tanggung jawab berbeda.
Controller
Menangani request dan response.
Application Service
Mengatur alur penggunaan fitur.
Order Aggregate
Menangani aturan bisnis yang berkaitan dengan Order.
Repository
Mengambil atau menyimpan data.
Dengan pembagian seperti ini, kode menjadi lebih mudah dipahami.
DDD Tidak Menggantikan MVC
Ini adalah salah satu hal yang sering disalahpahami.
DDD bukan pengganti MVC secara langsung.
DDD tidak mengatakan:
“Gunakan DDD dan jangan gunakan MVC.”
Begitu juga MVC tidak mengatakan:
“Anda tidak boleh menggunakan DDD.”
Keduanya dapat berada pada level yang berbeda.
MVC membantu mengatur struktur interaksi aplikasi.
DDD membantu mengatur pemodelan domain dan aturan bisnis.
Karena itu, keduanya dapat digunakan bersama.
Perbandingan DDD dan MVC Secara Lebih Sederhana
Kalau ingin memahami perbedaannya dengan cepat, gunakan analogi berikut.
Bayangkan kamu sedang membangun sebuah restoran.
MVC membantu menentukan siapa yang bertanggung jawab terhadap bagian tertentu:
Pelayan → menerima pesanan
Dapur → menyiapkan makanan
Kasir → menangani pembayaran
Setiap bagian memiliki tanggung jawab masing-masing.
Sedangkan DDD lebih fokus memahami bagaimana bisnis restoran tersebut bekerja.
Misalnya:
- bagaimana pesanan dibuat,
- kapan pesanan dianggap valid,
- bagaimana makanan diproses,
- bagaimana pembayaran dilakukan,
- bagaimana pesanan dibatalkan.
Jadi, MVC membantu mengatur struktur, sedangkan DDD membantu memahami domain dan aturan bisnis.
Kelebihan DDD
DDD memiliki beberapa kelebihan, terutama untuk aplikasi dengan bisnis yang kompleks.
1. Fokus pada Bisnis
Developer lebih memahami masalah yang sebenarnya ingin diselesaikan.
2. Aturan Bisnis Lebih Terorganisir
Business rule dapat ditempatkan pada domain yang tepat.
3. Cocok untuk Aplikasi Kompleks
DDD sangat berguna ketika aplikasi memiliki banyak aturan dan proses bisnis.
4. Komunikasi Tim Lebih Baik
Konsep seperti Ubiquitous Language membantu developer dan pihak bisnis menggunakan istilah yang sama.
5. Lebih Mudah Dikembangkan dalam Jangka Panjang
Model domain yang baik dapat membantu aplikasi menghadapi perubahan kebutuhan bisnis.
Kekurangan DDD
DDD juga memiliki beberapa tantangan.
1. Lebih Sulit Dipelajari
DDD memiliki banyak konsep yang perlu dipahami.
2. Membutuhkan Pemahaman Bisnis
Developer harus benar-benar memahami domain aplikasi.
3. Bisa Terlalu Kompleks untuk Project Kecil
Tidak semua aplikasi membutuhkan seluruh konsep DDD.
Untuk website sederhana atau CRUD sederhana, menerapkan DDD secara penuh justru dapat membuat project menjadi lebih rumit.
Kelebihan MVC
MVC juga memiliki banyak kelebihan.
1. Struktur Mudah Dipahami
Pembagian Model, View, dan Controller cukup mudah dipahami oleh developer.
2. Cocok untuk Banyak Jenis Aplikasi
MVC dapat digunakan pada berbagai aplikasi web.
3. Maintenance Lebih Terarah
Pemisahan tanggung jawab membuat developer lebih mudah menemukan bagian yang perlu diubah.
4. Banyak Framework Mendukung MVC
Berbagai framework populer menggunakan atau mendukung konsep MVC.
Contohnya adalah Laravel, Ruby on Rails, ASP.NET MVC, dan beberapa framework lainnya.
Kekurangan MVC
MVC juga memiliki keterbatasan.
1. Tidak Otomatis Mengatasi Kompleksitas Bisnis
Menggunakan MVC saja tidak menjamin aturan bisnis akan terorganisir dengan baik.
2. Controller Bisa Menjadi Terlalu Besar
Jika developer memasukkan terlalu banyak business logic ke Controller, kode dapat menjadi sulit dirawat.
3. Model Bisa Menjadi Terlalu Gemuk
Jika semua logika ditempatkan di Model, Model dapat memiliki terlalu banyak tanggung jawab.
Karena itu, untuk aplikasi kompleks, developer mungkin membutuhkan pendekatan tambahan.
DDD vs MVC: Mana yang Lebih Baik?
Pertanyaan ini sebenarnya kurang tepat.
Bukan soal mana yang lebih baik, tetapi:
Mana yang sesuai dengan kebutuhan project?
Jika aplikasi sederhana seperti:
- website profil,
- blog sederhana,
- sistem CRUD sederhana,
MVC mungkin sudah lebih dari cukup.
Namun jika aplikasi memiliki:
- aturan bisnis kompleks,
- banyak proses,
- banyak modul,
- banyak developer,
- kebutuhan pengembangan jangka panjang,
DDD dapat memberikan manfaat yang lebih besar.
Dan dalam banyak kasus, MVC dan DDD dapat digunakan secara bersamaan.
Kapan Sebaiknya Menggunakan MVC?
MVC cocok digunakan ketika:
- aplikasi memiliki struktur request dan response yang jelas,
- project membutuhkan pemisahan View, Model, dan Controller,
- aplikasi relatif sederhana hingga menengah,
- tim membutuhkan pola yang mudah dipahami,
- framework yang digunakan berbasis MVC.
Contohnya:
Website Sekolah
Sistem Informasi
Blog
Aplikasi CRUD
Website Perusahaan
Kapan Sebaiknya Menggunakan DDD?
DDD lebih cocok dipertimbangkan ketika:
- domain bisnis cukup kompleks,
- terdapat banyak business rule,
- aplikasi terus berkembang,
- project dikerjakan oleh banyak developer,
- kebutuhan bisnis sering berubah,
- aplikasi akan dipelihara dalam jangka panjang.
Contohnya:
Marketplace
Banking System
ERP
Sistem Rumah Sakit
Sistem Logistik
Sistem Pembayaran
Kapan DDD dan MVC Digunakan Bersama?
Jika aplikasi menggunakan framework berbasis MVC tetapi memiliki domain yang kompleks, keduanya dapat digunakan bersama.
Contohnya:
Presentation Layer
↓
Controller
↓
Application Layer
↓
Domain Layer
↓
Infrastructure Layer
↓
Database
Dalam struktur tersebut, MVC dapat digunakan pada bagian presentation, sedangkan DDD digunakan untuk membangun domain dan aturan bisnis.
Hasilnya, aplikasi tetap memiliki struktur request/response yang jelas sekaligus memiliki model bisnis yang lebih terorganisir.
Contoh Struktur Project
Sebagai gambaran sederhana, project dengan pendekatan DDD dan MVC dapat memiliki struktur seperti:
app/
├── Domain/
│ └── Order/
│ ├── Entities/
│ ├── ValueObjects/
│ ├── Repositories/
│ └── Services/
│
├── Application/
│ └── Order/
│ └── OrderService.php
│
├── Infrastructure/
│ └── Persistence/
│
└── Http/
└── Controllers/
└── OrderController.php
Struktur tersebut hanyalah contoh.
Tidak ada satu struktur folder DDD yang wajib digunakan oleh semua project. Yang paling penting adalah tanggung jawab setiap bagian tetap jelas dan sesuai dengan kebutuhan domain.
Kesalahan yang Perlu Dihindari
Saat membandingkan atau menggabungkan DDD dan MVC, ada beberapa kesalahan yang sebaiknya dihindari.
1. Menganggap DDD dan MVC sebagai Kompetitor
Keduanya memiliki fokus yang berbeda dan dapat digunakan bersama.
2. Menggunakan DDD pada Semua Project
Project sederhana tidak selalu membutuhkan DDD.
3. Menaruh Semua Logika di Controller
Controller sebaiknya tidak menjadi tempat seluruh business logic.
4. Membuat Struktur DDD yang Terlalu Rumit
Jangan membuat puluhan class hanya karena ingin terlihat menggunakan DDD.
5. Fokus pada Folder, Bukan Domain
DDD bukan sekadar tentang membuat folder Domain, Application, dan Infrastructure.
Hal terpenting adalah bagaimana aplikasi memodelkan dan menjaga aturan bisnis.
Kesimpulan
DDD dan MVC bukan dua pendekatan yang harus dipilih salah satunya. Keduanya memiliki tujuan yang berbeda.
MVC berfokus pada pemisahan tanggung jawab aplikasi menjadi Model, View, dan Controller. Pendekatan ini membantu membuat struktur aplikasi lebih terorganisir.
Sementara itu, Domain-Driven Design (DDD) berfokus pada pemahaman dan pemodelan domain bisnis. DDD membantu developer menangani aplikasi yang memiliki aturan dan proses bisnis yang kompleks.
Perbedaan sederhananya:
MVC → Bagaimana aplikasi dibagi berdasarkan tanggung jawab?
DDD → Bagaimana bisnis dimodelkan di dalam software?
Jika project masih sederhana, MVC mungkin sudah cukup. Namun, jika project memiliki kompleksitas bisnis yang tinggi, DDD dapat membantu mengelola aturan dan model bisnis dengan lebih baik.
Bahkan, keduanya dapat digunakan bersama. MVC dapat mengatur bagian aplikasi yang berhubungan dengan request dan tampilan, sementara DDD membantu mengatur domain dan business logic.
Jadi, jangan melihat DDD vs MVC sebagai pertarungan untuk menentukan pemenang. Lebih tepat jika keduanya dipahami sebagai dua pendekatan yang dapat saling melengkapi sesuai kebutuhan project.