完全自分用の学習備忘録。
詳細な解説等はコード内でコメントアウトしております。
環境構築
// go modファイルを生成
go mod init <プロジェクト名>
// ginをインストール
go get -u github.com/gin-gonic/gin
// hot reloadを有効化
go install [github.com/air-verse/air@latest](http://github.com/air-verse/air@latest)
air init
air
// プロジェクトのルートディレクトリ配下にdocker-compser.yamlファイルを置き、以下のコマンドを実行し、
// サービスを起動&コンテナをバックグラウンドで実行
docker compose up -d
// ブラウザから以下にアクセスしpgAdminを起動し、docker-compose.yamlに記載された情報を元にDBを構築
http://localhost:81
// 環境変数ファイル(.env)をプロジェクトルートディレクトリ配下に作成
// 以下のコマンドで、Go言語で.envファイルを読み込むためのライブラリをインストールする
go get github.com/joho/godotenv
// gormをインストール
go get -u gorm.io/gorm
go get -u gorm.io/driver/postgres
// JWT認証を行うため、JWTパッケージをインストール
go get -u [github.com/golang-jwt/jwt/v5](http://github.com/golang-jwt/jwt/v5)
Docker Compose の設定ファイルを作成
PostgreSQLデータベースとpgAdminを立ち上げます。
-
docker-composer.yaml
version: "3.8" services: postgres: image: postgres:16-alpine container_name: postgres ports: - 5432:5432 volumes: - ./docker/postgres/init.d:/docker-entrypoint-initdb.d - ./docker/postgres/pgdata:/var/lib/postgresql/data environment: POSTGRES_USER: **<POSTGRES_USER>** POSTGRES_PASSWORD: **<POSTGRES_PASSWORD>** POSTGRES_INITDB_ARGS: "--encoding=UTF-8" POSTGRES_DB: **<POSTGRES_DB>** hostname: postgres restart: always user: root pgadmin: image: dpage/pgadmin4 restart: always ports: - 81:80 environment: PGADMIN_DEFAULT_EMAIL: **<PGADMIN_DEFAULT_EMAIL>** PGADMIN_DEFAULT_PASSWORD: **<PGADMIN_DEFAULT_PASSWORD>** volumes: - ./docker/pgadmin:/var/lib/pgadmin depends_on: - postgres
環境変数(.env)ファイルを作成
-
.env
ENV=prod DB_HOST=localhost DB_USER=**<DB_USER>** DB_PASSWORD=**<DB_PASSWORD>** DB_NAME=**<DB_NAME>** DB_PORT=5432 # JWTToken認証の著名に使用する秘密鍵を定義 ターミナルで「openssl rand -hex 32」で生成 SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
インフラ設定
データベースへ接続
.envファイルを読み込む
-
infra/db.go
package infra import ( "fmt" "os" "gorm.io/driver/postgres" "gorm.io/gorm" ) func SetupDB() *gorm.DB { // dsnを生成するため、環境変数から取得 dsn := fmt.Sprintf( // %s はプレースホルダーで、順番に引数から値が挿入される "host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Tokyo", os.Getenv("DB_HOST"), os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_NAME"), os.Getenv("DB_PORT"), ) // DBへの接続 db, error := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if error != nil { panic("Failed to connect database") } return db }
-
infra/initializer.go
package infra import ( "log" "github.com/joho/godotenv" ) func Initialize() { error := godotenv.Load() // 引数にファイル名を渡す(省略するとデフォルトで.envファイルを読み込み) if error != nil { log.Fatal("Error loading .env file") } }