nove-b

Go LangでWebAPIを作成するために、GolangでDBのデータを取得するmainファイルをそれぞれの責務に分割する

Created: December 5, 2023

Modified: April 12, 2025

Go LangでWebAPIを作成するために、GolangでエンドポイントにアクセスしDBからデータを取得するでデータ取得の処理は確認できた。

リファクタリング

次に現状、main.goにすべての記述をしていたが、それぞれ簡単に責務ごとにフォルダを分けることにした。

分け方は、下記の通り。

db フォルダ:

// db/db.go
package db

import (
	"fmt"
	"os"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var DB *gorm.DB

type Model struct {
	gorm.Model
}

func InitDB() {
	dsn := os.Getenv("DB_CONNECTION_STRING")
	if dsn == "" {
		fmt.Println("DB_CONNECTION_STRING 環境変数が設定されていません")
		os.Exit(1)
	}

	var err error
	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Printf("データベースへの接続に失敗しました: %v\n", err)
		os.Exit(1)
	}

	fmt.Println("データベースに接続しました")
}

handlers フォルダ:

// handlers/handlers.go
package handlers

import (
	"project-Backend/src/db"
	"encoding/json"
	"fmt"
	"log"
	"net/http"
)

type User struct {
	db.Model // ここで埋め込みを行う

	Name     string
	Age      int
	IsActive bool
}

func HandleRequests() {
	http.HandleFunc("/users", FetchUsers)
	log.Fatal(http.ListenAndServe(":8081", nil))
}

func FetchUsers(w http.ResponseWriter, r *http.Request) {
	db := db.DB

	var users []User
	db.Find(&users)

	profJSON, err := json.Marshal(users)
	if err != nil {
		http.Error(w, "ユーザーデータのマーシャリングに失敗しました", http.StatusInternalServerError)
		return
	}

	fmt.Fprintf(w, string(profJSON))
}

main.go:

// main.go
package main

import (
	"log"

	"project-Backend/src/db"
	"project-Backend/src/handlers"

	"github.com/joho/godotenv"
)

func init() {
	err := godotenv.Load()
	if err != nil {
		log.Fatal("Error loading .env file")
	}

	db.InitDB()
}

func main() {
	handlers.HandleRequests()
}

これで分かりやすくなった。

handlers フォルダを詳細に

FetchUsersもついでに分けることにする。

// handlers/user_handler.go
package handlers

import (
	"project-Backend/src/db"
	"encoding/json"
	"fmt"
	"net/http"
)

type User struct {
	db.Model

	Name     string
	Age      int
	IsActive bool
}

func FetchUsers(w http.ResponseWriter, r *http.Request) {
	db := db.DB

	var users []User
	db.Find(&users)

	profJSON, err := json.Marshal(users)
	if err != nil {
		http.Error(w, "ユーザーデータのマーシャリングに失敗しました", http.StatusInternalServerError)
		return
	}

	fmt.Fprintf(w, string(profJSON))
}
// handlers/handlers.go
package handlers

import (
	"log"
	"net/http"
)

func HandleRequests() {
	http.HandleFunc("/users", FetchUsers)
	log.Fatal(http.ListenAndServe(":8081", nil))
}

これでそれぞれ管理しやすくなった。

新着記事

Menu

Search