Lompat ke konten
dokumentasi.id
Commit 43aad26
v1
Star1,1 rb

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-9). 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-21). 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.
Fig. 1: Komponen template dan direktori asalnyaconfig.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-26). Di dalamnya dibuat tiga repository, tiga use case, tiga controller, satu middleware middleware.NewAuth, lalu routeConfig.Setup() dipanggil (internal/config/app.go:28-66). cmd/web/main.go menyiapkan Viper, logger, database, validator, Fiber, dan producer sebelum memanggil Bootstrap, kemudian mendengarkan web.port (cmd/web/main.go:8-29). Nilai web.port pada config.json adalah 3000 dengan prefork bernilai false (config.json:5-8).

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-41). Ketiga goroutine tersebut memanggil messaging.ConsumeTopic untuk topik users, contacts, dan addresses (cmd/worker/main.go:43-61).

Direktori dan perannya

Direktori atau berkasPeranRujukan
cmd/webEntrypoint server HTTP Fibercmd/web/main.go:8-29
cmd/workerEntrypoint consumer Kafka dengan graceful shutdowncmd/worker/main.go:16-41
internal/configPemuat konfigurasi, koneksi database, Kafka, logger, validator, Fiberinternal/config/viper.go:11-25
internal/delivery/httpController HTTP dan middleware authinternal/delivery/http/route/route.go:22-44
internal/delivery/messagingConsumer per topikcmd/worker/main.go:43-61
internal/usecaseLogika bisnis per entitasinternal/config/app.go:45-48
internal/repositoryAkses data lewat GORMinternal/config/app.go:29-32
internal/entityStruct yang dipetakan ke tabelinternal/entity/user_entity.go:4-16
internal/modelRequest/response dan eventinternal/model/user_model.go:3-9
internal/gateway/messagingProducer Kafka per entitasinternal/gateway/messaging/user_producer.go:14-21
apiAPI spec OpenAPIapi/api-spec.json:1-12
db/migrationsMigration SQLREADME.md:47-49
testUnit test yang dijalankan lewat go test -v ./test/README.md:63-69

Konfigurasi dibaca oleh NewViper dari berkas bernama config bertipe json, dengan dua jalur pencarian yaitu ./../ dan ./ (internal/config/viper.go:11-25). Koneksi database dibangun dari kunci database.* dan pool-nya diatur lewat SetMaxIdleConns, SetMaxOpenConns, serta SetConnMaxLifetime (internal/config/gorm.go:14-49).

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-37). Versi yang benar-benar di-require oleh go.mod adalah Go 1.25 dengan modul golang-clean-architecture (go.mod:1-16):

LibraryVersi di go.modKegunaan
github.com/gofiber/fiber/v2v2.52.9HTTP framework
gorm.io/gormv1.30.1ORM
gorm.io/driver/mysqlv1.6.0Driver MySQL untuk GORM
github.com/IBM/saramav1.46.0Kafka client
github.com/spf13/viperv1.20.1Pembacaan konfigurasi
github.com/go-playground/validator/v10v10.27.0Validasi request
github.com/sirupsen/logrusv1.9.3Logger
github.com/google/uuidv1.6.0Pembuatan identifier
golang.org/x/cryptov0.41.0bcrypt untuk password
github.com/stretchr/testifyv1.11.0Assertion pada test

Golang Migrate tidak muncul di blok require go.mod (go.mod:5-16); README memakainya sebagai perintah CLI migrate create dan migrate ... up (README.md:47-49).

Entitas dan topik

Tiga entitas bisnis dipetakan ke tiga topik Kafka yang namanya ditentukan saat consumer dijalankan (cmd/worker/main.go:43-61). Producer juga menetapkan topik yang sama, misalnya UserProducer memakai Topic: "users" (internal/gateway/messaging/user_producer.go:14-21).

EntitasBerkasTopic Kafka
Userinternal/entity/user_entity.gousers
Contactinternal/entity/contact_entity.gocontacts
Addressinternal/entity/address_entity.goaddresses

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-16). Di sisi kontrak, UserResponse, RegisterUserRequest, UpdateUserRequest, LoginUserRequest, dan LogoutUserRequest memakai tag json dan validate dengan batas max=100 (internal/model/user_model.go:3-9).

Yang perlu diperhatikan

⚠️ Producer Kafka bersifat opsional. NewKafkaProducer mengembalikan nil ketika kafka.producer.enabled bernilai false (internal/config/kafka.go:32-36), dan nilai itu memang false pada config.json (config.json:36-38). Bootstrap tetap membangun use case dengan userProducer bernilai nil (internal/config/app.go:34-48), sehingga jalur pengiriman event tidak aktif pada konfigurasi bawaan.

⚠️ Handler consumer belum memproses event. UserConsumer.Consume hanya meng-unmarshal payload lalu mencatat log, dengan komentar // TODO process event (internal/delivery/messaging/user_consumer.go:21-31). 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-44). API spec-nya memakai OpenAPI 3.0.3 dengan server http://localhost:3000 (api/api-spec.json:1-12). Daftar endpoint lengkap dibahas di API Spec dan Daftar Endpoint.

Halaman terkait