Google App Engine で始める Go 実践入門 Part 4 【ディレクトリ構成】

連載を通して簡単なブログアプリを作成しつつ Go/GAE について学んでいきます。
今回は ディレクトリ構成 についての説明です。

- [Part 1. 『GO / Cloud SDK のインストール』](https://qiita.com/rema424/items/743bc508ef70cd980e17)
- [Part 2. 『GOPATH』](https://qiita.com/rema424/items/009f6345eb75a80bf369)
- [Part 3. 『プロジェクトの作成』](https://qiita.com/rema424/items/19b946c311f3b3b3f953)
- [Part 4. 『ディレクトリ構成』](https://qiita.com/rema424/items/1a6096c77b90ea350a26) ← イマココ
- [Part 5. 『Visual Studio Code』](https://qiita.com/rema424/items/b2ecdd2c7ec7fc1b0a7c)
- [Part 6. 『Hello World』](https://qiita.com/rema424/items/66ce1b02d7de588e63cf)
- [Part 7. 『リモートデバッグ』](https://qiita.com/rema424/items/996aaf0ab69670224af4)
- [Part 8. 『デプロイ』](https://qiita.com/rema424/items/dbf851908dbfc95f9b6f)
- [Part 9. 『Makefile』](https://qiita.com/rema424/items/3a099dfb023aa06086f5)
- [Part 10. 『Circle CI』](https://qiita.com/rema424/items/4dcb37346cecc544dfaa)
- Part 11. 『Dependency Injection』
- Part 12. 『ローカルDB with Docker』
- Part 13. 『gorm』
- Part 14. 『Cloud SQL』
- Part 15. 『Cloud SQL Proxy』
- Part 16. 『HTML』
- Part 17. 『CSS/JS』
- Part 18. 『Google Analytics』
- Part 19. 『Google Search Console』
- Part 20. 『A/B テスト』
- Part 21. 『ユーザーの作成』
- Part 22. 『Firebase Auth』
- Part 23. 『記事の作成』
- Part 24. 『コメントの作成』
- Part 25. 『ページネーション』

# App Engine のディレクトリ構成

App Engine　における開発では、アプリケーションのディレクトリ構成は少し特殊になります。

下記はディレクトリ構成の一例です。
（あくまでも一例となります。この構成が絶対ではありません。）

イメージが膨らみやすいように少しファイルも記載しています。

```
go-gae-blog-app-example
  ├── lib
  ├── model
  │     ├── Article.go
  │     ├── Comment.go
  │     └── User.go
  ├── module
  │     ├── admin
  │     │     ├── handler
  │     │     │     ├── article_handler.go
  │     │     │     └── user_handler.go
  │     │     └── main
  │     │           ├── node_modules
  │     │           ├── static
  │     │           │     ├── dist
  │     │           │     ├── public
  │     │           │     └── src
  │     │           ├── template
  │     │           ├── app.yaml
  │     │           ├── db.go
  │     │           ├── main.go
  │     │           └── package.json
  │     └── blog
  │           ├── handler
  │           │     ├── article_handler.go
  │           │     └── user_handler.go
  │           └── main
  │                 ├── node_modules
  │                 ├── static
  │                 │     ├── dist
  │                 │     ├── public
  │                 │     └── src
  │                 ├── template
  │                 ├── app.yaml
  │                 ├── db.go
  │                 ├── main.go
  │                 └── package.json
  ├── repository
  │     ├── article_repository.go
  │     ├── comment_repository.go
  │     └── user_repository.go
  ├── service
  │     ├── article_service.go
  │     ├── auth_service.go
  │     └── user_service.go
  ├── vendor
  ├── .gitignore
  ├── Gopkg.lock
  ├── Gopkg.toml
  └── README.md
```

App Engine の特殊な点として module という概念があります。
module　は昔の呼び方で今は　service　に変わっていますが、service　ディレクトリと名称が被ってしまうので旧名の module で話を進めます。

この module とは何かというと、 1 つ 1 つのアプリケーションだと認識して構いません。
App Engine におけるプロジェクトとモジュールの関係を整理すると次のようになります。

- プロジェクト ≠ アプリケーション
- モジュール = アプリケーション
- プロジェクトは複数のモジュール（アプリケーション）を持つ ( 1 つ以上)
- 課金はプロジェクト単位

「プロジェクトは複数のモジュールを持つ」というのが一番のポイントです。

例えば「ブログプロジェクト」の中で「ブログサイト」と「管理者用サイト」を同時に開発するといったスタイルです。

もちろん「ブログプロジェクト」の中で「ブログサイト」を開発し、「ブログ管理者プロジェクト」の中で「管理者用サイト」を開発するといったように、プロジェクトを分けるという選択肢もあります。

ここらへんは分断されたモノリス、整理されたモノリス、マイクロサービスといった話になってくるので状況によるかと思います。

先ほどのディレクトリ構成は整理されたモノリスを目指した構成になっています。
ドメイン領域のソースコードをプロジェクト内で共通化し、HTTPの処理や認可/認証の処理はモジュールごとにハンドリングするといった形です。

# おわりに

次回のテーマは『[Visual Studio Code](https://qiita.com/rema424/items/b2ecdd2c7ec7fc1b0a7c)』です。

よかったら Twitter フォローしてね。[@_rema424](https://twitter.com/_rema424)