Go言語

Go 1.22でGinとBunを使ったクリーンアーキテクチャ API構築ガイド

ⓘ本ページはプロモーションが含まれています

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


スポンサードリンク

1️⃣ 環境構築とプロジェクト初期化

1.1 Go 1.22+ のインストール(Ubuntu/Debian 編)

公式パッケージは Ubuntu のリポジトリに古いバージョンが残っていることが多く、apt だけでは最新の go1.22.x が入らないケースがあります。確実に最新版を入れる手順は次のとおりです。

手順 コマンド例
① ダウンロード
公式サイトから tarball を取得します。
bash<br>curl -LO https://go.dev/dl/go1.22.5.linux-amd64.tar.gz
② 既存の Go を削除/usr/local/go がデフォルトインストール先) bash<br>sudo rm -rf /usr/local/go
③ 展開してシステムに配置 bash<br>sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz
④ パスを通す~/.profile/etc/profile.d/go.sh bash<br>echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile && source ~/.profile
⑤ バージョン確認 bash<br>go version # → go1.22.5 linux/amd64

Tip
- apt でインストールしたい場合は、golang-1.22-go が Ubuntu 23.10 以降の公式リポジトリに入っています。sudo apt install golang-1.22-go とすれば同様に最新版が取得できます(ただし LTS 系ディストロではパッケージが遅れることがあります)。
- 複数バージョンを切り替える必要がある場合は asdfgvm、または Docker を併用すると管理が楽です。

1.2 go.mod によるモジュール初期化

2026年4月時点の依存バージョン(参考)

依存バージョンの自動更新

  • ローカル: go get -u ./... で一括アップデート。
  • CI/CD: Dependabot(GitHub)や Renovate を有効化し、プルリクエストで定期的に最新バージョンを取り込む。
  • 注意点: メジャーアップデートは破壊的変更が入る可能性があるので、テストスイートのカバレッジを 80 % 以上確保した上で自動マージしない設定が安全です。


2️⃣ クリーンアーキテクチャで設計するディレクトリ構成

2.1 基本概念(円環モデル)

  • 依存関係の方向は常に外側から内側へ。これにより、内部ロジックはフレームワークや DB に依存しないテスト可能なコードになる。
  • 各層は インターフェース で結合し、実装は外側の層が提供する。

2.2 推奨ディレクトリ構成

2.3 Mermaid 図(視覚的に把握)


3️⃣ Gin と Bun ORM を用いた実装例

3.1 Gin のルーティング(インポート忘れの修正)

  • *gin.Enginehttp.Handler インターフェースを実装しているため、上記のシグネチャで問題なく利用できます。

3.2 Bun の DB 接続ユーティリティ

3.3 自動マイグレーション

実運用のベストプラクティス
- 開発環境はアプリ起動時に AutoMigrate を呼び出す。
- 本番環境は SQL マイグレーションファイル(例:db/migrations/*.sql)をバージョン管理し、CI で go run ./cmd/migrate のみ実行してチェックする。

3.4 CRUD ハンドラとバリデーション

ポイント
- validator/v10 はフィールドタグだけでなく、構造体レベルのカスタムバリデーションも簡単に追加できる。
- エラーはハンドラ内で c.Error(err) だけ返し、共通ミドルウェアが JSON へ変換する設計にするとコード量が大幅に削減できる。

3.5 Usecase の実装例

3.6 JWT 認証ミドルウェア

router.go の保護対象エンドポイントは次のようにラップします。


4️⃣ エラーハンドリング・ロギング・テスト

4.1 統一エラー型と HTTP ステータスマッピング

4.2 エラーハンドリングミドルウェア

NewRouter の冒頭でミドルウェアを登録します。

4.3 構造化ロギング(zap)

ハンドラやリポジトリからは次のように呼び出すだけです。

4.4 ユニットテスト(usecase)

4.5 統合テスト(Gin ハンドラ)


5️⃣ コンテナ化と CI/CD パイプライン

5.1 Dockerfile(マルチステージ)と実際のサイズ感

  • サイズ目安: docker images 実行時、上記イメージは 約22 MB(Alpine + statically linked binary)になることが多いです。
  • 「15 MB 前後」という表現は最適化しすぎた期待値であり、実際の環境では 20‑30 MB が一般的です。サイズをさらに削減したい場合は distroless (gcr.io/distroless/static) をベースにすると約15 MB に近づきますが、デバッグツールが全く無いためローカルでのトラブルシューティングはやや面倒です。

5.2 docker‑compose(API + DB)

  • DATABASE_URL環境変数で注入 し、コード側では os.Getenv("DATABASE_URL") を読むだけにすることで、ローカル・ステージング・本番すべてで同一設定ファイルを使い回せます。

5.3 GitHub Actions(テスト → ビルド → デプロイ)

  • テストが失敗したらビルドは走りませんneeds: test による依存関係)。
  • dependabot.yml をリポジトリに追加すれば、ライブラリのバージョン更新プルリクエストを自動生成できます。

5.4 デプロイ先別環境変数管理

プラットフォーム 設定例(シークレット)
Google Cloud Run gcloud run services update gin-bun-api --set-env-vars=DATABASE_URL=${{ secrets.DATABASE_URL }},JWT_SECRET=${{ secrets.JWT_SECRET }}
Render Dashboard → Environment タブで Add Variable
Railway CLI で railway variables set DATABASE_URL=... JWT_SECRET=... または UI の Variables セクション。

セキュリティ注意点
- 環境変数やシークレットは決してコードベースにハードコーディングしないこと。
- docker-compose.yml にはプレーンテキストの URL を書かず、.env.example にキーだけを書いて .gitignore に実ファイルを除外する。


6️⃣ まとめと次のアクション

フェーズ 主な作業
① 環境構築 Go 1.22 を公式 tarball または golang-1.22-go パッケージでインストールし、go.mod で依存を管理。Dependabot により自動更新を設定。
② 設計 クリーンアーキテクチャに沿った cmd / internal / pkg の層分け。インターフェース中心の設計でテスト容易性を確保。
③ 実装 Gin + Bun で CRUD、バリデーション、JWT 認証を実装。エラーハンドリングは共通ミドルウェア、ロギングは構造化 zap を使用。
④ 品質向上 ユニットテスト(usecase)と統合テスト(Gin ハンドラ)を httptesttestify/mock で網羅。カバレッジ 80 %+ を目標に。
⑤ コンテナ化 マルチステージ Dockerfile → Alpine + static binary ≈ 22 MB(distroless なら ~15 MB)。docker‑compose と GitHub Actions による CI/CD パイプライン構築。
⑥ デプロイ Cloud Run / Render / Railway のいずれかへデプロイし、シークレットは全て外部管理。デプロイ後は kubectl logs 相当のモニタリング(Stackdriver, Grafana Loki 等)を設定。

次にやるべきこと

  1. ローカルで一通り動かす
    bash
    go run ./cmd/server
    curl -v http://localhost:8080/api/v1/health
  2. テストを書き足す
  3. すべての Usecase、Repository のインターフェースに対するモックテスト。
  4. エラーハンドリングミドルウェアのシナリオ(500, 404 等)もカバー。
  5. CI パイプラインを有効化
  6. dependabot.yml と GitHub Actions をコミットし、プルリクエストで自動ビルド・テストが走ることを確認。
  7. 本番環境へデプロイ
  8. GCP の Cloud Run か Render にデプロイし、実際のトラフィックで負荷測定(hey, k6)を行う。
  9. モニタリングとアラート
  10. zap の JSON 出力を Loki/Prometheus に流す。
  11. エラー率が一定閾値を超えたら Slack 通知するように Alertmanager を設定。

以上のステップを踏めば、最新 Go 1.22Gin + Bun の組み合わせで、ローカル開発から本番運用まで一貫したフローが完成します。ぜひご自身のビジネスドメインに合わせてエンティティやユースケースを拡張し、本格的なプロダクトへと成長させてください 🚀.

スポンサードリンク

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


-Go言語