こんにちは。ステックアップアカデミー講師のかびらです。現役のITエンジニアであり、かつAFP保持者として、このチャンネルを通して、ITエンジニアとフリーランスに必要な、ITとお金に関する情報を配信しています。
前回に引き続き、本日も「誰もが一度はつまずく、Spring Bootを解説」シリーズの第4回目をお届けします。このシリーズでは、私も含め誰もが共通してつまずきやすいポイントを、Javaのスキルや経験が浅い若手エンジニアでも簡単に理解できるよう、極力難しい用語を使わずに解説しています。今回のテーマは、Spring Bootでよく使用される「アノテーション」です。今回はアノテーション編のパート2です。
サービスアノテーション
前回の記事では、@Controllerアノテーションと@RestControllerアノテーションについて詳しく解説しました。これらはクラスの役割や性質を明示的に示すために使われる「ステレオタイプアノテーション」の一種です。本章では、ドメイン層に位置する「ステレオタイプアノテーション」である@Serviceアノテーションについて説明します。
@Serviceアノテーションは、「ステレオタイプアノテーション」の一つで、ドメイン層に対応します。このドメイン層とは、ビジネスロジックを実装する層のことを指します。ビジネスロジックを実装するクラスがこのドメイン層の役割を持つことを明示するために、そのクラスに@Serviceアノテーションを付与します。
@Serviceアノテーションをクラスに付与すると、そのクラスはBean化され、内部メモリ上に格納されます。その結果、前回紹介した@Autowiredアノテーションを使用することで、依存性注入(DI)が可能となります。
Spring Bootを使った開発を行う際、よくありがちなのが@Serviceアノテーションの付け忘れです。もし@Serviceアノテーションを付け忘れてしまうと、@Autowiredアノテーションを使用してそのサービスクラスを注入しようとした際に失敗します。その結果、Springが起動しないという状況が生じます。したがって、@Serviceアノテーションをはじめとする各種アノテーションの付け忘れには十分注意しましょう。
上記に示すサービスクラスの例では、ユーザID=1をキーに、データベースからユーザ情報を取得し、その情報を返却する処理が記述されています。Springフレームワークでは、データベースの入出力はリポジトリクラスが担当することになります。リポジトリクラスについては後ほど詳細に解説しますが、一旦は、サービスクラスが、データベースの入出力を担当するリポジトリクラスを@AutowiredアノテーションでDIし、そのリポジトリクラスを通じてデータの入出力を行うということを理解しておきましょう。
リポジトリアノテーション
次に、@Repositoryアノテーションについて説明します。@Repositoryアノテーションは、インフラ層に位置する「ステレオタイプアノテーション」です。
@Repositoryアノテーションは、インフラ層に対応する「ステレオタイプアノテーション」です。このインフラス層とは、ドメイン層から呼び出され、データベースやファイルとのインターフェースとしてデータの入出力を担当する層のことを指します。その役割を明示するために、クラスに@Repositoryアノテーションが付与されます。 @Repositoryアノテーションをクラスに付与すると、そのクラスはBean化されて内部メモリ上に格納されます。
上記のリポジトリクラスの例では、Springフレームワークが提供するリレーショナルデータベースのデータ操作用ライブラリ、JPAを使った実装例を示しています。データベースにアクセスするライブラリは他にもいくつか存在し、JPAが必ずしも主流なライブラリという訳ではありません。そのため、ここでは詳細な説明は割愛します。重要なのは、データベースのデータにアクセスする機能を持つクラスに、@Repositoryアノテーションを付与するという点を覚えておいてください。
なお、今回の例ではデータベースへのアクセス例のみを示していますが、ファイルなどへのアクセスにも@Repositoryアノテーションが使われます。@Repositoryアノテーションは、外部の記録媒体に対する入出力を担当するクラスに付与すると覚えておいてください。
データアノテーション
この機会に@Dataアノテーションについても説明しておきます。@DataアノテーションはSpring Bootの開発で頻繁に使用される便利な機能で、ぜひ覚えておいてください。
先ほどのリポジトリクラスの例では、データベースからユーザ情報を取得する処理を示しました。その際、戻り値としてUser型というDTOを使用していました。DTOについてはここでは詳しく説明しませんが、簡単に言えば、テーブルデータを保持するオブジェクトと思っていただければと思います。
User型はこのように実装されています。ここで注目していただきたいのが、@Dataアノテーションです。Javaのプログラムでは、カプセル化の概念に基づき、通常は各フィールドにgetterやsetterを実装しなければなりません。しかし、これはかなりの手間ですよね。そこで、この作業を効率化し生産性を向上させるのが、@Dataアノテーションです。
@Dataアノテーションを付与すると、クラス内にgetterやsetterを個別に実装しなくても、コンパイル時に自動でgetterやsetterが生成されます。@DataアノテーションはLombokというライブラリを利用することで使用可能になります。生産性の向上のためにもぜひ活用してみてください。
コンポーネントアノテーション
次に、@Componentアノテーションについて説明します。@Componentアノテーションは、「ステレオタイプアノテーション」の中で最も広範囲をカバーするもので、プログラム全体に対応します。
@Componentアノテーションはそこまで難しくはありません。これまでに、@Controllerアノテーション、@Serviceアノテーション、@Repositoryアノテーションという、特定の役割を持つ「ステレオタイプアノテーション」を説明してきました。@Componentアノテーションは、これらの「ステレオタイプアノテーション」の基底となるものです。
プログラムを作成する際、役割をより明確に示すために、@Controllerアノテーション、@Serviceアノテーション、@Repositoryアノテーションの使用が推奨されます。しかし、それらの役割が明確でない場合には@Componentアノテーションの使用を検討しても良いでしょう。特定の役割に該当しないと感じるクラスが存在する場合、@Componentアノテーションを使用することを考えてみてください。
@Componentアノテーションも、@Controllerアノテーション、@Serviceアノテーション、@Repositoryアノテーションと同様に、クラスに付与するとそのクラスはBean化され、@Autowiredアノテーションを利用してDIが可能となります。
コンフィグレーションアノテーション
この記事の最後に、@Configurationアノテーションについて解説します。@Configurationアノテーションは、プログラム全体に影響を及ぼす「ステレオタイプアノテーション」です。
@Configurationアノテーションは、「ステレオタイプアノテーション」の一つであり、その中でもよく@Beanアノテーションと一緒に使用されます。これを簡単に説明すると、@Configurationアノテーションはプログラム全体の設定に関する役割を担当するクラスに付与するものです。
たとえば、データベースの接続設定などがその一例として挙げられます。このような設定は、@Configurationアノテーションが付与されたクラス内の@Beanアノテーションが付与されたメソッドによって行われます。
@Configurationアノテーションと@Beanアノテーションを使用することで、Javaの構文を使ってプログラムの設定値を定義することが可能になります。しかし、一般的には設定値はプロパティファイルやymlファイルで定義されることがほとんどです。
ちなみに、データベースの設定は通常ymlファイルに記述され、その形式は上記の図のようになります。したがって、実際の開発では@Configurationアノテーションを直接使用することは少ないかもしれません。ただし、テスト環境等でよく活用されるため、知っておいて損はありません。
さいごに
今回の記事はここまでです。Spring Bootを使用し始めたものの、多くのアノテーションが理解しきれずに困っている方々の参考になったことと思います。今回説明できなかったアノテーションについては、次回の記事で解説予定です。今回もまた一つ賢くなりましたね!次回の記事もぜひご覧ください。お読みいただき、ありがとうございました!