Skip to content

Introduction to Backend Services

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

β”œβ”€β”€ 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

Folder ini digunakan untuk mengelola koneksi database dan file migrasi.

  • 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.

Semua hal terkait database terpusat di sini agar mudah dikelola dan di-maintain.


Berisi seluruh logika utama aplikasi.

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.


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"`
}

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}
}

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 parameters
func 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.

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()
}
}

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
}

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
}

Berisi utility dan konfigurasi umum yang digunakan di seluruh aplikasi.

  • app.go β†’ konfigurasi dasar (nama app, port, dsb)
  • config.go β†’ load .env atau environment variable
  • mysql.go β†’ konfigurasi koneksi MySQL

Berisi constant global, misal nama tabel atau error code standar.

Berisi fungsi utilitas seperti string helper, hash, converter, dll.

FileDeskripsi
.gitignoreMenentukan file/folder yang diabaikan Git
go.modInformasi dependency Go module
go.sumChecksum dependency
example.envContoh konfigurasi environment
main.goEntry point aplikasi (inisialisasi config, router, server)
README.mdDokumentasi utama proyek
  1. main.go menjalankan inisialisasi konfigurasi (pkg/config).
  2. Koneksi database dibuat lewat database/database.go.
  3. Dependency diatur melalui internal/factory.
  4. Semua route diregistrasikan lewat internal/http/http.go.
  5. Server dijalankan menggunakan Gin Engine.
  • 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