Dari MVC ke Clean Architecture: Mengelola Kompleksitas Sistem Skala Enterprise
Dulu saya pikir MVC (Model-View-Controller) adalah jawaban untuk semuanya. Strukturnya simpel, cepat dikembangkan, dan mudah dipahami. Buat saya waktu itu, itu sudah cukup. Bahkan saya sempat menganggap Clean Architecture terlalu ribet dan tidak praktis.
Sampai akhirnya saya masuk ke proyek klien skala korporasi besar. Di situ saya berperan sebagai fullstack developer (lebih fokus ke backend), dan untuk pertama kalinya saya benar-benar merasakan kompleksitas sistem yang nyata.
Tantangan Kompleksitas Enterprise
Dalam proyek besar tersebut, saya menghadapi beberapa tantangan utama:
- Multiple Domain: Banyak sub-sistem yang saling terhubung dengan batasan bisnisnya masing-masing.
- Business Rules yang Tebal: Logika bisnis yang kompleks dan memerlukan aturan validasi yang sangat ketat.
- Integration Antar Service: Komunikasi dan sinkronisasi data antar modul internal maupun layanan eksternal.
- Kebutuhan Scalability Jangka Panjang: Kode harus mudah dirawat (maintainable) dan dikembangkan oleh tim tanpa memicu regresi.
Di titik itu saya sadar bahwa MVC tidak dirancang untuk menangani kompleksitas sebesar ini. Masalahnya bukan di MVC itu sendiri—melainkan di cara saya melihat skala.
Memahami Pentingnya Separation of Concerns
Saya mulai memahami kenapa separation of concerns itu sangat krusial:
- Arah Dependensi: Dependency harus dijaga arahnya agar layer inti (domain) tidak bergantung pada detail teknis di luar.
- Independensi Framework: Domain logic tidak boleh bercampur dengan framework web atau ORM.
- Batasan Antar Layer: Boundary antar layer harus jelas agar pengujian (unit testing) dan perubahan komponen teknis dapat dilakukan tanpa merusak aturan bisnis.
Penerapan Multi-Module Maven
Untuk menerapkan prinsip-prinsip ini secara disiplin pada backend Java/Spring Boot, kami menggunakan struktur Multi-Module Maven untuk memisahkan layer:
- Domain Layer: Mengandung entities, value objects, dan domain services tanpa ketergantungan framework.
- Application Layer: Mengelola use cases, DTOs, dan orchestration logic.
- Infrastructure Layer: Menangani implementasi riil seperti database (JPA/Hibernate), integrasi API eksternal, dan perpesanan.
- Interface/Web Layer: Menangani controllers, request/response mapping, dan protokol HTTP/REST.
Pergeseran Mindset
Pengalaman ini mengubah mindset saya secara mendasar:
Architecture bukan soal pattern mana yang paling "clean". Architecture adalah tentang mengelola kompleksitas dan menjaga sistem tetap sehat dalam jangka panjang.
Sekarang saya tidak lagi melihat arsitektur sebagai sesuatu yang ribet. Saya melihatnya sebagai alat berpikir. Semakin besar sistem yang kita bangun, semakin penting kita berpikir dalam konteks scale, maintainability, dan evolusi jangka panjang.
Growth sebagai seorang engineer ternyata bukan soal bisa menggunakan banyak framework, melainkan soal memahami kapan sesuatu sudah cukup dan kapan sesuatu harus didesain dengan lebih serius.