Slide 1

Slide 1 text

connect-goとsqlboilerで構築する クリーンアーキテクチャ hirocy

Slide 2

Slide 2 text

{広告なんでも, pixiv Ads}チーム エンジニア 💼 23新卒/広告開発 ❤ Go言語/VTuber https://x.com/hir0cy hirocy

Slide 3

Slide 3 text

話すこと ● クリーンアーキテクチャとは ● connect-go・sqlboilerとは ● 広告管理サーバーを設計した際の最終的なディレクトリ 構成の紹介 ● connect-go・sqlboilerをクリーンアーキテクチャに取 り込む上での工夫

Slide 4

Slide 4 text

話さないこと ● connect-goとsqlboilerの使い方 ● 基本的なクリーンアーキテクチャの実装 Ask the Speakerで僕と握手!

Slide 5

Slide 5 text

クリーンアーキテクチャ とは?

Slide 6

Slide 6 text

クリーンアーキテクチャ ● Robert C. Martinが2012年に提唱したアーキテクチャ ● 4層のレイヤー構造 ○ Enterprise Business Rules(domain層) ○ Application Business Rules(usecase層) ○ Interface Adapters(interface層) ○ Frameworks & Drivers(infrastructure層)

Slide 7

Slide 7 text

クリーンアーキテクチャ ● Robert C. Martinが2012年に提唱したアーキテクチャ ● 4層のレイヤー構造 ○ Enterprise Business Rules(domain層) ○ Application Business Rules(usecase層) ○ Interface Adapters(interface層) ○ Frameworks & Drivers(infrastructure層)

Slide 8

Slide 8 text

connect-go・sqlboiler とは?

Slide 9

Slide 9 text

connect-goの特徴 ● The Go implementation of Connect: Protobuf RPC that works. ● ConnectというプロトコルのGo実装 ● Protobufで記述された通信の定義に基づいてGoのパッ ケージを生成

Slide 10

Slide 10 text

sqlboilerの特徴 ● Generate a Go ORM tailored to your database schema. ● 実際のDBスキーマからGoのORM(Object-Relational Mapping)をパッケージとして生成

Slide 11

Slide 11 text

どちらもパッケージ生成

Slide 12

Slide 12 text

クリーンアーキテクチャ のどこに生成?

Slide 13

Slide 13 text

〜広告管理サーバーの場合〜 最終的なディレクトリ構成

Slide 14

Slide 14 text

最終的なディレクトリ構成 "esakik/clean-architecture-python" (https://github.com/esakik/clean-architecture-python) より引用

Slide 15

Slide 15 text

最終的なディレクトリ構成

Slide 16

Slide 16 text

なぜinterface層に生成? ● 例えばconnectについて... ○ interface層 ■ 通信の中身を見るレイヤー ○ infrastructure層 ■ 通信について記述するレイヤー →ハンドラーやDBのクエリをinterface層で記述したい

Slide 17

Slide 17 text

connect-go・sqlboiler を扱う上での工夫

Slide 18

Slide 18 text

sqlboilerを扱う上での工夫 ● sqlboilerは独自の型とdomainとの変換が必要 ○ converterを実装して対応 ● sqlboilerの実行には*sql.DBが必要 ○ infrastructure層で接続を張った*sql.DBを返すよう に実装

Slide 19

Slide 19 text

connect-goを扱う上での工夫 ● 決められたHandlerの型 で実装する必要がある ● interactorから presenterを呼ぶ流れと 相性が悪い "esakik/clean-architecture-python" (https://github.com/esakik/clean-architecture-python) より引用

Slide 20

Slide 20 text

connect-goを扱う上での工夫 controllerから presenterを呼び出す

Slide 21

Slide 21 text

connect-goを扱う上での工夫 controllerから presenterを呼び出す

Slide 22

Slide 22 text

connect-goを扱う上での工夫 "クリーンアーキテクチャの Presenter が分かりにくいのは MVC 2 じゃないから" (https://qiita.com/os1ma/items/c02af5b7783b58165c8d) より引用

Slide 23

Slide 23 text

まとめ ● connect-goとsqlboilerはinterface層に生成 ● presenterをcontrollerから呼び出すように改変 ● 都度リファクタリングをすることでより良いアーキテク チャにしている ● Goの互助会ブースやAsk the Speakerも是非!