goでdocker接続からAPI作成

dockerでdbを作成
services:
database:
image: mysql:8.3.0
container_name: mysql-database-container
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_DATABASE: database
TZ: "Asia/Tokyo"
ports:
- "3306:3306"
goでDB接続するための参考記事

記事の中で出てきたライブラリ
gin
ginを使用してサーバーを立てた
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "テスト",
})
})
router.Run() // 0.0.0.0:8080 でサーバーを立てます。 default設定
}

DB接続のたのライブラリ
Gorm
Gormを使用するためにgoのバージョンアップ

airは必要なのか?
ホットリロードするもの
next.jsの場合は、volumesでローカルファイルをマウントされるように設定すれば行けた気がする
ChatGPTさん
・Next.jsの場合
Node.jsのランタイム環境で動作
開発モード(next dev)では、Node.jsのwatch機能を使用
ソースコードの変更を検知して自動的に再コンパイル
コンパイル済みのJavaScriptをメモリ上で実行
再起動が不要
・Goの場合
コンパイル言語
ソースコードの変更を検知しても、自動的に再コンパイルされない
コンパイル済みのバイナリを実行
変更を反映するには再ビルドと再起動が必要
結論
Next.jsとGoでは、言語の特性が異なります:
Next.js: インタープリタ型(実行時にコードを解釈)
Go: コンパイル型(事前にバイナリにコンパイル)
そのため、Goではairのようなツールが必要で、Next.jsでは不要です。

goのAPIドキュメント作成
設定追加
main.goへのSwagger設定追加
ハンドラーへのSwaggerアノテーション追加
コマンド叩く
swag init
下記ファイルができて無事にAPI仕様書完成
swagger.yaml
swagger.json
docs.go

gormが不便!!
swaggerを作成してFEでswagger-typescript-api
で型を生成する
modelの定義が全てオプショナルになる
ChataGPTさん
OpenAPIスキーマでは、フィールドが明示的に「required」とマークされていない限り、デフォルトでオプショナルとして扱われます。
不便すぎる

TODO:goのアーキテクチャを調べる
いろんな設計パターンがありそう

renderにデプロイする

envの取り扱いで沼ったのでメモ
以下のように環境変数の値を取得できる
os.Getenv("PORT")
ただ、localhostでは取得できない
renderでのdeploy時は取得できる
renderのEnvironmentで設定している場合は、プラットフォーム側で環境変数をシステムレベルで設定しているので上記のコードでdeploy時に環境変数が取得できるらしい
localhostでは.envファイルをおいても上記のコードではOSの環境変数のみを参照するため取得できない
→今回はdocker-compose.ymlでenv_fileを設定してdocker compose up
で参照可能

環境変数の設定はコンテナの作成時に行われる
buildはイメージの作成のみ
upでコンテナ作成時に環境変数が設定される