Pada tahapan ini kita akan mencoba menerapkan Clean Architecture yang mana konsep ini menurut Uncle Bob itu memiliki 4 layer yaitu
- Entities
- Usecase
- Controller
- Framework dan Driver
Pada project ini kami akan membuatnya sama memiliki 4 layer tetapi ada perbedaan pengelompokan:
- Models
- Repository
- Usecase
- Delivery
Sehingga ini akan mempengaruhi struktur pembuatan folder yang akan dimasukkan ke dalam projek. Agar teman-teman punya bayangan maka stuktur foldernya seperti ini.
.
├── cmd
│ └── main.go
├── models
│ └── article.go
├── repository
│ └── mysql
│ └── article.go
├── usecase
│ └── article
│ └── article.go
├── delivery
│ └── http
│ └── article.go
├── apispec.json
├── docker-compose.yaml
├── go.mod
├── go.sum
└── README.md
Models
Layer ini merupakan layer yang menyimpan model yang nanti akan dipakai pada domain lainnya. Layer ini dapat diakses oleh semua layer dan oleh semua domain juga. Pada projek ini kita akan membuat Model yang berhubugan dengan data Student
maka contoh struct yang akan kita buat seperit ini.
package models
type Student struct {
ID int64
NIM string
Name string
BirthPlace string
}
Repository
Layer ini adalah layer yang akan menyimpan action yang berhubungan dengan eksternal misalkan pada projek ini kita akan menyimpan data ke dalam database maka proses seperti querying, inserting, updating dan deleting data akan disimpan disini. Perlu dicatat juga pada layer ini diusahakan tidak ada business logic.
Layer ini tugas utama yaitu menentukan datastore yang akan digunakan. Pada projek ini kita memilih dan menggunakan RDBMS Mysql.
Jika menggunakan arsitektur microserice, maka layer ini akan bertugas sebagai penghubung dengan service lain (external) sehingga layer ini sangat terikat dan bergantung dengan datastore yang kita gunakan.
Usecase
Layer ini merupakan layer yang bertugas untuk mengontrol, menangani business logic pada setiap domain. Layer ini yang nantinya akan menghubungkan antar repository yang akan digunakan dan bahkan bisa saja lebih dari satu repository yang terhubung pada layer ini.
Tugas utama dari layer ini menghubungkan databstore, data eksternal yang dibutuhkan dengan mengakses data repository dengan delivery layer. Sehingga layer ini bertanggung jawab penuh validitas data, jika terjadi yg tidak valid pada repository atau delivery maka layer ini yang harus bertanggung jawab untuk melakukan handling.
Layer ini juga harus atau wajib berisi business logic. Misalkan menghitung jumlah article keseluruhan, kalkulasi data, proses mengeluarkan data yang terfilter yang mana data tersebut diambil dari repository dan diolah oleh layer ini.
Delivery
Layer ini merupakan layer yang bertugas sebagai presenter atau menjadi garda terdepan dalam aplikasi yaitu output. Pada layer ini juga kita bisa menentukan akan memakai metode apa dan penyampaian yang akan dipakai bisa menggunakan Rest API, HTML, gRPC, File, CRON dan lainnya.
Tugas lain dari layer ini sebagai penghubung antara user dan sistem. Menerima input dan validasi input sesuai dengan standar yang sudah kita gunakan. Misalkan contoh pada project ini kita akan memilih RestFul API sebagai layer delivery-nya sehingga komunikasi antara user terhadap sistem dilakukan melalui Rest API.