Configuration
Selama ini kita menulis konfigurasi seperti port server dan koneksi database secara hardcoded โ langsung ditulis dalam kode. Ini masalah besar karena:
Berbeda antara laptop developer (development) dengan server produksi
Konfigurasi rahasia (password database) tidak boleh masuk ke repository Git
Mengganti konfigurasi memerlukan compile ulang kode
Solusinya adalah membaca konfigurasi dari environment variable dan file .env.
๐ Kode Lengkap Bab Ini: Seluruh kode yang dibahas di bab ini tersedia di GitHub:
๐ github.com/jacky-htg/workshop/tree/main/06-configuration
6.1 Strategi Konfigurasi
Development
File .env
APP_PORT=9000
Production
Environment variable
export APP_PORT=8080
Container (Docker)
Environment variable
-e APP_PORT=8080
Pola yang akan kita terapkan:
Baca file
.envjika ada (untuk development)Jika variabel yang sama diset di environment, nilai environment lebih prioritas
Setiap konfigurasi memiliki nilai default (fallback)
6.2 Library yang Digunakan
Kita akan menggunakan dua library:
godotenvโ membaca file.envgo-libs/envโ wrapper yang memberi prioritas ke environment variable
Install dependency:
6.3 File .env
Buat file .env di root proyek:
Keamanan: Jangan commit file .env ke Git! Tambahkan .env ke .gitignore.
6.4 Struct Konfigurasi
Buat folder config/ dan file config/config.go. Struct ini akan mengelompokkan konfigurasi berdasarkan domainnya:
Pola ini penting: Dengan mengelompokkan konfigurasi, kita bisa dengan mudah melewatkan cfg.Server atau cfg.Database ke fungsi yang membutuhkan, bukan seluruh Config.
6.5 Fungsi LoadConfig
Fungsi LoadConfig akan membaca environment (dan file .env jika ada), lalu mengembalikan struct Config yang sudah terisi:
Perhatikan setiap nilai memiliki fallback default โ parameter kedua di env.EnvInt, env.EnvDuration, dll.
6.6 Update Package Database
Ubah pkg/database/postgre.go untuk menerima konfigurasi:
Penjelasan tambahan tentang connection pool:
MaxOpenConns โ maksimal koneksi aktif ke database (25 adalah nilai yang baik untuk aplikasi skala sedang)
MaxIdleConns โ koneksi idle yang disimpan untuk dipakai ulang
ConnMaxLifetime โ maksimal umur koneksi (mencegah koneksi stale)
ConnMaxIdleTime โ waktu maksimal koneksi idle sebelum ditutup
6.7 Update CLI dan Server
cmd/cli/main.go
cmd/cli/main.gocmd/server/main.go
cmd/server/main.goPerhatikan bahwa GracefulShutdownTimeout sekarang juga dibaca dari konfigurasi (tidak hardcoded 30 detik lagi).
6.8 Menjalankan Aplikasi
Ringkasan Bab 6
Di bab ini kita telah belajar:
Environment variable
Prioritas tertinggi, aman untuk production
File .env
Untuk development, tidak di-commit
Default values
Fallback jika variabel tidak diset
Struct grouping
ServerConfig, DatabaseConfig โ mudah di-passing
Connection pool
SetMaxOpenConns, SetMaxIdleConns, dll
Manfaat yang kita peroleh:
โ Tidak ada lagi hardcoded configuration
โ Password database bisa disimpan di environment (aman)
โ Port, timeout, dan koneksi database bisa diubah tanpa recompile
โ Connection pool database bisa diatur sesuai beban
โ Satu kode berjalan di development dan production
Yang akan datang:
โ Belum ada log yang terstruktur (masih pakai log.Printf)
โ Belum ada error handling yang konsisten
Pada bab berikutnya, kita akan membahas pola penggunaan log.Fatal yang disiplin dan terpusat.
Last updated