1
Ringkasan Proyek
Repository khannedy/golang-clean-architecture adalah template clean architecture untuk Golang. README menyebutnya sebagai "golang clean architecture template" dan menempatkan seluruh konfigurasi di config.json serta seluruh API spec di folder api (README.md:1-91). Template ini membawa tiga entitas bisnis, yaitu user, contact, dan address, lalu menyajikannya lewat dua entrypoint terpisah: server HTTP di cmd/web dan worker Kafka di cmd/worker.
Alur yang ingin dicontohkan template ini tertulis eksplisit di README: external system mengirim request, Delivery membentuk Model, Use Case membentuk Entity, Repository menjalankan operasi database, dan Gateway mengirim request ke sistem luar (README.md:11-212). Halaman ini memetakan komponen tersebut ke direktori nyata; rincian tiap lapisan ada di Arsitektur Berlapis.
Peta komponen
Diagram berikut memetakan komponen utama ke berkas dan direktori tempat komponen itu hidup. Sisi kiri adalah jalur HTTP, sisi kanan adalah jalur messaging.
graph TD
Web["cmd/web main"] --> Cfg["config.NewViper"]
Web --> Boot["config.Bootstrap"]
Boot --> Route["route.RouteConfig.Setup"]
Boot --> UC["usecase UseCase"]
Boot --> Repo["repository Repository"]
Boot --> Prod["gateway messaging Producer"]
Route --> Ctrl["delivery http Controller"]
Ctrl --> UC
UC --> Repo
UC --> Conv["model converter"]
UC --> Prod
Repo --> Gorm["gorm.DB"]
Gorm --> DB[("MySQL")]
Prod --> Kafka[("Apache Kafka")]
Worker["cmd/worker main"] --> Group["config.NewKafkaConsumerGroup"]
Group --> Consume["messaging.ConsumeTopic"]
Kafka --> Consume
Consume --> Handler["delivery messaging Consumer"]
style DB fill:#336791,color:#fff
style Kafka fill:#336791,color:#fff
style Gorm fill:#336791,color:#fff
style Boot fill:#f59e0b,color:#000
style Prod fill:#f59e0b,color:#000
style Conv fill:#8b5cf6,color:#fff
style Route fill:#2d7d46,color:#fff
%% fig: Komponen template dan direktori asalnya
%% desc: config.Bootstrap merangkai controller, use case, repository, dan producer untuk jalur HTTP, sementara cmd/worker merangkai consumer group untuk jalur Kafka.config.Bootstrap adalah titik rangkai utama jalur HTTP. Fungsi ini menerima BootstrapConfig berisi *gorm.DB, *fiber.App, *logrus.Logger, *validator.Validate, *viper.Viper, dan sarama.SyncProducer (internal/config/app.go:19-263). Di dalamnya dibuat tiga repository, tiga use case, tiga controller, satu middleware middleware.NewAuth, lalu routeConfig.Setup() dipanggil (internal/config/app.go:28-664). cmd/web/main.go menyiapkan Viper, logger, database, validator, Fiber, dan producer sebelum memanggil Bootstrap, kemudian mendengarkan web.port (cmd/web/main.go:8-295). Nilai web.port pada config.json adalah 3000 dengan prefork bernilai false (config.json:5-86).
Jalur kedua tidak melewati Bootstrap. cmd/worker/main.go membuat Viper dan logger sendiri, menjalankan tiga goroutine consumer, lalu menunggu SIGINT, SIGKILL, atau SIGTERM sebelum cancel() dan tidur 5 detik agar consumer selesai memproses (cmd/worker/main.go:16-417). Ketiga goroutine tersebut memanggil messaging.ConsumeTopic untuk topik users, contacts, dan addresses (cmd/worker/main.go:43-618).
Direktori dan perannya
| Direktori atau berkas | Peran | Rujukan |
|---|---|---|
cmd/web | Entrypoint server HTTP Fiber | cmd/web/main.go:8-295 |
cmd/worker | Entrypoint consumer Kafka dengan graceful shutdown | cmd/worker/main.go:16-417 |
internal/config | Pemuat konfigurasi, koneksi database, Kafka, logger, validator, Fiber | internal/config/viper.go:11-259 |
internal/delivery/http | Controller HTTP dan middleware auth | internal/delivery/http/route/route.go:22-4410 |
internal/delivery/messaging | Consumer per topik | cmd/worker/main.go:43-618 |
internal/usecase | Logika bisnis per entitas | internal/config/app.go:45-4811 |
internal/repository | Akses data lewat GORM | internal/config/app.go:29-3212 |
internal/entity | Struct yang dipetakan ke tabel | internal/entity/user_entity.go:4-1613 |
internal/model | Request/response dan event | internal/model/user_model.go:3-914 |
internal/gateway/messaging | Producer Kafka per entitas | internal/gateway/messaging/user_producer.go:14-2115 |
api | API spec OpenAPI | api/api-spec.json:1-1216 |
db/migrations | Migration SQL | README.md:47-4917 |
test | Unit test yang dijalankan lewat go test -v ./test/ | README.md:63-6918 |
Konfigurasi dibaca oleh NewViper dari berkas bernama config bertipe json, dengan dua jalur pencarian yaitu ./../ dan ./ (internal/config/viper.go:11-259). Koneksi database dibangun dari kunci database.* dan pool-nya diatur lewat SetMaxIdleConns, SetMaxOpenConns, serta SetConnMaxLifetime (internal/config/gorm.go:14-4919).
Tech stack
README menyebut Golang, MySQL, dan Apache Kafka sebagai tech stack, lalu mendaftar Fiber, GORM, Viper, Golang Migrate, validator, Logrus, dan Sarama sebagai framework dan library (README.md:23-3720). Versi yang benar-benar di-require oleh go.mod adalah Go 1.25 dengan modul golang-clean-architecture (go.mod:1-1621):
| Library | Versi di go.mod | Kegunaan |
|---|---|---|
github.com/gofiber/fiber/v2 | v2.52.9 | HTTP framework |
gorm.io/gorm | v1.30.1 | ORM |
gorm.io/driver/mysql | v1.6.0 | Driver MySQL untuk GORM |
github.com/IBM/sarama | v1.46.0 | Kafka client |
github.com/spf13/viper | v1.20.1 | Pembacaan konfigurasi |
github.com/go-playground/validator/v10 | v10.27.0 | Validasi request |
github.com/sirupsen/logrus | v1.9.3 | Logger |
github.com/google/uuid | v1.6.0 | Pembuatan identifier |
golang.org/x/crypto | v0.41.0 | bcrypt untuk password |
github.com/stretchr/testify | v1.11.0 | Assertion pada test |
Golang Migrate tidak muncul di blok require go.mod (go.mod:5-1622); README memakainya sebagai perintah CLI migrate create dan migrate ... up (README.md:47-4917).
Entitas dan topik
Tiga entitas bisnis dipetakan ke tiga topik Kafka yang namanya ditentukan saat consumer dijalankan (cmd/worker/main.go:43-618). Producer juga menetapkan topik yang sama, misalnya UserProducer memakai Topic: "users" (internal/gateway/messaging/user_producer.go:14-2115).
| Entitas | Berkas | Topic Kafka |
|---|---|---|
| User | internal/entity/user_entity.go | users |
| Contact | internal/entity/contact_entity.go | contacts |
| Address | internal/entity/address_entity.go | addresses |
entity.User memuat kolom id, password, name, token, created_at, dan updated_at, serta relasi Contacts dengan foreignKey:user_id;references:id; method TableName mengembalikan "users" (internal/entity/user_entity.go:4-1613). Di sisi kontrak, UserResponse, RegisterUserRequest, UpdateUserRequest, LoginUserRequest, dan LogoutUserRequest memakai tag json dan validate dengan batas max=100 (internal/model/user_model.go:3-914).
Yang perlu diperhatikan
⚠️ Producer Kafka bersifat opsional.
NewKafkaProducermengembalikannilketikakafka.producer.enabledbernilaifalse(internal/config/kafka.go:32-3623), dan nilai itu memangfalsepadaconfig.json(config.json:36-3824).Bootstraptetap membangun use case denganuserProducerbernilainil(internal/config/app.go:34-4825), sehingga jalur pengiriman event tidak aktif pada konfigurasi bawaan.
⚠️ Handler consumer belum memproses event.
UserConsumer.Consumehanya meng-unmarshalpayload lalu mencatat log, dengan komentar// TODO process event(internal/delivery/messaging/user_consumer.go:21-3126). Efek samping bisnis dari event belum ada.
Sisi HTTP sudah lengkap sejak awal: SetupGuestRoute mendaftarkan POST /api/users dan POST /api/users/_login, sedangkan SetupAuthRoute memasang middleware lalu mendaftarkan endpoint users, contacts, dan contacts/:contactId/addresses (internal/delivery/http/route/route.go:22-4410). API spec-nya memakai OpenAPI 3.0.3 dengan server http://localhost:3000 (api/api-spec.json:1-1216). Daftar endpoint lengkap dibahas di API Spec dan Daftar Endpoint.
Halaman terkait
- Arsitektur Berlapis menjelaskan pembagian Delivery, Use Case, Repository, dan Gateway beserta aturan ketergantungannya.
- Konfigurasi dan Bootstrap merinci urutan pemanggilan di
config.Bootstrapdan isiconfig.json. - Menjalankan Aplikasi, Migrasi, dan Test memuat perintah
go run,migrate, dango test.