pemrograman

09 Membuat Konfigurasi HTTP Router, HTTP Server dan Koneksi Database

Pada tahapan ini kita akan membuat main fungsi dari projek yang sudah kita buat. Pada fungsi main kita akan menambahkan beberapa inisialisasi fungsi yang memang pada main fungsi itu digunakan untuk menginisialisasi semua resources yang dibutuhkan oleh projek misalkan koneksi database, inisialisasi handler, usecase dan repository yang sebelumnya sudah kita buat.

HTTP Router yang kita gunakan pada projek kali ini yaitu

	github.com/julienschmidt/httprouter

Jadi kita perlu menambahkan terlebih dahulu package tersebut ke dalam projek kita dengan menggunakan perintah golang module.

	go get github.com/julienschmidt/httprouter

Konfigurasi HTTP Router dan HTTP ServerA

Pertama, kita buat file main.go pada folder cmd lalu isi file tersebut dengan kode dibawha ini.

package cmd

import (
	"database/sql"

	"github.com/julienschmidt/httprouter"
	httpHandler "github.com/santekno/learn-golang-restful/delivery/http"
	mysqlRepository "github.com/santekno/learn-golang-restful/repository/mysql"
	articleUsecase "github.com/santekno/learn-golang-restful/usecase/article"
)

func main() {
	router := httprouter.New()

	repository := mysqlRepository.New(&sql.DB{})
	articleUsecase := articleUsecase.New(repository)
	articleHandler := httpHandler.New(articleUsecase)

	router.GET("/api/articles", articleHandler.GetAll)
	router.GET("/api/articles/:article_id", articleHandler.GetByID)
	router.POST("/api/articles/", articleHandler.Store)
	router.PUT("/api/articles/:article_id", articleHandler.Update)
	router.DELETE("/api/articles/:article_id", articleHandler.Delete)

  server := http.Server{
		Addr:    "localhost:3000",
		Handler: router,
	}

	err := server.ListenAndServe()
	if err != nil {
		panic(err)
	}
}

Bisa kita lihat pertama inisialisasi yang dilakukan yaitu

	router := httprouter.New()

Inisialisasi httprouter ini dilakukan setiap ada inisialisasi REST API jika kita menggunakan package dari julienschmidt/httprouter.

Selanjutnya kita inisialisasi repository, usecase dan handler layer yang sebelumnya sudah kita buat.

	repository := mysqlRepository.New(&sql.DB{})
	articleUsecase := articleUsecase.New(repository)
	articleHandler := httpHandler.New(articleUsecase)

Pada inisialisasi repository kita perlu menambahkan koneksi database ke dalam layer tersebut yang akan dijelaskan di bagaian konfigurasi koneksi database.

Dilanjutkan dengan membuat setiap endpoint yang sebelumnya kita definisikan menggunakan API Spesification. Pastikan method dan entrypoint yang dibuat sama seperti pada dokumentasi.

	router.GET("/api/articles", articleHandler.GetAll)
	router.GET("/api/articles/:article_id", articleHandler.GetByID)
	router.POST("/api/articles/", articleHandler.Store)
	router.PUT("/api/articles/:article_id", articleHandler.Update)
	router.DELETE("/api/articles/:article_id", articleHandler.Delete)

Dan yang terakhir yaitu HTTP Server untuk membuat REST API server kita ke publik dengan konfigurasi seperti ini.

  server := http.Server{
    Addr:    "localhost:3000",
    Handler: router,
  }

  err := server.ListenAndServe()
  if err != nil {
    panic(err)
  }

Konfigurasi Koneksi Database MySQL

Pada koneksi database ini kita menggunakan package tambahan agar mendukung koneksi ke dalam database MySQL yaitu

github.com/go-sql-driver/mysql 

Maka kita perlu menambahkan terlebih dahulu package/libary tersebut dengan perintah ini.

go get github.com/go-sql-driver/mysql 

Lalu kita buat folder pkg/database dan buat file mysql.go lalu isi file tersebut dengan kode dibawah ini.

package database

import (
	"database/sql"
	"os"

	"gorm.io/driver/mysql"
)

unc New() *sql.DB {
	cfg := mysql.Config{
		User:                 os.Getenv("DATABASE_USER"),
		Passwd:               os.Getenv("DATABASE_PASS"),
		Net:                  "tcp",
		Addr:                 os.Getenv("DATABASE_ADDRESS"),
		DBName:               os.Getenv("DATABASE_NAME"),
		AllowNativePasswords: true,
		ParseTime:            true,
	}

	var err error
	db, err := sql.Open("mysql", cfg.FormatDSN())
	if err != nil {
		log.Fatal(err)
	}

	pingErr := db.Ping()
	if pingErr != nil {
		log.Fatal(pingErr)
	}

	fmt.Println("Connected!")
	return db
}

Pada projek ini kita hanya melakukan konfigurasi dasar saja diantaranya yaitu

KonfigurasiInformasi
Useruser koneksi yang dibutuhkan untuk ke database mysql
Passwdpassowrd untuk user yang dibutuhkan untuk koneksi ke database mysql
Netprotokol yang digunakan untuk koneksi ke database
Addralamat yang menunjukkan server dari database
DBNamenama dari database yang dituju

Selanjutnya tambahkan koneksi database tersebut ke dalam file main.go dan ubah fungsi main() seperti dibawah ini.

func main() {
	// inisialisasi http router
	router := httprouter.New()

	// inisialisasi database
	db := database.New()

	// inisialisasi repository
	repository := mysqlRepository.New(db)
	// inisialisasi usecase
	articleUsecase := articleUsecase.New(repository)
	// inisialisasi handler
	articleHandler := httpHandler.New(articleUsecase)

	// entrypoint
	router.GET("/api/articles", articleHandler.GetAll)
	router.GET("/api/articles/:article_id", articleHandler.GetByID)
	router.POST("/api/articles/", articleHandler.Store)
	router.PUT("/api/articles/:article_id", articleHandler.Update)
	router.DELETE("/api/articles/:article_id", articleHandler.Delete)
}

Membuat file .env

Kita akan membuat semua konfigurasi tersebut disimpan dalam satu file .env sehingga ketika kita ingin mengubah semua konfigurasi lebih mudah dan gampang tinggal menggantinya pada file tersebut. Maka kita akan coba buat file .env dan isi file tersebut dengan ini.

DATABASE_USER=development
DATABASE_PASS=d3v3l0pm3nt
DATABASE_ADDRESS=localhost:3306
DATABASE_NAME=article

lalu tambahkan library package ini agar bisa membaca file .env

go get github.com/joho/godotenv

dan tambahkan kode dibawah ini pada file main.go paling atas dari fungsi main().

	err := godotenv.Load(".env")
	if err != nil {
		log.Fatalf("error loading .env file")
	}
comments powered by Disqus