Episode ini membahas hooks dan pola event-driven di Fiber v3: lifecycle hooks OnListen dan OnShutdown, hooks saat route dan group didaftarkan, custom event lewat On dan Emit, serta pemanfaatan hooks untuk instrumentasi dan observabilitas.

Di episode 6 kalian melihat hooks OnListen dan OnShutdown. Episode 15 memperluas topik ini menjadi pola event-driven: Fiber v3 meregistrasi hooks tidak hanya untuk lifecycle server, tapi juga untuk peristiwa di dalam aplikasi — seperti saat route didaftarkan — plus custom events yang bisa kalian definisikan sendiri.
Pola event-driven memisahkan "apa yang terjadi" dari "siapa yang merespons". Ini sangat berguna untuk logging, metrik, audit, dan integrasi — kode pemantauan tidak lagi tercampur di setiap handler.
Hooks lifecycle memberi titik masuk di awal dan akhir umur server. Bisa di-registrasi langsung atau berantai:
app.Hooks().OnListen(func(addr fiber.ListenOnListenData) error {
log.Printf("listening on %s", addr.Addr)
return nil
})
app.Hooks().OnShutdown(func() {
closeDB()
cancelBackgroundJobs()
})OnListen dipanggil saat server siap menerima koneksi; OnShutdown saat graceful shutdown dimulai. Keluarga lengkapnya: OnListen, OnShutdown, OnPreShutdown, OnPostShutdown, OnMount, OnUnmount, dan OnFork. Menutup sumber daya di hooks lebih rapi daripada menaruhnya di main.
Fiber v3 memunculkan hooks setiap kali route, name, atau group didaftarkan. Ini membuka pintu untuk tooling otomatis:
app.Hooks().OnRoute(func(r fiber.Route) error {
log.Printf("route terdaftar: %s %s", r.Method, r.Path)
return nil
})
app.Hooks().OnGroup(func(g *fiber.Group) error {
log.Printf("group dibuat: prefix=%s", g.Prefix)
return nil
})OnRoute dipanggil setiap route baru didaftarkan, membawa objek fiber.Route berisi method dan path. OnGroup dipanggil saat group dibuat. Dengan hooks ini, daftar endpoint bisa dihasilkan otomatis untuk dokumentasi tanpa menuliskannya manual.
Selain hooks bawaan, Fiber v3 mendukung custom events melalui On dan Emit:
app.Hooks().On("user:created", func(data any) {
metrics.Inc("user_created")
notify("user", data)
})
app.Post("/users", func(c fiber.Ctx) error {
var user User
if err := c.Bind().JSON(&user); err != nil {
return err
}
createUser(user)
app.Hooks().Emit("user:created", user)
return c.Status(fiber.StatusCreated).JSON(user)
})app.Hooks().On("user:created", fn) mendaftarkan listener; app.Hooks().Emit("user:created", user) mengirim event lengkap dengan data. Handler cukup memanggil Emit — tidak perlu tahu siapa yang mendengarkan. Menambah fitur baru (email, webhook, audit) cukup menambah listener, tanpa menyentuh handler.
Custom events akan berkembang seiring waktu. Tetapkan pola penamaan sejak awal agar mudah dilacak:
app.Hooks().On("order:placed", handleOrderPlaced)
app.Hooks().On("order:payment-failed", handlePaymentFailed)
app.Hooks().On("order:fulfilled", handleOrderFulfilled)Pola domain:tindakan — order:placed, payment-failed, fulfilled — membuat event mudah dicari dan dipetakan. Konsistensi penamaan penting saat jumlah event puluhan dan listener tersebar di banyak file.
Kombinasi hooks bawaan dan custom events membentuk lapisan observabilitas tanpa mencemari kode bisnis:
app.Hooks().OnListen(func(d fiber.ListenOnListenData) error {
metrics.Gauge("uptime", 0)
return nil
})
app.Hooks().OnRoute(func(r fiber.Route) error {
auditLog("route_registered", map[string]string{
"method": r.Method, "path": r.Path,
})
return nil
})Satu titik registrasi mencatat seluruh route untuk audit; satu listener OnListen menginisialisasi metrik. Hasilnya: log dan metrik yang konsisten, terpusat, dan mudah dihapus saat tidak dibutuhkan lagi.
curl -X POST -H "Content-Type: application/json" \
--data '{"name":"Budi"}' http://localhost:3000/usersSaat server menyala, lihat terminal: hook OnListen dan OnRoute mencetak log di startup. Saat request POST di atas diproses, event user:created memicu listener metrik dan notifikasi — semua tercatat tanpa kode tambahan di handler utama.
Inti yang harus dibawa pulang:
OnListen, OnShutdown, OnPreShutdown, OnPostShutdown, OnMount, OnUnmount, OnFork.OnRoute dan OnGroup memunculkan event saat route/group didaftarkan — berguna untuk tooling.app.Hooks().On(name, fn) dan app.Hooks().Emit(name, data).Emit; listener yang menangani efek samping.domain:tindakan menjaga event tetap tertata.Di episode 16 selanjutnya kita membahas JWT dan keamanan — middleware jwt di Fiber, validasi token, penyimpanan secret, dan praktik keamanan autentikasi API.