For the complete documentation index, see llms.txt. This page is also available as Markdown.

Database

API tanpa database hanyalah kumpulan data statis. Di bab ini kita akan menghubungkan API dengan PostgreSQL sebagai penyimpanan data permanen. Kita akan menggunakan paket database/sql bawaan Go — sederhana, performa tinggi, dan tanpa ORM yang kompleks.

Pembahasan dibagi menjadi tiga bagian:

  1. Migration – Membuat struktur tabel

  2. Seed – Mengisi data awal

  3. ListUsers – Mengambil data dari database (bukan hardcode)

📂 Kode Lengkap Bab Ini: Seluruh kode yang dibahas di bab ini tersedia di GitHub:

🔗 github.com/jacky-htg/workshop/tree/main/04-database

4.1 Menyiapkan Database

Pertama, buat database di PostgreSQL:

CREATE DATABASE workshop;

Kemudian buat fungsi koneksi. Sesuaikan user dan password dengan konfigurasi PostgreSQL Anda:

func openDB() (*sql.DB, error) {
    return sql.Open("postgres", "postgres://user:password@localhost:5432/workshop?sslmode=disable")
}

Catatan: Koneksi string di atas menggunakan format URL. Pastikan menginstal driver PostgreSQL terlebih dahulu:

go get github.com/lib/pq

4.2 Migration

Migration adalah cara version-controlled untuk membuat dan mengubah skema database. Kita akan menggunakan library go-libs/migration karena cukup sederhana.

Langkah 1: Membuat Folder dan File Migration

Buat folder migration/ di root proyek, lalu buat file 1_0001_users.sql dengan struktur penamaan:

Prefix
Kegunaan

1_

Create Table

2_

Alter Table

3_

Seed Data

Langkah 2: Isi File Migration

Langkah 3: Integrasi Migration ke main.go

Kita perlu menambahkan kemampuan menjalankan migration dari command line:

Jalankan migration:

4.3 Seed Data

Seed adalah proses mengisi data awal ke database. Buat file 3_0001_users.sql di folder migration/:

Peringatan: Password masih dalam bentuk plain text! Di bab selanjutnya kita akan membahas hashing dengan bcrypt.

Jalankan migration lagi untuk mengisi seed:

Perintah yang sama akan mengeksekusi semua file migration yang belum dijalankan (termasuk seed).

4.4 Mengambil Data dari Database

Sekarang kita ubah handler ListUsers untuk mengambil data langsung dari database, bukan hardcode.

Membuat Struct dengan Dependency Injection

Pertama, buat struct Users yang menerima koneksi database melalui dependency injection (DI). DI membuat kode lebih mudah di-test karena kita bisa mengganti dependency kapan saja.

Method List yang Terintegrasi Database

Menghubungkan ke Server

Update fungsi main untuk menggunakan userService.List sebagai handler:

4.5 Kode Lengkap main.go

4.6 Menjalankan dan Menguji

Response akan berisi data dari database PostgreSQL:

Ringkasan Bab 4

Di bab ini kita telah belajar:

  1. Migration – Mengelola skema database dengan file SQL version-controlled

  2. Seed – Mengisi data awal untuk development/testing

  3. Dependency Injection – Menyuntikkan koneksi database ke handler

  4. Database Query – Menggunakan database/sql untuk mengambil data

  5. CLI Pattern – Menambahkan perintah migrate tanpa mengganggu server HTTP

Pola penting yang diperkenalkan:

  • File migration dengan prefix numerik (urutan eksekusi jelas)

  • Struct Users sebagai receiver method (bukan fungsi global)

  • Database connection dibuat sekali di main dan di-inject

Yang akan datang:

  • ❌ Masih ada password plain text

  • ❌ Belum ada validasi input

  • ❌ Semua kode dalam satu file (akan dipisah sesuai Clean Architecture)

Pada bab berikutnya, kita akan membahas Clean Architecture — memisahkan kode ke layer-layer yang bertanggung jawab agar framework kita mudah di-maintain dan di-test.

Last updated