Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
29 Jan 2024 · 4 mnt baca ·Artikel 86 / 119
Go

09 Membuat Konfigurasi HTTP Router, HTTP Server dan Koneksi Database

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

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

bash
1	github.com/julienschmidt/httprouter

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

bash
1	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.

go
 1package cmd
 2
 3import (
 4	"database/sql"
 5
 6	"github.com/julienschmidt/httprouter"
 7	httpHandler "github.com/santekno/learn-golang-restful/delivery/http"
 8	mysqlRepository "github.com/santekno/learn-golang-restful/repository/mysql"
 9	articleUsecase "github.com/santekno/learn-golang-restful/usecase/article"
10)
11
12func main() {
13	router := httprouter.New()
14
15	repository := mysqlRepository.New(&sql.DB{})
16	articleUsecase := articleUsecase.New(repository)
17	articleHandler := httpHandler.New(articleUsecase)
18
19	router.GET("/api/articles", articleHandler.GetAll)
20	router.GET("/api/articles/:article_id", articleHandler.GetByID)
21	router.POST("/api/articles/", articleHandler.Store)
22	router.PUT("/api/articles/:article_id", articleHandler.Update)
23	router.DELETE("/api/articles/:article_id", articleHandler.Delete)
24
25  server := http.Server{
26		Addr:    "localhost:3000",
27		Handler: router,
28	}
29
30	err := server.ListenAndServe()
31	if err != nil {
32		panic(err)
33	}
34}

Bisa kita lihat pertama inisialisasi yang dilakukan yaitu

go
1	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.

go
1	repository := mysqlRepository.New(&sql.DB{})
2	articleUsecase := articleUsecase.New(repository)
3	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.

go
1	router.GET("/api/articles", articleHandler.GetAll)
2	router.GET("/api/articles/:article_id", articleHandler.GetByID)
3	router.POST("/api/articles/", articleHandler.Store)
4	router.PUT("/api/articles/:article_id", articleHandler.Update)
5	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.

go
1  server := http.Server{
2    Addr:    "localhost:3000",
3    Handler: router,
4  }
5
6  err := server.ListenAndServe()
7  if err != nil {
8    panic(err)
9  }

Konfigurasi Koneksi Database MySQL

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

bash
1github.com/go-sql-driver/mysql 

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

bash
1go 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.

go
 1package database
 2
 3import (
 4	"database/sql"
 5	"os"
 6
 7	"gorm.io/driver/mysql"
 8)
 9
10unc New() *sql.DB {
11	cfg := mysql.Config{
12		User:                 os.Getenv("DATABASE_USER"),
13		Passwd:               os.Getenv("DATABASE_PASS"),
14		Net:                  "tcp",
15		Addr:                 os.Getenv("DATABASE_ADDRESS"),
16		DBName:               os.Getenv("DATABASE_NAME"),
17		AllowNativePasswords: true,
18		ParseTime:            true,
19	}
20
21	var err error
22	db, err := sql.Open("mysql", cfg.FormatDSN())
23	if err != nil {
24		log.Fatal(err)
25	}
26
27	pingErr := db.Ping()
28	if pingErr != nil {
29		log.Fatal(pingErr)
30	}
31
32	fmt.Println("Connected!")
33	return db
34}

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.

go
 1func main() {
 2	// inisialisasi http router
 3	router := httprouter.New()
 4
 5	// inisialisasi database
 6	db := database.New()
 7
 8	// inisialisasi repository
 9	repository := mysqlRepository.New(db)
10	// inisialisasi usecase
11	articleUsecase := articleUsecase.New(repository)
12	// inisialisasi handler
13	articleHandler := httpHandler.New(articleUsecase)
14
15	// entrypoint
16	router.GET("/api/articles", articleHandler.GetAll)
17	router.GET("/api/articles/:article_id", articleHandler.GetByID)
18	router.POST("/api/articles/", articleHandler.Store)
19	router.PUT("/api/articles/:article_id", articleHandler.Update)
20	router.DELETE("/api/articles/:article_id", articleHandler.Delete)
21}

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.

bash
1DATABASE_USER=development
2DATABASE_PASS=d3v3l0pm3nt
3DATABASE_ADDRESS=localhost:3306
4DATABASE_NAME=article

lalu tambahkan library package ini agar bisa membaca file .env

bash
1go get github.com/joho/godotenv

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

go
1	err := godotenv.Load(".env")
2	if err != nil {
3		log.Fatalf("error loading .env file")
4	}

Artikel Terkait

💬 Komentar