Clean Architecture: Cara Biar Project Tidak Jadi “Spaghetti Code”
Sering pusing karena project kamu kelihatan tidak efisien, susah di-maintain, dan semua logic tercampur di satu tempat?
File controller penuh dengan query database, business logic bercampur dengan validasi, bahkan kadang helper random ikut nimbrung di situ juga.
Kalau projectnya masih kecil dan kita kerjakan sendiri, mungkin masih bisa diatasi. Kamu masih ingat semua alur kodenya di kepala.
Namun bagaimana jika project tersebut dikerjakan bersama tim?
Mulai muncul pertanyaan seperti:
- “Logic ini ada di mana ya?”
- “Kalau ubah fitur ini nanti efeknya ke mana saja?”
- “Kenapa function ini dipanggil dari tiga tempat berbeda?”
Akhirnya kita sebagai developer harus bolak-balik bertanya ke orang lain yang handle kode tsb hanya untuk memahami struktur project.
Dan di sinilah konsep Clean Architecture mulai terasa penting.
Clean Architecture membantu kita membuat sistem yang terstruktur, mudah dipahami, dan lebih mudah di-maintain dalam jangka panjang.
Apa Itu Clean Architecture?
Clean Architecture adalah konsep arsitektur software yang diperkenalkan oleh Robert C. Martin (Uncle Bob).
Tujuan utamanya sederhana:
Memisahkan tanggung jawab dalam aplikasi agar setiap bagian memiliki peran yang jelas.
Dengan pemisahan ini kita mendapatkan beberapa keuntungan:
- Code lebih mudah dipahami
- Mudah melakukan testing
- Tidak bergantung pada framework
- Lebih mudah melakukan perubahan di masa depan
Masalah Umum Tanpa Arsitektur yang Jelas
Kita coba lihat contoh struktur project yang sering terjadi.
controllers/ userController.js orderController.js
models/ userModel.js orderModel.js
routes/Masalahnya?
Sering kali controller berisi:
- Query database
- Validasi
- Business logic
- Response API
Contohnya:
async function createUser(req, res) { const user = await db.query("INSERT INTO users ...")
if(user.age < 18){ return res.json({error: "Too young"}) }
sendEmail(user.email)
return res.json(user)}Semua logic tercampur di satu tempat.
Akibatnya:
- Susah di test
- Susah di reuse
- Susah di maintain
Semakin besar project, semakin terasa dampaknya.
Konsep Dasar Clean Architecture
Clean Architecture biasanya dibagi menjadi beberapa layer:
EntitiesUse CasesInterface AdaptersFrameworks & DriversAtau jika disederhanakan:
DomainUsecaseRepositoryHandler / ControllerMari kita bahas satu per satu.
1. Entities (Domain)
Ini adalah inti dari aplikasi.
Berisi:
- Struct / Model
- Business rules utama
Contoh:
type User struct { ID string Name string Email string}Layer ini tidak boleh bergantung pada database, framework, atau API.
Tujuannya supaya domain logic tetap bersih.
2. Usecase (Business Logic)
Layer ini berisi logic aplikasi.
Contohnya:
- Create user
- Login
- Calculate price
- Process order
Contoh sederhana:
type UserUsecase struct { repo UserRepository}
func (u *UserUsecase) CreateUser(user User) error { return u.repo.Create(user)}Usecase hanya tahu apa yang harus dilakukan, bukan bagaimana implementasinya.
3. Repository
Repository adalah layer yang bertugas berkomunikasi dengan database.
Contoh:
type UserRepository interface { Create(user User) error FindByEmail(email string) (*User, error)}Implementasinya bisa berbeda:
- PostgreSQL
- MySQL
- MongoDB
- bahkan API
Usecase tidak perlu tahu.
4. Handler / Controller
Layer ini menangani request dari luar.
Contoh:
- HTTP API
- CLI
- gRPC
Contoh sederhana:
func (h *UserHandler) CreateUser(c *fiber.Ctx) error { var req CreateUserRequest
if err := c.BodyParser(&req); err != nil { return err }
err := h.usecase.CreateUser(req.ToDomain())
return c.JSON("success")}Controller hanya bertugas:
- menerima request
- memanggil usecase
- mengembalikan response
Prinsip Penting Clean Architecture
Ada satu aturan utama:
Dependency harus mengarah ke dalam (inward).
Artinya:
Controller -> Usecase -> DomainBukan sebaliknya.
Domain tidak boleh tahu tentang:
- database
- framework
- HTTP
- library eksternal
Dengan begitu, domain tetap stabil walaupun teknologi berubah.
Contoh Struktur Project
Contoh struktur project:
internal/
domain/ user.go
repository/ user_repository.go user_repository_impl.go
usecase/ user_usecase.go
handler/ user_handler.goStruktur seperti ini membuat code lebih mudah dipahami oleh developer lain.
Kapan Clean Architecture Dibutuhkan?
Clean Architecture sangat berguna ketika:
- Project mulai membesar
- Banyak developer dalam satu project
- Sistem memiliki banyak business logic
- Project diharapkan bertahan lama
Namun untuk project kecil atau prototype, arsitektur sederhana mungkin sudah cukup.
Penutup
Clean Architecture bukan sekadar membuat folder yang banyak.
Tujuannya adalah memisahkan tanggung jawab dalam sistem agar kode tetap rapi, scalable, dan mudah dipahami.
Dengan menerapkan arsitektur yang baik sejak awal, kita bisa menghindari masalah klasik seperti:
- spaghetti code
- sulit testing
- sulit maintain
Dan yang paling penting, developer lain tidak perlu lagi kebingungan mencari logic di dalam project,
Mungkin sampai disini saja yang bisa dapat saya bagikan, dan semoga yang saya bagikan dapat bermanfaat kedepanya :)
Sekian dan Nuhunn ~