Episode ini membedah arsitektur Echo dari dalam: bagaimana echo.Echo menjadi net/http handler, cara router radix tree mencocokkan path, urutan eksekusi rantai middleware, hingga peran echo.Context yang membungkus request dan response di setiap handler.

Sebelum menulis kode, kalian perlu memahami apa yang terjadi di balik layar. Echo sering disebut "web framework", tapi sebenarnya dia adalah lapisan tipis yang mengatur bagaimana request HTTP standar diproses. Memahami arsitektur ini akan membuat debugging jauh lebih mudah di seluruh series.
Episode 2 ini membedah arsitektur Echo dari dalam: bagaimana instance echo.Echo menjadi net/http handler, bagaimana router radix tree mencocokkan path, bagaimana rantai middleware dieksekusi di root, group, dan route, serta peran echo.Context yang membungkus request dan response.
Alur sebuah request di Echo sederhana tapi presisi:
net/http server menerima request dan memanggil handler Echo.echo.Context yang siap pakai.Di Echo v5, signature handler adalah func(echo.Context) error. Perhatikan bahwa di v5 echo.Context selalu berupa pointer *echo.Context, perubahan penting dari v4 yang akan kita bahas di episode 20.
func handler(c echo.Context) error {
return c.String(200, "selamat datang di Echo")
}Handler menerima context, melakukan sesuatu, lalu mengembalikan error. Fungsi handler(c echo.Context) error adalah kontrak dasar seluruh aplikasi Echo — tidak ada panic tersembunyi, semua kegagalan dialirkan sebagai error.
Inti performa Echo ada di router. Router memakai struktur radix tree — trie terkompresi — di mana setiap node mewakili segmen path. Pencocokan dilakukan per karakter dalam satu lintasan, bukan dengan iterasi daftar route.
Setiap node menyimpan metode HTTP yang didukung, handler, dan metadata middleware. Saat route terdaftar, Echo menyisipkannya ke dalam tree sesuai pola path. Inilah mengapa e.GET("/users/:id") dan e.GET("/users/:id/posts") tidak saling bertabrakan — keduanya adalah node berbeda di cabang yang sama.
e := echo.New()
e.GET("/users/:id", getUser)
e.GET("/users/:id/posts", getPosts)Saat request /users/42 masuk, router menelusuri tree, menemukan node :id, dan mengisi nilai parameter 42. Nilai ini diambil handler lewat c.Param("id").
Salah satu keunggulan Echo: prioritas rute otomatis. Jika kalian mendaftarkan /users/new dan /users/:id, rute statis new diutamakan ketika request datang ke /users/new — tanpa perlu urutan pendaftaran khusus. Ini berbeda dengan beberapa framework lain yang bergantung pada urutan deklarasi.
Middleware Echo tersusun seperti lapisan bawang. Eksekusi dimulai dari middleware paling luar, turun melalui c.Next(), sampai handler, lalu naik kembali. Lokasi pemasangan menentukan posisi di rantai:
e.Pre: middleware sebelum routing, dijalankan paling awal.e.Use: middleware di level root, berlaku untuk semua route.group.Use: middleware khusus group.e := echo.New()
e.Pre(middleware.RemoveTrailingSlash())
e.Use(middleware.Logger())
api := e.Group("/api", middleware.CORS())
api.GET("/health", healthHandler)Pada kode di atas, RemoveTrailingSlash berjalan sebelum routing, Logger untuk semua request, dan CORS hanya untuk route di dalam group /api. Ini adalah pola yang akan kalian pakai terus-menerus.
echo.Context adalah objek paling sering kalian sentuh. Dia membungkus request (c.Request()), response (c.Response()), parameter route, query, dan data yang ditaruh di dalamnya.
Di Echo v5, context adalah pointer *echo.Context, yang membuatnya lebih ringan untuk dioper dan disimpan. Context menyediakan sekumpulan method yang akan menemani kalian sepanjang series:
name := c.Param("name")
q := c.QueryParam("q")
body := new(User)
if err := c.Bind(body); err != nil {
return err
}
return c.JSON(200, body)Method seperti c.Param, c.QueryParam, c.Bind, dan c.JSON adalah permukaan API yang paling banyak dipakai — detailnya akan dibedah satu per satu di episode 4, 5, dan 7.
Arsitektur Echo dapat diringkas dalam komponen-komponen berikut:
func(echo.Context) error yang berisi logika aplikasi.Semua komponen ini bisa diganti atau disesuaikan. Binder, validator, dan renderer bersifat pluggable — kalian akan memanfaatkan ini mulai episode 5.
cd belajar-echo
go mod tidyJalankan go mod tidy untuk membersihkan dependency sebelum menulis kode di episode berikutnya.
Episode 2 membuka selubung arsitektur Echo: echo.Echo adalah net/http handler, router radix tree mencocokkan path dalam satu lintasan dengan prioritas otomatis, middleware tersusun berlapis di pre, root, group, dan route, serta echo.Context menjadi jembatan utama antara request, response, dan handler.
Inti yang harus dibawa pulang:
echo.Echo dibungkus menjadi net/http handler standar.e.Pre, e.Use, group.Use, dan route middleware punya cakupan berbeda.echo.Context adalah pointer *echo.Context.Di episode 3 selanjutnya kita akan membangun setup & hello world — project Echo pertama dengan echo.New(), middleware RequestLogger berbasis slog dan Recover, handler pertama yang mengembalikan teks dan JSON, serta menjalankan server di port 8080. Persiapan selesai, saatnya menulis kode nyata!