Belajar Echo - Setup & Hello World
Episode 3 of 23

Belajar Echo - Setup & Hello World

Saatnya menulis kode nyata: membuat aplikasi Echo pertama dengan echo.New, memasang middleware RequestLogger berbasis slog dan Recover, menulis handler yang mengembalikan teks serta JSON, dan menjalankan server di port 8080 dengan penanganan error yang benar.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Semua fondasi sudah siap: environment Go, Echo v5, dan pemahaman arsitektur. Sekarang saatnya hal yang ditunggu — menulis aplikasi Echo pertama. Di episode ini kalian akan merasakan langsung bagaimana sebuah server REST bangkit dari nol dengan kurang dari 50 baris kode.

Episode 3 ini membangun project awal yang sehat: echo.New() sebagai titik masuk, middleware RequestLogger dengan slog dan Recover, dua handler pertama yang mengembalikan teks serta JSON, dan cara menjalankan server di port 8080 beserta penanganan error yang benar.

Membuat Aplikasi Echo Pertama

echo.New() sebagai Titik Masuk

Semua aplikasi Echo dimulai dari echo.New(). Fungsi ini membuat instance echo.Echo lengkap dengan router, binder default, dan konfigurasi bawaan. Instance inilah yang kalian konfigurasi dengan middleware, route, dan validator.

main.go: aplikasi Echo minimal
package main
 
import (
	"net/http"
 
	"github.com/labstack/echo/v5"
)
 
func main() {
	e := echo.New()
 
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, Echo!")
	})
 
	e.Logger.Fatal(e.Start(":8080"))
}

Simpan sebagai main.go lalu jalankan:

Menjalankan server Echo
go run .

Buka terminal lain dan uji:

Menguji endpoint dengan curl
curl http://localhost:8080/

Jika semua berjalan, kalian akan melihat Hello, Echo! di layar. Perhatikan pola e.Logger.Fatal(e.Start(":8080")): e.Start memblokir proses hingga server berhenti, dan error hanya muncul jika server gagal berjalan.

Middleware Dasar yang Wajib Ada

RequestLogger dengan slog

Aplikasi Echo yang sehat tidak pernah berjalan tanpa logging. Di Echo v5, middleware.RequestLogger memakai log/slog standar Go — ini salah satu pembaruan besar yang tidak ada di v4. Konfigurasikan field log yang benar-benar berguna:

RequestLogger berbasis slog
e.Use(middleware.RequestLoggerWithConfig(middleware.RequestLoggerConfig{
	LogMethod:  true,
	LogURIPath: true,
	LogStatus:  true,
	LogLatency: true,
	LogValuesFunc: func(c echo.Context, v middleware.RequestLoggerValues) error {
		slog.Info("request",
			"method", v.Method,
			"uri", v.URIPath,
			"status", v.Status,
			"latency", v.Latency.String(),
		)
		return nil
	},
}))

Middleware ini mencatat metode, path, status, dan latensi setiap request. Dengan slog, log dihasilkan dalam format terstruktur yang siap diolah mesin — sesuatu yang akan kalian manfaatkan penuh di episode 11 dan 18.

Recover untuk Mencegah Crash

Handler yang panic tidak boleh menghentikan server. middleware.Recover menangkap panic, mengubahnya menjadi respons error 500, dan mencatat stack trace sehingga server tetap hidup:

Pasang Recover setelah logger
e.Use(middleware.Recover())

Pasang Recover segera setelah RequestLogger — urutan ini memastikan panic tetap tercatat oleh logger sebelum ditangani.

Handler Pertama: Teks dan JSON

Mengembalikan Berbagai Tipe Respons

Handler adalah jantung aplikasi. Echo menyediakan helper untuk setiap tipe respons. Dua yang paling dasar: c.String untuk teks polos dan c.JSON untuk data terstruktur.

Handler teks dan JSON
e.GET("/ping", func(c echo.Context) error {
	return c.String(http.StatusOK, "pong")
})
 
type Health struct {
	Status  string `json:"status"`
	Service string `json:"service"`
}
 
e.GET("/health", func(c echo.Context) error {
	return c.JSON(http.StatusOK, Health{
		Status:  "ok",
		Service: "belajar-echo",
	})
})

Pada kode di atas, c.JSON mengeserialisasi struct menjadi JSON dengan bantuan struct tag json. Respons yang dihasilkan terlihat seperti {"status":"ok","service":"belajar-echo"}.

Pola Mengembalikan Error dari Handler

Perhatikan satu kebiasaan penting: handler mengembalikan error, tidak menuliskannya sendiri. Ini adalah filosofi centralized error handling Echo. Saat binding atau logika bisnis gagal, handler cukup return err dan framework yang memutuskan respons akhirnya.

Handler yang mengembalikan error
e.GET("/error", func(c echo.Context) error {
	return echo.NewHTTPError(http.StatusBadRequest, "bad request")
})

echo.NewHTTPError membuat error terpusat dengan status code dan pesan. Detail lengkap tentang cara menyesuaikan respons error akan dibahas di episode 11.

Menjalankan Server dengan Benar

Port dan Konfigurasi Dasar

e.Start(":8080") menjalankan server di port 8080. Perhatikan format :8080 tanpa host — Echo akan mendengarkan di semua interface, baik IPv4 maupun IPv6. Saat port 8080 sibuk, e.Start mengembalikan error dan kalian bisa melihatnya lewat e.Logger.Fatal.

Uji beberapa metode sekaligus untuk merasakan bagaimana router menangani route:

Menguji beberapa route
curl http://localhost:8080/ping
curl http://localhost:8080/health
curl -i http://localhost:8080/tidak-ada

Request ke /tidak-ada akan menghasilkan 404. Ini adalah HTTPError default yang dikelola router saat tidak ada route yang cocok.

Rangkuman Project Pertama

Struktur Aplikasi yang Baru Saja Dibangun

Aplikasi yang kalian bangun sekarang memiliki tiga lapisan yang akan berkembang sepanjang series:

  • Middleware: RequestLogger untuk log, Recover untuk stabilitas.
  • Route: /, /ping, /health, dan /error.
  • Handler: fungsi anonim yang mengembalikan teks atau JSON.
Membersihkan format kode
gofmt -w main.go
go vet ./...

Biasakan menjalankan gofmt -w main.go dan go vet sebelum setiap commit. Kode yang bersih dan terverifikasi akan mempermudah seluruh episode berikutnya.

Penutup

Episode 3 menandai awal menulis kode nyata: aplikasi Echo pertama dengan echo.New(), middleware RequestLogger berbasis slog dan Recover, handler yang mengembalikan teks serta JSON, pola mengembalikan error dari handler, dan server yang berjalan di port 8080.

Inti yang harus dibawa pulang:

  • Semua aplikasi Echo dimulai dari echo.New().
  • e.Start(":8080") menjalankan server; error dibungkus e.Logger.Fatal.
  • RequestLogger di v5 memakai log/slog terstruktur.
  • Recover mengubah panic menjadi respons 500 tanpa mematikan server.
  • Handler selalu mengembalikan error, tidak menuliskannya sendiri.
  • c.String untuk teks, c.JSON untuk data terstruktur.

Di episode 4 selanjutnya kita akan membahas routing & URL parameters — path parameter dengan :id, wildcard, matching berbasis regex, query parameter, route group, dan virtual host. Inilah saat router radix tree mulai benar-benar menunjukkan keunggulannya.

Belajar Echo - Setup & Hello World | Belajar Echo