(0275) 2974 127
Dalam pengembangan software, aplikasi yang awalnya sederhana dapat menjadi semakin kompleks seiring bertambahnya fitur, pengguna, integrasi, dan kebutuhan bisnis. Tanpa arsitektur yang tepat, kode dapat sulit dipahami, diuji, dikembangkan, dan dipelihara.
Salah satu pendekatan yang dapat membantu mengatasi masalah tersebut adalah Clean Architecture. Konsep ini memisahkan business rules, logika aplikasi, detail teknis, dan layanan eksternal sehingga setiap bagian memiliki tanggung jawab yang jelas.
Dengan struktur tersebut, perubahan pada database, framework, UI, atau layanan eksternal dapat dilakukan dengan lebih fleksibel tanpa terlalu memengaruhi inti aplikasi. Konsep Clean Architecture diperkenalkan oleh Robert C. Martin (Uncle Bob) dan menekankan pentingnya menjaga business rules tetap independen dari detail teknis.
Lalu, bagaimana Clean Architecture bekerja dan mengapa pendekatan ini penting untuk aplikasi yang terus berkembang?
Clean Architecture adalah pendekatan arsitektur software yang memisahkan logika bisnis inti dari detail implementasi seperti database, framework, user interface, dan layanan eksternal. Tujuan utamanya adalah membuat aplikasi lebih:
Dalam Clean Architecture, bagian yang paling penting dari aplikasi berada di pusat, sedangkan detail teknis ditempatkan di bagian luar. Secara sederhana, konsepnya dapat digambarkan seperti berikut:
Framework & External Systems
↓
Interface Adapters
↓
Application / Use Cases
↓
Business Rules / Entities
Semakin mendekati pusat, semakin penting dan stabil aturan bisnis aplikasi. Sebaliknya, komponen yang berada di bagian luar biasanya lebih mudah berubah karena bergantung pada teknologi tertentu.
Bayangkan sebuah aplikasi e-commerce yang seluruh logikanya langsung bergantung pada:
Awalnya mungkin tidak menjadi masalah. Namun, ketika perusahaan ingin mengganti database, framework, payment gateway, atau teknologi frontend, perubahan tersebut dapat merambat ke banyak bagian kode. Contohnya:
UI
↓
Controller
↓
Business Logic
↓
Database
Jika business logic langsung berhubungan dengan database, maka perubahan database berpotensi memengaruhi business logic. Clean Architecture berusaha mengurangi ketergantungan tersebut. Idealnya:
UI → Adapter → Use Case → Business Rules
↑
|
Interface
↑
Database
Dengan pola tersebut, business logic tidak perlu mengetahui detail bagaimana data disimpan.
Clean Architecture tidak hanya berkaitan dengan membagi kode ke dalam beberapa folder. Ada prinsip arsitektur yang lebih mendasar di baliknya.
1. Separation of Concerns
Setiap bagian aplikasi sebaiknya memiliki tanggung jawab yang jelas. Misalnya:
Dengan pemisahan tersebut, perubahan pada satu bagian tidak selalu menyebabkan perubahan besar pada bagian lainnya.
2. Dependency Rule
Salah satu konsep paling penting dalam Clean Architecture adalah Dependency Rule. Aturannya secara sederhana: Dependency source code harus mengarah ke bagian yang lebih dalam atau lebih stabil dari arsitektur.
Artinya, komponen di bagian luar boleh bergantung pada komponen di bagian dalam. Namun, komponen inti tidak seharusnya bergantung langsung pada detail yang berada di bagian luar. Contohnya:
Framework
↓
Adapter
↓
Use Case
↓
Entity
Bukan:
Entity
↓
Database
Karena Entity seharusnya tidak mengetahui database apa yang digunakan.
Clean Architecture umumnya divisualisasikan sebagai beberapa lingkaran konsentris. Meskipun implementasinya dapat berbeda antara satu proyek dan proyek lainnya, struktur konseptualnya biasanya terdiri dari:
1. Entities
Entities merupakan bagian paling dalam dari Clean Architecture yang berisi aturan bisnis inti. Entity merepresentasikan konsep penting dalam domain aplikasi. Contohnya pada aplikasi e-commerce:
Entity tidak seharusnya bergantung pada:
Sebagai contoh, sebuah Order dapat memiliki aturan bahwa order tidak dapat dibatalkan setelah status tertentu. Aturan tersebut merupakan bagian dari business rule.
Order
├── create()
├── cancel()
├── calculateTotal()
└── changeStatus()
Aturan tersebut tetap relevan meskipun aplikasi berpindah dari: MySQL → PostgreSQL atau REST API → GraphQL
Karena aturan tersebut berasal dari domain bisnis, bukan dari teknologi.
2. Use Cases
Layer berikutnya adalah Use Cases. Use case berisi aturan aplikasi yang menjelaskan bagaimana pengguna atau sistem menjalankan suatu proses bisnis. Contohnya pada aplikasi toko online:
Entity menjelaskan aturan bisnis inti, sedangkan use case mengatur bagaimana aturan tersebut digunakan dalam sebuah proses aplikasi. Contoh sederhana:
Checkout
↓
Validate Cart
↓
Calculate Total
↓
Create Order
↓
Process Payment
↓
Save Order
Use case tidak perlu mengetahui detail apakah data disimpan menggunakan MySQL, PostgreSQL, MongoDB, atau database lainnya.
3. Interface Adapters
Interface Adapters berfungsi sebagai penghubung antara bagian inti aplikasi dengan dunia luar. Layer ini dapat mencakup:
Misalnya sebuah HTTP request masuk: POST /orders
Controller menerima request tersebut dan mengubah data request menjadi format yang dapat digunakan oleh use case. Setelah use case selesai, adapter dapat mengubah hasilnya menjadi response HTTP. Dengan demikian, use case tidak perlu mengetahui detail protokol HTTP.
4. Frameworks and Drivers
Ini merupakan bagian terluar dari Clean Architecture. Layer ini berisi detail teknis yang digunakan aplikasi. Contohnya:
Contohnya:
Framework:
Laravel / Spring / .NET / Django
Database:
MySQL / PostgreSQL / MongoDB
Message Broker:
RabbitMQ / Kafka
External Service:
Payment Gateway / Email Service
Detail tersebut ditempatkan di bagian luar agar tidak menjadi pusat dari business logic.
Secara sederhana, arsitektur dapat digambarkan seperti berikut:
┌─────────────────────────────────────────────┐
│ Frameworks & External Systems │
│ │
│ Web Framework | Database | API | UI │
│ ┌─────────────────────────────┐ │
│ │ Interface Adapters │ │
│ │ │ │
│ │ Controller | Repository │ │
│ │ DTO | Presenter | Gateway │ │
│ │ ┌─────────────────┐ │ │
│ │ │ Use Cases │ │ │
│ │ │ │ │ │
│ │ │ Application │ │ │
│ │ │ Business Rules │ │ │
│ │ │ ┌───────┐ │ │ │
│ │ │ │Entity │ │ │ │
│ │ │ └───────┘ │ │ │
│ │ └─────────────────┘ │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────────────┘
Intinya, bagian luar bergantung pada bagian dalam, bukan sebaliknya.
Clean Architecture memiliki hubungan erat dengan prinsip Dependency Inversion Principle (DIP) dari SOLID. Masalah yang sering terjadi dalam aplikasi adalah business logic langsung bergantung pada implementasi konkret. Contohnya:
OrderService
↓
MySQLRepository
Jika database diganti, OrderService mungkin ikut berubah. Dalam pendekatan yang lebih terpisah:
OrderService
↓
OrderRepository Interface
↑
|
MySQLRepository
OrderService hanya mengetahui kontrak OrderRepository. Implementasinya dapat menggunakan:
MySQLRepository
PostgreSQLRepository
MongoRepository
InMemoryRepository
Dengan demikian, business logic tidak bergantung langsung pada database tertentu.
Misalnya kita memiliki aplikasi toko online dan ingin membuat fitur Create Order. Alurnya dapat dibuat seperti:
User
↓
HTTP Request
↓
Order Controller
↓
Create Order Use Case
↓
Order Entity
↓
Order Repository Interface
↓
Database Repository
↓
Database
Mari lihat tanggung jawabnya.
1. Controller
Menerima request:
POST /orders
Controller kemudian meneruskan data ke use case.
2. Use Case
Use case menjalankan proses:
Validate product
↓
Calculate total
↓
Create order
↓
Save order
3. Entity
Entity memastikan aturan bisnis order tetap valid.
4. Repository Interface
Use case hanya mengetahui kontrak: OrderRepositoryBukan database tertentu.
5. Repository Implementation
Bagian luar menyediakan implementasinya: MySQLOrderRepository
Dengan demikian, database dapat diganti tanpa harus mengubah seluruh business logic.
Implementasi Clean Architecture dapat berbeda tergantung bahasa pemrograman dan kebutuhan proyek. Contoh struktur sederhana:
src/
├── domain/
│ ├── entities/
│ │ └── Order
│ └── repositories/
│ └── OrderRepository
│
├── application/
│ └── usecases/
│ └── CreateOrder
│
├── adapters/
│ ├── controllers/
│ │ └── OrderController
│ ├── presenters/
│ └── repositories/
│ └── MySQLOrderRepository
│
└── infrastructure/
├── database/
├── http/
└── framework/
Nama folder tidak harus sama persis. Yang lebih penting adalah pemisahan tanggung jawab dan arah dependency.
Clean Architecture sering dibandingkan dengan Model-View-Controller (MVC). Keduanya sebenarnya tidak harus dianggap sebagai dua pilihan yang saling menggantikan. MVC lebih berfokus pada pemisahan:
Sedangkan Clean Architecture memiliki cakupan lebih luas dalam mengatur dependency dan pemisahan business rules dari detail teknis.
| Aspek | MVC | Clean Architecture |
|---|---|---|
| Fokus | Struktur aplikasi berbasis Model-View-Controller | Dependency dan pemisahan business rules |
| Business Logic | Bisa berada di berbagai bagian | Dipisahkan lebih jelas |
| Database | Sering dekat dengan model | Dapat diabstraksikan |
| Framework Dependency | Bisa cukup kuat | Diusahakan berada di luar |
| Testing | Bergantung implementasi | Business logic lebih mudah diuji |
| Kompleksitas | Relatif sederhana | Lebih tinggi |
| Cocok untuk | Aplikasi kecil hingga menengah | Aplikasi yang kompleks dan berkembang |
Clean Architecture juga dapat diterapkan bersama MVC. Misalnya, Controller dalam MVC dapat menjadi bagian dari Interface Adapters.
Layered Architecture biasanya membagi aplikasi menjadi beberapa lapisan seperti:
Presentation
↓
Business
↓
Data Access
↓
Database
Clean Architecture memiliki kemiripan dalam hal pemisahan tanggung jawab, tetapi memberikan perhatian yang lebih kuat terhadap arah dependency.
| Aspek | Layered Architecture | Clean Architecture |
|---|---|---|
| Struktur | Lapisan | Lapisan/lingkaran dengan dependency rule |
| Dependency | Sering dari atas ke bawah | Mengarah ke pusat |
| Business Logic | Dapat bergantung pada data layer | Diusahakan independen |
| Database | Sering menjadi dependency business layer | Berada di luar |
| Fleksibilitas | Baik | Lebih tinggi |
| Kompleksitas | Lebih sederhana | Lebih kompleks |
Clean Architecture juga memiliki banyak kesamaan dengan Hexagonal Architecture atau Ports and Adapters. Keduanya sama-sama berusaha memisahkan core application dari detail eksternal.
| Aspek | Clean Architecture | Hexagonal Architecture |
|---|---|---|
| Fokus | Dependency dan business rules | Core dan adapters |
| Konsep utama | Entities, Use Cases, Adapters | Ports dan Adapters |
| Database | Adapter eksternal | Adapter |
| External API | Adapter eksternal | Adapter |
| Business Logic | Berada di core | Berada di core |
| Tujuan | Independensi dan maintainability | Independensi terhadap external systems |
Clean Architecture memiliki beberapa keuntungan untuk proyek yang membutuhkan maintainability tinggi.
Business logic tidak terlalu bergantung pada framework, database, atau UI. Hal ini membuat aturan bisnis lebih mudah dipahami dan dikembangkan.
Karena business logic tidak bergantung langsung pada database atau layanan eksternal, unit test dapat dibuat lebih sederhana.
Misalnya, repository dapat diganti dengan: InMemoryRepository, saat menjalankan pengujian. Dengan demikian, test tidak harus selalu terhubung ke database production atau layanan eksternal.
Misalnya perusahaan ingin mengganti MySQL → PostgreSQLatau
REST → GraphQLatau
Framework A → Framework B
Perubahan dapat dibatasi pada bagian yang berkaitan dengan detail teknis, selama kontrak dan business rules tetap dipertahankan.
Pada proyek yang terus berkembang, pemisahan tanggung jawab membantu mencegah kode menjadi terlalu saling bergantung. Hal ini sangat berguna untuk aplikasi yang memiliki banyak fitur dan dikelola dalam waktu panjang.
Business logic yang terlalu bergantung pada vendor atau framework dapat menyulitkan proses migrasi. Clean Architecture membantu menempatkan ketergantungan tersebut di bagian luar sehingga inti aplikasi relatif lebih independen.
Meskipun memiliki banyak manfaat, Clean Architecture bukan berarti selalu menjadi pilihan terbaik.
Untuk aplikasi sederhana, membuat banyak layer dapat terasa berlebihan. Misalnya fitur sederhana: Create User
mungkin harus melewati:
Controller
↓
DTO
↓
Use Case
↓
Entity
↓
Repository Interface
↓
Repository Implementation
Untuk aplikasi kecil, struktur tersebut bisa terasa terlalu panjang.
Pemisahan layer dapat menghasilkan lebih banyak file dan interface. Developer perlu mempertimbangkan apakah kompleksitas tersebut memang memberikan manfaat.
Developer yang belum memahami dependency rule dapat dengan mudah membuat dependency yang salah. Contohnya: Entity → Database, yang justru bertentangan dengan tujuan Clean Architecture.
Menggunakan folder bernama:
entities/
usecases/
repositories/
controllers/
tidak otomatis berarti aplikasi sudah menerapkan Clean Architecture. Yang lebih penting adalah:
Clean Architecture lebih cocok diterapkan pada aplikasi yang memiliki kompleksitas tinggi, terus berkembang, dan diperkirakan akan digunakan dalam jangka panjang. Pendekatan ini dapat bermanfaat untuk aplikasi enterprise, SaaS, sistem keuangan, e-commerce, platform digital, hingga aplikasi yang memiliki banyak integrasi eksternal atau business rules yang kompleks. Clean Architecture juga membantu ketika aplikasi dikembangkan oleh banyak developer karena struktur dan tanggung jawab setiap bagian dapat dibuat lebih jelas.
Sebaliknya, aplikasi sederhana dengan sedikit fitur, business logic yang minim, dan umur pengembangan yang relatif singkat mungkin tidak membutuhkan penerapan Clean Architecture secara penuh. Menggunakan terlalu banyak layer dan abstraksi pada proyek kecil justru dapat menambah kompleksitas. Karena itu, penerapan Clean Architecture sebaiknya disesuaikan dengan kebutuhan, skala, dan tingkat kompleksitas aplikasi.
Tidak semua aplikasi membutuhkan Clean Architecture dengan struktur yang kompleks. Pada aplikasi internal sederhana yang hanya memiliki beberapa halaman, satu database, sedikit business logic, tanpa banyak integrasi eksternal, dan memiliki umur proyek relatif pendek, penerapan terlalu banyak layer justru dapat menambah kompleksitas tanpa memberikan manfaat yang sebanding.
Karena itu, tingkat abstraksi sebaiknya disesuaikan dengan kompleksitas dan kebutuhan aplikasi. Clean Architecture sebaiknya diterapkan untuk mengatasi masalah seperti maintainability, pengelolaan dependency, dan kebutuhan pengembangan jangka panjang, bukan sekadar mengikuti tren dalam software development.
Berikut langkah yang dapat digunakan untuk mulai menerapkan Clean Architecture.
1. Identifikasi Business Rules
Mulailah dengan menemukan aturan bisnis yang paling penting. Contohnya: Order tidak dapat dibatalkan setelah dikirim.Aturan tersebut merupakan business rule dan tidak seharusnya bergantung pada database atau framework.
2. Tentukan Entity
Identifikasi objek utama dalam domain aplikasi. Contoh e-commerce:
Customer
Product
Order
Payment
Cart
3. Tentukan Use Case
Selanjutnya tentukan proses yang dapat dilakukan oleh pengguna atau sistem. Contohnya:
CreateOrder
CancelOrder
PayOrder
RegisterCustomer
UpdateProfile
4. Tentukan Interface
Jika use case membutuhkan data atau layanan eksternal, buat abstraksinya terlebih dahulu. Misalnya:
OrderRepository
PaymentGateway
EmailService
Use case cukup mengetahui interface tersebut.
5. Implementasikan Adapter
Kemudian buat implementasi konkret. Misalnya:
MySQLOrderRepository
StripePaymentGateway
SMTPEmailService
Implementasi tersebut berada di bagian luar.
6. Hubungkan Framework
Framework web, database, ORM, dan teknologi lainnya ditempatkan sebagai detail implementasi. Contohnya:
Laravel
↓
Controller
↓
Use Case
↓
Entity
Framework tidak menjadi pusat dari business logic.
Tidak.
Clean Architecture dapat diterapkan pada berbagai jenis software, termasuk:
Misalnya pada aplikasi mobile, struktur dapat memisahkan:
UI
↓
Presentation
↓
Use Case
↓
Domain
↓
Repository Interface
↓
Data Source
Dengan pendekatan tersebut, business logic tidak terlalu bergantung pada framework UI.
Clean Architecture juga dapat digunakan pada microservices.
Misalnya sebuah sistem memiliki service:
Order Service
Payment Service
User Service
Inventory Service
Masing-masing service dapat memiliki business logic sendiri yang dipisahkan dari:
Contohnya:
Order Service
Domain
↓
Use Cases
↓
Adapters
↓
Infrastructure
Dengan demikian, Clean Architecture dapat diterapkan pada level service tanpa harus membuat seluruh sistem menjadi satu aplikasi besar.
Salah satu manfaat yang sering dicari dari Clean Architecture adalah kemudahan testing.
Misalnya sebuah use case:
CreateOrder
bergantung pada:
OrderRepository
Dalam production:
OrderRepository
↓
PostgreSQL
Sedangkan saat testing:
OrderRepository
↓
FakeRepository
Use case tetap dapat diuji tanpa menggunakan database sebenarnya.
Contohnya:
CreateOrder
↓
Fake Order Repository
↓
Assert Result
Pendekatan ini membuat pengujian business logic menjadi lebih cepat dan terisolasi.
Dependency Injection (DI) sering digunakan untuk mendukung Clean Architecture.
Daripada sebuah class membuat dependency sendiri:
OrderService
↓
new MySQLRepository()
dependency dapat diberikan dari luar:
OrderService
↑
OrderRepository
Implementasi konkretnya dapat ditentukan oleh konfigurasi aplikasi.
Contohnya:
OrderService
↑
OrderRepository Interface
↑
MySQLRepository
Dengan cara tersebut, dependency dapat diganti dengan implementasi lain ketika diperlukan.
Beberapa prinsip berikut dapat membantu menjaga implementasi tetap sehat.
Framework merupakan detail implementasi.
Entity seharusnya mewakili domain, bukan struktur tabel database.
Use case tidak perlu mengetahui apakah request datang melalui REST, GraphQL, CLI, atau message queue.
Business logic sebaiknya berinteraksi dengan kontrak repository, bukan database secara langsung.
Abstraksi sebaiknya dibuat ketika memang membantu memisahkan dependency atau memenuhi kebutuhan desain.
1. Terlalu Banyak Layer
Developer terkadang membuat banyak layer hanya karena mengikuti contoh arsitektur. Akibatnya, satu proses sederhana harus melewati terlalu banyak class.
2. Business Logic Tetap Berada di Controller
Jika controller berisi terlalu banyak aturan bisnis, pemisahan layer menjadi tidak efektif. Controller sebaiknya fokus pada penerimaan input dan koordinasi dengan use case.
3. Entity Bergantung pada Framework
Jika entity langsung menggunakan library atau framework tertentu, independensi domain dapat berkurang.
4. Repository Hanya Menjadi Wrapper
Tidak semua kode harus dipaksa melalui repository jika tidak memberikan manfaat. Abstraksi sebaiknya memiliki tujuan yang jelas.
5. Menganggap Clean Architecture sebagai Struktur Folder
Clean Architecture bukan sekadar:
entities/
usecases/
controllers/
repositories/
Hal yang lebih penting adalah arah dependency dan pemisahan business rules dari detail teknis.
| Kondisi Proyek | Pendekatan yang Dapat Dipertimbangkan |
|---|---|
| Aplikasi sangat sederhana | Struktur sederhana |
| CRUD sederhana | MVC atau Layered Architecture |
| Aplikasi menengah | Layered/Clean Architecture sesuai kebutuhan |
| Business logic kompleks | Clean Architecture |
| Enterprise application | Clean Architecture atau pendekatan sejenis |
| Banyak integrasi eksternal | Clean/Hexagonal Architecture |
| Microservices kompleks | Clean/Hexagonal Architecture per service |
| Sistem kecil dengan umur pendek | Hindari overengineering |
Tidak ada satu arsitektur yang selalu paling baik untuk semua proyek. Pilihan sebaiknya didasarkan pada kompleksitas domain, kebutuhan perubahan, jumlah developer, umur aplikasi, dan risiko teknis.
Clean Architecture adalah pendekatan software development yang memisahkan business logic dari detail teknis seperti framework, database, UI, dan layanan eksternal. Dengan prinsip dependency yang terarah, aplikasi menjadi lebih mudah diuji, dipelihara, dikembangkan, dan beradaptasi terhadap perubahan teknologi.
Namun, penerapannya perlu disesuaikan dengan kompleksitas proyek agar tidak menjadi overengineering. Bagi developer dan tim engineering, Clean Architecture dapat menjadi solusi untuk menjaga struktur kode tetap terorganisir seiring aplikasi berkembang.
Temukan lebih banyak informasi seputar software development, DevOps, cloud computing, website, hosting, dan teknologi digital di Blog Hosteko.
Setelah memahami pentingnya Shift-Left Security, tahap berikutnya adalah melihat bagaimana pendekatan ini diterapkan dalam proses…
Dalam pengelolaan infrastruktur modern, terutama pada lingkungan cloud dan DevOps, Infrastructure as Code (IaC) digunakan…
Ketika seseorang mengakses sebuah website, konten yang ditampilkan seperti halaman HTML, gambar, CSS, JavaScript, dan…
Setelah memahami pengertian Shift-Left Security, pertanyaan berikutnya adalah mengapa pendekatan ini penting dalam pengembangan software.…
Keamanan menjadi salah satu aspek penting dalam pengembangan aplikasi dan software. Kerentanan yang tidak ditemukan…
Dalam aplikasi modern, terutama yang menggunakan microservices, sebuah aplikasi biasanya tidak hanya terdiri dari satu…