Proyek: Aplikasi Go dan PostgreSQL

REST API katalog item yang ditulis dengan Go standar (net/http) dan PostgreSQL lewat driver jackc/pgx/v5. Aplikasi menjalankan migrasi skema secara otomatis saat startup, siap menerima SIGTERM dengan graceful shutdown, dan diuji lewat integration test black-box yang berjalan sebagai service Compose terpisah.

Struktur Berkas #

BerkasPeran
main.goKonfigurasi environment, routing, graceful shutdown
database.goKoneksi dengan retry dan runner migrasi schema_migrations
handlers.goHandler HTTP untuk seluruh endpoint
go.mod / go.sumDefinisi dan checksum dependensi
migrations/001_create_items.sqlSkema awal tabel items
tests/integration_test.goTest black-box HTTP
DockerfileBuild multi-stage (builder Go → runtime Alpine)
compose.yamlService app, db, dan test (profile)
.dockerignoreMembatasi build context

Endpoint #

MetodePathKeterangan
GET/healthzCek kesehatan aplikasi dan database
GET/api/itemsDaftar seluruh item
POST/api/itemsBuat item baru (body: name, note)
GET/api/items/{id}Ambil satu item (404 jika tidak ada)

Menjalankan #

Password database diambil dari environment; paling mudah lewat berkas .env:

bash
echo 'POSTGRES_PASSWORD=rahasia123' > .env
docker compose up -d --build

Menguji #

bash
curl -s http://localhost:8080/healthz
curl -s -X POST http://localhost:8080/api/items \
  -H 'Content-Type: application/json' \
  -d '{"name":"Kopi Torabika","note":"favorit pelanggan"}'
curl -s http://localhost:8080/api/items
curl -s http://localhost:8080/api/items/1

Hasil yang diharapkan: healthz mengembalikan {"status":"ok"}, POST mengembalikan 201 dengan item ber-id 1, daftar memuat item tersebut, dan GET /api/items/999 mengembalikan 404.

Integration Test #

Test menembak HTTP aplikasi dari container golang terpisah dengan profile test (aplikasi dan database tetap berjalan):

bash
docker compose --profile test run --rm test

Membersihkan #

bash
docker compose down          # volume db-data tetap ada
docker compose down -v       # sekaligus menghapus data