RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

Java開発エンジニアが紹介する、7つのフレームワーク

f:id:tech-rakus:20201026151522p:plain

はじめに

こんにちは。sts-250rrです。

いきなりですが、皆さま開発においてフレームワークは使われていますでしょうか?

世の中のサービスはもちろん、ラクスのシステムにおいても様々なフレームワークが使われているわけですが、フレームワーク自体も時代の流れに沿って、新しいものが出てきています。
新規サービスは新しい技術を、既存のサービスは新しい技術に置き換えていくなど日々試行錯誤をしている方もおられるかと思います。

今回はそんなJavaフレームワークを7つご紹介したいと思います。
他にも魅力的なものがあるとは思いますがご了承ください。

私が使用したことのあるものについてはちょっとした感想なども添えていますのでご参考程度に読んでいただければ幸いです。

フレームワークの良さって?

メリット

サービスを開発する上で、チームや複数メンバーで開発することは避けて通ることはできないプロセスです。
しかし、スキルやバックボーンが異なるそれぞれのメンバー間でプログラムの書き方がバラバラになってしまうと、統一感が崩れてしまうことによる可読性の低さや、改修コストが上がってしまう恐れが出てきます。
フレームワークを利用することでチーム内で共通の規則に沿った書き方に統一することができ、これらの問題を解決することが可能です。

また、フレームワーク側が用意している機能を用いることで、セキュリティや認証の機能を低コストで実装することができる場合もあり、開発速度を上げることにも繋がります。

デメリット

基本的なJavaの知識に加えて、フレームワーク特有の機能やその書き方を理解する必要があるため、それに伴い学習コストは上がってしまうことは避けられません。
他のフレームワークで開発されていた方や若いエンジニアの方は苦労するポイントになってくるかと思います。
特に新卒エンジニアはフレームワークの知識が先についてしまい、Javaの基本がわからなくなってしまう。いざプレーンなJavaのプログラムを書こうとすると手が止まってしまうなんていう落とし穴もあるのではないでしょうか。(これは結構に身に覚えがあります。)

Javaフレームワーク

フレームワークについてメリット・デメリットをお伝えしましたが、本項ではJava開発における有名どころのフレームワークをご紹介します。
2020年現在のトレンドや過去に活躍したフレームワークを選抜してみましたのでお楽しみください。

Spring Framework

f:id:sts-250rr:20201025152019p:plain

Webアプリケーションやモバイルアプリをはじめとした様々な開発に適しているフレームワークで、ラクスでも利用実績があります。
2020年現在「JavaといえばSpring」のようなイメージを持っている方もいるほど、スタンダードになりつつあるフレームワークなのではないでしょうか。
私も最近になってこのフレームワークで開発を行う機会が増えてきました。

Spring Frameworkの特徴はDI(Dependency Injection:依存性の注入)AOPAspect Orientation Programming:アスペクト指向プログラミング)の概念を取り入れることで機能開発や改修が楽にできる点が挙げられます。

簡単ですがDI・AOPのメリットは以下のようなものがあげられます。

DI(Dependency Injection:依存性の注入)
  • クラス間の依存関係を解消し、疎結合にすることで保守性を高めることが可能。
  • 依存関係のある他のクラスが完成していなかったとしても、Mockに置き換えてやることで、テストを実行することが可能。
AOPAspect Orientation Programming:アスペクト指向プログラミング)
  • ログの出力や認証など、共通で行うような処理を1つの機能として抜き出し、プログラム内のいろいろな場所で横断的(Aspect)に利用することが可能
  • 共通の処理が抜き出されているため、業務ロジックに集中した開発が可能。

また、Spring Frameworkには多くのプロジェクトが存在するため、作成するシステムによって必要なプロジェクトを使い分けることで様々なアプリケーションの開発に適することができていると言えます。

ただし、多くのプロジェクトが存在する反面、多くのことができてしまうため、必要な要素を適切に利用することが大切です。
また、フレームワークが担える範囲が広い(≒隠ぺいできる範囲が広い)ため、開発に慣れていない方にとってはどこで何をしているかわからない。といったことが起こりがちなように思います。

spring.io

Play Framework

f:id:sts-250rr:20201025152053p:plain
Play Framework(プレイ・フレームワーク)は、ScalaJava言語で書かれたフレームワークで、生産性を重視したフレームワークになっています。

既存のJavaのWebアプリケーションの開発手法では、JSPサーブレットをコツコツと書いて、コードを修正したらコンパイルして、ビルドして、初めて編集した内容が確認できる。といった状況であったため、コーディング以外にとられる時間もあり、しんどさを感じている方が少なくなかったようです。
そういった状況の中で、Rubyの「Ruby on Rails」やPythonの「Django」のような開発を、Javaでもやりたいというニーズで生まれた背景を持つようです。
そのため、Play Frameworkは「Ruby on Rails」、「Django」の影響を強く受けているといわれています。

Play Frameworkの特徴はコンパイルが早く、コードの追加・修正がすぐに反映され確認できる点と、使用するCPUリソースやメモリ使用量が少ないため、システムが大規模なものになったとしても動作するシステムを作ることができる点です。

Javaの弱点であったコンパイルに時間がかかるという欠点をなくし、メリットである堅牢性や高速な動作を活かすことができるようになっています。

また、MVC(Model-View-Controller)アーキテクチャを使用しているため、開発者にとって理解しやすく高速なアプリケーション開発に適しているとされています。

もともとJavaで開発をしていなかった方にとって、他の開発言語の流れを汲んでいるPlay Frameworkは馴染みやすいのではないでしょうか。

Spark Framework

f:id:sts-250rr:20201025152149p:plain

Spark Frameworkは、シンプルな構成でできていいる軽量なフレームワークで、軽量であるためにマイクロフレームワークとも呼ばれています。
ここまでで紹介してきたSpring FrameworkやPlay Frameworkは複雑で大きなシステムを開発する際にも活躍しますが、シンプルで小さなシステムを作る際にはあまりに機能が豊富で大げさになってしまうため、よりシンプルなフレームワークとして生まれました。
Rubyの「Sinatora」というフレームワークに影響を受けており、多くのアノテーションの記述や設定ファイルを必要としないため、開発する際の負担を軽減してくれます。 これらの特徴に加え、Lambda式とstaticメソッドを活用することで手軽に実装することが出来るということが挙げられています。

Apache Struts

f:id:sts-250rr:20201025152509j:plain

2013年にEOLを迎えたフレームワークではありますが、Spring Frameworkが出てくるまでは「Apache StrutsJavaの主流フレームワーク」と言われていました。世の中で動いているシステムでApache Strutsを採用しているプロジェクトも少なくないと思われますのでご紹介します。
※2007年に新しくStruts2というフレームワークが誕生していますが、今回はStruts1についてです。

Apache Strutsの特徴はMVC(Model-View-Controller)のアーキテクチャに基づいた、JavaサーブレットJSP( JavaServer Pages )の仕組みを組合せてWebアプリケーションを作成することができるフレームワークです。

XMLベースの設定ファイルを記述することで、ユーザのリクエスト(URL)を適切なJavaクラスに割り振るような動きや、JavaBeanに値を自動設定できるようにするなど、Javaプログラムのコーディング削減ができるような仕組みがそろっています。
ただし、XMLの設定ファイルが便利である反面、様々な設定ファイルを書かなければならないというデメリットとして挙げられることもあります。

Seasar2

f:id:sts-250rr:20201025152532g:plain

2016年にEOLとなっているフレームワークですが、日本国産のフレームワークということでご紹介します。

前述したApache Strutsでは設定ファイルの記述が多くなることがデメリットとして挙げられるとお伝えしました。
また、修正したプログラムの動作を確認するためにデプロイをしなければならないという点で開発速度を上げていきたいエンジニア的には煩わしい部分になっていました。

Seasar2はそういった部分を解消するため、設定ファイルの記述を命名規則アノテーションでカバーすることで設定ファイルを少なくし、ホットデプロイの機能を取り入れることで修正のたびにデプロイの作業をせずに開発を進めることが可能です。

ただし、個人的には命名規則などを誤ると途端に動かなくなってしまうため、フレームワーク特有のルールを理解する必要がある点はちょっとした学習コストがかかるなと感じる部分だと思っています。
ちなみに、Springの項でご紹介したDIやAOPSAStrutsでも利用することができ、個人的にSeasar2からSpringへの学習は割とスッと入ってくる印象を受けました。

Java EE(Java Platform, Enterprise Edition)

f:id:sts-250rr:20201025152556j:plain

Java EEは、エンタプライズ(企業)向けのシステム構築するために作られたJava標準仕様のフレームワークです。
Java SEにサーバー関係のライブラリなどを追加することで、Webアプリケーション開発ができるようになっています。 ServletJSPEJBに加えJavaの各種APIなど、大規模システムの構築に必要な機能がまとめて提供されています。

JSF(JavaServer Faces)

f:id:sts-250rr:20201025152613j:plain

JSFJava EEの中のサブシステムですが、フレームワークとしての役割を持っています。 Apache Strutsと同じくMVCを利用していますが、XML方式のHTMLを利用した、コンポーネントベースフレームワークであるため、Apache Strutsとはまた異なります。 JSFは専用のタグライブラリを使ってWeb画面の構築を行う「フェースレット」とフェースレットと関連づけた処理をおこなったり、値設定をしたりするJavaのクラス「マネージドビーン」で構成されています。

まとめ

今回Javaフレームワークについてまとめてみましたが、いかがだったでしょうか?
改めて見比べてみてもどのフレームワークにも特徴があり、すべてにおいて最も優れているというものはなかったように感じます。

当たり前のことではありますが、「目的(作りたいシステムや、開発手法)に合わせて、最適なフレームワークを選択する」ことが開発を『楽』にする第一歩であると思います。

私事かつ話がそれますが、私が関わっているプロジェクトで徐々にSA StrutsからSpringに乗り換えようとする動きがあり、StrutsとSpring共存した状態で動作させるということを行ってます。 ただし、これもそう簡単なことではなく、既存のStrutsの機能に引っ張られてSpringの機能が上手く使えない、ということも発生しておりこれを解決しようと思うと新旧両者の知識を求められるためなかなかに苦労しています。

皆様のフレームワーク選択の足掛かりになれば幸いです。

Copyright © RAKUS Co., Ltd. All rights reserved.