Recraftory

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

  1. Client kirim request ke controller
  2. Controller memvalidasi dan memanggil service
  3. Service menjalankan logic bisnis dan memanggil repository
  4. Repository mengambil data dari database
  5. Data dikembalikan ke service, diolah, ke controller
  6. 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.js

Praktik 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