🦓

転生したらJavaエンジニアがSpring Bootを理解した件(基礎)

2024/10/06に公開

はじめに

お久しぶりです!
今年は金融系SEとして2年ぶりに舞い戻り、
特有の専門用語に苦戦してひーひーいいながら頑張ってました!
最近はJava以外にもSpring Bootに触れる機会があり
今まではJavaのコードばかりに触れてばっかりだったので、
理解が進むとすごく便利なフレームワークだなっておもいました!

最初は勉強してて、色々学びになったので備忘録として
記事にしましたのでこんなんあったんだなーくらいで読んでくれると
嬉しいです✨

そもそもSpring Bootってなんだね?

実はSpring Frameworkの機能を使いやすくするためのフレームワークなんです!
Spring FrameworkはJava開発において利用できるフレームワークの集合体で
他にもデータアクセスやバッチ処理や認証の認可で使われています。

Spring Bootはその中でもJavaによるWebアプリケーションの開発を効率的かつ迅速な
仕組みが備わっているフレームワークなので、JavaのWebアプリ開発に
よく用いられるほどの人気を誇っています。

これ、実際に使ってみると、理解は必要ですが覚えるとコード量がすごく減って
可読性の高い質のいいコードになっててすごく便利なので、Javaエンジニアは
覚えておくとWebアプリ開発にも重宝されて仕事の幅が広がること間違いなしです。

URL貼っとくのでさらっと何に使われてるのかはこちらを参照してね
https://freelance.shiftinc.jp/column/spring-boot

Spring MVCの理解👻

特に一般的なMVCモデルとなんら変わりがないが、
MVCモデルがわからない人に説明すると
ビュー(View):画面の見た目を担当する
モデル(Model):データベースとのやり取り、データの操作や処理を担当する
コントローラ(Controller):ビューとモデルの制御を担当する

と思ってもらえればと思います!
これらはそれぞれ独立して開発されているため、コードが読みやすく
なったり保守性が向上したり、テストが行いやすいというメリットがあります。

自分は過去に会社でPHPを教わり、LaravelというフレームワークでMVCモデルを
習得したのですでに理解はありましたが、改めてすごい便利な設計モデルだなって
思いました。

DIコンテナの理解😉

DIコンテナ(Dependency Injection)は、オブジェクトのインスタンス化と依存関係の解決を行うコンテナの事を指します。オブジェクト注入って言った方がエンジニアは分かりやすいと思います。
(依存性注入って説明する奴はほんと優しくないと思う)

図にすると、下記のようになります。

クラスAが業務処理を担当していて、クラスBが共通の計算をするクラスだったとします。
ここでは、クラスBの計算クラスに依存しているためクラスAの業務処理のメソッドが
多くなるたびに負荷がかかってしまいます。これは実装としてよくはありません。

そこでDIコンテナを使う事により、こうなります。

インターフェースB君を作ることによって、クラスAの処理は、他クラスに中継されて
クラスBへの処理のみインターフェースB君に行くため。
仕様変更や負荷分散・冗長化が可能になるため、クラスBをいちいち書き換える面倒くささ
がなくなるわけです。

他にもトランザクション管理がありますが、説明が長くなるため下記サイトを参照してください。
https://images.app.goo.gl/CBmPSGwhgzRUM6KQ7

AOPの理解👾

アスペクト指向プログラミング(Aspect Oriented Programming)の略であり、
共有する処理を抜き出してまとめて管理する仕組みの事を指します。

「中心的関心事」・「横断的関心事」と言ってもわかりずらいので例を使って説明します。

例えば、現実世界でAOPをイメージするにあたって野球を上手くなるというのがテーマだとします。

中心的関心事は本来は多くの機能や目的の事を指しますが、ここでは野球を上手くなるための
特有のタスクに置き換えます。

  • 1000本ノックを受けて守備をうまくなる
  • プロ野球選手の打撃理論を取り入れる
  • スプリントトレーニングして足を速くする

などがあげられると思います。これらは野球をうまくなるための直接な目的ですよね!

横断的関心事は本来は、多くの機能に共通して影響をあたえる作業や処理を指しますが
こちらでは、野球にうまくなる共通のタスクに置き換えます。

  • ランナーをおいて、ケース別のシートバッティングをやる

などがあげられると思います。これは、上記の中心的関心事に付随したタスクですね!
ランナーとして参加して、盗塁を決める練習や打撃でランナーをすすめるために
ヒットをうったり犠牲バントしたり、守備練習で学んだことで
ヒットを阻止するなど
結果的に野球がうまくなることにつながりますよね?

AOPって意外と現実に落とし込んで考えるとわかりやすいし理解も進むと思います

ここでは概要にとどめて具体的な説明も割愛しますので下記のサイトで学んでね
https://camp.trainocate.co.jp/magazine/whats-aop-programming/

最後に

ここでは概要くらいしか説明してませんでしたが、先月から改めて勉強してみて
Javaのコードだけ知っていた自分にとって、目から鱗でした。
アノテーションやバリデーションチェックに使われてて、コードの量が
かなり短縮されていてすごく可読性の高いソースコードになってました。
自分も実装がメインになったら積極的に布教して、質の高いソースコードをかけるようにがんばります!
ただ苦労したポイントとしてDIの理解が結構ムズかったです…

今回の記事について他に読んだサイト(ありがとうございます)

https://skillquest.jp/knowledge/skillup/what-is-di-container/
https://images.app.goo.gl/5rxkkPqtL4Er9B8G8
https://zenn.dev/willyang/articles/60469fe463c328
https://qiita.com/ist-a-ku/items/1d278619f241f4800bb2
https://www.slideshare.net/slideshow/1spring/206688180

Discussion