こんにちは、newmo 株式会社に所属しているアーキテクトの伊藤です。
5/22 に【Go】カンファレンススポンサーブースの集い 2024 〜カウシェ × newmo × メルカリ〜というイベントを開催しました。 このイベントで、筆者からは GraphQL Federation や Go のための GraphQL のコード生成、Modular Monolith によるシステム設計について話しました。
スライドや動画のアーカイブは、次の場所で公開されているので、ぜひご覧ください!
- スライド: Go + GraphQL @ newmo - Speaker Deck
- 動画: 【Go】カンファレンススポンサーブースの集い 2024 〜カウシェ × newmo × メルカリ〜 - YouTube
筆者が発表した内容を簡単にまとめると、次の3つのポイントが挙げられます。
- GraphQL Federation とその採用理由
- GraphQL のスキーマから Go のコードを生成している仕組み
- Modular Monolith なシステム設計
GraphQL を採用した理由
newmo ではクライアント(ウェブやモバイルアプリ)からサーバの API を呼び出す際に GraphQL を採用しています。 発表でも触れましたが、GraphQL を採用した理由としては、エコシステムの豊富さや GraphQL Federation の存在が挙げられます。
GraphQL Federation は、複数の GraphQL のグラフを一つにまとめるような仕組みで、具体的な実装としては Apollo Federation を利用しています。複数のシステムの API をまとめる Aggregation レイヤーを自動的に生成して、CI/CD で常に合体したグラフが生成されるので、Aggregation レイヤーのコンポーネントを管理する手間がなくなります。
GraphQL のスキーマから Go のコードを生成している仕組み
GraphQL のスキーマは宣言的なファイルとして管理しています。 newmo では GraphQL の Operation(クライアントが実際に利用する Query や Mutation の定義)も宣言的なファイルとして管理するようにしています。
これによって、GraphQL のスキーマや Operation から Go や TypeScript などのコードを生成することができます。 具体的なコード生成ツールとしては gqlgen や GraphQL-Codegen などを利用しています。
これらのコード生成ツールはプラグインとして生成するコードをカスタマイズできるため、newmo ではスキーマに @validateString
のような独自の Directive を書いて、スキーマからバリデーションコードを生成しています。
発表では時間の問題で触れることができませんでしたが、スキーマから Fake Server を生成して開発に利用したり、 GraphQL のエラーガイドラインを作成して、対処が画一的なエラーに関してはエラーハンドリングを自動化することも検討しています。
この辺りについては、今後ブログなどで発表していく予定です!
Modular Monolith なシステム設計
newmo では、最初からMicroservice でシステムを構築するのではなく、Modular Monolith 形式で開発を進めていこうとしています。
Component という形式でモジュールを定義して、単一のプロセス(コンテナ)で動作するようにし、Component 同士は gRPC 経由でやりとりするような構造にしようとしています。 これによって、少ない工数で初期のシステムを構築しつつ、後から Component をプロセスとしても分離しやすくするといった狙いがあります。
詳細については、スライドや動画も公開しているので、是非ご覧ください〜
- スライド: Go + GraphQL @ newmo - Speaker Deck
- 動画: 【Go】カンファレンススポンサーブースの集い 2024 〜カウシェ × newmo × メルカリ〜 - YouTube
このイベントでは、他にも株式会社メルペイの goccy さんと株式会社カウシェの uo さんが gRPC について話されています。 イベントの動画アーカイブも公開されているので、是非ご覧ください!
newmo ではエンジニアを積極的に採用中です!
興味があれば DM やカジュアル面談でもお気軽に連絡ください〜
- X(Twitter): https://twitter.com/mrno110