118
113

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

始めに

こんにちは。
今回はSpringBootを一から勉強したので、学んだことをできるだけ噛み砕いて自分なりにまとめてみました。
この記事では具体的な実装方法は説明しないので、「まずはSpring Bootがどのようなものなのかなんとなく知りたい」と思っている方に活用していただけると幸いです。

この記事の対象者

・Spring Bootの学習を始めた方
・Spring Bootとはそもそも何か知りたい方
・Javaの概要を理解している方

この記事で伝えること

・Spring Bootとは何か
・Spring Bootの特徴(DI・AOP)

Spring Bootとは?

まずは、そもそもSpring BootとはどのようなものかSpring Frameworkと共に説明します。

Spring Frameworkとは?

Java開発において利用できるフレームワークの 集合体 のこと。
※「Spring」と縮めて呼ばれているものは、Spring Frameworkのことを指している。

Spring Frameworkは開発を効率化するための様々な機能を提供しており、それぞれの機能ごとにフレームワークが存在している。
そのため実現したいシステムに応じて使用するフレームワークを選ぶことができる。

フレームワーク 提供する機能の概要
Spring MVC Webアプリケーションを簡単に作成する機能を提供
Spring Data データアクセスに関する機能提供
Spring Batch バッチ処理機能を提供
Spring Security 認証認可の機能を提供

※「フレームワーク」とは
開発を簡単にするための「骨組み」のこと。
フレームワークを使うことで全てのプログラムを一から作る必要がないため、開発効率が上がる。

Spring Bootとは?

Spring Frameworkに含まれるフレームワークの一つで、 Spring Frameworkの機能を使いやすくするため のフレームワーク。

Spring全体像.png

Spring Frameworkは各フレームワークを使用するにあたってXMLファイル等の用意が必要であり、様々なフレームワークを提供しているが故に、環境設定が複雑になってしまうという問題があった。

これを解消するために作られたのがSpring Bootで、Spring Bootでは使いたい機能を選ぶだけで自動で初期設定を行ってくれる。
springframework違い.png

SpringBootプロジェクトの立ち上げ方法

eclipse(Pleiades ALL in One)でのSpring Bootプロジェクトの作成方法を簡単に説明します。

①パッケージ・エクスプローラーで右クリックし、「新規」>「Spring スターター・プロジェクト」を選択
操作1.png

②「名前」「タイプ」「パッケージ」などを任意に設定して「次へ」
操作2.png

③Spring BootのバージョンとSpring Bootプロジェクトで使用する機能を選択し、「次へ」
操作3.png

④プロジェクトが作られる
操作4.png

※今回はビルドツールとしてMavenを選んだため、作成したプロジェクト配下にpom.xmlが自動で生成されている。
pom.xmlを見てみると、③で選択した機能がdependency(依存関係)として定義されていることがわかる。
操作5.png

SpringBootの特徴

ここからはSpringBoot(正しくはSpring Framework)のコア機能である 「DI」「AOP」 について説明します。
結論、この二つの機能は 「システムの開発効率・保守性を高める」 ためのものです。

①DI

「Dependency Injection」の略で、「依存性の注入」と訳される。
この機能を「DIコンテナ」が担っている。

「依存性」とは?

「依存性」とは、 あるクラス(=使う側)が他のクラス(=使われる側)を利用している こと。

Javaには以下2種類の依存がある。
この2種類の依存では、「使われる側クラス」に変更があった場合、 「使う側クラス」の修正が必要 になる。

1. クラス依存

「使う側クラス」で「使われる側クラス」をインスタンス化し、メソッドを呼び出すこと。

【「使われる側クラス」に修正が入った場合】
①「使われる側クラス」のインスタンスを代入する変数の型の修正
②「使われる側クラス」のインスタンス化処理の修正
③「使われる側クラス」のメソッド呼び出し処理を修正
クラス依存.png

2. インターフェース依存

「使う側クラス」で「使われる側クラス」をインターフェース型でインスタンス化し、メソッドを呼び出すこと。

【「使われる側クラス」に修正が入った場合】
①「使われる側クラス」のインスタンス化処理の修正
インターフェース依存.png

このように、Javaには2種類の依存があるが、「インターフェース依存」は「クラス依存」よりも修正箇所が少なくなり、「低依存」な状態にできるというメリットがある。

しかし、「インターフェース依存」でも「使う側クラス」の修正は必要であり、
「使う側クラス」が複数ある場合、修正漏れが起こる可能性が出てしまう。
この問題を解消してくれるのがDIの機能。

DIコンテナの役割

DIコンテナは 「使われる側クラス」をインスタンス化し、そのインスタンスを「使う側クラス」に注入 する。
「クラス依存」と「インターフェース依存」に置いて、インスタンス生成はnewキーワードを用いて「使う側クラス」で行っているが、このインスタンス生成を代わりに行ってくれるのがDIコンテナ。
※生成されたインスタンスは「Bean」と呼ばれる

DIコンテナ.png

DIプログラムの実装

DIコンテナにインスタンス生成を行ってもらい、そのインスタンスを利用するために必要なのは、下記のように「アノテーションを付与する」ことである。

①使われる側クラスに 「@Component 」アノテーションを付与する
 ※「@Controller」「@Service」「@Repository」もインスタンス生成アノテーション。
②使う側クラスで、インスタンスの参照を受け取るためのフィールドを宣言し、フィールドに 「@Autowired」アノテーションを付与する

Spring Bootは起動時に、「@Component」など対象のアノテーションが付与されたクラスを探し、インスタンス化する。それらをDIコンテナに登録しておき、「@Autowired」が付与されている箇所に注入している。

DI実装1.png

DIのメリット

  • 「使う側クラス」の修正が不要になる
    DIコンテナにインスタンス化を行ってもらうことで、「使われる側クラス」に修正が入った場合でも、「使う側クラス」の修正は不要 になる。
    「使われる側クラス」に付与しているアノテーションを修正するだけで、「使う側クラス」で使用したいインスタンスを変えることができる。
    DI実装.png

②AOP

「Aspect Oriented Programming」の略で、「アスペクト指向プログラミング」と訳される。

「アスペクト指向プログラミング」とは?

アスペクト指向プログラミングとは、簡単に説明すると「 共有する処理を抜き出してまとめて管理する仕組み 」のこと。

アスペクト指向では、プログラムは以下の二つの要素で構成されていると考える。
AOP概要.png

「横断的関心事」とは、実現したい機能の本質的な部分ではないが、
品質・保守の観点で必要になるもののことで、データベース接続後の例外処理や、ログ出力処理などを指す。

「中心的関心事」・「横断的関心事」をまとめて記述すると、以下のようなデメリットがある。

  • 処理が増えることでソースが読みづらくなる
  • 処理を入れ忘れる可能性がある

これを防ぐために、 「中心的関心事」と「横断的関心事」を分け、「横断的関心事」をまとめて管理する のがAOPの機能である。

AOPイメージ.png

AOPの実装

まずはAOPを理解するにあたり、知っておく必要がある用語を紹介する。

用語 意味
Advice 横断的関心事を実装したメソッド
Aspect Adviceをまとめたクラス
JointPoint Adviceを実行するタイミング
※メソッドの実行前・実行後などを指定できる
PointCut Adviceを実行する場所(クラスやメソッド)
※「メソッド名がgetで始まるもの」といった条件を指定できる

横断的関心事を記述するAspectクラスには、 @Aspect」「@Component アノテーションを付与する。
各Adviceでは、JointPointとPointCutを指定することで、処理がいつ・どこで実行されるかを決める。
AOP実装.png

JonitPointとPointCutの指定例
@Before(“execution(* com.example.Controller.get*(..))”)

= com.example.Controllerクラス配下の名前が getから始まるメソッド に実行する

AOPのメリットとは?

  • 共有処理を統一化できる
    処理を1箇所にまとめることで、担当者によって実装が異なるといった状況を防ぐことができる。
    また、共通処理に修正が入った場合も1箇所を修正すれば良いため、修正漏れを防ぐことができる。

  • コードの可読性が上がる
    横断的関心事を共通処理として抜き出すことで、処理の長さを短くすることができる。

  • 開発効率が上がる
    作成したプログラムの動作確認をするために、全てのメソッドに確認用のログを入れる場合を考えてみる。
    Aspectを実装しない場合は、全てのメソッドに処理を追加し、確認が終わったら削除しなければならない。
    Aspectを実装することで、「全てのメソッドに処理を追加する」という手間を省くことができるのと、「処理を消し忘れる」可能性を無くすことができる。
    AOPメリット.png

参考文献

118
113
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
118
113

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?