GoのDependency InjectionにWireを使う理由

Go

2024-09-09

#目次

#はじめに

今回は、GoのDependency Injection(以下、DI)をするのに便利なライブラリWireを紹介します。
Wire自体は、古くからあるライブラリで、私はここ5年以上使っています。
そのため、新しい技術の紹介ではありませんが、これだけ使い続けているということで、その理由を改めて整理してみたいと思います。
Wireの使い方などのコードは、この記事では扱いませんので、公式ドキュメントを参照してください。

#Wireとは

Wire is a code generation tool that automates connecting components using dependency injection. Dependencies between components are represented in Wire as function parameters, encouraging explicit initialization instead of global variables. Because Wire operates without runtime state or reflection, code written to be used with Wire is useful even for hand-written initialization.

出典:https://github.com/google/wire

Wireは、DIを行うためのコードジェネレータです。
手書きのDIコードの代わりに、Wireを使ってDIのグラフを生成することができます。
Wireは、ランタイム状態やリフレクションを使わずに動作するため、手書きのDIコードと同じように動作します。

詳しい説明は、Go公式ブログを参照してください。

#なぜDIが必要なのか

私にとって一番の理由は、ユニットテストのしやすさです。
DIで依存関係を注入することで、ユニットテスト時にモックを注入することができます。
Clean Architectureなどのアーキテクチャを採用してレイヤー間をインターフェースに依存したコンポーネントのユニットテストを書く場合には、DIは必須といえるでしょう。

#なぜWireを使うのか

他のDIライブラリもある中で、なぜWireを使うのかというと、以下の理由があります。

  • リフレクトを使わないコードが生成されるので、ビルド時にエラーを検知できる
  • 手書きのDIコードは、量が増えてくるとメンテナンスが大変なので自動生成できるとミスが減らせる
  • ドキュメントが充実している

DI自体は、量が増えてくると大変で、型安全にコード生成されたDIコードを使うことで、ビルド時にエラーを検知できるのは大きなメリットです。
また、DIでは、あまり複雑なことはしませんが、ドキュメントが充実しており、やりたいことがすぐに見つかるのも魅力です。

デメリットを上げると、リフレクトを使うライブラリに比べて、依存関係が変更になったときに、go generateを実行してコードを生成しないといけないという点があります。これを忘れると、ビルドエラーになったり、依存関係注入されていないコンポーネントにアクセスしてNULLポインタエラーが発生する可能性があります。

#まとめ

今回は、GoのDIライブラリWireについて紹介しました。
今後も便利なGoのライブラリを紹介していきます。
次回はGo Cloud Development Kit (Go CDK)を紹介したいと思います。