Go(JWT認証)✖️RiverpodでTodoアプリを作ってみたPart1（Go環境構築 編）

完全自分用の学習備忘録。
詳細な解説等はコード内でコメントアウトしております。

## 環境構築

```go
// 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
    
    ```go
    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
    
    ```go
    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
    
    ```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
    
    ```go
    package infra
    
    import (
    	"log"
    
    	"github.com/joho/godotenv"
    )
    
    func Initialize() {
    	error := godotenv.Load() // 引数にファイル名を渡す（省略するとデフォルトで.envファイルを読み込み）
    	if error != nil {
    		log.Fatal("Error loading .env file")
    	}
    }
    ```