こんにちは。KOUKIです。
前回に引き続き、ユーザー認証アプリの実装を行います。本記事は、主にバックエンドで以下の処理について書きます。
1. Fiber フレームワークの導入
2. MySQLの接続
3. パッケージ化
4. マイグレーション
<目次>
前回
FiberでWebサーバーを導入
今回は、Webフレームワークに「Fiber」を使ってみようと思います。仕事では、「Gin」を使っていますが、違うものを使ってみたく..
Installは以下のコマンドを使いますが、「go mod」を導入しているので自動でインストールされるはずです。
1 2 |
# Install go get -u github.com/gofiber/fiber/v2 |
main.goに、次の処理を実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// main.go package main import "github.com/gofiber/fiber/v2" func main() { app := fiber.New() app.Get("/", func(c *fiber.Ctx) error { return c.SendString("Hello, World 👋!") }) app.Listen(":80") } |
これで、Webサーバーが立ち上がります。
コンテナを立ち上げていない場合は、以下のコマンドで立ち上げましょう。
1 |
docker-compose up |
「http://localhost/」にブラウザからアクセスします。

OKですね。
補足: ホットリロードについて
設定を反映させるために通常なら「Ctrl + c」でコンテナを停止させなければいけませんが、動作環境がMac(or Linux)の場合は、ホットリロードが走ります。これは、Dockerに設定した「reflex」の機能です。ちなみにWindowsだとホットリロードされません^^;
MySQL接続
次は、MySQLに接続する処理を実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
// main.go package main import ( "fmt" "os" "github.com/gofiber/fiber/v2" "gorm.io/driver/mysql" "gorm.io/gorm" ) var ( schema = "%s:%s@tcp(mysql:3306)/%s?charset=utf8&parseTime=True&loc=Local" // docker-compose.ymlに設定した環境変数を取得 username = os.Getenv("MYSQL_USER") password = os.Getenv("MYSQL_PASSWORD") dbName = os.Getenv("MYSQL_DATABASE") datasourceName = fmt.Sprintf(schema, username, password, dbName) ) func main() { // GORMセット db, err := gorm.Open(mysql.Open(datasourceName), &gorm.Config{}) if err != nil { panic("Could not connect to the database") } fmt.Println(db) ... } |
MySQLに接続するために、GORMを使用しています。これを使うとDBの接続やSQL発行などをGo言語で実装できるようになるのでオススメです。
接続に成功すると、以下のようにコンソールに出力されます。
1 2 |
// fmt.Println(db) api_1 | [00] &{0xc00013a240 <nil> 0 0xc0000911e0 1} |
パッケージ化
機能の役割に応じて、パッケージ化してみましょう。
database
databaseパッケージには、MySQLへの接続処理を実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// connect.go package database import ( "fmt" "os" "gorm.io/driver/mysql" "gorm.io/gorm" ) var ( schema = "%s:%s@tcp(mysql:3306)/%s?charset=utf8&parseTime=True&loc=Local" // docker-compose.ymlに設定した環境変数を取得 username = os.Getenv("MYSQL_USER") password = os.Getenv("MYSQL_PASSWORD") dbName = os.Getenv("MYSQL_DATABASE") datasourceName = fmt.Sprintf(schema, username, password, dbName) ) func Connect() { db, err := gorm.Open(mysql.Open(datasourceName), &gorm.Config{}) if err != nil { panic("Could not connect to the database") } fmt.Println(db) } |
routers
routersには、エンドポイントを定義しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// routes.go package routes import ( "auth-api/controllers" "github.com/gofiber/fiber/v2" ) func Setup(app *fiber.App) { app.Get("/", controllers.Home) app.Get("/other", controllers.Other) } |
controllers
controllersには、リクエスト先の処理を実装します。
1 2 3 4 5 6 7 8 |
// controller.go package controllers import "github.com/gofiber/fiber/v2" func Other(c *fiber.Ctx) error { return c.SendString("Other Controller") } |
1 2 3 4 5 6 7 8 |
// authController.go package controllers import "github.com/gofiber/fiber/v2" func Home(c *fiber.Ctx) error { return c.SendString("Hello, World 👋!") } |
この例のように、controllersを用途によって分けるのはベストプラクティスです。メンテが楽になります。
main.go
main関数から先ほど実装した関数を呼びだします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// main.go package main import ( "auth-api/database" "auth-api/routes" "github.com/gofiber/fiber/v2" ) func main() { // GORMセット database.Connect() app := fiber.New() routes.Setup(app) app.Listen(":80") } |
routersに、「”/”」と「”/other”」のエンドポイントを設定したので、それぞれアクセスしてみましょう。


OKですね。
モデルの定義
次は、モデルを定義しましょう。
1 2 3 4 5 6 7 8 9 10 11 |
// user.go package models type User struct { ID uint FirstName string LastName string Email string Password string } |
これは、API通信やDBに格納するデータの元になる定義です。
Register関数を以下のように編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// authController.go package controllers import ( "auth-api/models" "github.com/gofiber/fiber/v2" ) func Register(c *fiber.Ctx) error { var user models.User user.FirstName = "Self" user.LastName = "Note" user.Email = "selfnote@yahoo.co.jp" user.Password = "pass" return c.JSON(user) } |
c.JSON(user)は、GoのデータをJSON形式で呼び出し元に返す便利メソッドです。
また、Setup関数も変更します。
1 2 3 4 5 6 |
// routes.go package routes ... func Setup(app *fiber.App) { app.Post("/api/register", controllers.Register) } |
これで、「http://localhost/api/register」にPOSTでリクエストを送信すれば、userデータが取得できます。
Talend API Testerで確認してみましょう。


OKですね。無事にデータが取得できました。
マイグレーション
次は、マイグレーションを試します。
GORMのAutoMigrateメソッドを実行するとマイグレーションを実行できます。その結果、データベースのスキーマーが作成されるはずです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// connect.go package database ... func Connect() { connection, err := gorm.Open(mysql.Open(datasourceName), &gorm.Config{}) if err != nil { panic("Could not connect to the database") } connection.AutoMigrate(&models.User{}) } |
これで、Userモデルからスキーマーを作成しました。
「http://localhost:8888/tbl_structure.php?server=1&db=go_auth&table=users」にアクセスしてみてください。

Userに紐づくスキーマーが作成されたことがわかります。
スキーマーに条件を付けたい場合は、User StructにGORMのプレフィックスを付けます。
1 2 3 4 5 6 7 8 9 10 11 |
// user.go package models type User struct { ID uint FirstName string LastName string Email string `gorm:"unique"` Password string } |
Emailをユニーク条件にしました。この変更も即座に反映されます。※Windowsの場合は、reflexが効かないのでコンテナを立ち上げ直してください

gormには、gorm.Modelという構造体があります。これは便利なので追加しておきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// user.go package models import "gorm.io/gorm" // gorm.Modelの中身 // type Model struct { // ID uint `gorm:"primarykey"` // CreatedAt time.Time // UpdatedAt time.Time // DeletedAt DeletedAt `gorm:"index"` // } type User struct { gorm.Model // 追加 FirstName string LastName string Email string `gorm:"unique"` Password string } |
こうなります。

便利ですね。
次回
次回も引き続き、バックエンド開発を行っていきます。
コメントを残す
コメントを投稿するにはログインしてください。