Skip to content

Web アプリパッケージ構成例

Go で Web アプリケーションを開発する際のプロジェクトのパッケージ構成について一つの指針となるサンプルを記載します。

.
├── api                 # APIドキュメント
├── assets                 ├── static          # js, css, favicon等   └── templates       # html
├── cmd                 # エントリポイント
├── internal
│   ├── apperrors       # 独自エラー定義およびそのハンドリング   ├── domain          # ドメイン構造体   ├── handler         # APIリクエストをハンドリング、業務処理呼び出し      ├── model       # APIのリクエスト・レスポンス構造体      └── router      # httpリクエストのルーティング   ├── infrastructure  # データベースなど外部接続設定      └── repository  # データベースへのアクセス   ├── logging         # ログ出力制御   └── usecase         # 業務処理       └── payload     # 業務処理の入力・出力モデル
└── scripts             # 開発支援ツール

パッケージ解説

api

swagger などの API ドキュメント、およびそれを生成する関数を格納するパッケージです。

assets

静的コンテンツを格納するパッケージです。本パッケージの直下に assets.go を設け、go:embed を使ってこれらの静的ファイルを呼び出します。

cmd

アプリケーションのエントリポイントとなる関数を格納するパッケージです。基本的に main.go のみが格納されます。

internal/apperrors

アプリケーション内で独自に定義するエラーおよびそのハンドリング関数を格納するパッケージです。

internal/domain

業務処理の中心となるドメイン構造体およびそれを取得する repository インターフェースを格納するパッケージです。

値のチェックなど、1 つの domain で完結する業務処理についてはこのパッケージ内で実装してください。

repository の戻り値について、ドメイン構造体とテーブル定義とが 1:1 対応している場合は domain を戻し、そうでない場合はテーブル定義に対応する構造体を internal/infrastructure/entity パッケージを新設してその中で定義し、usecase 内で entity から domain への変換を行ってください。

internal/handler

リクエストモデルの json の解析およびバリデーションを行なって、業務処理を呼び出すハンドラ関数を格納するパッケージです。

internal/handler/model

API のリクエスト・レスポンスモデルとなる構造体を格納するパッケージです。

internal/handler/router

http リクエストのルーティングを行う関数を格納するパッケージです。

internal/infrastructure

データベースや他 API などの外部接続に関する設定を行う関数を格納するパッケージです。

internal/infrastructure/repository

データベースにアクセスして SQL を実行する関数を格納するパッケージです。

internal/logging

ログレベル別の文言出力など、ログ出力を制御するパッケージです。

internal/usecase

業務処理を行う関数を格納するパッケージです。関数内に直接処理を実装するか、domain 内の処理を呼び出す形で業務を実施します。

internal/usecase/payload

業務処理の入力・出力モデルとなる構造体を格納するパッケージです。

scripts

テストカバレッジの作成や API ドキュメントの自動生成などの開発支援ツールを格納するパッケージです。