Screaming Architecture: Auman Fitur vs Framework

Screaming Architecture adalah arsitektur di mana struktur folder dan struktur aplikasi harus “mengaumkan” fitur utama tentang bisnis tersebut, bukan tentang framework atau teknologi yang dipakai. Konsepnya sederhana tapi argumennya cukup kuat. Misalkan kita membuka struktur folder aplikasi e-commerce, yang harusnya kita lihat bukanlah folder terkait teknologi yang dipakai e-commerce, melainkan folder terkait fitur-fitur e-commerce. Analoginya seperti kita masuk ke sebuah gedung dan kita melihat ada IGD, Apotek, Ruang Tunggu, dan sejenisnya, kita langsung paham ini adalah fitur dari Rumah Sakit. Kalau yang kita lihat pertama kali adalah Besi, Semen, Batu Bata, Pasir, dan struktur bangunan lainnya, maka kita akan bingung apa aja fungsi dari bangunan ini.
Pelanggaran Screaming Architecture
Misalnya strukturnya seperti ini:
src/
├── controllers/
│ ├── OrderController.java
│ └── UserController.java
├── entities/
│ ├── OrderEntity.java
│ └── UserEntity.java
├── usecases/
│ ├── OrderCreationUseCase.java
│ ├── OrderDetailUseCase.java
│ ├── UserCreationUseCase.java
│ └── UserDetailUseCase.java
└── repositories/
├── OrderRepository.java
└── UserRepository.javaFolder teratas yang kita lihat adalah controllers, entities, usecases, repositories, dan sejenisnya. Ini ga mencerminkan fitur dari aplikasi. Folder-folder itu ga menjelaskan bisnis sama sekali. Selain itu, ketika ada perubahan fitur, misalnya terkait user, maka kita perlu pindah-pindah folder dari controllers, entities, usecases, repositories, dan sebagainya.
Solusi Screaming Architecture
Dengan Screaming Architecture pendekatan di atas diubah jadi seperti berikut:
src/
├── order/
│ ├── OrderEntity.java
│ ├── OrderRepository.java
│ ├── creation/
│ │ ├── OrderCreationController.java
│ │ ├── OrderCreationRequest.java
│ │ ├── OrderCreationResponse.java
│ │ ├── OrderCreationUseCase.java
│ │ └── OrderCreationUseCaseImpl.java
│ └── detail/
│ ├── OrderDetailController.java
│ ├── OrderDetailRequest.java
│ ├── OrderDetailResponse.java
│ ├── OrderDetailUseCase.java
│ └── OrderDetailUseCaseImpl.java
└── user/
├── UserEntity.java
├── UserRepository.java
├── creation/
│ ├── UserCreationController.java
│ ├── UserCreationRequest.java
│ ├── UserCreationResponse.java
│ ├── UserCreationUseCase.java
│ └── UserCreationUseCaseImpl.java
└── detail/
├── UserDetailController.java
├── UserDetailRequest.java
├── UserDetailResponse.java
├── UserDetailUseCase.java
└── UserDetailUseCaseImpl.javaDengan begini saat pertama kali buka struktur foldernya dari atas, kita langsung tahu fitur-fiturnya apa aja. Di saat kita ingin melakukan perubahan fitur, kita langsung ke folder fitur tersebut. Ga perlu bolak-balik pindah-pindah folder lompat sana lompat sini. Strukturnya pun lebih rapi sesuai domain dan fitur.
