Layered Architecture
Memahami pemisahan lapisan dalam aplikasi backend
Apa itu Layered Architecture
- Membagi aplikasi menjadi lapisan-lapisan dengan tanggung jawab berbeda
- Setiap lapisan hanya berkomunikasi dengan lapisan di atas atau bawahnya
- Memudahkan maintenance, testing, dan pengembangan tim
Lapisan Umum
Presentation Layer (Controller/Router)
- Menerima request dari client
- Memvalidasi input dasar
- Mengirim response ke client
- Tidak mengandung logic bisnis
Business Logic Layer (Service/Use Case)
- Menjalankan aturan bisnis aplikasi
- Mengolah data dari controller
- Tidak tahu detail database atau HTTP
- Tempat logic utama aplikasi
Data Access Layer (Repository/DAO)
- Berkomunikasi dengan database
- Menjalankan query dan mengembalikan data
- Mengisolasi detail database dari business logic
- Bisa diganti tanpa mengubah business logic
Alur Data
- Client kirim request ke controller
- Controller memvalidasi dan memanggil service
- Service menjalankan logic bisnis dan memanggil repository
- Repository mengambil data dari database
- Data dikembalikan ke service, diolah, ke controller
- Controller format response dan kirim ke client
Keuntungan Layered Architecture
- Pemisahan concern yang jelas
- Testing lebih mudah karena setiap lapisan bisa di-test terpisah
- Modifikasi di satu lapisan tidak merusak lapisan lain
- Tim bisa bekerja paralel di lapisan berbeda
Dependency Rule
- Lapisan atas boleh bergantung pada lapisan bawah
- Lapisan bawah tidak boleh bergantung pada lapisan atas
- Controller -> Service -> Repository -> Database
- Jangan buat dependency melingkar atau melompat
Anti-Pattern: God Object
- Class atau fungsi yang menangani semuanya
- Menggabungkan controller, service, dan repository jadi satu
- Sulit di-test, sulit diubah, sulit dipahami
Contoh Struktur Folder
src/
controllers/
userController.js
services/
userService.js
repositories/
userRepository.js
models/
userModel.jsPraktik Terbaik
- Lapisan service harus pure, tidak tahu HTTP atau database detail
- Lapisan controller hanya validasi input dan format output
- Lapisan repository hanya query dan mapping data
- Gunakan dependency injection untuk menghubungkan lapisan
- Jangan lewatkan lapisan, controller tidak langsung ke repository