Clean Architecture VS Hexagonal Architecture

Secara singkat, keduanya memiliki tujuan yang sama: memisahkan logika bisnis inti (domain) Anda dari detail teknis (seperti database, framework, atau UI). Keduanya ingin membuat aplikasi yang decoupled (terisolasi) dan mudah diuji.

Perbedaan utamanya terletak pada metafora yang digunakan dan tingkat kerincian (granularity) dalam mendefinisikan lapisan-lapisannya. Clean Architecture bisa dianggap sebagai evolusi yang lebih rinci dari ide yang diperkenalkan oleh Hexagonal Architecture.


Hexagonal Architecture (Ports & Adapters)

Arsitektur ini diperkenalkan oleh Alistair Cockburn. Metafora utamanya adalah sebuah "segi enam" (hexagon) yang mewakili inti aplikasi Anda.

Prinsip Utama

  • Pemisahan "Inside" vs. "Outside": Ada pemisahan yang jelas antara inti aplikasi (logika bisnis murni) dan dunia luar (database, UI, API pihak ketiga, dll.).

  • Komunikasi via Ports: Inti aplikasi tidak boleh bergantung pada dunia luar. Sebaliknya, inti aplikasi mendefinisikan "Ports" (pelabuhan).

  • Ports adalah Antarmuka (Interfaces): Port adalah sebuah antarmuka (interface) yang mendefinisikan bagaimana inti aplikasi ingin berkomunikasi, tanpa peduli dengan teknologi spesifiknya.

  • Adapters adalah Implementasi: "Adapters" (adaptor) adalah kode "lem" yang menghubungkan teknologi eksternal ke port tersebut. Merekalah yang mengimplementasikan interface dari Port.

Istilah

Istilah

Deskripsi

Contoh

Inti Aplikasi (Hexagon)

Tempat semua logika bisnis dan aturan domain berada. Tidak tahu apa-apa tentang dunia luar.

Fungsi HitungTotalBelanja atau ValidasiPendaftaranPengguna.

Ports (Pelabuhan)

Kontrak atau interface yang didefinisikan oleh inti aplikasi.

Interface UserRepository dengan fungsi Save(User) atau FindByID(id).

Adapters (Adaptor)

Implementasi konkret dari Ports. Ini adalah kode yang "menerjemahkan" dari dunia luar ke inti.

Implementasi PostgreSQLUserRepository yang menjalankan query SQL untuk Save(User).

Adapters dan Ports selanjutnya dibagi menjadi dua jenis:

  • Primary / Driving (Penggerak): Pihak yang memulai komunikasi ke aplikasi.

    • Driving Port: Interface yang diekspos oleh inti (misalnya, UserService dengan method Register).

    • Driving Adapter: Pihak yang memanggil port tersebut (misalnya, REST Controller, gRPC handler, atau CLI command).

  • Secondary / Driven (Yang Digerakkan): Pihak yang dibutuhkan oleh aplikasi untuk bekerja.

    • Driven Port: Interface yang dibutuhkan oleh inti (misalnya, UserRepository).

    • Driven Adapter: Implementasi dari port tersebut (misalnya, Database Repository, Email Service Client).


Clean Architecture

Arsitektur ini diperkenalkan oleh Robert C. Martin ("Uncle Bob"). Metafora utamanya adalah serangkaian lingkaran konsentris (seperti target atau bawang).

Prinsip Utama

  • The Dependency Rule (Aturan Ketergantungan): Ini adalah aturan emasnya. Ketergantungan hanya boleh mengarah ke dalam.

  • Lingkaran luar (Frameworks) boleh bergantung pada lingkaran dalam (Use Cases), tapi lingkaran dalam (Entities) tidak boleh tahu apa-apa tentang lingkaran luar.

  • Data yang melintasi batas-batas lingkaran ini harus dalam bentuk struktur data sederhana (DTOs), bukan objek database atau objek framework.

Istilah (Lapisan dari Terdalam ke Terluar)

Lapisan

Deskripsi

Contoh

Entities

(Lingkaran terdalam) Aturan bisnis inti yang berlaku di seluruh perusahaan. Objek bisnis murni.

struct User dengan validasi bahwa email harus valid. struct Product.

Use Cases (Interactors)

Aturan bisnis yang spesifik untuk aplikasi ini. Mengorkestrasi aliran data menggunakan Entities.

RegisterUserUseCase (mengambil input, memvalidasi, memanggil repository untuk menyimpan User).

Interface Adapters

Lapisan konverter data. Mengubah data dari format yang nyaman untuk Use Cases/Entities ke format yang nyaman untuk dunia luar.

Controllers, Presenters, dan Gateways (yang seringkali merupakan implementasi dari interface repository).

Frameworks & Drivers

(Lingkaran terluar) "Detail" teknis. Semua yang ada di dunia luar.

Web framework (seperti Gin, Echo, Laravel), Database (PostgreSQL, GORM), UI (React), Message broker (RabbitMQ).


Perbedaan Utama: Clean vs. Hexagonal

Aspek

Hexagonal Architecture (Ports & Adapters)

Clean Architecture

Metafora

Segi enam (Hexagon) dengan "Inside" vs. "Outside".

Lingkaran konsentris (Onion Layers).

Fokus Utama

Fokus pada batas (boundary) dan komunikasi di perbatasan itu.

Fokus pada hierarki ketergantungan (Dependency Rule) antar lapisan.

Granularitas

Kurang rinci. "Inti Aplikasi" (Hexagon) adalah satu blok besar.

Sangat rinci. Memecah "Inti Aplikasi" menjadi dua lapisan: Entities dan Use Cases.

Secara sederhana:

Hexagonal Architecture mendefinisikan cara inti aplikasi berkomunikasi (melalui Ports dan Adapters).

Clean Architecture menyetujui cara itu, dan kemudian menambahkan aturan tentang bagaimana bagian dalam inti aplikasi itu sendiri harus distrukturkan (Entities dan Use Cases).

Dalam praktiknya, Inti Aplikasi (Hexagon) dalam arsitektur Heksagonal setara dengan gabungan lapisan Entities + Use Cases dalam Clean Architecture.

Last updated