post Image
そこそこの規模のGo言語開発に使っているパッケージレイアウトの例

Lenetという生活サービスのエンジニアをやってるカイ(@kai-zoa)です。
ちなみにディープラーニングの方のLeNetとはなんの関係もございません。読み方も違います。

で、Lenetの一部のサービスでは、3年程前からAPIをGoで実装していて、ディレクトリの掘り方からパッケージ間の依存に関するルールについて長いこと苦慮してきたのでまとめてみます。(今回は触りまで…)

コメントでも直接でも指摘があると大変ありがたいです。

コンセプト

下記のようなポイントを抑えていってるつもりです。
※DDDでよく言ううように事業の特定領域や業務に関するレイヤーをここではドメイン層と呼びます

  • ドメイン層のロジックと外部との入出力(インフラ層)まわりのロジックは明確に分けたい
  • 特定のフレームワークを前提にしない
  • ルールに従えば循環インポートの迷路に迷い込まない
  • ヘキサゴナルアーキテクチャとかクリーンアーキテクチャの雰囲気を持ちつつGoらしさを維持したい(改善の余地ありな気がしてる)

サンプルコードについて

JSONを返す簡単なWEBサーバーを作ります。

$ curl http://localhost:8080/today.info
{"ok":true,"year":2017,"month":12,"day":13}

本日の年月日がJSONで返ってきます。

ディレクトリレイアウトと各パッケージについて

github.com/kaizoa/go-arch-example

$ tree
.
├── app/
│   └── today.go
│
├── bootstrap/
│   └── today.go
│
├── domain/
│   └── today/
│       ├── models.go
│       └── usecase_info.go
│
├── middleware/
│   ├── http/
│   │   ├── router.go
│   │   └── serve.go
│   ├── os/
│   │   └── now.go
│   ├── now.go
│   ├── router.go
│   └── M.go
│
├── web/
│   └── today.go
│
└── main.go

8 directories, 13 files

web/ – HTTPハンドラの実装(インフラ層)

HTTPリクエストに応答するためのnet/http.Handlerの実装をする。
基本的には応答するjsonのレイアウトはこのパッケージで定義して、外部にも出したくない。

app/ – アプリケーション層

インフラ層の実装をインジェクトする構造体を実装する。
依存関係の緩衝地帯のように使い方になる。

domain/ – ドメイン層

事業の特定領域や業務に関するロジックを書くところ
といっても今回は現在時刻から年月日オブジェクトへの変換を行うのみ。

domain/today/usecase_info.go
package today

import "time"

type InfoOutput struct {
    Year int
    Month time.Month
    Day int
}

type InfoUseCase struct {
    Now Now
}

func (u *InfoUseCase) Get() *InfoOutput {
    // 現在時刻から年月日オブジェクトへの変換を行う
    now := u.Now.Time()
    out := &InfoOutput{}
    out.Year, out.Month, out.Day = now.Date()
    return out
}

middleware/ – ミドルウェア

ドメイン層とは直接の関わりを持たない技術的な機能の実装をパッケージにしている。
OSの機能にアクセスするためのパッケージなど、フレームワークが実装しそうな機能、特定サービスへの通信クライアントを実装することが多い。

bootstrap/ – ブートストラップ

起動時に呼び出されるサービスごとの関数を実装する。
この関数内でmiddlewareに依存したインフラ層の実装を初期化して、アプリケーション層、ドメイン層に渡すことで依存性の注入を行い、依存の反転を実現する。

依存グラフ

依存グラフ (1).png

コードを追ってみる

書いてる途中です、すいません

続きを書きたい…

今回は簡単な例にとどめてるので、より実践的なことについては別に書こうと思います。

  • 他の外部インターフェイス実装の例(mysql, gRPC)
  • 複数システム・サービスをまとめるときの例
  • etc

気力があれば…


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。