Introduction to Backend Services
ποΈ Repository Structure
Section titled βποΈ Repository StructureβBase Project Structure for Golang (Gin Framework)
Repository ini digunakan sebagai base project untuk pengembangan aplikasi backend menggunakan Golang dan Gin.
Struktur ini dirancang agar modular, scalable, dan mudah dikembangkan oleh banyak developer.
π¦ Repository URL:
https://gitlab.komerce.id/backend/golang-arch
π Project Structure
Section titled βπ Project Structureβ βββ database/ β βββ migration/ β β βββ migrations_file/ β β βββ migration.go β βββ database.go β βββ type.go βββ internal/ β βββ app/ β β βββ feature β β βββ handler.go β β βββ router.go β β βββ service.go β β βββ formatter.go β βββ dto/ β β βββ common.go β β βββ user.go β βββ factory/ β β βββ factory.go β βββ http/ β β βββ http.go β βββ middleware/ β β βββ middleware.go β βββ model/ β β βββ entity.go β β βββ common.go β βββ repository/ β βββ repository.go βββ pkg/ β βββ config/ β β βββ app.go β β βββ config.go β β βββ mysql.go β βββ consts/ β β βββ mysql.go β βββ util/ β βββ util.go βββ .gitignore βββ go.mod βββ go.sum βββ example.env βββ main.go βββ readme.mdπ Directory Explanation
Section titled βπ Directory ExplanationβποΈ database/
Section titled βποΈ database/βFolder ini digunakan untuk mengelola koneksi database dan file migrasi.
Struktur:
Section titled βStruktur:βmigration/migrations_file/β Menyimpan seluruh file migrasi database.migration/migration.goβ Menjalankan semua file migrasi.database.goβ Inisialisasi koneksi database (MySQL, PostgreSQL, dll).type.goβ Tipe dan konfigurasi tambahan yang terkait database.
Tujuan:
Section titled βTujuan:βSemua hal terkait database terpusat di sini agar mudah dikelola dan di-maintain.
π§© internal/
Section titled βπ§© internal/βBerisi seluruh logika utama aplikasi.
π¦ app/
Section titled βπ¦ app/βBerisi folder untuk masing-masing feature/module seperti user, auth, product, dll.
Setiap feature berisi:
handler.goβ Menangani request & response HTTP.router.goβ Mendaftarkan route per feature.service.goβ Menyimpan logika bisnis (business logic).formatter.goβ Mengatur format response ke client.
π§ Prinsip:
Setiap feature harus terisolasi dan independen agar mudah dikembangkan dan diuji.
π dto/ (Data Transfer Object)
Section titled βπ dto/ (Data Transfer Object)βMenampung struct untuk memvalidasi dan mentransfer data antar layer:
- Struct untuk menerima request body / query param.
- Struct untuk mengembalikan response ke client.
Contoh:
type CreateUserRequest struct { Name string `json:"name" binding:"required"` Email string `json:"email" binding:"required,email"`}π factory/
Section titled βπ factory/βBerisi dependency injection untuk repository, service, dan resource lain seperti config atau database. Dengan ini, dependency cukup didefinisikan satu kali dan bisa digunakan di mana saja.
func NewFactory() *Factory { db := database.InitDB() userRepo := repository.NewUserRepository(db) return &Factory{UserRepository: userRepo}}π http/
Section titled βπ http/βTempat semua route dari setiap feature diregistrasikan ke Gin Engine. Selain itu, file ini juga berfungsi untuk menambahkan middleware global seperti logging dan recovery.
// Here we define route function for user Handlers that accepts gin.Engine and factory parametersfunc NewHttp(g *gin.Engine, f *factory.Factory) { // Definisikan router group API v1 v1 := g.Group("/api/v1")
// Registrasi route dari feature user user.NewHandler(f).Router(v1.Group("/user"))}Best Practice
- Gunakan router group untuk versioning API.
- Pisahkan setiap feature di internal/app.
- Gunakan middleware custom agar log lebih informatif.
- Hindari panic di handler β gunakan error handling di service layer.
π§± middleware/
Section titled βπ§± middleware/βBerisi middleware custom seperti:
- JWT Authentication
- Authorization
- API Key Validation
- CORS Handling
- Custom Logging
Contoh:
func JWTAuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // Validasi token JWT c.Next() }}𧬠model/
Section titled β𧬠model/βMenyimpan semua entity struct yang merepresentasikan tabel database. Biasanya digunakan oleh ORM seperti GORM. Contoh:
type User struct { ID uint `gorm:"primaryKey"` Name string Email string `gorm:"unique"` CreatedAt time.Time}πΎ repository/
Section titled βπΎ repository/βBerisi semua query dan operasi database (CRUD). Dengan repository pattern, logika akses data terpisah dari business logic.
Contoh:
func (r *UserRepository) FindByEmail(email string) (*model.User, error) { var user model.User if err := r.db.Where("email = ?", email).First(&user).Error; err != nil { return nil, err } return &user, nil}βοΈ pkg/
Section titled ββοΈ pkg/βBerisi utility dan konfigurasi umum yang digunakan di seluruh aplikasi.
π config/
Section titled βπ config/β- app.go β konfigurasi dasar (nama app, port, dsb)
- config.go β load .env atau environment variable
- mysql.go β konfigurasi koneksi MySQL
π consts/
Section titled βπ consts/βBerisi constant global, misal nama tabel atau error code standar.
π util/
Section titled βπ util/βBerisi fungsi utilitas seperti string helper, hash, converter, dll.
π§Ύ File Root
Section titled βπ§Ύ File Rootβ| File | Deskripsi |
|---|---|
.gitignore | Menentukan file/folder yang diabaikan Git |
go.mod | Informasi dependency Go module |
go.sum | Checksum dependency |
example.env | Contoh konfigurasi environment |
main.go | Entry point aplikasi (inisialisasi config, router, server) |
README.md | Dokumentasi utama proyek |
π Alur Eksekusi Aplikasi
Section titled βπ Alur Eksekusi Aplikasiβ- main.go menjalankan inisialisasi konfigurasi (pkg/config).
- Koneksi database dibuat lewat database/database.go.
- Dependency diatur melalui internal/factory.
- Semua route diregistrasikan lewat internal/http/http.go.
- Server dijalankan menggunakan Gin Engine.
π§ Best Practices
Section titled βπ§ Best Practicesβ- Gunakan Dependency Injection (factory pattern) untuk menjaga modularitas.
- Pisahkan handler, service, repository agar mudah di-maintain.
- Gunakan DTO untuk validasi input & output data.
- Simpan semua file migration di database/migration/migrations_file.
- Simpan konfigurasi sensitif di .env.
- Gunakan middleware custom agar log dan error lebih terstruktur.
π Last Updated: 2025-10-30 π§βπ» Maintained by: Backend Team β Komerce