お問い合わせ

第2回 プログラム構成編【誰もが一度はつまずくSpring Bootを解説♪】【若手Javaエンジニア向け】

こんにちは。ステックアップアカデミー講師のかびらです。現役のITエンジニアであり、かつAFP保持者として、このチャンネルを通して、ITエンジニアとフリーランスに必要な、ITとお金に関する情報を配信しています。

前回に引き続き、主に若手のJavaエンジニアの方々に向けて、「誰もが一度はつまずく、Spring Bootを解説♪」というシリーズをお届けしています。このシリーズでは、私も含め誰もが共通してつまずきやすいポイントを、Javaのスキルや経験が浅い若手エンジニアでも簡単に理解できるよう、極力難しい用語を使わずに解説しています。今回は、そのシリーズの第2回目として、Spring Bootが目指す基本的なプログラム構成についてわかりやすく解説します。

プログラムの構成

まずは、Spring Bootが採用するSpringフレームワークが目指すプログラムの基本構成について学びましょう。一般的には、「MVC」や「レイヤードアーキテクチャ」と呼ばれるものですが、これらの難しい用語を覚える必要はありません。Springフレームワークでは、どのような構成でプログラムを作成するのか、そのイメージを掴んでいただけると嬉しいです。

それでは、Springフレームワークが目指すプログラムの構成について説明します。Springフレームワークが目指すプログラムの基本的な構成は、上図の通りです。プログラムは4つの層に分けられています。それぞれ、「プレゼンテーション層」、「アプリケーション層」、「ドメイン層」、「インフラ層」と呼ばれます。この4つの層は、特定の順序で呼び出されます。具体的には、「プレゼンテーション層」が「アプリケーション層」を呼び出し、「アプリケーション層」が「ドメイン層」を呼び出し、「ドメイン層」が「インフラ層」を呼び出します。そして、「インフラ層」では、データベースやファイルとのやり取りが行われます。その後、「インフラ層」から「ドメイン層」、「ドメイン層」から「アプリケーション層」、「アプリケーション層」から「プレゼンテーション層」という順序で、結果が返されます。これが4つの層を介した、基本的な処理の流れです。

それでは、なぜプログラムを層状に構成するのでしょうか?その理由は、プログラムが持つ役割を分類し、層状に構成することで指揮系統を明確にするためです。指揮系統が明確になるとどのようなメリットがあるのでしょうか?その答えは、指揮系統が明確になることで、コードが読みやすく、変更に強いプログラムを作ることができるためです。役割が整理できていないプログラムは、コードが非常に読みにくく、仕様変更やバグによる修正が難しくなってしまいます。Springフレームワークを使い、階層を整理することで、コードの可読性や保守性を高めることができます。

ここまでで、プログラムが各役割ごとに層状に構成するメリットを理解していただけたと思います。次に、各層が担う役割について見ていきましょう。

まず、処理のスタートである「プレゼンテーション層」です。「プレゼンテーション層」は、画面表示やUI提供を担当します。具体的には、フロント部分であるHTMLやJavaScriptを作成します。「プレゼンテーション層」は、フロントエンドに分類されます。しかし、Springフレームワークは、バックエンドのフレームワークです。Spring Bootでは、フロント部分を実装できる「テンプレートエンジン」と呼ばれるツールと連携することができます。Spring Bootで使用できる代表的なテンプレートエンジンとして、Thymelea」と呼ばれる「テンプレートエンジン」があります。Spring BootでThymeleafを採用し連携することで、「プレゼンテーション層」を実装することが可能です。

次に説明する「アプリケーション層」以降がサーバーサイドとして、Springフレームワーク、つまりJava言語で実装するバックエンドの部分です。「アプリケーション層」では、必要な「ドメイン」の呼び出しを行います。「ドメイン」とは、次の層で出てくる「ドメイン層」のプログラムのことを指します。「ドメイン層」は、Webアプリで最もコアな部分である業務処理や仕様の実現を担当します。「アプリケーション層」は、「ドメイン層」で実装されたコアな処理や仕様の塊を、必要な部分だけ選んで順番に呼び出す役割を持ちます。

そして最後に、「インフラ層」です。「インフラ層」は、データの入出力を担当します。「ドメイン層」で業務ロジック、「インフラ層」でデータの入出力と、役割を明確に分けることで、データベースやファイルが変更されても、プログラムの修正を局所化するような工夫が施されています。

続いて、各層が担う役割について、より具体的に説明します。上図は、各層におけるシーケンス図を示しています。

シーケンス図には、「プレゼンテーション層」、「アプリケーション層」、「ドメイン層」、「インフラ層」、そして「記録媒体」の各層に分けられています。それでは、このシーケンス図を使って、Springフレームワークが目指す処理の流れを見ていきましょう。

処理は、「プレゼンテーション層」から始まります。ユーザーが画面上であるボタンをクリックしたと仮定します。この時、処理は「プレゼンテーション層」の画面上のボタンイベントとして開始され、その後、「アプリケーション層」の「コントローラ」に到達します。前述したように、「コントローラ」の役割は、「ドメイン層」の処理の塊を呼び出すことです。したがって、この例では、「アプリケーション層」の「コントローラ」が「ドメイン層」の「サービス①」を呼び出します。もし、データベースにアクセスする必要がある場合は、「サービス①」から「インフラ層」の「データ取得」や「データ登録」処理を呼び出します。このように、「記録媒体」となるデータベースへの操作は、「インフラ層」を介して行われます。「サービス①」の処理が完了したら、「アプリケーション層」の「コントローラ」に戻ります。

もし「コントローラ」で次に「サービス②」を呼び出したい場合は、「ドメイン層」の「サービス②」を呼び出します。この例では、「サービス②」はファイル入出力の処理を担当していますので、「インフラ層」を介してファイルに対する「データ取得」処理や「データ登録」処理を行います。「サービス②」の処理が完了したら、再び「コントローラ」に処理を戻し、「コントローラ」の処理が完了したら、結果を画面に返します。これがSpringフレームワークでの処理の流れです。

以上が各層の役割とSpringフレームワークが目指す処理の流れについての説明です。各層が分業し、それぞれの役割を担うことで、プログラムの可読性や保守性、拡張性が高くなります。また、Springフレームワークを使用することで、プログラムの基盤となる部分を自動的に生成できるため、開発効率も向上します。

各層とアノテーションの関係

Springフレームワークのプログラム構成について、イメージを掴んでいただけたと思います。次に、プログラムを構成する各層とアノテーションの関係について説明します。

上図には、先ほど説明した、Springフレームワークの各層における処理の流れをシーケンス図で示しています。前回のDI編では、アノテーションについても簡単にご紹介しました。今回は、そのアノテーションがSpringフレームワークのプログラムにどのように関わってくるのかを説明します。

まず、@Controllerと@RestControllerについてです。@Controllerと@RestControllerは、その名の通り、「アプリ層」のコントローラクラスに付与します。

次に、@Serviceについてです。@Serviceもその名の通り、「ドメイン層」のサービスクラスに付与します。

続いて、@Repositoryについてです。@Repositoryは、記録媒体とのやり取りを担う「インフラ層」のクラスに付与されます。「リポジトリ」は、日本語で「倉庫」や「貯蔵庫」という意味を持ちますので、「倉庫からデータを格納したり取り出したりする人」というイメージを持っていただけると理解しやすいと思います。

最後に、@Component、@Configuration、@Beanについてですが、これらはプログラム全般に関わってくるアノテーションです。@Componen、@Configuration、@Beanは、プログラム全体の定義などに指定するアノテーションです。そのため、処理に特化したアノテーションというよりは、プログラムを動作させるために必要な定義や設定項目などに利用されます。

前回のDI編でもご紹介しましたが、それぞれの層に対するアノテーションが付与された、実際のプログラムを見てみましょう。

「アプリ層」にあるコントローラクラスには、@Controller付与します。レストコントローラの場合は@RestControllerです。コントローラとレストコントローラの違いは次回のテーマで解説します。「ドメイン層」のサービスには@Serviceを付与します。「インフラ層」には@Repositoryを付与します。プログラム全体の設定値などを定義するクラスには、@Component、@Configuration、@Beanを付与します。

まとめ

最後に本テーマのまとめです。

今回は、Spring Bootで採用されているSpringフレームワークのプログラム構成について解説しました。Springフレームワークが目指すプログラムは4つの層に分かれています。画面表示やUIを担当する「プレゼンテーション層」、必要なドメインを呼び出す「アプリケーション層」、プログラムのコアとなる業務処理や仕様を実現する「ドメイン層」、データベースやファイルの入出力を担当する「インフラ層」の4つです。

Springフレームワークでは、それぞれの層に対応したアノテーションが用意されています。「アプリケーション層」では@Controllerや@RestController、「ドメイン層」では@Service、「インフラ層」では@Repository、プログラム全体には@Component、@Configuration、@Beanです。

Springフレームワークを使うことで、プログラムの構造が明確になり、保守性や拡張性が高まるというメリットがあります。また、アノテーションの使い方を理解することで、より効率的なプログラミングが可能になります。以上のように、本記事はSpringフレームワークのプログラム構成とアノテーションについて解説しました。

次回はSpring Bootでよく使われるアノテーションの意味について解説しようと思います。それではまた、次回のブログ更新までよろしくお願いします。ご購読ありがとうございました!