Go Webserver Boilerplate
Created for: Departemen Transformasi Digital Universitas Indonesia Updated At: 21 February 2025
Pendahuluan
Repositori ini digunakan sebagai referensi project menggunakan golang.
Prerequisites
Package list
- Fiber v3
- Gorm (ORM)
- go-dotenv
Memulai
Install seluruh software yang terdapat di prerequisites. Khusus **windows gunakan git bash
selama menjalankan project**
Clone repository
git clone git@gitlab.ui.ac.id:dtd/go-webserver-boilerplate.git
Build example
make build <app-name>
Start Project
Environment Variable
- Salin
.env
dari.env.example
cp .env.example .env
- Isi seluruh value yang dibutuhkan di .env
Start binary
./bin/<app-name>
Dokumentasi
Migrasi
Migrasi pada projek ini menggunakan goose, untuk membuat migrasi jalankan
goose --dir migration/postgres <migration-name> sql
isi file sql yang di-generate oleh goose di folder migration/postgres
Menjalankan migrasi
make migration-postgres
Memeriksa status migrasi
make migration-postgres-status
Struktur Folder
|- cmd/
| |- app-1/
| | |- main.go (entrypoint untuk aplikasi app-1)
| |- <app-lain>
|- internal/
| |- domain/
| | |-base.go
| | |-error.go
| |- handler/
| | |-specification
| | |-base.go
| | |-error.go
| |-repository/
| | |-postgresql/
| |-service/
|- migration/
|-postgres/
cmd
Folder ini digunakan sebagai kumpulan apps yang nantinya dapat dijalankan.
Contoh:
- app-1: Fiber
- app-2: Scheduler
- app-3: worker
Setiap apps, harus memiliki file entrypoint atau package main.
internal
Folder ini digunakan sebagai kumpulan core logic yang nantinya akan digunakan untuk setiap apps. Sehingga, jika app-1 dan app-2 memiliki logic yang sama, dapat berbagi core logic.
domain
Folder ini digunakan sebagai kontrak
dari setiap module yang nantinya akan diimplementasi. Contoh nama file user.go
auth.go
.
Dalam satu file di domain, setidaknya harus memiliki:
package domain
type User struct {
ID int
IdentityNumber string
Email string
Name string
}
type UserService interface {}
type UserRepository interface {}
UserService
interface tersebut berisi function yang nantinya akan diimplementasi di folder service
.
UserRepository
interface tersebut berisi function yang nantinya akan diimplementasi di folder repository
.
handle
Folder ini digunakan sebagai handler
untuk setiap apps.
Contohnya adalah UserHandler
digunakan untuk handle api/v1/user
Jika terdapat dependencies injection maka type
yang digunakan adalah interface
yang terdapat di domain.
repository
Folder ini digunakan untuk mengakses database
, didalam folder ini kontrak
yang dibuat di domain harus diimplementasi sesuai dengan driver yang digunakan.
Contoh:
- Pada example project ini, terdapat driver
postgresql
menggunakan gorm. Sehingga terdapat packagepostgresql
dan terdapat fileuser.go
untuk mengimplementasikan user repository yang terdapat di domain user.
service
Folder ini digunakan untuk business logic dari aplikasi. Suatu service harus mengimplementasikan kontrak UserService
yang dibuat di domain.User
.
Jika terdapat dependencies injection maka type
yang digunakan adalah interface
yang terdapat di domain.
migration
Kumpulan migration untuk database. Migration digunakan untuk memastikan perubahan database dapat dikelola dengan baik.
postgres
Migration yang berkaitan dengan database PostgreSQL