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
1 github.com/julienschmidt/httprouterJadi kita perlu menambahkan terlebih dahulu package tersebut ke dalam projek kita dengan menggunakan perintah golang module.
1 go get github.com/julienschmidt/httprouterKonfigurasi HTTP Router dan HTTP ServerA
Pertama, kita buat file main.go pada folder cmd lalu isi file tersebut dengan kode dibawha ini.
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
1 router := httprouter.New()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.
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.
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.
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
1github.com/go-sql-driver/mysql Maka kita perlu menambahkan terlebih dahulu package/libary tersebut dengan perintah ini.
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.
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
| Konfigurasi | Informasi |
|---|---|
User | user koneksi yang dibutuhkan untuk ke database mysql |
Passwd | passowrd untuk user yang dibutuhkan untuk koneksi ke database mysql |
Net | protokol yang digunakan untuk koneksi ke database |
Addr | alamat yang menunjukkan server dari database |
DBName | nama dari database yang dituju |
Selanjutnya tambahkan koneksi database tersebut ke dalam file main.go dan ubah fungsi main() seperti dibawah ini.
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.
1DATABASE_USER=development
2DATABASE_PASS=d3v3l0pm3nt
3DATABASE_ADDRESS=localhost:3306
4DATABASE_NAME=articlelalu tambahkan library package ini agar bisa membaca file .env
1go get github.com/joho/godotenvdan tambahkan kode dibawah ini pada file main.go paling atas dari fungsi main().
1 err := godotenv.Load(".env")
2 if err != nil {
3 log.Fatalf("error loading .env file")
4 }