newmo技術ブログ

技術で地域をカラフルに

Go + GraphQL による Modular Monolith なシステム設計について発表しました

こんにちは、newmo 株式会社に所属しているアーキテクトの伊藤です。

5/22 に【Go】カンファレンススポンサーブースの集い 2024 〜カウシェ × newmo × メルカリ〜というイベントを開催しました。 このイベントで、筆者からは GraphQL Federation や Go のための GraphQL のコード生成、Modular Monolith によるシステム設計について話しました。

スライドや動画のアーカイブは、次の場所で公開されているので、ぜひご覧ください!

筆者が発表した内容を簡単にまとめると、次の3つのポイントが挙げられます。

  • GraphQL Federation とその採用理由
  • GraphQL のスキーマから Go のコードを生成している仕組み
  • Modular Monolith なシステム設計

GraphQL を採用した理由

newmo ではクライアント(ウェブやモバイルアプリ)からサーバの API を呼び出す際に GraphQL を採用しています。 発表でも触れましたが、GraphQL を採用した理由としては、エコシステムの豊富さや GraphQL Federation の存在が挙げられます。

GraphQL Federation

GraphQL Federation は、複数の GraphQL のグラフを一つにまとめるような仕組みで、具体的な実装としては Apollo Federation を利用しています。複数のシステムの API をまとめる Aggregation レイヤーを自動的に生成して、CI/CD で常に合体したグラフが生成されるので、Aggregation レイヤーのコンポーネントを管理する手間がなくなります。

GraphQL のスキーマから Go のコードを生成している仕組み

GraphQL のスキーマは宣言的なファイルとして管理しています。 newmo では GraphQL の Operation(クライアントが実際に利用する Query や Mutation の定義)も宣言的なファイルとして管理するようにしています。

GraphQL のスキーマからCustom Validationを生成

これによって、GraphQL のスキーマや Operation から Go や TypeScript などのコードを生成することができます。 具体的なコード生成ツールとしては gqlgenGraphQL-Codegen などを利用しています。

これらのコード生成ツールはプラグインとして生成するコードをカスタマイズできるため、newmo ではスキーマに @validateString のような独自の Directive を書いて、スキーマからバリデーションコードを生成しています。

発表では時間の問題で触れることができませんでしたが、スキーマから Fake Server を生成して開発に利用したり、 GraphQL のエラーガイドラインを作成して、対処が画一的なエラーに関してはエラーハンドリングを自動化することも検討しています。

この辺りについては、今後ブログなどで発表していく予定です!

Modular Monolith なシステム設計

Modular Monolith

newmo では、最初からMicroservice でシステムを構築するのではなく、Modular Monolith 形式で開発を進めていこうとしています。

Component という形式でモジュールを定義して、単一のプロセス(コンテナ)で動作するようにし、Component 同士は gRPC 経由でやりとりするような構造にしようとしています。 これによって、少ない工数で初期のシステムを構築しつつ、後から Component をプロセスとしても分離しやすくするといった狙いがあります。

詳細については、スライドや動画も公開しているので、是非ご覧ください〜


このイベントでは、他にも株式会社メルペイの goccy さんと株式会社カウシェの uo さんが gRPC について話されています。 イベントの動画アーカイブも公開されているので、是非ご覧ください!

newmo ではエンジニアを積極的に採用中です!

興味があれば DM やカジュアル面談でもお気軽に連絡ください〜