Clean Architecture Spring Boot Blog

📐 Architecture Guide

Belajar Clean Architecture
dari Awal

Panduan sederhana untuk developer baru yang ingin memahami pola arsitektur perangkat lunak modern

4Layer Utama
1Aturan Emas
Testability

Clean Architecture (catatan: bedakan dengan clean code) adalah pola arsitektur perangkat lunak yang diciptakan oleh Uncle Bob (Robert C. Martin). Banyak developer merasa bingung saat pertama membaca strukturnya — dan itu wajar, karena pemisahan layer-nya sangat ketat.

👨‍💻
Robert C. Martin — "Uncle Bob"
Pencipta Clean Architecture · Software Engineer & Author

Pendekatan terbaik untuk belajar adalah melalui contoh project kecil. Artikel ini menggunakan contoh Blog sederhana dengan Spring Boot yang strukturnya hampir sama dengan project besar.

01 Tujuan Clean Architecture

Sistem yang dibangun dengan Clean Architecture dirancang agar:

  • 🧪 Mudah diuji (testable)
  • 📖 Mudah dipahami
  • 🔧 Mudah diubah (maintainable)
  • 🔌 Bebas dari framework tertentu

02 Konsep Dasar: Urutan Layer

Clean Architecture memisahkan sistem ke dalam beberapa layer dengan aturan dependency yang sangat jelas, dari paling dalam ke paling luar:

🏛️
Domain (Entities)
Inti aplikasi — business rule murni, tanpa framework
↑ depends on
⚙️
Use Cases
Application Business Rules — workflow & orchestration
↑ depends on
🔄
Interface Adapters
Controllers, Presenters, Gateways — jembatan luar & dalam
↑ depends on
🌐
Frameworks & Drivers
Web, UI, Database, External Services — paling luar
💡 Aturan Emas (Dependency Rule): Source code dependency hanya boleh menunjuk ke dalam (inward). Layer luar boleh tahu tentang layer dalam, tapi tidak sebaliknya.
✓ Boleh
  • Frameworks → Interface Adapters
  • Interface Adapters → Use Cases
  • Use Cases → Entities
✗ Dilarang
  • Entities tahu tentang Use Cases
  • Domain tahu tentang Spring/JPA
  • Dependency mengarah ke luar

03 Struktur Project Blog

Berikut contoh struktur project Blog sederhana yang mengikuti prinsip Clean Architecture:

com.example.blog
│
├── domain/
│   ├── Article.java
│   ├── ArticleRepository.java  ← interface only
│   └── ArticleNotFoundException.java
│
├── usecase/
│   ├── CreateArticleUseCase.java
│   ├── GetArticleUseCase.java
│   ├── UpdateArticleUseCase.java
│   └── DeleteArticleUseCase.java
│
├── adapter/
│   ├── in/web/
│   │   └── ArticleController.java
│   └── out/persistence/
│       ├── ArticleEntity.java
│       ├── ArticleMapper.java
│       ├── SpringArticleRepo.java
│       └── ArticleRepoAdapter.java
│
└── config/
    └── BeanConfig.java

04 Domain Layer

No Framework Business Rules Only Java Standard Library

Layer ini adalah inti dari aplikasi. Di sinilah business rule yang sesungguhnya hidup — tanpa ketergantungan pada framework, database, atau UI.

Hal penting: Repository di domain hanya berupa interface, bukan implementasi database. Domain tidak boleh tahu apakah data disimpan di MongoDB, PostgreSQL, Redis, atau API eksternal.

public interface ArticleRepository {
    Article              save(Article article);
    Optional<Article>  findById(UUID id);
    List<Article>       findAll();
    void                 deleteById(UUID id);
}

05 Use Case Layer

Layer ini berisi workflow aplikasi. Setiap UseCase menerima input, menjalankan business logic, memanggil domain repository, lalu menghasilkan output.

Controller
UseCase
Domain
Repository

UseCase hanya bergantung pada ArticleRepository (interface) — bukan pada Spring Data, MongoRepository, atau JPA. Ini membuat UseCase mudah diuji tanpa database.

06 Interface Adapter Layer

Layer ini berfungsi sebagai jembatan antara dunia luar dan domain. Terdiri dari tiga komponen utama:

6.1 Controller

Menerima request HTTP seperti POST /articles dan GET /articles/{id}, lalu memanggil UseCase yang sesuai.

6.2 Repository Adapter

Karena Domain hanya mendefinisikan interface, kita membutuhkan adapter yang mengimplementasikan interface tersebut menggunakan Spring Data.

public class ArticleRepoAdapter implements ArticleRepository {
    // menggunakan SpringArticleRepo (Spring Data interface)
    private final SpringArticleRepo springArticleRepo;
    // ... implementasi method
}

6.3 Mapper

Mapper mengubah object antara layer Domain dan layer Persistence:

Article (Domain)
ArticleEntity (DB)

07 Framework Layer

Layer paling luar berisi Spring Boot, MongoDB, REST API, dan konfigurasi. Di BeanConfig.java itulah semua dependency di-wire bersama melalui Dependency Injection.

08 Visualisasi Dependency

Controller (HTTP in)
menerima request dari luar
↓ calls
UseCase
orchestrates business logic
↓ uses interface
Domain
ArticleRepository (interface)
↑ implemented by
Repository Adapter
mengimplementasikan interface
↓ delegates to
Spring Data Repository
akses database aktual

Semua dependency mengarah ke Domain — tidak pernah keluar.

09 Cara Memulai untuk Pemula

1
Pahami Konsep Dasar
  • Apa itu Domain dan kenapa tidak boleh tahu framework
  • Apa itu UseCase dan bagaimana dia mengatur alur
  • Apa itu Adapter dan peran jembatannya
  • Hafalkan Dependency Rule — dependency selalu ke dalam
2
Pelajari Contoh Kecil Dulu
  • Bagaimana UseCase memanggil Repository
  • Bagaimana Controller memanggil UseCase
  • Bagaimana Adapter menghubungkan Database
3
Baru Baca Project Besar
  • Setelah paham pola dasarnya, struktur project besar akan terasa familiar
  • Tulis kode yang konsisten dengan arsitektur yang ada

🎯 Kesimpulan

Memahami Clean Architecture secara langsung bisa terasa sulit karena project yang besar dan domain logic yang kompleks. Pendekatan yang efektif:

  1. Pelajari Clean Architecture melalui contoh kecil
  2. Gunakan Blog application sebagai latihan
  3. Setelah itu baru membaca kode project besar

Dengan metode ini, kamu bisa memahami arsitektur lebih cepat, tidak bingung membaca struktur project, dan menulis kode yang konsisten.

🚀 Mulai Praktek: Buat Blog API →

Comments

Popular posts from this blog

Numpang Kerja Remote dari Bandung Creative Hub

Membangun AI Development Assistant Lokal

Debugging PHP Web dengan XDebug di Intellij IDEA (PHP STORM)